]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
armv8: mmu: add a way to map additional regions
authorCaleb Connolly <caleb.connolly@linaro.org>
Thu, 8 Aug 2024 23:59:31 +0000 (01:59 +0200)
committerCaleb Connolly <caleb.connolly@linaro.org>
Fri, 6 Sep 2024 08:47:46 +0000 (10:47 +0200)
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>
arch/arm/cpu/armv8/cache_v8.c
arch/arm/include/asm/system.h

index c3f8dac648ba4c4e6f3b1e802433534cbece3171..631d9efa5e10b2e126f25618e2cf52f139a942ad 100644 (file)
@@ -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)
 {
        u64 attrs = map->attrs | PTE_TYPE_BLOCK | PTE_BLOCK_AF;
index 7e30cac32a098b94e8410d1163a058b8aa507e3f..2237d7d0066863a09c71fa492362f8d9098d018e 100644 (file)
@@ -277,6 +277,16 @@ void protect_secure_region(void);
 void smp_kick_all_cpus(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);
 
 /*