diff options
Diffstat (limited to 'arch/arm/mm/mm-armv.c')
-rw-r--r-- | arch/arm/mm/mm-armv.c | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/arch/arm/mm/mm-armv.c b/arch/arm/mm/mm-armv.c index 95273de4f772..d06440cc4e8f 100644 --- a/arch/arm/mm/mm-armv.c +++ b/arch/arm/mm/mm-armv.c | |||
@@ -303,16 +303,16 @@ static struct mem_types mem_types[] __initdata = { | |||
303 | .prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY | | 303 | .prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY | |
304 | L_PTE_WRITE, | 304 | L_PTE_WRITE, |
305 | .prot_l1 = PMD_TYPE_TABLE, | 305 | .prot_l1 = PMD_TYPE_TABLE, |
306 | .prot_sect = PMD_TYPE_SECT | PMD_SECT_UNCACHED | | 306 | .prot_sect = PMD_TYPE_SECT | PMD_BIT4 | PMD_SECT_UNCACHED | |
307 | PMD_SECT_AP_WRITE, | 307 | PMD_SECT_AP_WRITE, |
308 | .domain = DOMAIN_IO, | 308 | .domain = DOMAIN_IO, |
309 | }, | 309 | }, |
310 | [MT_CACHECLEAN] = { | 310 | [MT_CACHECLEAN] = { |
311 | .prot_sect = PMD_TYPE_SECT, | 311 | .prot_sect = PMD_TYPE_SECT | PMD_BIT4, |
312 | .domain = DOMAIN_KERNEL, | 312 | .domain = DOMAIN_KERNEL, |
313 | }, | 313 | }, |
314 | [MT_MINICLEAN] = { | 314 | [MT_MINICLEAN] = { |
315 | .prot_sect = PMD_TYPE_SECT | PMD_SECT_MINICACHE, | 315 | .prot_sect = PMD_TYPE_SECT | PMD_BIT4 | PMD_SECT_MINICACHE, |
316 | .domain = DOMAIN_KERNEL, | 316 | .domain = DOMAIN_KERNEL, |
317 | }, | 317 | }, |
318 | [MT_LOW_VECTORS] = { | 318 | [MT_LOW_VECTORS] = { |
@@ -328,25 +328,25 @@ static struct mem_types mem_types[] __initdata = { | |||
328 | .domain = DOMAIN_USER, | 328 | .domain = DOMAIN_USER, |
329 | }, | 329 | }, |
330 | [MT_MEMORY] = { | 330 | [MT_MEMORY] = { |
331 | .prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE, | 331 | .prot_sect = PMD_TYPE_SECT | PMD_BIT4 | PMD_SECT_AP_WRITE, |
332 | .domain = DOMAIN_KERNEL, | 332 | .domain = DOMAIN_KERNEL, |
333 | }, | 333 | }, |
334 | [MT_ROM] = { | 334 | [MT_ROM] = { |
335 | .prot_sect = PMD_TYPE_SECT, | 335 | .prot_sect = PMD_TYPE_SECT | PMD_BIT4, |
336 | .domain = DOMAIN_KERNEL, | 336 | .domain = DOMAIN_KERNEL, |
337 | }, | 337 | }, |
338 | [MT_IXP2000_DEVICE] = { /* IXP2400 requires XCB=101 for on-chip I/O */ | 338 | [MT_IXP2000_DEVICE] = { /* IXP2400 requires XCB=101 for on-chip I/O */ |
339 | .prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY | | 339 | .prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY | |
340 | L_PTE_WRITE, | 340 | L_PTE_WRITE, |
341 | .prot_l1 = PMD_TYPE_TABLE, | 341 | .prot_l1 = PMD_TYPE_TABLE, |
342 | .prot_sect = PMD_TYPE_SECT | PMD_SECT_UNCACHED | | 342 | .prot_sect = PMD_TYPE_SECT | PMD_BIT4 | PMD_SECT_UNCACHED | |
343 | PMD_SECT_AP_WRITE | PMD_SECT_BUFFERABLE | | 343 | PMD_SECT_AP_WRITE | PMD_SECT_BUFFERABLE | |
344 | PMD_SECT_TEX(1), | 344 | PMD_SECT_TEX(1), |
345 | .domain = DOMAIN_IO, | 345 | .domain = DOMAIN_IO, |
346 | }, | 346 | }, |
347 | [MT_NONSHARED_DEVICE] = { | 347 | [MT_NONSHARED_DEVICE] = { |
348 | .prot_l1 = PMD_TYPE_TABLE, | 348 | .prot_l1 = PMD_TYPE_TABLE, |
349 | .prot_sect = PMD_TYPE_SECT | PMD_SECT_NONSHARED_DEV | | 349 | .prot_sect = PMD_TYPE_SECT | PMD_BIT4 | PMD_SECT_NONSHARED_DEV | |
350 | PMD_SECT_AP_WRITE, | 350 | PMD_SECT_AP_WRITE, |
351 | .domain = DOMAIN_IO, | 351 | .domain = DOMAIN_IO, |
352 | } | 352 | } |
@@ -376,14 +376,21 @@ void __init build_mem_type_table(void) | |||
376 | ecc_mask = 0; | 376 | ecc_mask = 0; |
377 | } | 377 | } |
378 | 378 | ||
379 | if (cpu_arch <= CPU_ARCH_ARMv5TEJ && !cpu_is_xscale()) { | 379 | /* |
380 | for (i = 0; i < ARRAY_SIZE(mem_types); i++) { | 380 | * Xscale must not have PMD bit 4 set for section mappings. |
381 | */ | ||
382 | if (cpu_is_xscale()) | ||
383 | for (i = 0; i < ARRAY_SIZE(mem_types); i++) | ||
384 | mem_types[i].prot_sect &= ~PMD_BIT4; | ||
385 | |||
386 | /* | ||
387 | * ARMv5 and lower, excluding Xscale, bit 4 must be set for | ||
388 | * page tables. | ||
389 | */ | ||
390 | if (cpu_arch < CPU_ARCH_ARMv6 && !cpu_is_xscale()) | ||
391 | for (i = 0; i < ARRAY_SIZE(mem_types); i++) | ||
381 | if (mem_types[i].prot_l1) | 392 | if (mem_types[i].prot_l1) |
382 | mem_types[i].prot_l1 |= PMD_BIT4; | 393 | mem_types[i].prot_l1 |= PMD_BIT4; |
383 | if (mem_types[i].prot_sect) | ||
384 | mem_types[i].prot_sect |= PMD_BIT4; | ||
385 | } | ||
386 | } | ||
387 | 394 | ||
388 | cp = &cache_policies[cachepolicy]; | 395 | cp = &cache_policies[cachepolicy]; |
389 | kern_pgprot = user_pgprot = cp->pte; | 396 | kern_pgprot = user_pgprot = cp->pte; |
@@ -407,8 +414,8 @@ void __init build_mem_type_table(void) | |||
407 | * bit 4 becomes XN which we must clear for the | 414 | * bit 4 becomes XN which we must clear for the |
408 | * kernel memory mapping. | 415 | * kernel memory mapping. |
409 | */ | 416 | */ |
410 | mem_types[MT_MEMORY].prot_sect &= ~PMD_BIT4; | 417 | mem_types[MT_MEMORY].prot_sect &= ~PMD_SECT_XN; |
411 | mem_types[MT_ROM].prot_sect &= ~PMD_BIT4; | 418 | mem_types[MT_ROM].prot_sect &= ~PMD_SECT_XN; |
412 | 419 | ||
413 | /* | 420 | /* |
414 | * Mark cache clean areas and XIP ROM read only | 421 | * Mark cache clean areas and XIP ROM read only |