diff options
Diffstat (limited to 'arch/powerpc/mm')
-rw-r--r-- | arch/powerpc/mm/Makefile | 2 | ||||
-rw-r--r-- | arch/powerpc/mm/fault.c | 25 | ||||
-rw-r--r-- | arch/powerpc/mm/hash_native_64.c | 2 | ||||
-rw-r--r-- | arch/powerpc/mm/hash_utils_64.c | 2 | ||||
-rw-r--r-- | arch/powerpc/mm/init_64.c | 2 | ||||
-rw-r--r-- | arch/powerpc/mm/pgtable_32.c | 33 | ||||
-rw-r--r-- | arch/powerpc/mm/pgtable_64.c | 52 | ||||
-rw-r--r-- | arch/powerpc/mm/slb.c | 13 |
8 files changed, 63 insertions, 68 deletions
diff --git a/arch/powerpc/mm/Makefile b/arch/powerpc/mm/Makefile index 93441e7a2921..38a81967ca07 100644 --- a/arch/powerpc/mm/Makefile +++ b/arch/powerpc/mm/Makefile | |||
@@ -8,7 +8,7 @@ endif | |||
8 | 8 | ||
9 | obj-y := fault.o mem.o lmb.o | 9 | obj-y := fault.o mem.o lmb.o |
10 | obj-$(CONFIG_PPC32) += init_32.o pgtable_32.o mmu_context_32.o | 10 | obj-$(CONFIG_PPC32) += init_32.o pgtable_32.o mmu_context_32.o |
11 | hash-$(CONFIG_PPC_MULTIPLATFORM) := hash_native_64.o | 11 | hash-$(CONFIG_PPC_NATIVE) := hash_native_64.o |
12 | obj-$(CONFIG_PPC64) += init_64.o pgtable_64.o mmu_context_64.o \ | 12 | obj-$(CONFIG_PPC64) += init_64.o pgtable_64.o mmu_context_64.o \ |
13 | hash_utils_64.o hash_low_64.o tlb_64.o \ | 13 | hash_utils_64.o hash_low_64.o tlb_64.o \ |
14 | slb_low.o slb.o stab.o mmap.o imalloc.o \ | 14 | slb_low.o slb.o stab.o mmap.o imalloc.o \ |
diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c index e8fa50624b70..03aeb3a46077 100644 --- a/arch/powerpc/mm/fault.c +++ b/arch/powerpc/mm/fault.c | |||
@@ -426,18 +426,21 @@ void bad_page_fault(struct pt_regs *regs, unsigned long address, int sig) | |||
426 | 426 | ||
427 | /* kernel has accessed a bad area */ | 427 | /* kernel has accessed a bad area */ |
428 | 428 | ||
429 | printk(KERN_ALERT "Unable to handle kernel paging request for "); | ||
430 | switch (regs->trap) { | 429 | switch (regs->trap) { |
431 | case 0x300: | 430 | case 0x300: |
432 | case 0x380: | 431 | case 0x380: |
433 | printk("data at address 0x%08lx\n", regs->dar); | 432 | printk(KERN_ALERT "Unable to handle kernel paging request for " |
434 | break; | 433 | "data at address 0x%08lx\n", regs->dar); |
435 | case 0x400: | 434 | break; |
436 | case 0x480: | 435 | case 0x400: |
437 | printk("instruction fetch\n"); | 436 | case 0x480: |
438 | break; | 437 | printk(KERN_ALERT "Unable to handle kernel paging request for " |
439 | default: | 438 | "instruction fetch\n"); |
440 | printk("unknown fault\n"); | 439 | break; |
440 | default: | ||
441 | printk(KERN_ALERT "Unable to handle kernel paging request for " | ||
442 | "unknown fault\n"); | ||
443 | break; | ||
441 | } | 444 | } |
442 | printk(KERN_ALERT "Faulting instruction address: 0x%08lx\n", | 445 | printk(KERN_ALERT "Faulting instruction address: 0x%08lx\n", |
443 | regs->nip); | 446 | regs->nip); |
diff --git a/arch/powerpc/mm/hash_native_64.c b/arch/powerpc/mm/hash_native_64.c index c90f124f3c71..6f1016acdbf6 100644 --- a/arch/powerpc/mm/hash_native_64.c +++ b/arch/powerpc/mm/hash_native_64.c | |||
@@ -123,7 +123,7 @@ static inline void native_unlock_hpte(hpte_t *hptep) | |||
123 | clear_bit(HPTE_LOCK_BIT, word); | 123 | clear_bit(HPTE_LOCK_BIT, word); |
124 | } | 124 | } |
125 | 125 | ||
126 | long native_hpte_insert(unsigned long hpte_group, unsigned long va, | 126 | static long native_hpte_insert(unsigned long hpte_group, unsigned long va, |
127 | unsigned long pa, unsigned long rflags, | 127 | unsigned long pa, unsigned long rflags, |
128 | unsigned long vflags, int psize) | 128 | unsigned long vflags, int psize) |
129 | { | 129 | { |
diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c index 1915661c2c81..c0d2a694fa30 100644 --- a/arch/powerpc/mm/hash_utils_64.c +++ b/arch/powerpc/mm/hash_utils_64.c | |||
@@ -277,7 +277,7 @@ static void __init htab_init_page_sizes(void) | |||
277 | * Not in the device-tree, let's fallback on known size | 277 | * Not in the device-tree, let's fallback on known size |
278 | * list for 16M capable GP & GR | 278 | * list for 16M capable GP & GR |
279 | */ | 279 | */ |
280 | if (cpu_has_feature(CPU_FTR_16M_PAGE) && !machine_is(iseries)) | 280 | if (cpu_has_feature(CPU_FTR_16M_PAGE)) |
281 | memcpy(mmu_psize_defs, mmu_psize_defaults_gp, | 281 | memcpy(mmu_psize_defs, mmu_psize_defaults_gp, |
282 | sizeof(mmu_psize_defaults_gp)); | 282 | sizeof(mmu_psize_defaults_gp)); |
283 | found: | 283 | found: |
diff --git a/arch/powerpc/mm/init_64.c b/arch/powerpc/mm/init_64.c index 3ff374697e34..9a178549cbcf 100644 --- a/arch/powerpc/mm/init_64.c +++ b/arch/powerpc/mm/init_64.c | |||
@@ -130,7 +130,7 @@ static int __init setup_kcore(void) | |||
130 | /* GFP_ATOMIC to avoid might_sleep warnings during boot */ | 130 | /* GFP_ATOMIC to avoid might_sleep warnings during boot */ |
131 | kcore_mem = kmalloc(sizeof(struct kcore_list), GFP_ATOMIC); | 131 | kcore_mem = kmalloc(sizeof(struct kcore_list), GFP_ATOMIC); |
132 | if (!kcore_mem) | 132 | if (!kcore_mem) |
133 | panic("mem_init: kmalloc failed\n"); | 133 | panic("%s: kmalloc failed\n", __FUNCTION__); |
134 | 134 | ||
135 | kclist_add(kcore_mem, __va(base), size); | 135 | kclist_add(kcore_mem, __va(base), size); |
136 | } | 136 | } |
diff --git a/arch/powerpc/mm/pgtable_32.c b/arch/powerpc/mm/pgtable_32.c index 8fcacb0239da..1891dbeeb8e9 100644 --- a/arch/powerpc/mm/pgtable_32.c +++ b/arch/powerpc/mm/pgtable_32.c | |||
@@ -141,29 +141,19 @@ void pte_free(struct page *ptepage) | |||
141 | __free_page(ptepage); | 141 | __free_page(ptepage); |
142 | } | 142 | } |
143 | 143 | ||
144 | #ifndef CONFIG_PHYS_64BIT | ||
145 | void __iomem * | 144 | void __iomem * |
146 | ioremap(phys_addr_t addr, unsigned long size) | 145 | ioremap(phys_addr_t addr, unsigned long size) |
147 | { | 146 | { |
148 | return __ioremap(addr, size, _PAGE_NO_CACHE); | 147 | return __ioremap(addr, size, _PAGE_NO_CACHE); |
149 | } | 148 | } |
150 | #else /* CONFIG_PHYS_64BIT */ | 149 | EXPORT_SYMBOL(ioremap); |
151 | void __iomem * | ||
152 | ioremap64(unsigned long long addr, unsigned long size) | ||
153 | { | ||
154 | return __ioremap(addr, size, _PAGE_NO_CACHE); | ||
155 | } | ||
156 | EXPORT_SYMBOL(ioremap64); | ||
157 | 150 | ||
158 | void __iomem * | 151 | void __iomem * |
159 | ioremap(phys_addr_t addr, unsigned long size) | 152 | ioremap_flags(phys_addr_t addr, unsigned long size, unsigned long flags) |
160 | { | 153 | { |
161 | phys_addr_t addr64 = fixup_bigphys_addr(addr, size); | 154 | return __ioremap(addr, size, flags); |
162 | |||
163 | return ioremap64(addr64, size); | ||
164 | } | 155 | } |
165 | #endif /* CONFIG_PHYS_64BIT */ | 156 | EXPORT_SYMBOL(ioremap_flags); |
166 | EXPORT_SYMBOL(ioremap); | ||
167 | 157 | ||
168 | void __iomem * | 158 | void __iomem * |
169 | __ioremap(phys_addr_t addr, unsigned long size, unsigned long flags) | 159 | __ioremap(phys_addr_t addr, unsigned long size, unsigned long flags) |
@@ -264,20 +254,7 @@ void iounmap(volatile void __iomem *addr) | |||
264 | } | 254 | } |
265 | EXPORT_SYMBOL(iounmap); | 255 | EXPORT_SYMBOL(iounmap); |
266 | 256 | ||
267 | void __iomem *ioport_map(unsigned long port, unsigned int len) | 257 | int map_page(unsigned long va, phys_addr_t pa, int flags) |
268 | { | ||
269 | return (void __iomem *) (port + _IO_BASE); | ||
270 | } | ||
271 | |||
272 | void ioport_unmap(void __iomem *addr) | ||
273 | { | ||
274 | /* Nothing to do */ | ||
275 | } | ||
276 | EXPORT_SYMBOL(ioport_map); | ||
277 | EXPORT_SYMBOL(ioport_unmap); | ||
278 | |||
279 | int | ||
280 | map_page(unsigned long va, phys_addr_t pa, int flags) | ||
281 | { | 258 | { |
282 | pmd_t *pd; | 259 | pmd_t *pd; |
283 | pte_t *pg; | 260 | pte_t *pg; |
diff --git a/arch/powerpc/mm/pgtable_64.c b/arch/powerpc/mm/pgtable_64.c index ac64f4aaa509..16e4ee1c2318 100644 --- a/arch/powerpc/mm/pgtable_64.c +++ b/arch/powerpc/mm/pgtable_64.c | |||
@@ -113,7 +113,7 @@ static int map_io_page(unsigned long ea, unsigned long pa, int flags) | |||
113 | } | 113 | } |
114 | 114 | ||
115 | 115 | ||
116 | static void __iomem * __ioremap_com(unsigned long addr, unsigned long pa, | 116 | static void __iomem * __ioremap_com(phys_addr_t addr, unsigned long pa, |
117 | unsigned long ea, unsigned long size, | 117 | unsigned long ea, unsigned long size, |
118 | unsigned long flags) | 118 | unsigned long flags) |
119 | { | 119 | { |
@@ -129,22 +129,12 @@ static void __iomem * __ioremap_com(unsigned long addr, unsigned long pa, | |||
129 | return (void __iomem *) (ea + (addr & ~PAGE_MASK)); | 129 | return (void __iomem *) (ea + (addr & ~PAGE_MASK)); |
130 | } | 130 | } |
131 | 131 | ||
132 | 132 | void __iomem * __ioremap(phys_addr_t addr, unsigned long size, | |
133 | void __iomem * | ||
134 | ioremap(unsigned long addr, unsigned long size) | ||
135 | { | ||
136 | return __ioremap(addr, size, _PAGE_NO_CACHE | _PAGE_GUARDED); | ||
137 | } | ||
138 | |||
139 | void __iomem * __ioremap(unsigned long addr, unsigned long size, | ||
140 | unsigned long flags) | 133 | unsigned long flags) |
141 | { | 134 | { |
142 | unsigned long pa, ea; | 135 | unsigned long pa, ea; |
143 | void __iomem *ret; | 136 | void __iomem *ret; |
144 | 137 | ||
145 | if (firmware_has_feature(FW_FEATURE_ISERIES)) | ||
146 | return (void __iomem *)addr; | ||
147 | |||
148 | /* | 138 | /* |
149 | * Choose an address to map it to. | 139 | * Choose an address to map it to. |
150 | * Once the imalloc system is running, we use it. | 140 | * Once the imalloc system is running, we use it. |
@@ -178,9 +168,28 @@ void __iomem * __ioremap(unsigned long addr, unsigned long size, | |||
178 | return ret; | 168 | return ret; |
179 | } | 169 | } |
180 | 170 | ||
171 | |||
172 | void __iomem * ioremap(phys_addr_t addr, unsigned long size) | ||
173 | { | ||
174 | unsigned long flags = _PAGE_NO_CACHE | _PAGE_GUARDED; | ||
175 | |||
176 | if (ppc_md.ioremap) | ||
177 | return ppc_md.ioremap(addr, size, flags); | ||
178 | return __ioremap(addr, size, flags); | ||
179 | } | ||
180 | |||
181 | void __iomem * ioremap_flags(phys_addr_t addr, unsigned long size, | ||
182 | unsigned long flags) | ||
183 | { | ||
184 | if (ppc_md.ioremap) | ||
185 | return ppc_md.ioremap(addr, size, flags); | ||
186 | return __ioremap(addr, size, flags); | ||
187 | } | ||
188 | |||
189 | |||
181 | #define IS_PAGE_ALIGNED(_val) ((_val) == ((_val) & PAGE_MASK)) | 190 | #define IS_PAGE_ALIGNED(_val) ((_val) == ((_val) & PAGE_MASK)) |
182 | 191 | ||
183 | int __ioremap_explicit(unsigned long pa, unsigned long ea, | 192 | int __ioremap_explicit(phys_addr_t pa, unsigned long ea, |
184 | unsigned long size, unsigned long flags) | 193 | unsigned long size, unsigned long flags) |
185 | { | 194 | { |
186 | struct vm_struct *area; | 195 | struct vm_struct *area; |
@@ -235,13 +244,10 @@ int __ioremap_explicit(unsigned long pa, unsigned long ea, | |||
235 | * | 244 | * |
236 | * XXX what about calls before mem_init_done (ie python_countermeasures()) | 245 | * XXX what about calls before mem_init_done (ie python_countermeasures()) |
237 | */ | 246 | */ |
238 | void iounmap(volatile void __iomem *token) | 247 | void __iounmap(volatile void __iomem *token) |
239 | { | 248 | { |
240 | void *addr; | 249 | void *addr; |
241 | 250 | ||
242 | if (firmware_has_feature(FW_FEATURE_ISERIES)) | ||
243 | return; | ||
244 | |||
245 | if (!mem_init_done) | 251 | if (!mem_init_done) |
246 | return; | 252 | return; |
247 | 253 | ||
@@ -250,6 +256,14 @@ void iounmap(volatile void __iomem *token) | |||
250 | im_free(addr); | 256 | im_free(addr); |
251 | } | 257 | } |
252 | 258 | ||
259 | void iounmap(volatile void __iomem *token) | ||
260 | { | ||
261 | if (ppc_md.iounmap) | ||
262 | ppc_md.iounmap(token); | ||
263 | else | ||
264 | __iounmap(token); | ||
265 | } | ||
266 | |||
253 | static int iounmap_subset_regions(unsigned long addr, unsigned long size) | 267 | static int iounmap_subset_regions(unsigned long addr, unsigned long size) |
254 | { | 268 | { |
255 | struct vm_struct *area; | 269 | struct vm_struct *area; |
@@ -268,7 +282,7 @@ static int iounmap_subset_regions(unsigned long addr, unsigned long size) | |||
268 | return 0; | 282 | return 0; |
269 | } | 283 | } |
270 | 284 | ||
271 | int iounmap_explicit(volatile void __iomem *start, unsigned long size) | 285 | int __iounmap_explicit(volatile void __iomem *start, unsigned long size) |
272 | { | 286 | { |
273 | struct vm_struct *area; | 287 | struct vm_struct *area; |
274 | unsigned long addr; | 288 | unsigned long addr; |
@@ -303,8 +317,10 @@ int iounmap_explicit(volatile void __iomem *start, unsigned long size) | |||
303 | } | 317 | } |
304 | 318 | ||
305 | EXPORT_SYMBOL(ioremap); | 319 | EXPORT_SYMBOL(ioremap); |
320 | EXPORT_SYMBOL(ioremap_flags); | ||
306 | EXPORT_SYMBOL(__ioremap); | 321 | EXPORT_SYMBOL(__ioremap); |
307 | EXPORT_SYMBOL(iounmap); | 322 | EXPORT_SYMBOL(iounmap); |
323 | EXPORT_SYMBOL(__iounmap); | ||
308 | 324 | ||
309 | void __iomem * reserve_phb_iospace(unsigned long size) | 325 | void __iomem * reserve_phb_iospace(unsigned long size) |
310 | { | 326 | { |
diff --git a/arch/powerpc/mm/slb.c b/arch/powerpc/mm/slb.c index d3733912adb4..224e960650a0 100644 --- a/arch/powerpc/mm/slb.c +++ b/arch/powerpc/mm/slb.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <asm/cputable.h> | 23 | #include <asm/cputable.h> |
24 | #include <asm/cacheflush.h> | 24 | #include <asm/cacheflush.h> |
25 | #include <asm/smp.h> | 25 | #include <asm/smp.h> |
26 | #include <asm/firmware.h> | ||
26 | #include <linux/compiler.h> | 27 | #include <linux/compiler.h> |
27 | 28 | ||
28 | #ifdef DEBUG | 29 | #ifdef DEBUG |
@@ -193,6 +194,7 @@ static inline void patch_slb_encoding(unsigned int *insn_addr, | |||
193 | void slb_initialize(void) | 194 | void slb_initialize(void) |
194 | { | 195 | { |
195 | unsigned long linear_llp, vmalloc_llp, io_llp; | 196 | unsigned long linear_llp, vmalloc_llp, io_llp; |
197 | unsigned long lflags, vflags; | ||
196 | static int slb_encoding_inited; | 198 | static int slb_encoding_inited; |
197 | extern unsigned int *slb_miss_kernel_load_linear; | 199 | extern unsigned int *slb_miss_kernel_load_linear; |
198 | extern unsigned int *slb_miss_kernel_load_io; | 200 | extern unsigned int *slb_miss_kernel_load_io; |
@@ -225,11 +227,12 @@ void slb_initialize(void) | |||
225 | #endif | 227 | #endif |
226 | } | 228 | } |
227 | 229 | ||
230 | get_paca()->stab_rr = SLB_NUM_BOLTED; | ||
231 | |||
228 | /* On iSeries the bolted entries have already been set up by | 232 | /* On iSeries the bolted entries have already been set up by |
229 | * the hypervisor from the lparMap data in head.S */ | 233 | * the hypervisor from the lparMap data in head.S */ |
230 | #ifndef CONFIG_PPC_ISERIES | 234 | if (firmware_has_feature(FW_FEATURE_ISERIES)) |
231 | { | 235 | return; |
232 | unsigned long lflags, vflags; | ||
233 | 236 | ||
234 | lflags = SLB_VSID_KERNEL | linear_llp; | 237 | lflags = SLB_VSID_KERNEL | linear_llp; |
235 | vflags = SLB_VSID_KERNEL | vmalloc_llp; | 238 | vflags = SLB_VSID_KERNEL | vmalloc_llp; |
@@ -247,8 +250,4 @@ void slb_initialize(void) | |||
247 | * elsewhere, we'll call _switch() which will bolt in the new | 250 | * elsewhere, we'll call _switch() which will bolt in the new |
248 | * one. */ | 251 | * one. */ |
249 | asm volatile("isync":::"memory"); | 252 | asm volatile("isync":::"memory"); |
250 | } | ||
251 | #endif /* CONFIG_PPC_ISERIES */ | ||
252 | |||
253 | get_paca()->stab_rr = SLB_NUM_BOLTED; | ||
254 | } | 253 | } |