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 | ||
