[PATCH v3 1/2] arm: stm32mp: activate data cache in SPL and before relocation

Patrice CHOTARD patrice.chotard at st.com
Mon Apr 27 09:17:42 CEST 2020


Hi Patrick,

some typos below

On 4/24/20 8:24 PM, Patrick Delaunay wrote:
> Activate the data cache in SPL and in U-Boot before relocation.
>
> In arch_cpu_init(), the function early_enable_caches() sets the early
> TLB, early_tlb[] located .init section, and set cacheable:
> - for SPL, all the SYSRAM
> - for U-Boot, all the DDR
>
> After relocation, the function enable_caches() (called by board_r)
> reconfigures the MMU with new TLB location (reserved in
> board_f.c::reserve_mmu) and re-enable the data cache.
>
> This patch allows to reduce the execution time, particularly
> - for the device tree parsing in U-Boot pre-reloc stage
>   (dm_extended_scan_fd =>dm_scan_fdt)
> - in I2C timing computation in SPL (stm32_i2c_choose_solution())
>
> For example, the result on STM32MP157C-DK2 board is:
>    1,6s gain for trusted boot chain with TF-A
>    2,2s gain for basic boot chain with SPL
>
> For information, as TLB is added in .data section, the binary size
> increased and the SPL load time by ROM code increased (30ms on DK2).
>
> But early maloc can't be used for TLB because arch_cpu_init()
s/maloc/malloc
> is executed before the early poll initialization done in spl_common_init()
> called by spl_early_init() So it too late for this use case.
> And if I initialize the MMU and the cache after this function it is
> too late, as dm_init_and_scan and fdt parsin is also called in
s/parsin/parsing
> spl_common_init().
>
> And .BSS can be used in board_init_f(): only stack and global can use
> before BSS init done in board_init_r().
>
> So .data is the better soluttion without hardcoded location but is you

s/soluttion/solution

s/is you/if you

> have size issue for SPL you can deactivate cache for SPL only
> (with CONFIG_SPL_SYS_DCACHE_OFF).
>
> Signed-off-by: Patrick Delaunay <patrick.delaunay at st.com>
> ---
>
> Changes in v3:
> - add Information in commit-message on early malloc and .BSS
>
> Changes in v2:
> - create a new function early_enable_caches
> - use TLB in .init section
> - use the default weak dram_bank_mmu_setup() and
>   use mmu_set_region_dcache_behaviour() to setup
>   the early MMU configuration
> - enable data cache on DDR in SPL, after DDR controller initialization
>
>  arch/arm/mach-stm32mp/cpu.c | 43 ++++++++++++++++++++++++++++++++++++-
>  1 file changed, 42 insertions(+), 1 deletion(-)
>
> diff --git a/arch/arm/mach-stm32mp/cpu.c b/arch/arm/mach-stm32mp/cpu.c
> index 74d03fa7dd..712c2c594b 100644
> --- a/arch/arm/mach-stm32mp/cpu.c
> +++ b/arch/arm/mach-stm32mp/cpu.c
> @@ -75,6 +75,12 @@
>  #define PKG_SHIFT	27
>  #define PKG_MASK	GENMASK(2, 0)
>  
> +/*
> + * early TLB into the .data section so that it not get cleared
> + * with 16kB allignment (see TTBR0_BASE_ADDR_MASK)
s /allignment/alignement
> + */
> +u8 early_tlb[PGTABLE_SIZE] __section(".data") __aligned(0x4000);
> +
>  #if !defined(CONFIG_SPL) || defined(CONFIG_SPL_BUILD)
>  #ifndef CONFIG_TFABOOT
>  static void security_init(void)
> @@ -186,6 +192,32 @@ u32 get_bootmode(void)
>  		    TAMP_BOOT_MODE_SHIFT;
>  }
>  
> +/*
> + * initialize the MMU and activate cache in SPL or in U- Boot pre-reloc stage
s/U- Boot/U-Boot
> + * MMU/TLB is updated in enable_caches() for U-Boot after relocation
> + * or is deactivated in U-Boot entry function start.S::cpu_init_cp15
> + */
> +static void early_enable_caches(void)
> +{
> +	/* I-cache is already enabled in start.S: cpu_init_cp15 */
> +
> +	if (CONFIG_IS_ENABLED(SYS_DCACHE_OFF))
> +		return;
> +
> +	gd->arch.tlb_size = PGTABLE_SIZE;
> +	gd->arch.tlb_addr = (unsigned long)&early_tlb;
> +
> +	dcache_enable();
> +
> +	if (IS_ENABLED(CONFIG_SPL_BUILD))
> +		mmu_set_region_dcache_behaviour(STM32_SYSRAM_BASE,
> +						STM32_SYSRAM_SIZE,
> +						DCACHE_DEFAULT_OPTION);
> +	else
> +		mmu_set_region_dcache_behaviour(STM32_DDR_BASE, STM32_DDR_SIZE,
> +						DCACHE_DEFAULT_OPTION);
> +}
> +
>  /*
>   * Early system init
>   */
> @@ -193,6 +225,8 @@ int arch_cpu_init(void)
>  {
>  	u32 boot_mode;
>  
> +	early_enable_caches();
> +
>  	/* early armv7 timer init: needed for polling */
>  	timer_init();
>  
> @@ -225,7 +259,14 @@ int arch_cpu_init(void)
>  
>  void enable_caches(void)
>  {
> -	/* Enable D-cache. I-cache is already enabled in start.S */
> +	/* I-cache is already enabled in start.S: icache_enable() not needed */
> +
> +	/* deactivate the data cache, early enabled in arch_cpu_init() */
> +	dcache_disable();
> +	/*
> +	 * update MMU after relocation and enable the data cache
> +	 * warning: the TLB location udpated in board_f.c::reserve_mmu
> +	 */
>  	dcache_enable();
>  }
>  

With typo fixes

Reviewed-by: Patrice Chotard <patrice.chotard at st.com>

Thanks



More information about the U-Boot mailing list