xref: /rk3399_ARM-atf/plat/nxp/soc-lx2160a/aarch64/lx2160a_warm_rst.S (revision 9719e19a977df3e8bf7567b3c0e1d6b2ebc5b46f)
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