diff options
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/arm/include/asm/pgtable-3level.h | 15 | ||||
| -rw-r--r-- | arch/arm/mm/mm.h | 1 | ||||
| -rw-r--r-- | arch/arm/mm/mmu.c | 7 |
3 files changed, 16 insertions, 7 deletions
diff --git a/arch/arm/include/asm/pgtable-3level.h b/arch/arm/include/asm/pgtable-3level.h index 03243f7eeddf..85c60adc8b60 100644 --- a/arch/arm/include/asm/pgtable-3level.h +++ b/arch/arm/include/asm/pgtable-3level.h | |||
| @@ -120,13 +120,16 @@ | |||
| 120 | /* | 120 | /* |
| 121 | * 2nd stage PTE definitions for LPAE. | 121 | * 2nd stage PTE definitions for LPAE. |
| 122 | */ | 122 | */ |
| 123 | #define L_PTE_S2_MT_UNCACHED (_AT(pteval_t, 0x5) << 2) /* MemAttr[3:0] */ | 123 | #define L_PTE_S2_MT_UNCACHED (_AT(pteval_t, 0x0) << 2) /* strongly ordered */ |
| 124 | #define L_PTE_S2_MT_WRITETHROUGH (_AT(pteval_t, 0xa) << 2) /* MemAttr[3:0] */ | 124 | #define L_PTE_S2_MT_WRITETHROUGH (_AT(pteval_t, 0xa) << 2) /* normal inner write-through */ |
| 125 | #define L_PTE_S2_MT_WRITEBACK (_AT(pteval_t, 0xf) << 2) /* MemAttr[3:0] */ | 125 | #define L_PTE_S2_MT_WRITEBACK (_AT(pteval_t, 0xf) << 2) /* normal inner write-back */ |
| 126 | #define L_PTE_S2_RDONLY (_AT(pteval_t, 1) << 6) /* HAP[1] */ | 126 | #define L_PTE_S2_MT_DEV_SHARED (_AT(pteval_t, 0x1) << 2) /* device */ |
| 127 | #define L_PTE_S2_RDWR (_AT(pteval_t, 3) << 6) /* HAP[2:1] */ | 127 | #define L_PTE_S2_MT_MASK (_AT(pteval_t, 0xf) << 2) |
| 128 | 128 | ||
| 129 | #define L_PMD_S2_RDWR (_AT(pmdval_t, 3) << 6) /* HAP[2:1] */ | 129 | #define L_PTE_S2_RDONLY (_AT(pteval_t, 1) << 6) /* HAP[1] */ |
| 130 | #define L_PTE_S2_RDWR (_AT(pteval_t, 3) << 6) /* HAP[2:1] */ | ||
| 131 | |||
| 132 | #define L_PMD_S2_RDWR (_AT(pmdval_t, 3) << 6) /* HAP[2:1] */ | ||
| 130 | 133 | ||
| 131 | /* | 134 | /* |
| 132 | * Hyp-mode PL2 PTE definitions for LPAE. | 135 | * Hyp-mode PL2 PTE definitions for LPAE. |
diff --git a/arch/arm/mm/mm.h b/arch/arm/mm/mm.h index d5a982d15a88..7ea641b7aa7d 100644 --- a/arch/arm/mm/mm.h +++ b/arch/arm/mm/mm.h | |||
| @@ -38,6 +38,7 @@ static inline pmd_t *pmd_off_k(unsigned long virt) | |||
| 38 | 38 | ||
| 39 | struct mem_type { | 39 | struct mem_type { |
| 40 | pteval_t prot_pte; | 40 | pteval_t prot_pte; |
| 41 | pteval_t prot_pte_s2; | ||
| 41 | pmdval_t prot_l1; | 42 | pmdval_t prot_l1; |
| 42 | pmdval_t prot_sect; | 43 | pmdval_t prot_sect; |
| 43 | unsigned int domain; | 44 | unsigned int domain; |
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index 4f08c133cc25..a623cb3ad012 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c | |||
| @@ -232,12 +232,16 @@ __setup("noalign", noalign_setup); | |||
| 232 | #endif /* ifdef CONFIG_CPU_CP15 / else */ | 232 | #endif /* ifdef CONFIG_CPU_CP15 / else */ |
| 233 | 233 | ||
| 234 | #define PROT_PTE_DEVICE L_PTE_PRESENT|L_PTE_YOUNG|L_PTE_DIRTY|L_PTE_XN | 234 | #define PROT_PTE_DEVICE L_PTE_PRESENT|L_PTE_YOUNG|L_PTE_DIRTY|L_PTE_XN |
| 235 | #define PROT_PTE_S2_DEVICE PROT_PTE_DEVICE | ||
| 235 | #define PROT_SECT_DEVICE PMD_TYPE_SECT|PMD_SECT_AP_WRITE | 236 | #define PROT_SECT_DEVICE PMD_TYPE_SECT|PMD_SECT_AP_WRITE |
| 236 | 237 | ||
| 237 | static struct mem_type mem_types[] = { | 238 | static struct mem_type mem_types[] = { |
| 238 | [MT_DEVICE] = { /* Strongly ordered / ARMv6 shared device */ | 239 | [MT_DEVICE] = { /* Strongly ordered / ARMv6 shared device */ |
| 239 | .prot_pte = PROT_PTE_DEVICE | L_PTE_MT_DEV_SHARED | | 240 | .prot_pte = PROT_PTE_DEVICE | L_PTE_MT_DEV_SHARED | |
| 240 | L_PTE_SHARED, | 241 | L_PTE_SHARED, |
| 242 | .prot_pte_s2 = s2_policy(PROT_PTE_S2_DEVICE) | | ||
| 243 | s2_policy(L_PTE_S2_MT_DEV_SHARED) | | ||
| 244 | L_PTE_SHARED, | ||
| 241 | .prot_l1 = PMD_TYPE_TABLE, | 245 | .prot_l1 = PMD_TYPE_TABLE, |
| 242 | .prot_sect = PROT_SECT_DEVICE | PMD_SECT_S, | 246 | .prot_sect = PROT_SECT_DEVICE | PMD_SECT_S, |
| 243 | .domain = DOMAIN_IO, | 247 | .domain = DOMAIN_IO, |
| @@ -508,7 +512,8 @@ static void __init build_mem_type_table(void) | |||
| 508 | cp = &cache_policies[cachepolicy]; | 512 | cp = &cache_policies[cachepolicy]; |
| 509 | vecs_pgprot = kern_pgprot = user_pgprot = cp->pte; | 513 | vecs_pgprot = kern_pgprot = user_pgprot = cp->pte; |
| 510 | s2_pgprot = cp->pte_s2; | 514 | s2_pgprot = cp->pte_s2; |
| 511 | hyp_device_pgprot = s2_device_pgprot = mem_types[MT_DEVICE].prot_pte; | 515 | hyp_device_pgprot = mem_types[MT_DEVICE].prot_pte; |
| 516 | s2_device_pgprot = mem_types[MT_DEVICE].prot_pte_s2; | ||
| 512 | 517 | ||
| 513 | /* | 518 | /* |
| 514 | * ARMv6 and above have extended page tables. | 519 | * ARMv6 and above have extended page tables. |
