Skip to content

Support ECC RAM on 11xx MCUs - #31

Merged
mciantyre merged 3 commits into
imxrt-rs:mainfrom
mciantyre:ecc-ram
Mar 18, 2026
Merged

mciantyre merged 3 commits into
imxrt-rs:mainfrom
mciantyre:ecc-ram

Conversation

@mciantyre

Copy link
Copy Markdown
Member

RuntimeBuilder supports additional configurations for MECC64 and FlexRAM ECC on 11xx MCUs (1160, 1170). The feature is backwards compatible, although the instruction count in __pre_init increases no matter your chip and usage.

If enabled,

  • the available OCRAM shrinks.
  • __pre_init configures TCM interfaces & performs RAM preloading.

Something else is expected to turn on the MECCC64 peripherals and FlexRAM ECC. That's typically NXP's boot ROM. You'll need to configure your FlexRAM ECC RAM bank to support your FlexRAM allocation.

See commit messages for more info.

No change in behavior. Follows the approach shown by ITCM in a prior
commit. Unit tests still pass, and existing ELF tests show that we
still generate valid linker script.
As of this commit, the RuntimeBuilder only limits the available OCRAM
if either ECC controller is enabled. It's misleading; however, it gives
users a chance to evaluate their firmware builds with the restricted
RAM regions. I'll add and test the controller setups in a later commit.

Existing tests still pass. New unit tests demonstrate the restricted
RAM behavior.
Testing shows that we must blow fuses in order to activate either ECC
engine.  Once the fuse is blown, NXP's boot ROM will enable the ECC
engine. So by the time the reset handler is running, ECC may already
be enabled.

The 32-bit copy loops won't work for initializing ITCM and OCRAM.
Since these bus widths are 64-bit and the ECC is computed over 64
bits, these 32 bit accesses result in a read-modify-write (RMW) on the
underlying interface. If these RAM regions aren't already initialized,
we'll fail an ECC check; the read in RMW compares bogus RAM contents
against a bogus ECC. This seems to dramatically slow down
initialization, or stall it (I've seen the CPU spinning in the boot
ROM).

If we listen to NXP and use 64-bit writes to preload ECC-protected RAM
regions, the 32-bit copy loops will work as expected. Note that we can
still issue 64-bit accesses towards DTCM; they're scattered across the
two 32-bit interfaces. There's an NXP whitepaper [1] describing that.

Once TCM ECC is enabled, we need to tell the TCM interfaces to RMW
smaller accesses. Otherwise, we won't generate correct ciphers. We
also might need to retry operations if there was a correction by the
RAM controller. We can perform these with predicated instructions.
Tested on an 1010EVK, where I used the debugger to show the control
registers weren't touched; and tested on the 1170EVK, with the same
approach showing the expected set bits.

[1]: https://www.nxp.com/docs/en/white-paper/CORTEXM7WP.pdf
[2]: https://www.nxp.com/docs/en/application-note/AN13204.pdf
@mciantyre
mciantyre merged commit a9bb416 into imxrt-rs:main Mar 18, 2026
7 checks passed
@mciantyre
mciantyre deleted the ecc-ram branch March 18, 2026 11:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant