diff options
Diffstat (limited to 'arch/arm64/include/asm/pgtable-hwdef.h')
| -rw-r--r-- | arch/arm64/include/asm/pgtable-hwdef.h | 33 | 
1 files changed, 27 insertions, 6 deletions
diff --git a/arch/arm64/include/asm/pgtable-hwdef.h b/arch/arm64/include/asm/pgtable-hwdef.h index e4944d517c99..ef207a0d4f0d 100644 --- a/arch/arm64/include/asm/pgtable-hwdef.h +++ b/arch/arm64/include/asm/pgtable-hwdef.h @@ -26,10 +26,10 @@  #define ARM64_HW_PGTABLE_LEVELS(va_bits) (((va_bits) - 4) / (PAGE_SHIFT - 3))  /* - * Size mapped by an entry at level n ( 0 <= n <= 3) + * Size mapped by an entry at level n ( -1 <= n <= 3)   * We map (PAGE_SHIFT - 3) at all translation levels and PAGE_SHIFT bits   * in the final page. The maximum number of translation levels supported by - * the architecture is 4. Hence, starting at level n, we have further + * the architecture is 5. Hence, starting at level n, we have further   * ((4 - n) - 1) levels of translation excluding the offset within the page.   * So, the total number of bits mapped by an entry at level n is :   * @@ -62,9 +62,16 @@  #define PTRS_PER_PUD		(1 << (PAGE_SHIFT - 3))  #endif +#if CONFIG_PGTABLE_LEVELS > 4 +#define P4D_SHIFT		ARM64_HW_PGTABLE_LEVEL_SHIFT(0) +#define P4D_SIZE		(_AC(1, UL) << P4D_SHIFT) +#define P4D_MASK		(~(P4D_SIZE-1)) +#define PTRS_PER_P4D		(1 << (PAGE_SHIFT - 3)) +#endif +  /*   * PGDIR_SHIFT determines the size a top-level page table entry can map - * (depending on the configuration, this level can be 0, 1 or 2). + * (depending on the configuration, this level can be -1, 0, 1 or 2).   */  #define PGDIR_SHIFT		ARM64_HW_PGTABLE_LEVEL_SHIFT(4 - CONFIG_PGTABLE_LEVELS)  #define PGDIR_SIZE		(_AC(1, UL) << PGDIR_SHIFT) @@ -87,6 +94,15 @@  /*   * Hardware page table definitions.   * + * Level -1 descriptor (PGD). + */ +#define PGD_TYPE_TABLE		(_AT(pgdval_t, 3) << 0) +#define PGD_TABLE_BIT		(_AT(pgdval_t, 1) << 1) +#define PGD_TYPE_MASK		(_AT(pgdval_t, 3) << 0) +#define PGD_TABLE_PXN		(_AT(pgdval_t, 1) << 59) +#define PGD_TABLE_UXN		(_AT(pgdval_t, 1) << 60) + +/*   * Level 0 descriptor (P4D).   */  #define P4D_TYPE_TABLE		(_AT(p4dval_t, 3) << 0) @@ -155,13 +171,17 @@  #define PTE_PXN			(_AT(pteval_t, 1) << 53)	/* Privileged XN */  #define PTE_UXN			(_AT(pteval_t, 1) << 54)	/* User XN */ -#define PTE_ADDR_LOW		(((_AT(pteval_t, 1) << (48 - PAGE_SHIFT)) - 1) << PAGE_SHIFT) +#define PTE_ADDR_LOW		(((_AT(pteval_t, 1) << (50 - PAGE_SHIFT)) - 1) << PAGE_SHIFT)  #ifdef CONFIG_ARM64_PA_BITS_52 +#ifdef CONFIG_ARM64_64K_PAGES  #define PTE_ADDR_HIGH		(_AT(pteval_t, 0xf) << 12) -#define PTE_ADDR_MASK		(PTE_ADDR_LOW | PTE_ADDR_HIGH)  #define PTE_ADDR_HIGH_SHIFT	36 +#define PHYS_TO_PTE_ADDR_MASK	(PTE_ADDR_LOW | PTE_ADDR_HIGH)  #else -#define PTE_ADDR_MASK		PTE_ADDR_LOW +#define PTE_ADDR_HIGH		(_AT(pteval_t, 0x3) << 8) +#define PTE_ADDR_HIGH_SHIFT	42 +#define PHYS_TO_PTE_ADDR_MASK	GENMASK_ULL(49, 8) +#endif  #endif  /* @@ -284,6 +304,7 @@  #define TCR_E0PD1		(UL(1) << 56)  #define TCR_TCMA0		(UL(1) << 57)  #define TCR_TCMA1		(UL(1) << 58) +#define TCR_DS			(UL(1) << 59)  /*   * TTBR.  |