/* * Copyright 2020 NXP * * SPDX-License-Identifier: BSD-3-Clause * */ .section .text, "ax" #include #ifndef NXP_COINED_BB #include #include #endif #include #ifdef NXP_COINED_BB #include #endif #include #include #define SDRAM_CFG 0x110 #define SDRAM_CFG_2 0x114 #define SDRAM_MD_CNTL 0x120 #define SDRAM_INTERVAL 0x124 #define TIMING_CFG_10 0x258 #define DEBUG_2 0xF04 #define DEBUG_26 0xF64 #define DDR_DSR2 0xB24 #define DDR_CNTRLR_2 0x2 #define COUNT_100 1000 .globl _soc_sys_warm_reset .align 12 func _soc_sys_warm_reset mov x3, xzr b touch_line0 start_line0: mov x3, #1 mov x2, #NUM_OF_DDRC ldr x1, =NXP_DDR_ADDR 1: ldr w0, [x1, #SDRAM_CFG] orr w0, w0, #SDRAM_CFG_MEM_HLT str w0, [x1, #SDRAM_CFG] 2: ldr w0, [x1, #DEBUG_2] and w0, w0, #DDR_DBG_2_MEM_IDLE cbz w0, 2b ldr w0, [x1, #DEBUG_26] orr w0, w0, #DDR_DEBUG_26_BIT_12 orr w0, w0, #DDR_DEBUG_26_BIT_13 orr w0, w0, #DDR_DEBUG_26_BIT_14 touch_line0: cbz x3, touch_line1 orr w0, w0, #DDR_DEBUG_26_BIT_15 orr w0, w0, #DDR_DEBUG_26_BIT_16 str w0, [x1, #DEBUG_26] ldr w0, [x1, #SDRAM_CFG_2] orr w0, w0, #SDRAM_CFG2_FRC_SR str w0, [x1, #SDRAM_CFG_2] 3: ldr w0, [x1, #DDR_DSR2] orr w0, w0, #DDR_DSR_2_PHY_INIT_CMPLT str w0, [x1, #DDR_DSR2] ldr w0, [x1, #DDR_DSR2] and w0, w0, #DDR_DSR_2_PHY_INIT_CMPLT cbnz w0, 3b ldr w0, [x1, #SDRAM_INTERVAL] and w0, w0, #SDRAM_INTERVAL_REFINT_CLEAR str w0, [x1, #SDRAM_INTERVAL] touch_line1: cbz x3, touch_line2 ldr w0, [x1, #SDRAM_MD_CNTL] orr w0, w0, #MD_CNTL_CKE(1) orr w0, w0, #MD_CNTL_MD_EN str w0, [x1, #SDRAM_MD_CNTL] ldr w0, [x1, #TIMING_CFG_10] orr w0, w0, #DDR_TIMING_CFG_10_T_STAB str w0, [x1, #TIMING_CFG_10] ldr w0, [x1, #SDRAM_CFG_2] and w0, w0, #SDRAM_CFG2_FRC_SR_CLEAR str w0, [x1, #SDRAM_CFG_2] 4: ldr w0, [x1, #DDR_DSR2] and w0, w0, #DDR_DSR_2_PHY_INIT_CMPLT cbz w0, 4b nop touch_line2: cbz x3, touch_line3 ldr w0, [x1, #DEBUG_26] orr w0, w0, #DDR_DEBUG_26_BIT_25 and w0, w0, #DDR_DEBUG_26_BIT_24_CLEAR str w0, [x1, #DEBUG_26] cmp x2, #DDR_CNTRLR_2 b.ne 5f ldr x1, =NXP_DDR2_ADDR mov x2, xzr b 1b 5: mov x5, xzr 6: add x5, x5, #1 cmp x5, #COUNT_100 b.ne 6b nop touch_line3: cbz x3, touch_line4 #ifdef NXP_COINED_BB ldr x1, =NXP_SNVS_ADDR ldr w0, [x1, #NXP_APP_DATA_LP_GPR_OFFSET] /* On Warm Boot is enabled, then zeroth bit * of SNVS LP GPR register 0 will used * to save the status of warm-reset as a cause. */ orr w0, w0, #(1 << NXP_LPGPR_ZEROTH_BIT) /* write back */ str w0, [x1, #NXP_APP_DATA_LP_GPR_OFFSET] nop nop nop nop nop nop nop nop nop nop nop touch_line4: cbz x3, touch_line6 #elif !(ERLY_WRM_RST_FLG_FLSH_UPDT) ldr x1, =NXP_FLEXSPI_ADDR ldr w0, [x1, #FSPI_IPCMD] orr w0, w0, #FSPI_IPCMD_TRG_MASK str w0, [x1, #FSPI_IPCMD] 7: ldr w0, [x1, #FSPI_INTR] and w0, w0, #FSPI_INTR_IPCMDDONE_MASK cmp w0, #0 b.eq 7b ldr w0, [x1, #FSPI_IPTXFCR] orr w0, w0, #FSPI_IPTXFCR_CLR str w0, [x1, #FSPI_IPTXFCR] ldr w0, [x1, #FSPI_INTR] orr w0, w0, #FSPI_INTR_IPCMDDONE_MASK str w0, [x1, #FSPI_INTR] nop touch_line4: cbz x3, touch_line5 /* flexspi driver has an api * is_flash_busy(). * Impelementation of the api will not * fit-in in 1 cache line. * instead a nop-cycles are introduced to * simulate the wait time for flash write * completion. * * Note: This wait time varies from flash to flash. */ mov x0, #FLASH_WR_COMP_WAIT_BY_NOP_COUNT 8: sub x0, x0, #1 nop cmp x0, #0 b.ne 8b nop nop nop nop nop nop nop nop nop touch_line5: cbz x3, touch_line6 #endif ldr x2, =NXP_RST_ADDR /* clear the RST_REQ_MSK and SW_RST_REQ */ mov w0, #0x00000000 str w0, [x2, #RSTCNTL_OFFSET] /* initiate the sw reset request */ mov w0, #SW_RST_REQ_INIT str w0, [x2, #RSTCNTL_OFFSET] /* In case this address range is mapped as cacheable, * flush the write out of the dcaches. */ add x2, x2, #RSTCNTL_OFFSET dc cvac, x2 dsb st isb /* Function does not return */ b . nop nop nop nop nop nop nop touch_line6: cbz x3, start_line0 endfunc _soc_sys_warm_reset