[PATCH] arm: mach-k3: j721s2: j784s4: Add errata i2378 workaround
Francis, Neha
n-francis at ti.com
Mon May 11 06:50:07 CEST 2026
Hi Udit
On 5/9/2026 7:15 AM, Kumar, Udit wrote:
>
>
> 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 ?
I don't think it will, but I will confirm with the h/w team to make sure.
>
>> 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();
>
--
Thanking You
Neha Malcom Francis
More information about the U-Boot
mailing list