From c24d0c840519b650d2bd2f03784365183d0dffc6 Mon Sep 17 00:00:00 2001 From: Neil Armstrong Date: Thu, 7 Oct 2021 09:38:59 +0200 Subject: [PATCH] arm64: mmu: implement arch_virt_region_align() Add the arm64 MMU arch_virt_region_align() implementation used to return a possible virtual addres alignment in order to optimize the MMU table layout and possibly avoid using L3 tables and use some L1 & L3 blocks instead for most of the mapping. Suggested-by: Nicolas Pitre Signed-off-by: Neil Armstrong --- arch/arm64/core/mmu.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/arch/arm64/core/mmu.c b/arch/arm64/core/mmu.c index 5862cc2fd0e..3d063f9ed4a 100644 --- a/arch/arm64/core/mmu.c +++ b/arch/arm64/core/mmu.c @@ -943,6 +943,29 @@ int arch_page_phys_get(void *virt, uintptr_t *phys) return 0; } +size_t arch_virt_region_align(uintptr_t phys, size_t size) +{ + size_t alignment = CONFIG_MMU_PAGE_SIZE; + size_t level_size; + int level; + + for (level = XLAT_LAST_LEVEL; level >= BASE_XLAT_LEVEL; level--) { + level_size = 1 << LEVEL_TO_VA_SIZE_SHIFT(level); + + if (size < level_size) { + break; + } + + if ((phys & (level_size - 1))) { + break; + } + + alignment = level_size; + } + + return alignment; +} + #ifdef CONFIG_USERSPACE static void z_arm64_swap_ptables(struct k_thread *incoming);