MSPM0G1107: LDR result silently stale (register not updated) when code runs from main flash and reads data via ECC-bypass flash alias

Part Number: MSPM0G1107
Other Parts Discussed in Thread: SYSCONFIG

On the MSPM0G1107 (die revision C, DEVICEID=0x2BB8802F, USERID=0x8020807B), when the CPU executes from main flash and, within the same loop, reads data through the ECC-bypass flash alias (address bit 22 set, 0x0040_0000), a LDR Rn,[SP,#imm] instruction can silently fail to update its destination register, keeping the previous iteration's value. The next instruction then dereferences that stale value and the device HardFaults.

This reproduces only when:

  • the read goes through the ECC-bypass alias (the same loop reading via the corrected MAIN-flash window passes);
  • the affected LDR sits at offset 6 (last halfword) of a 64-bit flash word; the instruction cache is enabled; and the alias read crosses into a new flash word.
  • Disabling the instruction cache alone removes the failure; disabling the prefetcher alone does not — the instruction cache, not the prefetcher, is implicated. This matches the mechanism in errata CPU_ERR_01 (SLAZ742H), but that erratum only documents it for NONMAIN/Factory flash, not the ECC-bypass alias of MAIN flash. 
  • The attached minimal reproducer (MSPM0 SDK 2.11.00.07, SysConfig 1.28.0, IAR EWARM 9.70.1, MCLK 80 MHz/ULPCLK 40 MHz, 2 flash wait states) runs 16 functionally identical loops at every possible offset within a 64-bit word; 4 of 16 reliably fault, always where the affected LDR lands at offset 6.

Measured workarounds:

  • read via the corrected window instead of the alias (re-enables ECC, so a double-bit error can trigger FLASHDED),
  • or disable I-cache around the alias read.

We'd appreciate TI's guidance on the recommended production workaround and confirmation of whether this is a known silicon limitation. All the details are provided in the flash_cache_bug.c file in the attached ZIP archive:

TIFlashBug_export_v1.zip