diff options
Diffstat (limited to 'include/asm-powerpc/page.h')
-rw-r--r-- | include/asm-powerpc/page.h | 45 |
1 files changed, 37 insertions, 8 deletions
diff --git a/include/asm-powerpc/page.h b/include/asm-powerpc/page.h index 6c850609b847..cffdf0eb0df6 100644 --- a/include/asm-powerpc/page.h +++ b/include/asm-powerpc/page.h | |||
@@ -12,6 +12,7 @@ | |||
12 | 12 | ||
13 | #include <asm/asm-compat.h> | 13 | #include <asm/asm-compat.h> |
14 | #include <asm/kdump.h> | 14 | #include <asm/kdump.h> |
15 | #include <asm/types.h> | ||
15 | 16 | ||
16 | /* | 17 | /* |
17 | * On PPC32 page size is 4K. For PPC64 we support either 4K or 64K software | 18 | * On PPC32 page size is 4K. For PPC64 we support either 4K or 64K software |
@@ -42,8 +43,23 @@ | |||
42 | * | 43 | * |
43 | * The kdump dump kernel is one example where KERNELBASE != PAGE_OFFSET. | 44 | * The kdump dump kernel is one example where KERNELBASE != PAGE_OFFSET. |
44 | * | 45 | * |
45 | * To get a physical address from a virtual one you subtract PAGE_OFFSET, | 46 | * PAGE_OFFSET is the virtual address of the start of lowmem. |
46 | * _not_ KERNELBASE. | 47 | * |
48 | * PHYSICAL_START is the physical address of the start of the kernel. | ||
49 | * | ||
50 | * MEMORY_START is the physical address of the start of lowmem. | ||
51 | * | ||
52 | * KERNELBASE, PAGE_OFFSET, and PHYSICAL_START are all configurable on | ||
53 | * ppc32 and based on how they are set we determine MEMORY_START. | ||
54 | * | ||
55 | * For the linear mapping the following equation should be true: | ||
56 | * KERNELBASE - PAGE_OFFSET = PHYSICAL_START - MEMORY_START | ||
57 | * | ||
58 | * Also, KERNELBASE >= PAGE_OFFSET and PHYSICAL_START >= MEMORY_START | ||
59 | * | ||
60 | * There are two was to determine a physical address from a virtual one: | ||
61 | * va = pa + PAGE_OFFSET - MEMORY_START | ||
62 | * va = pa + KERNELBASE - PHYSICAL_START | ||
47 | * | 63 | * |
48 | * If you want to know something's offset from the start of the kernel you | 64 | * If you want to know something's offset from the start of the kernel you |
49 | * should subtract KERNELBASE. | 65 | * should subtract KERNELBASE. |
@@ -51,20 +67,33 @@ | |||
51 | * If you want to test if something's a kernel address, use is_kernel_addr(). | 67 | * If you want to test if something's a kernel address, use is_kernel_addr(). |
52 | */ | 68 | */ |
53 | 69 | ||
54 | #define PAGE_OFFSET ASM_CONST(CONFIG_KERNEL_START) | 70 | #define KERNELBASE ASM_CONST(CONFIG_KERNEL_START) |
55 | #define KERNELBASE (PAGE_OFFSET + PHYSICAL_START) | 71 | #define PAGE_OFFSET ASM_CONST(CONFIG_PAGE_OFFSET) |
56 | #define LOAD_OFFSET PAGE_OFFSET | 72 | #define LOAD_OFFSET ASM_CONST((CONFIG_KERNEL_START-CONFIG_PHYSICAL_START)) |
73 | |||
74 | #if defined(CONFIG_RELOCATABLE) && defined(CONFIG_FLATMEM) | ||
75 | #ifndef __ASSEMBLY__ | ||
76 | extern phys_addr_t memstart_addr; | ||
77 | extern phys_addr_t kernstart_addr; | ||
78 | #endif | ||
79 | #define PHYSICAL_START kernstart_addr | ||
80 | #define MEMORY_START memstart_addr | ||
81 | #else | ||
82 | #define PHYSICAL_START ASM_CONST(CONFIG_PHYSICAL_START) | ||
83 | #define MEMORY_START (PHYSICAL_START + PAGE_OFFSET - KERNELBASE) | ||
84 | #endif | ||
57 | 85 | ||
58 | #ifdef CONFIG_FLATMEM | 86 | #ifdef CONFIG_FLATMEM |
59 | #define pfn_valid(pfn) ((pfn) < max_mapnr) | 87 | #define ARCH_PFN_OFFSET (MEMORY_START >> PAGE_SHIFT) |
88 | #define pfn_valid(pfn) ((pfn) >= ARCH_PFN_OFFSET && (pfn) < (ARCH_PFN_OFFSET + max_mapnr)) | ||
60 | #endif | 89 | #endif |
61 | 90 | ||
62 | #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) | 91 | #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) |
63 | #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) | 92 | #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) |
64 | #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT) | 93 | #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT) |
65 | 94 | ||
66 | #define __va(x) ((void *)((unsigned long)(x) + PAGE_OFFSET)) | 95 | #define __va(x) ((void *)((unsigned long)(x) - PHYSICAL_START + KERNELBASE)) |
67 | #define __pa(x) ((unsigned long)(x) - PAGE_OFFSET) | 96 | #define __pa(x) ((unsigned long)(x) + PHYSICAL_START - KERNELBASE) |
68 | 97 | ||
69 | /* | 98 | /* |
70 | * Unfortunately the PLT is in the BSS in the PPC32 ELF ABI, | 99 | * Unfortunately the PLT is in the BSS in the PPC32 ELF ABI, |