This minmal set of macros will allow boot-time page selection support to be added to the arm64 arch code incrementally over the following set of patches. The definitions in pgtable-geometry.h are for compile-time page size currently, but they will be modified in future to support boot-time page size. Signed-off-by: Ryan Roberts <ryan.roberts@xxxxxxx> --- ***NOTE*** Any confused maintainers may want to read the cover note here for context: https://lore.kernel.org/all/20241014105514.3206191-1-ryan.roberts@xxxxxxx/ arch/arm64/include/asm/page-def.h | 5 ++-- arch/arm64/include/asm/pgtable-geometry.h | 28 +++++++++++++++++++++++ arch/arm64/include/asm/pgtable-hwdef.h | 16 ++++++++----- 3 files changed, 40 insertions(+), 9 deletions(-) create mode 100644 arch/arm64/include/asm/pgtable-geometry.h diff --git a/arch/arm64/include/asm/page-def.h b/arch/arm64/include/asm/page-def.h index d69971cf49cd2..b99dee0112463 100644 --- a/arch/arm64/include/asm/page-def.h +++ b/arch/arm64/include/asm/page-def.h @@ -9,12 +9,11 @@ #define __ASM_PAGE_DEF_H #include <linux/const.h> +#include <asm/pgtable-geometry.h> /* PAGE_SHIFT determines the page size */ -#define PAGE_SHIFT CONFIG_PAGE_SHIFT +#define PAGE_SHIFT ptg_page_shift #define PAGE_SIZE (_AC(1, UL) << PAGE_SHIFT) #define PAGE_MASK (~(PAGE_SIZE-1)) -#include <asm-generic/pgtable-geometry.h> - #endif /* __ASM_PAGE_DEF_H */ diff --git a/arch/arm64/include/asm/pgtable-geometry.h b/arch/arm64/include/asm/pgtable-geometry.h new file mode 100644 index 0000000000000..62fe125909c08 --- /dev/null +++ b/arch/arm64/include/asm/pgtable-geometry.h @@ -0,0 +1,28 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +#ifndef ASM_PGTABLE_GEOMETRY_H +#define ASM_PGTABLE_GEOMETRY_H + +#define ARM64_PAGE_SHIFT_4K 12 +#define ARM64_PAGE_SHIFT_16K 14 +#define ARM64_PAGE_SHIFT_64K 16 + +#define PAGE_SHIFT_MIN CONFIG_PAGE_SHIFT +#define PAGE_SIZE_MIN (_AC(1, UL) << PAGE_SHIFT_MIN) +#define PAGE_MASK_MIN (~(PAGE_SIZE_MIN-1)) + +#define PAGE_SHIFT_MAX CONFIG_PAGE_SHIFT +#define PAGE_SIZE_MAX (_AC(1, UL) << PAGE_SHIFT_MAX) +#define PAGE_MASK_MAX (~(PAGE_SIZE_MAX-1)) + +#include <asm-generic/pgtable-geometry.h> + +#define ptg_page_shift CONFIG_PAGE_SHIFT +#define ptg_pmd_shift ARM64_HW_PGTABLE_LEVEL_SHIFT(2) +#define ptg_pud_shift ARM64_HW_PGTABLE_LEVEL_SHIFT(1) +#define ptg_p4d_shift ARM64_HW_PGTABLE_LEVEL_SHIFT(0) +#define ptg_pgdir_shift ARM64_HW_PGTABLE_LEVEL_SHIFT(4 - CONFIG_PGTABLE_LEVELS) +#define ptg_cont_pte_shift (CONFIG_ARM64_CONT_PTE_SHIFT + PAGE_SHIFT) +#define ptg_cont_pmd_shift (CONFIG_ARM64_CONT_PMD_SHIFT + PMD_SHIFT) +#define ptg_pgtable_levels CONFIG_PGTABLE_LEVELS + +#endif /* ASM_PGTABLE_GEOMETRY_H */ diff --git a/arch/arm64/include/asm/pgtable-hwdef.h b/arch/arm64/include/asm/pgtable-hwdef.h index 1f60aa1bc750c..54a9153f56bc5 100644 --- a/arch/arm64/include/asm/pgtable-hwdef.h +++ b/arch/arm64/include/asm/pgtable-hwdef.h @@ -41,39 +41,43 @@ #define ARM64_HW_PGTABLE_LEVEL_SHIFT(n) ((PAGE_SHIFT - 3) * (4 - (n)) + 3) #define PTRS_PER_PTE (1 << (PAGE_SHIFT - 3)) +#define MAX_PTRS_PER_PTE (1 << (PAGE_SHIFT_MAX - 3)) /* * PMD_SHIFT determines the size a level 2 page table entry can map. */ #if CONFIG_PGTABLE_LEVELS > 2 -#define PMD_SHIFT ARM64_HW_PGTABLE_LEVEL_SHIFT(2) +#define PMD_SHIFT ptg_pmd_shift #define PMD_SIZE (_AC(1, UL) << PMD_SHIFT) #define PMD_MASK (~(PMD_SIZE-1)) #define PTRS_PER_PMD (1 << (PAGE_SHIFT - 3)) +#define MAX_PTRS_PER_PMD (1 << (PAGE_SHIFT_MAX - 3)) #endif /* * PUD_SHIFT determines the size a level 1 page table entry can map. */ #if CONFIG_PGTABLE_LEVELS > 3 -#define PUD_SHIFT ARM64_HW_PGTABLE_LEVEL_SHIFT(1) +#define PUD_SHIFT ptg_pud_shift #define PUD_SIZE (_AC(1, UL) << PUD_SHIFT) #define PUD_MASK (~(PUD_SIZE-1)) #define PTRS_PER_PUD (1 << (PAGE_SHIFT - 3)) +#define MAX_PTRS_PER_PUD (1 << (PAGE_SHIFT_MAX - 3)) #endif #if CONFIG_PGTABLE_LEVELS > 4 -#define P4D_SHIFT ARM64_HW_PGTABLE_LEVEL_SHIFT(0) +#define P4D_SHIFT ptg_p4d_shift #define P4D_SIZE (_AC(1, UL) << P4D_SHIFT) #define P4D_MASK (~(P4D_SIZE-1)) #define PTRS_PER_P4D (1 << (PAGE_SHIFT - 3)) +#define MAX_PTRS_PER_P4D (1 << (PAGE_SHIFT_MAX - 3)) #endif /* * PGDIR_SHIFT determines the size a top-level page table entry can map * (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_SHIFT ptg_pgdir_shift #define PGDIR_SIZE (_AC(1, UL) << PGDIR_SHIFT) #define PGDIR_MASK (~(PGDIR_SIZE-1)) #define PTRS_PER_PGD (1 << (VA_BITS - PGDIR_SHIFT)) @@ -81,12 +85,12 @@ /* * Contiguous page definitions. */ -#define CONT_PTE_SHIFT (CONFIG_ARM64_CONT_PTE_SHIFT + PAGE_SHIFT) +#define CONT_PTE_SHIFT ptg_cont_pte_shift #define CONT_PTES (1 << (CONT_PTE_SHIFT - PAGE_SHIFT)) #define CONT_PTE_SIZE (CONT_PTES * PAGE_SIZE) #define CONT_PTE_MASK (~(CONT_PTE_SIZE - 1)) -#define CONT_PMD_SHIFT (CONFIG_ARM64_CONT_PMD_SHIFT + PMD_SHIFT) +#define CONT_PMD_SHIFT ptg_cont_pmd_shift #define CONT_PMDS (1 << (CONT_PMD_SHIFT - PMD_SHIFT)) #define CONT_PMD_SIZE (CONT_PMDS * PMD_SIZE) #define CONT_PMD_MASK (~(CONT_PMD_SIZE - 1)) -- 2.43.0