1*87056d31SPankaj Gupta/* 2*87056d31SPankaj Gupta * Copyright 2020 NXP 3*87056d31SPankaj Gupta * 4*87056d31SPankaj Gupta * SPDX-License-Identifier: BSD-3-Clause 5*87056d31SPankaj Gupta * 6*87056d31SPankaj Gupta */ 7*87056d31SPankaj Gupta 8*87056d31SPankaj Gupta.section .text, "ax" 9*87056d31SPankaj Gupta 10*87056d31SPankaj Gupta#include <asm_macros.S> 11*87056d31SPankaj Gupta 12*87056d31SPankaj Gupta#ifndef NXP_COINED_BB 13*87056d31SPankaj Gupta#include <flash_info.h> 14*87056d31SPankaj Gupta#include <fspi.h> 15*87056d31SPankaj Gupta#endif 16*87056d31SPankaj Gupta#include <regs.h> 17*87056d31SPankaj Gupta#ifdef NXP_COINED_BB 18*87056d31SPankaj Gupta#include <snvs.h> 19*87056d31SPankaj Gupta#endif 20*87056d31SPankaj Gupta 21*87056d31SPankaj Gupta#include <plat_warm_rst.h> 22*87056d31SPankaj Gupta#include <platform_def.h> 23*87056d31SPankaj Gupta 24*87056d31SPankaj Gupta#define SDRAM_CFG 0x110 25*87056d31SPankaj Gupta#define SDRAM_CFG_2 0x114 26*87056d31SPankaj Gupta#define SDRAM_MD_CNTL 0x120 27*87056d31SPankaj Gupta#define SDRAM_INTERVAL 0x124 28*87056d31SPankaj Gupta#define TIMING_CFG_10 0x258 29*87056d31SPankaj Gupta#define DEBUG_2 0xF04 30*87056d31SPankaj Gupta#define DEBUG_26 0xF64 31*87056d31SPankaj Gupta#define DDR_DSR2 0xB24 32*87056d31SPankaj Gupta 33*87056d31SPankaj Gupta#define DDR_CNTRLR_2 0x2 34*87056d31SPankaj Gupta#define COUNT_100 1000 35*87056d31SPankaj Gupta 36*87056d31SPankaj Gupta .globl _soc_sys_warm_reset 37*87056d31SPankaj Gupta .align 12 38*87056d31SPankaj Gupta 39*87056d31SPankaj Guptafunc _soc_sys_warm_reset 40*87056d31SPankaj Gupta mov x3, xzr 41*87056d31SPankaj Gupta b touch_line0 42*87056d31SPankaj Guptastart_line0: 43*87056d31SPankaj Gupta mov x3, #1 44*87056d31SPankaj Gupta mov x2, #NUM_OF_DDRC 45*87056d31SPankaj Gupta ldr x1, =NXP_DDR_ADDR 46*87056d31SPankaj Gupta1: 47*87056d31SPankaj Gupta ldr w0, [x1, #SDRAM_CFG] 48*87056d31SPankaj Gupta orr w0, w0, #SDRAM_CFG_MEM_HLT 49*87056d31SPankaj Gupta str w0, [x1, #SDRAM_CFG] 50*87056d31SPankaj Gupta2: 51*87056d31SPankaj Gupta ldr w0, [x1, #DEBUG_2] 52*87056d31SPankaj Gupta and w0, w0, #DDR_DBG_2_MEM_IDLE 53*87056d31SPankaj Gupta cbz w0, 2b 54*87056d31SPankaj Gupta 55*87056d31SPankaj Gupta ldr w0, [x1, #DEBUG_26] 56*87056d31SPankaj Gupta orr w0, w0, #DDR_DEBUG_26_BIT_12 57*87056d31SPankaj Gupta orr w0, w0, #DDR_DEBUG_26_BIT_13 58*87056d31SPankaj Gupta orr w0, w0, #DDR_DEBUG_26_BIT_14 59*87056d31SPankaj Guptatouch_line0: 60*87056d31SPankaj Gupta cbz x3, touch_line1 61*87056d31SPankaj Gupta 62*87056d31SPankaj Gupta orr w0, w0, #DDR_DEBUG_26_BIT_15 63*87056d31SPankaj Gupta orr w0, w0, #DDR_DEBUG_26_BIT_16 64*87056d31SPankaj Gupta str w0, [x1, #DEBUG_26] 65*87056d31SPankaj Gupta 66*87056d31SPankaj Gupta ldr w0, [x1, #SDRAM_CFG_2] 67*87056d31SPankaj Gupta orr w0, w0, #SDRAM_CFG2_FRC_SR 68*87056d31SPankaj Gupta str w0, [x1, #SDRAM_CFG_2] 69*87056d31SPankaj Gupta 70*87056d31SPankaj Gupta3: 71*87056d31SPankaj Gupta ldr w0, [x1, #DDR_DSR2] 72*87056d31SPankaj Gupta orr w0, w0, #DDR_DSR_2_PHY_INIT_CMPLT 73*87056d31SPankaj Gupta str w0, [x1, #DDR_DSR2] 74*87056d31SPankaj Gupta ldr w0, [x1, #DDR_DSR2] 75*87056d31SPankaj Gupta and w0, w0, #DDR_DSR_2_PHY_INIT_CMPLT 76*87056d31SPankaj Gupta cbnz w0, 3b 77*87056d31SPankaj Gupta 78*87056d31SPankaj Gupta ldr w0, [x1, #SDRAM_INTERVAL] 79*87056d31SPankaj Gupta and w0, w0, #SDRAM_INTERVAL_REFINT_CLEAR 80*87056d31SPankaj Gupta str w0, [x1, #SDRAM_INTERVAL] 81*87056d31SPankaj Guptatouch_line1: 82*87056d31SPankaj Gupta cbz x3, touch_line2 83*87056d31SPankaj Gupta 84*87056d31SPankaj Gupta ldr w0, [x1, #SDRAM_MD_CNTL] 85*87056d31SPankaj Gupta orr w0, w0, #MD_CNTL_CKE(1) 86*87056d31SPankaj Gupta orr w0, w0, #MD_CNTL_MD_EN 87*87056d31SPankaj Gupta str w0, [x1, #SDRAM_MD_CNTL] 88*87056d31SPankaj Gupta 89*87056d31SPankaj Gupta ldr w0, [x1, #TIMING_CFG_10] 90*87056d31SPankaj Gupta orr w0, w0, #DDR_TIMING_CFG_10_T_STAB 91*87056d31SPankaj Gupta str w0, [x1, #TIMING_CFG_10] 92*87056d31SPankaj Gupta 93*87056d31SPankaj Gupta ldr w0, [x1, #SDRAM_CFG_2] 94*87056d31SPankaj Gupta and w0, w0, #SDRAM_CFG2_FRC_SR_CLEAR 95*87056d31SPankaj Gupta str w0, [x1, #SDRAM_CFG_2] 96*87056d31SPankaj Gupta 97*87056d31SPankaj Gupta4: 98*87056d31SPankaj Gupta ldr w0, [x1, #DDR_DSR2] 99*87056d31SPankaj Gupta and w0, w0, #DDR_DSR_2_PHY_INIT_CMPLT 100*87056d31SPankaj Gupta cbz w0, 4b 101*87056d31SPankaj Gupta nop 102*87056d31SPankaj Guptatouch_line2: 103*87056d31SPankaj Gupta cbz x3, touch_line3 104*87056d31SPankaj Gupta 105*87056d31SPankaj Gupta ldr w0, [x1, #DEBUG_26] 106*87056d31SPankaj Gupta orr w0, w0, #DDR_DEBUG_26_BIT_25 107*87056d31SPankaj Gupta and w0, w0, #DDR_DEBUG_26_BIT_24_CLEAR 108*87056d31SPankaj Gupta str w0, [x1, #DEBUG_26] 109*87056d31SPankaj Gupta 110*87056d31SPankaj Gupta cmp x2, #DDR_CNTRLR_2 111*87056d31SPankaj Gupta b.ne 5f 112*87056d31SPankaj Gupta ldr x1, =NXP_DDR2_ADDR 113*87056d31SPankaj Gupta mov x2, xzr 114*87056d31SPankaj Gupta b 1b 115*87056d31SPankaj Gupta 116*87056d31SPankaj Gupta5: 117*87056d31SPankaj Gupta mov x5, xzr 118*87056d31SPankaj Gupta6: 119*87056d31SPankaj Gupta add x5, x5, #1 120*87056d31SPankaj Gupta cmp x5, #COUNT_100 121*87056d31SPankaj Gupta b.ne 6b 122*87056d31SPankaj Gupta nop 123*87056d31SPankaj Guptatouch_line3: 124*87056d31SPankaj Gupta cbz x3, touch_line4 125*87056d31SPankaj Gupta#ifdef NXP_COINED_BB 126*87056d31SPankaj Gupta ldr x1, =NXP_SNVS_ADDR 127*87056d31SPankaj Gupta ldr w0, [x1, #NXP_APP_DATA_LP_GPR_OFFSET] 128*87056d31SPankaj Gupta 129*87056d31SPankaj Gupta /* On Warm Boot is enabled, then zeroth bit 130*87056d31SPankaj Gupta * of SNVS LP GPR register 0 will used 131*87056d31SPankaj Gupta * to save the status of warm-reset as a cause. 132*87056d31SPankaj Gupta */ 133*87056d31SPankaj Gupta orr w0, w0, #(1 << NXP_LPGPR_ZEROTH_BIT) 134*87056d31SPankaj Gupta 135*87056d31SPankaj Gupta /* write back */ 136*87056d31SPankaj Gupta str w0, [x1, #NXP_APP_DATA_LP_GPR_OFFSET] 137*87056d31SPankaj Gupta nop 138*87056d31SPankaj Gupta nop 139*87056d31SPankaj Gupta nop 140*87056d31SPankaj Gupta nop 141*87056d31SPankaj Gupta nop 142*87056d31SPankaj Gupta nop 143*87056d31SPankaj Gupta nop 144*87056d31SPankaj Gupta nop 145*87056d31SPankaj Gupta nop 146*87056d31SPankaj Gupta nop 147*87056d31SPankaj Gupta nop 148*87056d31SPankaj Guptatouch_line4: 149*87056d31SPankaj Gupta cbz x3, touch_line6 150*87056d31SPankaj Gupta#elif !(ERLY_WRM_RST_FLG_FLSH_UPDT) 151*87056d31SPankaj Gupta ldr x1, =NXP_FLEXSPI_ADDR 152*87056d31SPankaj Gupta ldr w0, [x1, #FSPI_IPCMD] 153*87056d31SPankaj Gupta orr w0, w0, #FSPI_IPCMD_TRG_MASK 154*87056d31SPankaj Gupta str w0, [x1, #FSPI_IPCMD] 155*87056d31SPankaj Gupta7: 156*87056d31SPankaj Gupta ldr w0, [x1, #FSPI_INTR] 157*87056d31SPankaj Gupta and w0, w0, #FSPI_INTR_IPCMDDONE_MASK 158*87056d31SPankaj Gupta cmp w0, #0 159*87056d31SPankaj Gupta b.eq 7b 160*87056d31SPankaj Gupta 161*87056d31SPankaj Gupta ldr w0, [x1, #FSPI_IPTXFCR] 162*87056d31SPankaj Gupta orr w0, w0, #FSPI_IPTXFCR_CLR 163*87056d31SPankaj Gupta str w0, [x1, #FSPI_IPTXFCR] 164*87056d31SPankaj Gupta 165*87056d31SPankaj Gupta ldr w0, [x1, #FSPI_INTR] 166*87056d31SPankaj Gupta orr w0, w0, #FSPI_INTR_IPCMDDONE_MASK 167*87056d31SPankaj Gupta str w0, [x1, #FSPI_INTR] 168*87056d31SPankaj Gupta nop 169*87056d31SPankaj Guptatouch_line4: 170*87056d31SPankaj Gupta cbz x3, touch_line5 171*87056d31SPankaj Gupta /* flexspi driver has an api 172*87056d31SPankaj Gupta * is_flash_busy(). 173*87056d31SPankaj Gupta * Impelementation of the api will not 174*87056d31SPankaj Gupta * fit-in in 1 cache line. 175*87056d31SPankaj Gupta * instead a nop-cycles are introduced to 176*87056d31SPankaj Gupta * simulate the wait time for flash write 177*87056d31SPankaj Gupta * completion. 178*87056d31SPankaj Gupta * 179*87056d31SPankaj Gupta * Note: This wait time varies from flash to flash. 180*87056d31SPankaj Gupta */ 181*87056d31SPankaj Gupta 182*87056d31SPankaj Gupta mov x0, #FLASH_WR_COMP_WAIT_BY_NOP_COUNT 183*87056d31SPankaj Gupta8: 184*87056d31SPankaj Gupta sub x0, x0, #1 185*87056d31SPankaj Gupta nop 186*87056d31SPankaj Gupta cmp x0, #0 187*87056d31SPankaj Gupta b.ne 8b 188*87056d31SPankaj Gupta nop 189*87056d31SPankaj Gupta nop 190*87056d31SPankaj Gupta nop 191*87056d31SPankaj Gupta nop 192*87056d31SPankaj Gupta nop 193*87056d31SPankaj Gupta nop 194*87056d31SPankaj Gupta nop 195*87056d31SPankaj Gupta nop 196*87056d31SPankaj Gupta nop 197*87056d31SPankaj Guptatouch_line5: 198*87056d31SPankaj Gupta cbz x3, touch_line6 199*87056d31SPankaj Gupta#endif 200*87056d31SPankaj Gupta ldr x2, =NXP_RST_ADDR 201*87056d31SPankaj Gupta /* clear the RST_REQ_MSK and SW_RST_REQ */ 202*87056d31SPankaj Gupta mov w0, #0x00000000 203*87056d31SPankaj Gupta str w0, [x2, #RSTCNTL_OFFSET] 204*87056d31SPankaj Gupta 205*87056d31SPankaj Gupta /* initiate the sw reset request */ 206*87056d31SPankaj Gupta mov w0, #SW_RST_REQ_INIT 207*87056d31SPankaj Gupta str w0, [x2, #RSTCNTL_OFFSET] 208*87056d31SPankaj Gupta 209*87056d31SPankaj Gupta /* In case this address range is mapped as cacheable, 210*87056d31SPankaj Gupta * flush the write out of the dcaches. 211*87056d31SPankaj Gupta */ 212*87056d31SPankaj Gupta add x2, x2, #RSTCNTL_OFFSET 213*87056d31SPankaj Gupta dc cvac, x2 214*87056d31SPankaj Gupta dsb st 215*87056d31SPankaj Gupta isb 216*87056d31SPankaj Gupta 217*87056d31SPankaj Gupta /* Function does not return */ 218*87056d31SPankaj Gupta b . 219*87056d31SPankaj Gupta nop 220*87056d31SPankaj Gupta nop 221*87056d31SPankaj Gupta nop 222*87056d31SPankaj Gupta nop 223*87056d31SPankaj Gupta nop 224*87056d31SPankaj Gupta nop 225*87056d31SPankaj Gupta nop 226*87056d31SPankaj Guptatouch_line6: 227*87056d31SPankaj Gupta cbz x3, start_line0 228*87056d31SPankaj Gupta 229*87056d31SPankaj Guptaendfunc _soc_sys_warm_reset 230