diff options
Diffstat (limited to 'arch/powerpc/mm/mem.c')
-rw-r--r-- | arch/powerpc/mm/mem.c | 37 |
1 files changed, 29 insertions, 8 deletions
diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c index 16def4dcff6d..5ccb579b81e4 100644 --- a/arch/powerpc/mm/mem.c +++ b/arch/powerpc/mm/mem.c | |||
@@ -45,6 +45,7 @@ | |||
45 | #include <asm/tlb.h> | 45 | #include <asm/tlb.h> |
46 | #include <asm/sections.h> | 46 | #include <asm/sections.h> |
47 | #include <asm/vdso.h> | 47 | #include <asm/vdso.h> |
48 | #include <asm/fixmap.h> | ||
48 | 49 | ||
49 | #include "mmu_decl.h" | 50 | #include "mmu_decl.h" |
50 | 51 | ||
@@ -57,6 +58,20 @@ int init_bootmem_done; | |||
57 | int mem_init_done; | 58 | int mem_init_done; |
58 | unsigned long memory_limit; | 59 | unsigned long memory_limit; |
59 | 60 | ||
61 | #ifdef CONFIG_HIGHMEM | ||
62 | pte_t *kmap_pte; | ||
63 | pgprot_t kmap_prot; | ||
64 | |||
65 | EXPORT_SYMBOL(kmap_prot); | ||
66 | EXPORT_SYMBOL(kmap_pte); | ||
67 | |||
68 | static inline pte_t *virt_to_kpte(unsigned long vaddr) | ||
69 | { | ||
70 | return pte_offset_kernel(pmd_offset(pud_offset(pgd_offset_k(vaddr), | ||
71 | vaddr), vaddr), vaddr); | ||
72 | } | ||
73 | #endif | ||
74 | |||
60 | int page_is_ram(unsigned long pfn) | 75 | int page_is_ram(unsigned long pfn) |
61 | { | 76 | { |
62 | unsigned long paddr = (pfn << PAGE_SHIFT); | 77 | unsigned long paddr = (pfn << PAGE_SHIFT); |
@@ -216,7 +231,7 @@ void __init do_init_bootmem(void) | |||
216 | unsigned long total_pages; | 231 | unsigned long total_pages; |
217 | int boot_mapsize; | 232 | int boot_mapsize; |
218 | 233 | ||
219 | max_pfn = lmb_end_of_DRAM() >> PAGE_SHIFT; | 234 | max_low_pfn = max_pfn = lmb_end_of_DRAM() >> PAGE_SHIFT; |
220 | total_pages = (lmb_end_of_DRAM() - memstart_addr) >> PAGE_SHIFT; | 235 | total_pages = (lmb_end_of_DRAM() - memstart_addr) >> PAGE_SHIFT; |
221 | #ifdef CONFIG_HIGHMEM | 236 | #ifdef CONFIG_HIGHMEM |
222 | total_pages = total_lowmem >> PAGE_SHIFT; | 237 | total_pages = total_lowmem >> PAGE_SHIFT; |
@@ -232,7 +247,8 @@ void __init do_init_bootmem(void) | |||
232 | 247 | ||
233 | start = lmb_alloc(bootmap_pages << PAGE_SHIFT, PAGE_SIZE); | 248 | start = lmb_alloc(bootmap_pages << PAGE_SHIFT, PAGE_SIZE); |
234 | 249 | ||
235 | boot_mapsize = init_bootmem(start >> PAGE_SHIFT, total_pages); | 250 | min_low_pfn = MEMORY_START >> PAGE_SHIFT; |
251 | boot_mapsize = init_bootmem_node(NODE_DATA(0), start >> PAGE_SHIFT, min_low_pfn, max_low_pfn); | ||
236 | 252 | ||
237 | /* Add active regions with valid PFNs */ | 253 | /* Add active regions with valid PFNs */ |
238 | for (i = 0; i < lmb.memory.cnt; i++) { | 254 | for (i = 0; i < lmb.memory.cnt; i++) { |
@@ -310,14 +326,19 @@ void __init paging_init(void) | |||
310 | unsigned long top_of_ram = lmb_end_of_DRAM(); | 326 | unsigned long top_of_ram = lmb_end_of_DRAM(); |
311 | unsigned long max_zone_pfns[MAX_NR_ZONES]; | 327 | unsigned long max_zone_pfns[MAX_NR_ZONES]; |
312 | 328 | ||
329 | #ifdef CONFIG_PPC32 | ||
330 | unsigned long v = __fix_to_virt(__end_of_fixed_addresses - 1); | ||
331 | unsigned long end = __fix_to_virt(FIX_HOLE); | ||
332 | |||
333 | for (; v < end; v += PAGE_SIZE) | ||
334 | map_page(v, 0, 0); /* XXX gross */ | ||
335 | #endif | ||
336 | |||
313 | #ifdef CONFIG_HIGHMEM | 337 | #ifdef CONFIG_HIGHMEM |
314 | map_page(PKMAP_BASE, 0, 0); /* XXX gross */ | 338 | map_page(PKMAP_BASE, 0, 0); /* XXX gross */ |
315 | pkmap_page_table = pte_offset_kernel(pmd_offset(pud_offset(pgd_offset_k | 339 | pkmap_page_table = virt_to_kpte(PKMAP_BASE); |
316 | (PKMAP_BASE), PKMAP_BASE), PKMAP_BASE), PKMAP_BASE); | 340 | |
317 | map_page(KMAP_FIX_BEGIN, 0, 0); /* XXX gross */ | 341 | kmap_pte = virt_to_kpte(__fix_to_virt(FIX_KMAP_BEGIN)); |
318 | kmap_pte = pte_offset_kernel(pmd_offset(pud_offset(pgd_offset_k | ||
319 | (KMAP_FIX_BEGIN), KMAP_FIX_BEGIN), KMAP_FIX_BEGIN), | ||
320 | KMAP_FIX_BEGIN); | ||
321 | kmap_prot = PAGE_KERNEL; | 342 | kmap_prot = PAGE_KERNEL; |
322 | #endif /* CONFIG_HIGHMEM */ | 343 | #endif /* CONFIG_HIGHMEM */ |
323 | 344 | ||