arm: armv8: mmu: add mem_map_from_dram_banks
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>
This commit is contained in:
@@ -58,6 +58,34 @@ static int get_effective_el(void)
|
|||||||
return el;
|
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)
|
u64 get_tcr(u64 *pips, u64 *pva_bits)
|
||||||
{
|
{
|
||||||
int el = get_effective_el();
|
int el = get_effective_el();
|
||||||
|
|||||||
@@ -194,8 +194,19 @@ struct mm_region {
|
|||||||
u64 attrs;
|
u64 attrs;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Used as the memory map for MMU configuration by mmu_setup */
|
||||||
extern struct mm_region *mem_map;
|
extern struct mm_region *mem_map;
|
||||||
void setup_pgtables(void);
|
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);
|
u64 get_tcr(u64 *pips, u64 *pva_bits);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user