123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 |
- /*
- * Copyright 2020 NXP
- *
- * SPDX-License-Identifier: BSD-3-Clause
- *
- */
- .section .text, "ax"
- #include <asm_macros.S>
- #ifndef NXP_COINED_BB
- #include <flash_info.h>
- #include <fspi.h>
- #endif
- #include <regs.h>
- #ifdef NXP_COINED_BB
- #include <snvs.h>
- #endif
- #include <plat_warm_rst.h>
- #include <platform_def.h>
- #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
|