aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mm/mm-armv.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mm/mm-armv.c')
-rw-r--r--arch/arm/mm/mm-armv.c26
1 files changed, 11 insertions, 15 deletions
diff --git a/arch/arm/mm/mm-armv.c b/arch/arm/mm/mm-armv.c
index 4dae00bf7a56..d125a3dc061c 100644
--- a/arch/arm/mm/mm-armv.c
+++ b/arch/arm/mm/mm-armv.c
@@ -295,14 +295,10 @@ alloc_init_page(unsigned long virt, unsigned long phys, unsigned int prot_l1, pg
295 pte_t *ptep; 295 pte_t *ptep;
296 296
297 if (pmd_none(*pmdp)) { 297 if (pmd_none(*pmdp)) {
298 unsigned long pmdval;
299 ptep = alloc_bootmem_low_pages(2 * PTRS_PER_PTE * 298 ptep = alloc_bootmem_low_pages(2 * PTRS_PER_PTE *
300 sizeof(pte_t)); 299 sizeof(pte_t));
301 300
302 pmdval = __pa(ptep) | prot_l1; 301 __pmd_populate(pmdp, __pa(ptep) | prot_l1);
303 pmdp[0] = __pmd(pmdval);
304 pmdp[1] = __pmd(pmdval + 256 * sizeof(pte_t));
305 flush_pmd_entry(pmdp);
306 } 302 }
307 ptep = pte_offset_kernel(pmdp, virt); 303 ptep = pte_offset_kernel(pmdp, virt);
308 304
@@ -457,7 +453,7 @@ static void __init build_mem_type_table(void)
457 453
458 for (i = 0; i < 16; i++) { 454 for (i = 0; i < 16; i++) {
459 unsigned long v = pgprot_val(protection_map[i]); 455 unsigned long v = pgprot_val(protection_map[i]);
460 v &= (~(PTE_BUFFERABLE|PTE_CACHEABLE)) | user_pgprot; 456 v = (v & ~(PTE_BUFFERABLE|PTE_CACHEABLE)) | user_pgprot;
461 protection_map[i] = __pgprot(v); 457 protection_map[i] = __pgprot(v);
462 } 458 }
463 459
@@ -581,23 +577,23 @@ static void __init create_mapping(struct map_desc *md)
581 */ 577 */
582void setup_mm_for_reboot(char mode) 578void setup_mm_for_reboot(char mode)
583{ 579{
584 unsigned long pmdval; 580 unsigned long base_pmdval;
585 pgd_t *pgd; 581 pgd_t *pgd;
586 pmd_t *pmd;
587 int i; 582 int i;
588 int cpu_arch = cpu_architecture();
589 583
590 if (current->mm && current->mm->pgd) 584 if (current->mm && current->mm->pgd)
591 pgd = current->mm->pgd; 585 pgd = current->mm->pgd;
592 else 586 else
593 pgd = init_mm.pgd; 587 pgd = init_mm.pgd;
594 588
595 for (i = 0; i < FIRST_USER_PGD_NR + USER_PTRS_PER_PGD; i++) { 589 base_pmdval = PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | PMD_TYPE_SECT;
596 pmdval = (i << PGDIR_SHIFT) | 590 if (cpu_architecture() <= CPU_ARCH_ARMv5TEJ)
597 PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | 591 base_pmdval |= PMD_BIT4;
598 PMD_TYPE_SECT; 592
599 if (cpu_arch <= CPU_ARCH_ARMv5TEJ) 593 for (i = 0; i < FIRST_USER_PGD_NR + USER_PTRS_PER_PGD; i++, pgd++) {
600 pmdval |= PMD_BIT4; 594 unsigned long pmdval = (i << PGDIR_SHIFT) | base_pmdval;
595 pmd_t *pmd;
596
601 pmd = pmd_off(pgd, i << PGDIR_SHIFT); 597 pmd = pmd_off(pgd, i << PGDIR_SHIFT);
602 pmd[0] = __pmd(pmdval); 598 pmd[0] = __pmd(pmdval);
603 pmd[1] = __pmd(pmdval + (1 << (PGDIR_SHIFT - 1))); 599 pmd[1] = __pmd(pmdval + (1 << (PGDIR_SHIFT - 1)));