]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
arm: armv8: mmu: add mem_map_from_dram_banks
authorAnshul Dalal <anshuld@ti.com>
Fri, 17 Oct 2025 13:15:27 +0000 (18:45 +0530)
committerTom Rini <trini@konsulko.com>
Wed, 22 Oct 2025 18:05:52 +0000 (12:05 -0600)
For armv8, U-Boot uses a static map defined as 'mem_map' for configuring
the MMU as part of mmu_setup.

But since the exact configuration of memory banks might not be known at
build time, many platforms such as imx9, versal2 etc. utilize
gd->bd->bi_dram to configure the static map at runtime.

Therefore this patch adds a new API mem_map_from_dram_banks that
modifies the static map in a similar way. Allowing the caller to map all
dram banks by just passing the index to last entry in their mem_map and
it's length.

Reviewed-by: Dhruva Gole <d-gole@ti.com>
Signed-off-by: Anshul Dalal <anshuld@ti.com>
Tested-by: Wadim Egorov <w.egorov@phytec.de>
arch/arm/cpu/armv8/cache_v8.c
arch/arm/include/asm/armv8/mmu.h

index 74c78cb2fb0bcb0a089cb0f03736a7a2888cf878..9b3c37dae8207d0f8087b55f3ac8f4ca9419a56d 100644 (file)
@@ -58,6 +58,34 @@ static int get_effective_el(void)
        return el;
 }
 
+int mem_map_from_dram_banks(unsigned int index, unsigned int len, u64 attrs)
+{
+       unsigned int i;
+       int ret = fdtdec_setup_memory_banksize();
+
+       if (ret) {
+               log_err("%s: Failed to setup dram banks\n", __func__);
+               return ret;
+       }
+
+       if (index + CONFIG_NR_DRAM_BANKS >= len) {
+               log_err("%s: Provided mem_map array has insufficient size for DRAM entries\n",
+                       __func__);
+               return -ENOMEM;
+       }
+
+       for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
+               mem_map[index].virt = gd->bd->bi_dram[i].start;
+               mem_map[index].phys = gd->bd->bi_dram[i].start;
+               mem_map[index].size = gd->bd->bi_dram[i].size;
+               mem_map[index].attrs = attrs;
+               index++;
+       }
+
+       memset(&mem_map[index], 0, sizeof(mem_map[index]));
+
+       return 0;
+}
 u64 get_tcr(u64 *pips, u64 *pva_bits)
 {
        int el = get_effective_el();
index 3807c702fb655a4c06cf6ce1cb210668f7a0374e..6e7a33668446cc0ae33d43db55d9c46998fd55c3 100644 (file)
@@ -194,8 +194,19 @@ struct mm_region {
        u64 attrs;
 };
 
+/* Used as the memory map for MMU configuration by mmu_setup */
 extern struct mm_region *mem_map;
 void setup_pgtables(void);
+
+/**
+ * mem_map_from_dram_banks() - Populate mem_map with entries corresponding to
+ * dram banks as per the gd. This should be called prior to mmu_setup.
+ *
+ * @index: The entry in mem_map to start the over-write
+ * @len: The size of mem_map
+ */
+int mem_map_from_dram_banks(unsigned int index, unsigned int len, u64 attrs);
+
 u64 get_tcr(u64 *pips, u64 *pva_bits);
 
 /**