16bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#ifndef _ASM_SCORE_FIXMAP_H
26bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#define _ASM_SCORE_FIXMAP_H
36bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
46bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#include <asm/page.h>
56bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
66bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#define PHY_RAM_BASE		0x00000000
76bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#define PHY_IO_BASE		0x10000000
86bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
96bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#define VIRTUAL_RAM_BASE	0xa0000000
106bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#define VIRTUAL_IO_BASE		0xb0000000
116bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
126bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#define RAM_SPACE_SIZE		0x10000000
136bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#define IO_SPACE_SIZE		0x10000000
146bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
156bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin/* Kernel unmapped, cached 512MB */
166bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#define KSEG1			0xa0000000
176bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
186bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin/*
196bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * Here we define all the compile-time 'special' virtual
206bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * addresses. The point is to have a constant address at
216bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * compile time, but to set the physical address only
226bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * in the boot process. We allocate these special addresses
236bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * from the end of virtual memory (0xfffff000) backwards.
246bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * Also this lets us do fail-safe vmalloc(), we
256bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * can guarantee that these special addresses and
266bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * vmalloc()-ed addresses never overlap.
276bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin *
286bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * these 'compile-time allocated' memory buffers are
296bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * fixed-size 4k pages. (or larger if used with an increment
306bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * highger than 1) use fixmap_set(idx,phys) to associate
316bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * physical memory with fixmap indices.
326bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin *
336bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * TLB entries of such buffers will not be flushed across
346bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * task switches.
356bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin */
366bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
376bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin/*
386bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * on UP currently we will have no trace of the fixmap mechanizm,
396bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * no page table allocations, etc. This might change in the
406bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * future, say framebuffers for the console driver(s) could be
416bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * fix-mapped?
426bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin */
436bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinenum fixed_addresses {
446bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#define FIX_N_COLOURS 8
456bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	FIX_CMAP_BEGIN,
466bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	FIX_CMAP_END = FIX_CMAP_BEGIN + FIX_N_COLOURS,
476bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	__end_of_fixed_addresses
486bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin};
496bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
506bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin/*
516bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * used by vmalloc.c.
526bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin *
536bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * Leave one empty page between vmalloc'ed areas and
546bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * the start of the fixmap, and leave one page empty
556bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * at the top of mem..
566bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin */
576bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#define FIXADDR_TOP	((unsigned long)(long)(int)0xfefe0000)
586bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#define FIXADDR_SIZE	(__end_of_fixed_addresses << PAGE_SHIFT)
596bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#define FIXADDR_START	(FIXADDR_TOP - FIXADDR_SIZE)
606bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
616bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#define __fix_to_virt(x)	(FIXADDR_TOP - ((x) << PAGE_SHIFT))
626bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#define __virt_to_fix(x)	\
636bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	((FIXADDR_TOP - ((x) & PAGE_MASK)) >> PAGE_SHIFT)
646bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
656bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinextern void __this_fixmap_does_not_exist(void);
666bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
676bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin/*
686bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * 'index to address' translation. If anyone tries to use the idx
696bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * directly without tranlation, we catch the bug with a NULL-deference
706bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * kernel oops. Illegal ranges of incoming indices are caught too.
716bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin */
726bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinstatic inline unsigned long fix_to_virt(const unsigned int idx)
736bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin{
746bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	return __fix_to_virt(idx);
756bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin}
766bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
776bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinstatic inline unsigned long virt_to_fix(const unsigned long vaddr)
786bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin{
796bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	return __virt_to_fix(vaddr);
806bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin}
816bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
826bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#endif /* _ASM_SCORE_FIXMAP_H */
83