mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-23 13:56:20 +00:00
armv8: mmu: add a way to map additional regions
In some cases we might want to map some memory region after enabling caches. Introduce a new helper for this. Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org> Signed-off-by: Caleb Connolly <caleb.connolly@linaro.org>
This commit is contained in:
parent
a9337c6651
commit
9f2d456146
2 changed files with 35 additions and 0 deletions
|
@ -339,6 +339,31 @@ static void map_range(u64 virt, u64 phys, u64 size, int level,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mmu_map_region(phys_addr_t addr, u64 size, bool emergency)
|
||||||
|
{
|
||||||
|
u64 va_bits;
|
||||||
|
int level = 0;
|
||||||
|
u64 attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) | PTE_BLOCK_INNER_SHARE;
|
||||||
|
|
||||||
|
attrs |= PTE_TYPE_BLOCK | PTE_BLOCK_AF;
|
||||||
|
|
||||||
|
get_tcr(NULL, &va_bits);
|
||||||
|
if (va_bits < 39)
|
||||||
|
level = 1;
|
||||||
|
|
||||||
|
if (emergency)
|
||||||
|
map_range(addr, addr, size, level,
|
||||||
|
(u64 *)gd->arch.tlb_emerg, attrs);
|
||||||
|
|
||||||
|
/* Switch pagetables while we update the primary one */
|
||||||
|
__asm_switch_ttbr(gd->arch.tlb_emerg);
|
||||||
|
|
||||||
|
map_range(addr, addr, size, level,
|
||||||
|
(u64 *)gd->arch.tlb_addr, attrs);
|
||||||
|
|
||||||
|
__asm_switch_ttbr(gd->arch.tlb_addr);
|
||||||
|
}
|
||||||
|
|
||||||
static void add_map(struct mm_region *map)
|
static void add_map(struct mm_region *map)
|
||||||
{
|
{
|
||||||
u64 attrs = map->attrs | PTE_TYPE_BLOCK | PTE_BLOCK_AF;
|
u64 attrs = map->attrs | PTE_TYPE_BLOCK | PTE_BLOCK_AF;
|
||||||
|
|
|
@ -277,6 +277,16 @@ void protect_secure_region(void);
|
||||||
void smp_kick_all_cpus(void);
|
void smp_kick_all_cpus(void);
|
||||||
|
|
||||||
void flush_l3_cache(void);
|
void flush_l3_cache(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* mmu_map_region() - map a region of previously unmapped memory.
|
||||||
|
* Will be mapped MT_NORMAL & PTE_BLOCK_INNER_SHARE.
|
||||||
|
*
|
||||||
|
* @start: Start address of the region
|
||||||
|
* @size: Size of the region
|
||||||
|
* @emerg: Also map the region in the emergency table
|
||||||
|
*/
|
||||||
|
void mmu_map_region(phys_addr_t start, u64 size, bool emerg);
|
||||||
void mmu_change_region_attr(phys_addr_t start, size_t size, u64 attrs);
|
void mmu_change_region_attr(phys_addr_t start, size_t size, u64 attrs);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Reference in a new issue