blob: d3e03328c964ebb3b9108371a2fc058e2e6db53d [file] [log] [blame]
/*
* Copyright 2023 NXP
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/devicetree.h>
#include <zephyr/toolchain.h>
#include <zephyr/linker/sections.h>
#define MC_RGM_BASE 0x4028C000
#define MC_RGM_DES 0x0
#define MC_RGM_FES 0x8
_ASM_FILE_PROLOGUE
GTEXT(soc_reset_hook)
SECTION_FUNC(TEXT, soc_reset_hook)
/*
* On destructive reset, SRAM and TCM memories must be initialized to a known value using a
* 64-bit master before 32-bit masters can read or write to them. Note that SRAM retains
* content during functional reset through a hardware mechanism, therefore accesses do not
* cause any content corruption errors.
*
* This is implemented directly in ASM, to ensure no stack access is performed.
*/
/* If we come from a destructive reset, then ignore functional reset flags */
ldr r1, =MC_RGM_BASE
ldr r2, [r1, MC_RGM_DES]
cmp r2, 0x0
bne ECC_INIT
ldr r2, [r1, MC_RGM_FES]
cmp r2, 0x0
bne ECC_END
ECC_INIT:
ldr r1, = DT_REG_ADDR(DT_CHOSEN(zephyr_sram))
ldr r2, = DT_REG_SIZE(DT_CHOSEN(zephyr_sram))
subs r2, #1
ble SRAM_LOOP_END
movs r0, 0
movs r3, 0
SRAM_LOOP:
stm r1!, {r0,r3}
subs r2, 8
bge SRAM_LOOP
SRAM_LOOP_END:
#if DT_NODE_HAS_STATUS(DT_CHOSEN(zephyr_itcm), okay)
ldr r1, = DT_REG_ADDR(DT_CHOSEN(zephyr_itcm))
ldr r2, = DT_REG_SIZE(DT_CHOSEN(zephyr_itcm))
subs r2, #1
ITCM_LOOP:
stm r1!, {r0,r3}
subs r2, 8
bge ITCM_LOOP
#endif
#if DT_NODE_HAS_STATUS(DT_CHOSEN(zephyr_dtcm), okay)
ldr r1, = DT_REG_ADDR(DT_CHOSEN(zephyr_dtcm))
ldr r2, = DT_REG_SIZE(DT_CHOSEN(zephyr_dtcm))
subs r2, #1
DTCM_LOOP:
stm r1!, {r0,r3}
subs r2, 8
bge DTCM_LOOP
#endif
ECC_END:
bx lr