| .. | .. |
|---|
| 1 | +/* SPDX-License-Identifier: GPL-2.0-only */ |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Copyright (C) 2012 ARM Ltd. |
|---|
| 3 | | - * |
|---|
| 4 | | - * This program is free software; you can redistribute it and/or modify |
|---|
| 5 | | - * it under the terms of the GNU General Public License version 2 as |
|---|
| 6 | | - * published by the Free Software Foundation. |
|---|
| 7 | | - * |
|---|
| 8 | | - * This program is distributed in the hope that it will be useful, |
|---|
| 9 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|---|
| 10 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|---|
| 11 | | - * GNU General Public License for more details. |
|---|
| 12 | | - * |
|---|
| 13 | | - * You should have received a copy of the GNU General Public License |
|---|
| 14 | | - * along with this program. If not, see <http://www.gnu.org/licenses/>. |
|---|
| 15 | 4 | */ |
|---|
| 16 | 5 | #ifndef __ASM_PGTABLE_HWDEF_H |
|---|
| 17 | 6 | #define __ASM_PGTABLE_HWDEF_H |
|---|
| .. | .. |
|---|
| 40 | 29 | * Size mapped by an entry at level n ( 0 <= n <= 3) |
|---|
| 41 | 30 | * We map (PAGE_SHIFT - 3) at all translation levels and PAGE_SHIFT bits |
|---|
| 42 | 31 | * in the final page. The maximum number of translation levels supported by |
|---|
| 43 | | - * the architecture is 4. Hence, starting at at level n, we have further |
|---|
| 32 | + * the architecture is 4. Hence, starting at level n, we have further |
|---|
| 44 | 33 | * ((4 - n) - 1) levels of translation excluding the offset within the page. |
|---|
| 45 | 34 | * So, the total number of bits mapped by an entry at level n is : |
|---|
| 46 | 35 | * |
|---|
| .. | .. |
|---|
| 92 | 81 | /* |
|---|
| 93 | 82 | * Contiguous page definitions. |
|---|
| 94 | 83 | */ |
|---|
| 95 | | -#ifdef CONFIG_ARM64_64K_PAGES |
|---|
| 96 | | -#define CONT_PTE_SHIFT 5 |
|---|
| 97 | | -#define CONT_PMD_SHIFT 5 |
|---|
| 98 | | -#elif defined(CONFIG_ARM64_16K_PAGES) |
|---|
| 99 | | -#define CONT_PTE_SHIFT 7 |
|---|
| 100 | | -#define CONT_PMD_SHIFT 5 |
|---|
| 101 | | -#else |
|---|
| 102 | | -#define CONT_PTE_SHIFT 4 |
|---|
| 103 | | -#define CONT_PMD_SHIFT 4 |
|---|
| 104 | | -#endif |
|---|
| 105 | | - |
|---|
| 106 | | -#define CONT_PTES (1 << CONT_PTE_SHIFT) |
|---|
| 84 | +#define CONT_PTE_SHIFT (CONFIG_ARM64_CONT_PTE_SHIFT + PAGE_SHIFT) |
|---|
| 85 | +#define CONT_PTES (1 << (CONT_PTE_SHIFT - PAGE_SHIFT)) |
|---|
| 107 | 86 | #define CONT_PTE_SIZE (CONT_PTES * PAGE_SIZE) |
|---|
| 108 | 87 | #define CONT_PTE_MASK (~(CONT_PTE_SIZE - 1)) |
|---|
| 109 | | -#define CONT_PMDS (1 << CONT_PMD_SHIFT) |
|---|
| 88 | + |
|---|
| 89 | +#define CONT_PMD_SHIFT (CONFIG_ARM64_CONT_PMD_SHIFT + PMD_SHIFT) |
|---|
| 90 | +#define CONT_PMDS (1 << (CONT_PMD_SHIFT - PMD_SHIFT)) |
|---|
| 110 | 91 | #define CONT_PMD_SIZE (CONT_PMDS * PMD_SIZE) |
|---|
| 111 | 92 | #define CONT_PMD_MASK (~(CONT_PMD_SIZE - 1)) |
|---|
| 112 | | -/* the the numerical offset of the PTE within a range of CONT_PTES */ |
|---|
| 113 | | -#define CONT_RANGE_OFFSET(addr) (((addr)>>PAGE_SHIFT)&(CONT_PTES-1)) |
|---|
| 114 | 93 | |
|---|
| 115 | 94 | /* |
|---|
| 116 | 95 | * Hardware page table definitions. |
|---|
| .. | .. |
|---|
| 121 | 100 | #define PUD_TABLE_BIT (_AT(pudval_t, 1) << 1) |
|---|
| 122 | 101 | #define PUD_TYPE_MASK (_AT(pudval_t, 3) << 0) |
|---|
| 123 | 102 | #define PUD_TYPE_SECT (_AT(pudval_t, 1) << 0) |
|---|
| 103 | +#define PUD_SECT_RDONLY (_AT(pudval_t, 1) << 7) /* AP[2] */ |
|---|
| 124 | 104 | |
|---|
| 125 | 105 | /* |
|---|
| 126 | 106 | * Level 2 descriptor (PMD). |
|---|
| 127 | 107 | */ |
|---|
| 128 | 108 | #define PMD_TYPE_MASK (_AT(pmdval_t, 3) << 0) |
|---|
| 129 | | -#define PMD_TYPE_FAULT (_AT(pmdval_t, 0) << 0) |
|---|
| 130 | 109 | #define PMD_TYPE_TABLE (_AT(pmdval_t, 3) << 0) |
|---|
| 131 | 110 | #define PMD_TYPE_SECT (_AT(pmdval_t, 1) << 0) |
|---|
| 132 | 111 | #define PMD_TABLE_BIT (_AT(pmdval_t, 1) << 1) |
|---|
| .. | .. |
|---|
| 153 | 132 | /* |
|---|
| 154 | 133 | * Level 3 descriptor (PTE). |
|---|
| 155 | 134 | */ |
|---|
| 135 | +#define PTE_VALID (_AT(pteval_t, 1) << 0) |
|---|
| 156 | 136 | #define PTE_TYPE_MASK (_AT(pteval_t, 3) << 0) |
|---|
| 157 | | -#define PTE_TYPE_FAULT (_AT(pteval_t, 0) << 0) |
|---|
| 158 | 137 | #define PTE_TYPE_PAGE (_AT(pteval_t, 3) << 0) |
|---|
| 159 | 138 | #define PTE_TABLE_BIT (_AT(pteval_t, 1) << 1) |
|---|
| 160 | 139 | #define PTE_USER (_AT(pteval_t, 1) << 6) /* AP[1] */ |
|---|
| .. | .. |
|---|
| 162 | 141 | #define PTE_SHARED (_AT(pteval_t, 3) << 8) /* SH[1:0], inner shareable */ |
|---|
| 163 | 142 | #define PTE_AF (_AT(pteval_t, 1) << 10) /* Access Flag */ |
|---|
| 164 | 143 | #define PTE_NG (_AT(pteval_t, 1) << 11) /* nG */ |
|---|
| 144 | +#define PTE_GP (_AT(pteval_t, 1) << 50) /* BTI guarded */ |
|---|
| 165 | 145 | #define PTE_DBM (_AT(pteval_t, 1) << 51) /* Dirty Bit Management */ |
|---|
| 166 | 146 | #define PTE_CONT (_AT(pteval_t, 1) << 52) /* Contiguous range */ |
|---|
| 167 | 147 | #define PTE_PXN (_AT(pteval_t, 1) << 53) /* Privileged XN */ |
|---|
| 168 | 148 | #define PTE_UXN (_AT(pteval_t, 1) << 54) /* User XN */ |
|---|
| 169 | | -#define PTE_HYP_XN (_AT(pteval_t, 1) << 54) /* HYP XN */ |
|---|
| 170 | 149 | |
|---|
| 171 | 150 | #define PTE_ADDR_LOW (((_AT(pteval_t, 1) << (48 - PAGE_SHIFT)) - 1) << PAGE_SHIFT) |
|---|
| 172 | 151 | #ifdef CONFIG_ARM64_PA_BITS_52 |
|---|
| .. | .. |
|---|
| 183 | 162 | #define PTE_ATTRINDX_MASK (_AT(pteval_t, 7) << 2) |
|---|
| 184 | 163 | |
|---|
| 185 | 164 | /* |
|---|
| 186 | | - * 2nd stage PTE definitions |
|---|
| 187 | | - */ |
|---|
| 188 | | -#define PTE_S2_RDONLY (_AT(pteval_t, 1) << 6) /* HAP[2:1] */ |
|---|
| 189 | | -#define PTE_S2_RDWR (_AT(pteval_t, 3) << 6) /* HAP[2:1] */ |
|---|
| 190 | | -#define PTE_S2_XN (_AT(pteval_t, 2) << 53) /* XN[1:0] */ |
|---|
| 191 | | - |
|---|
| 192 | | -#define PMD_S2_RDONLY (_AT(pmdval_t, 1) << 6) /* HAP[2:1] */ |
|---|
| 193 | | -#define PMD_S2_RDWR (_AT(pmdval_t, 3) << 6) /* HAP[2:1] */ |
|---|
| 194 | | -#define PMD_S2_XN (_AT(pmdval_t, 2) << 53) /* XN[1:0] */ |
|---|
| 195 | | - |
|---|
| 196 | | -/* |
|---|
| 197 | 165 | * Memory Attribute override for Stage-2 (MemAttr[3:0]) |
|---|
| 198 | 166 | */ |
|---|
| 199 | 167 | #define PTE_S2_MEMATTR(t) (_AT(pteval_t, (t)) << 2) |
|---|
| 200 | | -#define PTE_S2_MEMATTR_MASK (_AT(pteval_t, 0xf) << 2) |
|---|
| 201 | | - |
|---|
| 202 | | -/* |
|---|
| 203 | | - * EL2/HYP PTE/PMD definitions |
|---|
| 204 | | - */ |
|---|
| 205 | | -#define PMD_HYP PMD_SECT_USER |
|---|
| 206 | | -#define PTE_HYP PTE_USER |
|---|
| 207 | 168 | |
|---|
| 208 | 169 | /* |
|---|
| 209 | 170 | * Highest possible physical address supported. |
|---|
| 210 | 171 | */ |
|---|
| 211 | 172 | #define PHYS_MASK_SHIFT (CONFIG_ARM64_PA_BITS) |
|---|
| 212 | 173 | #define PHYS_MASK ((UL(1) << PHYS_MASK_SHIFT) - 1) |
|---|
| 174 | + |
|---|
| 175 | +#define TTBR_CNP_BIT (UL(1) << 0) |
|---|
| 213 | 176 | |
|---|
| 214 | 177 | /* |
|---|
| 215 | 178 | * TCR flags. |
|---|
| .. | .. |
|---|
| 221 | 184 | #define TCR_TxSZ(x) (TCR_T0SZ(x) | TCR_T1SZ(x)) |
|---|
| 222 | 185 | #define TCR_TxSZ_WIDTH 6 |
|---|
| 223 | 186 | #define TCR_T0SZ_MASK (((UL(1) << TCR_TxSZ_WIDTH) - 1) << TCR_T0SZ_OFFSET) |
|---|
| 187 | +#define TCR_T1SZ_MASK (((UL(1) << TCR_TxSZ_WIDTH) - 1) << TCR_T1SZ_OFFSET) |
|---|
| 224 | 188 | |
|---|
| 189 | +#define TCR_EPD0_SHIFT 7 |
|---|
| 190 | +#define TCR_EPD0_MASK (UL(1) << TCR_EPD0_SHIFT) |
|---|
| 225 | 191 | #define TCR_IRGN0_SHIFT 8 |
|---|
| 226 | 192 | #define TCR_IRGN0_MASK (UL(3) << TCR_IRGN0_SHIFT) |
|---|
| 227 | 193 | #define TCR_IRGN0_NC (UL(0) << TCR_IRGN0_SHIFT) |
|---|
| .. | .. |
|---|
| 229 | 195 | #define TCR_IRGN0_WT (UL(2) << TCR_IRGN0_SHIFT) |
|---|
| 230 | 196 | #define TCR_IRGN0_WBnWA (UL(3) << TCR_IRGN0_SHIFT) |
|---|
| 231 | 197 | |
|---|
| 198 | +#define TCR_EPD1_SHIFT 23 |
|---|
| 199 | +#define TCR_EPD1_MASK (UL(1) << TCR_EPD1_SHIFT) |
|---|
| 232 | 200 | #define TCR_IRGN1_SHIFT 24 |
|---|
| 233 | 201 | #define TCR_IRGN1_MASK (UL(3) << TCR_IRGN1_SHIFT) |
|---|
| 234 | 202 | #define TCR_IRGN1_NC (UL(0) << TCR_IRGN1_SHIFT) |
|---|
| .. | .. |
|---|
| 292 | 260 | #define TCR_TBI1 (UL(1) << 38) |
|---|
| 293 | 261 | #define TCR_HA (UL(1) << 39) |
|---|
| 294 | 262 | #define TCR_HD (UL(1) << 40) |
|---|
| 263 | +#define TCR_TBID1 (UL(1) << 52) |
|---|
| 264 | +#define TCR_NFD0 (UL(1) << 53) |
|---|
| 295 | 265 | #define TCR_NFD1 (UL(1) << 54) |
|---|
| 266 | +#define TCR_E0PD0 (UL(1) << 55) |
|---|
| 267 | +#define TCR_E0PD1 (UL(1) << 56) |
|---|
| 296 | 268 | |
|---|
| 297 | 269 | /* |
|---|
| 298 | 270 | * TTBR. |
|---|
| .. | .. |
|---|
| 305 | 277 | #define TTBR_BADDR_MASK_52 (((UL(1) << 46) - 1) << 2) |
|---|
| 306 | 278 | #endif |
|---|
| 307 | 279 | |
|---|
| 280 | +#ifdef CONFIG_ARM64_VA_BITS_52 |
|---|
| 281 | +/* Must be at least 64-byte aligned to prevent corruption of the TTBR */ |
|---|
| 282 | +#define TTBR1_BADDR_4852_OFFSET (((UL(1) << (52 - PGDIR_SHIFT)) - \ |
|---|
| 283 | + (UL(1) << (48 - PGDIR_SHIFT))) * 8) |
|---|
| 284 | +#endif |
|---|
| 285 | + |
|---|
| 308 | 286 | #endif |
|---|