[PATCH] arm: mach-k3: j721s2: j784s4: Add errata i2378 workaround

Kumar, Udit u-kumar1 at ti.com
Sat May 9 03:45:16 CEST 2026



On 5/8/2026 7:55 PM, Neha Malcom Francis wrote:
> The shadow copies of WAY_SELECT MSMC MMRs have incorrect reset values.
> The main copy has the correct reset value but MSMC functionality uses
> the shadow copy values. This incorrect reset value results in
> under-utilization of MSMC L3 data cache and snoop filter for DDR
> accesses.
> 

Thanks Neha for rolling this out. Wondering if L3 set to zero then
will this hardcoded write will impact in some way ?

> The workaround is to write 0x00000303 to both MSMC MMRs after reset.
> This ensures that their shadow copies get the correct post-reset value.
> 
> Link: https://www.ti.com/lit/er/sprz530c/sprz530c.pdf
> Link: https://www.ti.com/lit/er/sprz536b/sprz536b.pdf
> Signed-off-by: Neha Malcom Francis <n-francis at ti.com>
> ---
>  arch/arm/mach-k3/include/mach/j721s2_hardware.h |  4 ++++
>  arch/arm/mach-k3/include/mach/j784s4_hardware.h |  4 ++++
>  arch/arm/mach-k3/j721s2/j721s2_init.c           | 11 +++++++++++
>  arch/arm/mach-k3/j784s4/j784s4_init.c           | 11 +++++++++++
>  4 files changed, 30 insertions(+)
> 
> diff --git a/arch/arm/mach-k3/include/mach/j721s2_hardware.h b/arch/arm/mach-k3/include/mach/j721s2_hardware.h
> index 82f076a45e0..a4d7fe48662 100644
> --- a/arch/arm/mach-k3/include/mach/j721s2_hardware.h
> +++ b/arch/arm/mach-k3/include/mach/j721s2_hardware.h
> @@ -37,6 +37,10 @@
>  /* MCU SCRATCHPAD usage */
>  #define TI_SRAM_SCRATCH_BOARD_EEPROM_START	CONFIG_SYS_K3_MCU_SCRATCHPAD_BASE
>  
> +/* MSMC RT_WAY MMR addresses */
> +#define K3_MSMC_RT_WAY_SELECT		0x6E008000
> +#define K3_MSMC_NRT_WAY_SELECT		0x6E008008
> +
>  #if defined(CONFIG_SYS_K3_SPL_ATF) && !defined(__ASSEMBLY__)
>  
>  #define J721S2_DEV_MCU_RTI0			295
> diff --git a/arch/arm/mach-k3/include/mach/j784s4_hardware.h b/arch/arm/mach-k3/include/mach/j784s4_hardware.h
> index 29a894baed3..bb5c58d00e4 100644
> --- a/arch/arm/mach-k3/include/mach/j784s4_hardware.h
> +++ b/arch/arm/mach-k3/include/mach/j784s4_hardware.h
> @@ -37,6 +37,10 @@
>  /* MCU SCRATCHPAD usage */
>  #define TI_SRAM_SCRATCH_BOARD_EEPROM_START	CONFIG_SYS_K3_MCU_SCRATCHPAD_BASE
>  
> +/* MSMC RT_WAY MMR addresses */
> +#define K3_MSMC_RT_WAY_SELECT		0x6E008000
> +#define K3_MSMC_NRT_WAY_SELECT		0x6E008008
> +
>  #if defined(CONFIG_SYS_K3_SPL_ATF) && !defined(__ASSEMBLY__)
>  
>  #define J784S4_DEV_MCU_RTI0			367
> diff --git a/arch/arm/mach-k3/j721s2/j721s2_init.c b/arch/arm/mach-k3/j721s2/j721s2_init.c
> index b5453d8895d..d996dfcc332 100644
> --- a/arch/arm/mach-k3/j721s2/j721s2_init.c
> +++ b/arch/arm/mach-k3/j721s2/j721s2_init.c
> @@ -163,6 +163,14 @@ static void store_boot_info_from_rom(void)
>  	       sizeof(struct rom_extended_boot_data));
>  }
>  
> +void apply_msmc_shadow_copy_errata(void)
> +{
> +	/* Errata i2378: Write 0x00000303 to MSMC shadow copy MMRs */
> +	writel(0x00000303, K3_MSMC_RT_WAY_SELECT);
> +	writel(0x00000303, K3_MSMC_NRT_WAY_SELECT);
> +	debug("%s: Applied errata i2378\n", __func__);
> +}
> +
>  void k3_spl_init(void)
>  {
>  	struct udevice *dev;
> @@ -176,6 +184,9 @@ void k3_spl_init(void)
>  	/* Make all control module registers accessible */
>  	ctrl_mmr_unlock();
>  
> +	/* Apply MSMC shadow copy errata workaround */
> +	apply_msmc_shadow_copy_errata();
> +
>  	if (IS_ENABLED(CONFIG_CPU_V7R)) {
>  		disable_linefill_optimization();
>  		setup_k3_mpu_regions();
> diff --git a/arch/arm/mach-k3/j784s4/j784s4_init.c b/arch/arm/mach-k3/j784s4/j784s4_init.c
> index 53f152ccd9c..48b52fcb333 100644
> --- a/arch/arm/mach-k3/j784s4/j784s4_init.c
> +++ b/arch/arm/mach-k3/j784s4/j784s4_init.c
> @@ -180,6 +180,14 @@ static void store_boot_info_from_rom(void)
>  	       sizeof(struct rom_extended_boot_data));
>  }
>  
> +void apply_msmc_shadow_copy_errata(void)
> +{
> +	/* Errata i2378: Write 0x00000303 to MSMC shadow copy MMRs */
> +	writel(0x00000303, K3_MSMC_RT_WAY_SELECT);
> +	writel(0x00000303, K3_MSMC_NRT_WAY_SELECT);
> +	debug("%s: Applied errata i2378\n", __func__);	
> +}
> +
>  void k3_spl_init(void)
>  {
>  	struct udevice *dev;
> @@ -194,6 +202,9 @@ void k3_spl_init(void)
>  	/* Make all control module registers accessible */
>  	ctrl_mmr_unlock();
>  
> +	/* Apply MSMC shadow copy errata workaround */
> +	apply_msmc_shadow_copy_errata();
> +
>  	if (IS_ENABLED(CONFIG_CPU_V7R)) {
>  		disable_linefill_optimization();
>  		setup_k3_mpu_regions();



More information about the U-Boot mailing list