diff options
Diffstat (limited to 'arch/powerpc/mm/pgtable_32.c')
-rw-r--r-- | arch/powerpc/mm/pgtable_32.c | 56 |
1 files changed, 23 insertions, 33 deletions
diff --git a/arch/powerpc/mm/pgtable_32.c b/arch/powerpc/mm/pgtable_32.c index c31d6d26f0b5..38ff35f2142a 100644 --- a/arch/powerpc/mm/pgtable_32.c +++ b/arch/powerpc/mm/pgtable_32.c | |||
@@ -48,10 +48,6 @@ EXPORT_SYMBOL(ioremap_bot); /* aka VMALLOC_END */ | |||
48 | 48 | ||
49 | extern char etext[], _stext[]; | 49 | extern char etext[], _stext[]; |
50 | 50 | ||
51 | #ifdef CONFIG_SMP | ||
52 | extern void hash_page_sync(void); | ||
53 | #endif | ||
54 | |||
55 | #ifdef HAVE_BATS | 51 | #ifdef HAVE_BATS |
56 | extern phys_addr_t v_mapped_by_bats(unsigned long va); | 52 | extern phys_addr_t v_mapped_by_bats(unsigned long va); |
57 | extern unsigned long p_mapped_by_bats(phys_addr_t pa); | 53 | extern unsigned long p_mapped_by_bats(phys_addr_t pa); |
@@ -72,24 +68,29 @@ extern unsigned long p_mapped_by_tlbcam(unsigned long pa); | |||
72 | #define p_mapped_by_tlbcam(x) (0UL) | 68 | #define p_mapped_by_tlbcam(x) (0UL) |
73 | #endif /* HAVE_TLBCAM */ | 69 | #endif /* HAVE_TLBCAM */ |
74 | 70 | ||
75 | #ifdef CONFIG_PTE_64BIT | 71 | #define PGDIR_ORDER (32 + PGD_T_LOG2 - PGDIR_SHIFT) |
76 | /* Some processors use an 8kB pgdir because they have 8-byte Linux PTEs. */ | ||
77 | #define PGDIR_ORDER 1 | ||
78 | #else | ||
79 | #define PGDIR_ORDER 0 | ||
80 | #endif | ||
81 | 72 | ||
82 | pgd_t *pgd_alloc(struct mm_struct *mm) | 73 | pgd_t *pgd_alloc(struct mm_struct *mm) |
83 | { | 74 | { |
84 | pgd_t *ret; | 75 | pgd_t *ret; |
85 | 76 | ||
86 | ret = (pgd_t *)__get_free_pages(GFP_KERNEL|__GFP_ZERO, PGDIR_ORDER); | 77 | /* pgdir take page or two with 4K pages and a page fraction otherwise */ |
78 | #ifndef CONFIG_PPC_4K_PAGES | ||
79 | ret = (pgd_t *)kzalloc(1 << PGDIR_ORDER, GFP_KERNEL); | ||
80 | #else | ||
81 | ret = (pgd_t *)__get_free_pages(GFP_KERNEL|__GFP_ZERO, | ||
82 | PGDIR_ORDER - PAGE_SHIFT); | ||
83 | #endif | ||
87 | return ret; | 84 | return ret; |
88 | } | 85 | } |
89 | 86 | ||
90 | void pgd_free(struct mm_struct *mm, pgd_t *pgd) | 87 | void pgd_free(struct mm_struct *mm, pgd_t *pgd) |
91 | { | 88 | { |
92 | free_pages((unsigned long)pgd, PGDIR_ORDER); | 89 | #ifndef CONFIG_PPC_4K_PAGES |
90 | kfree((void *)pgd); | ||
91 | #else | ||
92 | free_pages((unsigned long)pgd, PGDIR_ORDER - PAGE_SHIFT); | ||
93 | #endif | ||
93 | } | 94 | } |
94 | 95 | ||
95 | __init_refok pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address) | 96 | __init_refok pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address) |
@@ -125,23 +126,6 @@ pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long address) | |||
125 | return ptepage; | 126 | return ptepage; |
126 | } | 127 | } |
127 | 128 | ||
128 | void pte_free_kernel(struct mm_struct *mm, pte_t *pte) | ||
129 | { | ||
130 | #ifdef CONFIG_SMP | ||
131 | hash_page_sync(); | ||
132 | #endif | ||
133 | free_page((unsigned long)pte); | ||
134 | } | ||
135 | |||
136 | void pte_free(struct mm_struct *mm, pgtable_t ptepage) | ||
137 | { | ||
138 | #ifdef CONFIG_SMP | ||
139 | hash_page_sync(); | ||
140 | #endif | ||
141 | pgtable_page_dtor(ptepage); | ||
142 | __free_page(ptepage); | ||
143 | } | ||
144 | |||
145 | void __iomem * | 129 | void __iomem * |
146 | ioremap(phys_addr_t addr, unsigned long size) | 130 | ioremap(phys_addr_t addr, unsigned long size) |
147 | { | 131 | { |
@@ -194,6 +178,7 @@ __ioremap(phys_addr_t addr, unsigned long size, unsigned long flags) | |||
194 | if (p < 16*1024*1024) | 178 | if (p < 16*1024*1024) |
195 | p += _ISA_MEM_BASE; | 179 | p += _ISA_MEM_BASE; |
196 | 180 | ||
181 | #ifndef CONFIG_CRASH_DUMP | ||
197 | /* | 182 | /* |
198 | * Don't allow anybody to remap normal RAM that we're using. | 183 | * Don't allow anybody to remap normal RAM that we're using. |
199 | * mem_init() sets high_memory so only do the check after that. | 184 | * mem_init() sets high_memory so only do the check after that. |
@@ -203,6 +188,7 @@ __ioremap(phys_addr_t addr, unsigned long size, unsigned long flags) | |||
203 | (unsigned long long)p, __builtin_return_address(0)); | 188 | (unsigned long long)p, __builtin_return_address(0)); |
204 | return NULL; | 189 | return NULL; |
205 | } | 190 | } |
191 | #endif | ||
206 | 192 | ||
207 | if (size == 0) | 193 | if (size == 0) |
208 | return NULL; | 194 | return NULL; |
@@ -288,7 +274,7 @@ int map_page(unsigned long va, phys_addr_t pa, int flags) | |||
288 | } | 274 | } |
289 | 275 | ||
290 | /* | 276 | /* |
291 | * Map in a big chunk of physical memory starting at KERNELBASE. | 277 | * Map in a big chunk of physical memory starting at PAGE_OFFSET. |
292 | */ | 278 | */ |
293 | void __init mapin_ram(void) | 279 | void __init mapin_ram(void) |
294 | { | 280 | { |
@@ -297,7 +283,7 @@ void __init mapin_ram(void) | |||
297 | int ktext; | 283 | int ktext; |
298 | 284 | ||
299 | s = mmu_mapin_ram(); | 285 | s = mmu_mapin_ram(); |
300 | v = KERNELBASE + s; | 286 | v = PAGE_OFFSET + s; |
301 | p = memstart_addr + s; | 287 | p = memstart_addr + s; |
302 | for (; s < total_lowmem; s += PAGE_SIZE) { | 288 | for (; s < total_lowmem; s += PAGE_SIZE) { |
303 | ktext = ((char *) v >= _stext && (char *) v < etext); | 289 | ktext = ((char *) v >= _stext && (char *) v < etext); |
@@ -363,7 +349,11 @@ static int __change_page_attr(struct page *page, pgprot_t prot) | |||
363 | return -EINVAL; | 349 | return -EINVAL; |
364 | set_pte_at(&init_mm, address, kpte, mk_pte(page, prot)); | 350 | set_pte_at(&init_mm, address, kpte, mk_pte(page, prot)); |
365 | wmb(); | 351 | wmb(); |
366 | flush_HPTE(0, address, pmd_val(*kpmd)); | 352 | #ifdef CONFIG_PPC_STD_MMU |
353 | flush_hash_pages(0, address, pmd_val(*kpmd), 1); | ||
354 | #else | ||
355 | flush_tlb_page(NULL, address); | ||
356 | #endif | ||
367 | pte_unmap(kpte); | 357 | pte_unmap(kpte); |
368 | 358 | ||
369 | return 0; | 359 | return 0; |
@@ -400,7 +390,7 @@ void kernel_map_pages(struct page *page, int numpages, int enable) | |||
400 | #endif /* CONFIG_DEBUG_PAGEALLOC */ | 390 | #endif /* CONFIG_DEBUG_PAGEALLOC */ |
401 | 391 | ||
402 | static int fixmaps; | 392 | static int fixmaps; |
403 | unsigned long FIXADDR_TOP = 0xfffff000; | 393 | unsigned long FIXADDR_TOP = (-PAGE_SIZE); |
404 | EXPORT_SYMBOL(FIXADDR_TOP); | 394 | EXPORT_SYMBOL(FIXADDR_TOP); |
405 | 395 | ||
406 | void __set_fixmap (enum fixed_addresses idx, phys_addr_t phys, pgprot_t flags) | 396 | void __set_fixmap (enum fixed_addresses idx, phys_addr_t phys, pgprot_t flags) |