@@ -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 */
new file mode 100644
@@ -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 */
@@ -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))
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@arm.com> --- ***NOTE*** Any confused maintainers may want to read the cover note here for context: https://lore.kernel.org/all/20241014105514.3206191-1-ryan.roberts@arm.com/ 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