xref: /rk3399_ARM-atf/plat/nxp/common/aarch64/bl31_data.S (revision 9719e19a977df3e8bf7567b3c0e1d6b2ebc5b46f)
1*bdfad087SPankaj Gupta/*
2*bdfad087SPankaj Gupta * Copyright 2018-2020 NXP
3*bdfad087SPankaj Gupta *
4*bdfad087SPankaj Gupta * SPDX-License-Identifier: BSD-3-Clause
5*bdfad087SPankaj Gupta *
6*bdfad087SPankaj Gupta */
7*bdfad087SPankaj Gupta
8*bdfad087SPankaj Gupta#include <asm_macros.S>
9*bdfad087SPankaj Gupta
10*bdfad087SPankaj Gupta#include "bl31_data.h"
11*bdfad087SPankaj Gupta#include "plat_psci.h"
12*bdfad087SPankaj Gupta#include "platform_def.h"
13*bdfad087SPankaj Gupta
14*bdfad087SPankaj Gupta.global _getCoreData
15*bdfad087SPankaj Gupta.global _setCoreData
16*bdfad087SPankaj Gupta.global _getCoreState
17*bdfad087SPankaj Gupta.global _setCoreState
18*bdfad087SPankaj Gupta.global _init_global_data
19*bdfad087SPankaj Gupta.global _get_global_data
20*bdfad087SPankaj Gupta.global _set_global_data
21*bdfad087SPankaj Gupta.global _initialize_psci
22*bdfad087SPankaj Gupta.global _init_task_flags
23*bdfad087SPankaj Gupta.global _set_task1_start
24*bdfad087SPankaj Gupta.global _set_task1_done
25*bdfad087SPankaj Gupta
26*bdfad087SPankaj Gupta
27*bdfad087SPankaj Gupta/* Function returns the specified data field value from the specified cpu
28*bdfad087SPankaj Gupta * core data area
29*bdfad087SPankaj Gupta * in:  x0 = core mask lsb
30*bdfad087SPankaj Gupta *	x1 = data field name/offset
31*bdfad087SPankaj Gupta * out: x0 = data value
32*bdfad087SPankaj Gupta * uses x0, x1, x2, [x13, x14, x15]
33*bdfad087SPankaj Gupta */
34*bdfad087SPankaj Guptafunc _getCoreData
35*bdfad087SPankaj Gupta
36*bdfad087SPankaj Gupta	/* generate a 0-based core number from the input mask */
37*bdfad087SPankaj Gupta	clz   x2, x0
38*bdfad087SPankaj Gupta	mov   x0, #63
39*bdfad087SPankaj Gupta	sub   x0, x0, x2
40*bdfad087SPankaj Gupta
41*bdfad087SPankaj Gupta	/* x0 = core number (0-based) */
42*bdfad087SPankaj Gupta	/* x1 = field offset */
43*bdfad087SPankaj Gupta
44*bdfad087SPankaj Gupta	/* determine if this is bootcore or secondary core */
45*bdfad087SPankaj Gupta	cbnz  x0, 1f
46*bdfad087SPankaj Gupta
47*bdfad087SPankaj Gupta	/* get base address for bootcore data */
48*bdfad087SPankaj Gupta	ldr  x2, =BC_PSCI_BASE
49*bdfad087SPankaj Gupta	add  x2, x2, x1
50*bdfad087SPankaj Gupta	b	2f
51*bdfad087SPankaj Gupta
52*bdfad087SPankaj Gupta1:	/* get base address for secondary core data */
53*bdfad087SPankaj Gupta
54*bdfad087SPankaj Gupta	/* x0 = core number (0-based) */
55*bdfad087SPankaj Gupta	/* x1 = field offset */
56*bdfad087SPankaj Gupta
57*bdfad087SPankaj Gupta	/* generate number of regions to offset */
58*bdfad087SPankaj Gupta	mov   x2, #SEC_REGION_SIZE
59*bdfad087SPankaj Gupta	mul   x2, x2, x0
60*bdfad087SPankaj Gupta
61*bdfad087SPankaj Gupta	/* x1 = field offset */
62*bdfad087SPankaj Gupta	/* x2 = region offset */
63*bdfad087SPankaj Gupta
64*bdfad087SPankaj Gupta	/* generate the total offset to data element */
65*bdfad087SPankaj Gupta	sub   x1, x2, x1
66*bdfad087SPankaj Gupta
67*bdfad087SPankaj Gupta	/* x1 = total offset to data element */
68*bdfad087SPankaj Gupta
69*bdfad087SPankaj Gupta	/* get the base address */
70*bdfad087SPankaj Gupta	ldr   x2, =SECONDARY_TOP
71*bdfad087SPankaj Gupta
72*bdfad087SPankaj Gupta	/* apply offset to base addr */
73*bdfad087SPankaj Gupta	sub   x2, x2, x1
74*bdfad087SPankaj Gupta2:
75*bdfad087SPankaj Gupta	/* x2 = data element address */
76*bdfad087SPankaj Gupta
77*bdfad087SPankaj Gupta	dc   ivac, x2
78*bdfad087SPankaj Gupta	dsb  sy
79*bdfad087SPankaj Gupta	isb
80*bdfad087SPankaj Gupta	/* read data */
81*bdfad087SPankaj Gupta	ldr  x0, [x2]
82*bdfad087SPankaj Gupta
83*bdfad087SPankaj Gupta	ret
84*bdfad087SPankaj Guptaendfunc _getCoreData
85*bdfad087SPankaj Gupta
86*bdfad087SPankaj Gupta
87*bdfad087SPankaj Gupta/* Function returns the SoC-specific state of the specified cpu
88*bdfad087SPankaj Gupta * in:  x0 = core mask lsb
89*bdfad087SPankaj Gupta * out: x0 = data value
90*bdfad087SPankaj Gupta * uses x0, x1, x2, [x13, x14, x15]
91*bdfad087SPankaj Gupta */
92*bdfad087SPankaj Guptafunc _getCoreState
93*bdfad087SPankaj Gupta
94*bdfad087SPankaj Gupta	mov   x1, #CORE_STATE_DATA
95*bdfad087SPankaj Gupta
96*bdfad087SPankaj Gupta	/* generate a 0-based core number from the input mask */
97*bdfad087SPankaj Gupta	clz   x2, x0
98*bdfad087SPankaj Gupta	mov   x0, #63
99*bdfad087SPankaj Gupta	sub   x0, x0, x2
100*bdfad087SPankaj Gupta
101*bdfad087SPankaj Gupta	/* x0 = core number (0-based) */
102*bdfad087SPankaj Gupta	/* x1 = field offset */
103*bdfad087SPankaj Gupta
104*bdfad087SPankaj Gupta	/* determine if this is bootcore or secondary core */
105*bdfad087SPankaj Gupta	cbnz  x0, 1f
106*bdfad087SPankaj Gupta
107*bdfad087SPankaj Gupta	/* get base address for bootcore data */
108*bdfad087SPankaj Gupta	ldr  x2, =BC_PSCI_BASE
109*bdfad087SPankaj Gupta	add  x2, x2, x1
110*bdfad087SPankaj Gupta	b	2f
111*bdfad087SPankaj Gupta
112*bdfad087SPankaj Gupta1:	/* get base address for secondary core data */
113*bdfad087SPankaj Gupta
114*bdfad087SPankaj Gupta	/* x0 = core number (0-based) */
115*bdfad087SPankaj Gupta	/* x1 = field offset */
116*bdfad087SPankaj Gupta
117*bdfad087SPankaj Gupta	/* generate number of regions to offset */
118*bdfad087SPankaj Gupta	mov   x2, #SEC_REGION_SIZE
119*bdfad087SPankaj Gupta	mul   x2, x2, x0
120*bdfad087SPankaj Gupta
121*bdfad087SPankaj Gupta	/* x1 = field offset */
122*bdfad087SPankaj Gupta	/* x2 = region offset */
123*bdfad087SPankaj Gupta
124*bdfad087SPankaj Gupta	/* generate the total offset to data element */
125*bdfad087SPankaj Gupta	sub   x1, x2, x1
126*bdfad087SPankaj Gupta
127*bdfad087SPankaj Gupta	/* x1 = total offset to data element */
128*bdfad087SPankaj Gupta
129*bdfad087SPankaj Gupta	/* get the base address */
130*bdfad087SPankaj Gupta	ldr   x2, =SECONDARY_TOP
131*bdfad087SPankaj Gupta
132*bdfad087SPankaj Gupta	/* apply offset to base addr */
133*bdfad087SPankaj Gupta	sub   x2, x2, x1
134*bdfad087SPankaj Gupta2:
135*bdfad087SPankaj Gupta	/* x2 = data element address */
136*bdfad087SPankaj Gupta
137*bdfad087SPankaj Gupta	dc   ivac, x2
138*bdfad087SPankaj Gupta	dsb  sy
139*bdfad087SPankaj Gupta	isb
140*bdfad087SPankaj Gupta
141*bdfad087SPankaj Gupta	/* read data */
142*bdfad087SPankaj Gupta	ldr  x0, [x2]
143*bdfad087SPankaj Gupta
144*bdfad087SPankaj Gupta	ret
145*bdfad087SPankaj Guptaendfunc _getCoreState
146*bdfad087SPankaj Gupta
147*bdfad087SPankaj Gupta
148*bdfad087SPankaj Gupta/* Function writes the specified data value into the specified cpu
149*bdfad087SPankaj Gupta * core data area
150*bdfad087SPankaj Gupta * in:  x0 = core mask lsb
151*bdfad087SPankaj Gupta *	  x1 = data field offset
152*bdfad087SPankaj Gupta *	  x2 = data value to write/store
153*bdfad087SPankaj Gupta * out: none
154*bdfad087SPankaj Gupta * uses x0, x1, x2, x3, [x13, x14, x15]
155*bdfad087SPankaj Gupta */
156*bdfad087SPankaj Guptafunc _setCoreData
157*bdfad087SPankaj Gupta	/* x0 = core mask */
158*bdfad087SPankaj Gupta	/* x1 = field offset */
159*bdfad087SPankaj Gupta	/* x2 = data value */
160*bdfad087SPankaj Gupta
161*bdfad087SPankaj Gupta	clz   x3, x0
162*bdfad087SPankaj Gupta	mov   x0, #63
163*bdfad087SPankaj Gupta	sub   x0, x0, x3
164*bdfad087SPankaj Gupta
165*bdfad087SPankaj Gupta	/* x0 = core number (0-based) */
166*bdfad087SPankaj Gupta	/* x1 = field offset */
167*bdfad087SPankaj Gupta	/* x2 = data value */
168*bdfad087SPankaj Gupta
169*bdfad087SPankaj Gupta	/* determine if this is bootcore or secondary core */
170*bdfad087SPankaj Gupta	cbnz  x0, 1f
171*bdfad087SPankaj Gupta
172*bdfad087SPankaj Gupta	/* get base address for bootcore data */
173*bdfad087SPankaj Gupta	ldr  x3, =BC_PSCI_BASE
174*bdfad087SPankaj Gupta	add  x3, x3, x1
175*bdfad087SPankaj Gupta	b	2f
176*bdfad087SPankaj Gupta
177*bdfad087SPankaj Gupta1:	/* get base address for secondary core data */
178*bdfad087SPankaj Gupta
179*bdfad087SPankaj Gupta	/* x0 = core number (0-based) */
180*bdfad087SPankaj Gupta	/* x1 = field offset */
181*bdfad087SPankaj Gupta	/* x2 = data value */
182*bdfad087SPankaj Gupta
183*bdfad087SPankaj Gupta	/* generate number of regions to offset */
184*bdfad087SPankaj Gupta	mov   x3, #SEC_REGION_SIZE
185*bdfad087SPankaj Gupta	mul   x3, x3, x0
186*bdfad087SPankaj Gupta
187*bdfad087SPankaj Gupta	/* x1 = field offset */
188*bdfad087SPankaj Gupta	/* x2 = data value */
189*bdfad087SPankaj Gupta	/* x3 = region offset */
190*bdfad087SPankaj Gupta
191*bdfad087SPankaj Gupta	/* generate the total offset to data element */
192*bdfad087SPankaj Gupta	sub   x1, x3, x1
193*bdfad087SPankaj Gupta
194*bdfad087SPankaj Gupta	/* x1 = total offset to data element */
195*bdfad087SPankaj Gupta	/* x2 = data value */
196*bdfad087SPankaj Gupta
197*bdfad087SPankaj Gupta	ldr   x3, =SECONDARY_TOP
198*bdfad087SPankaj Gupta
199*bdfad087SPankaj Gupta	/* apply offset to base addr */
200*bdfad087SPankaj Gupta	sub   x3, x3, x1
201*bdfad087SPankaj Gupta
202*bdfad087SPankaj Gupta2:
203*bdfad087SPankaj Gupta	/* x2 = data value */
204*bdfad087SPankaj Gupta	/* x3 = data element address */
205*bdfad087SPankaj Gupta
206*bdfad087SPankaj Gupta	str   x2, [x3]
207*bdfad087SPankaj Gupta
208*bdfad087SPankaj Gupta	dc	cvac, x3
209*bdfad087SPankaj Gupta	dsb   sy
210*bdfad087SPankaj Gupta	isb
211*bdfad087SPankaj Gupta	ret
212*bdfad087SPankaj Guptaendfunc _setCoreData
213*bdfad087SPankaj Gupta
214*bdfad087SPankaj Gupta
215*bdfad087SPankaj Gupta/* Function stores the specified core state
216*bdfad087SPankaj Gupta * in:  x0 = core mask lsb
217*bdfad087SPankaj Gupta *	x1 = data value to write/store
218*bdfad087SPankaj Gupta * out: none
219*bdfad087SPankaj Gupta * uses x0, x1, x2, x3, [x13, x14, x15]
220*bdfad087SPankaj Gupta */
221*bdfad087SPankaj Guptafunc _setCoreState
222*bdfad087SPankaj Gupta	mov  x2, #CORE_STATE_DATA
223*bdfad087SPankaj Gupta
224*bdfad087SPankaj Gupta	clz   x3, x0
225*bdfad087SPankaj Gupta	mov   x0, #63
226*bdfad087SPankaj Gupta	sub   x0, x0, x3
227*bdfad087SPankaj Gupta
228*bdfad087SPankaj Gupta	/* x0 = core number (0-based) */
229*bdfad087SPankaj Gupta	/* x1 = data value */
230*bdfad087SPankaj Gupta	/* x2 = field offset */
231*bdfad087SPankaj Gupta
232*bdfad087SPankaj Gupta	/* determine if this is bootcore or secondary core */
233*bdfad087SPankaj Gupta	cbnz  x0, 1f
234*bdfad087SPankaj Gupta
235*bdfad087SPankaj Gupta	/* get base address for bootcore data */
236*bdfad087SPankaj Gupta	ldr  x3, =BC_PSCI_BASE
237*bdfad087SPankaj Gupta	add  x3, x3, x2
238*bdfad087SPankaj Gupta	b	2f
239*bdfad087SPankaj Gupta
240*bdfad087SPankaj Gupta1:	/* get base address for secondary core data */
241*bdfad087SPankaj Gupta
242*bdfad087SPankaj Gupta	/* x0 = core number (0-based) */
243*bdfad087SPankaj Gupta	/* x1 = data value */
244*bdfad087SPankaj Gupta	/* x2 = field offset */
245*bdfad087SPankaj Gupta
246*bdfad087SPankaj Gupta	/* generate number of regions to offset */
247*bdfad087SPankaj Gupta	mov   x3, #SEC_REGION_SIZE
248*bdfad087SPankaj Gupta	mul   x3, x3, x0
249*bdfad087SPankaj Gupta
250*bdfad087SPankaj Gupta	/* x1 = data value */
251*bdfad087SPankaj Gupta	/* x2 = field offset */
252*bdfad087SPankaj Gupta	/* x3 = region offset */
253*bdfad087SPankaj Gupta
254*bdfad087SPankaj Gupta	/* generate the total offset to data element */
255*bdfad087SPankaj Gupta	sub   x2, x3, x2
256*bdfad087SPankaj Gupta
257*bdfad087SPankaj Gupta	/* x1 = data value */
258*bdfad087SPankaj Gupta	/* x2 = total offset to data element */
259*bdfad087SPankaj Gupta
260*bdfad087SPankaj Gupta	ldr   x3, =SECONDARY_TOP
261*bdfad087SPankaj Gupta
262*bdfad087SPankaj Gupta	/* apply offset to base addr */
263*bdfad087SPankaj Gupta	sub   x3, x3, x2
264*bdfad087SPankaj Gupta
265*bdfad087SPankaj Gupta2:
266*bdfad087SPankaj Gupta	/* x1 = data value */
267*bdfad087SPankaj Gupta	/* x3 = data element address */
268*bdfad087SPankaj Gupta
269*bdfad087SPankaj Gupta	str   x1, [x3]
270*bdfad087SPankaj Gupta
271*bdfad087SPankaj Gupta	dc	civac, x3
272*bdfad087SPankaj Gupta	dsb   sy
273*bdfad087SPankaj Gupta	isb
274*bdfad087SPankaj Gupta	ret
275*bdfad087SPankaj Guptaendfunc _setCoreState
276*bdfad087SPankaj Gupta
277*bdfad087SPankaj Gupta
278*bdfad087SPankaj Gupta/* Function sets the task1 start
279*bdfad087SPankaj Gupta * in:  w0 = value to set flag to
280*bdfad087SPankaj Gupta * out: none
281*bdfad087SPankaj Gupta * uses x0, x1
282*bdfad087SPankaj Gupta */
283*bdfad087SPankaj Guptafunc _set_task1_start
284*bdfad087SPankaj Gupta
285*bdfad087SPankaj Gupta	ldr  x1, =SMC_TASK1_BASE
286*bdfad087SPankaj Gupta
287*bdfad087SPankaj Gupta	add  x1, x1, #TSK_START_OFFSET
288*bdfad087SPankaj Gupta	str  w0, [x1]
289*bdfad087SPankaj Gupta	dc   cvac, x1
290*bdfad087SPankaj Gupta	dsb  sy
291*bdfad087SPankaj Gupta	isb
292*bdfad087SPankaj Gupta	ret
293*bdfad087SPankaj Guptaendfunc _set_task1_start
294*bdfad087SPankaj Gupta
295*bdfad087SPankaj Gupta
296*bdfad087SPankaj Gupta/* Function sets the state of the task 1 done flag
297*bdfad087SPankaj Gupta * in:  w0 = value to set flag to
298*bdfad087SPankaj Gupta * out: none
299*bdfad087SPankaj Gupta * uses x0, x1
300*bdfad087SPankaj Gupta */
301*bdfad087SPankaj Guptafunc _set_task1_done
302*bdfad087SPankaj Gupta
303*bdfad087SPankaj Gupta	ldr  x1, =SMC_TASK1_BASE
304*bdfad087SPankaj Gupta
305*bdfad087SPankaj Gupta	add  x1, x1, #TSK_DONE_OFFSET
306*bdfad087SPankaj Gupta	str  w0, [x1]
307*bdfad087SPankaj Gupta	dc   cvac, x1
308*bdfad087SPankaj Gupta	dsb  sy
309*bdfad087SPankaj Gupta	isb
310*bdfad087SPankaj Gupta	ret
311*bdfad087SPankaj Guptaendfunc _set_task1_done
312*bdfad087SPankaj Gupta
313*bdfad087SPankaj Gupta
314*bdfad087SPankaj Gupta/* Function initializes the smc global data entries
315*bdfad087SPankaj Gupta * Note: the constant LAST_SMC_GLBL_OFFSET must reference the last entry in the
316*bdfad087SPankaj Gupta *	   smc global region
317*bdfad087SPankaj Gupta * in:  none
318*bdfad087SPankaj Gupta * out: none
319*bdfad087SPankaj Gupta * uses x0, x1, x2
320*bdfad087SPankaj Gupta */
321*bdfad087SPankaj Guptafunc _init_global_data
322*bdfad087SPankaj Gupta
323*bdfad087SPankaj Gupta	ldr  x1, =SMC_GLBL_BASE
324*bdfad087SPankaj Gupta
325*bdfad087SPankaj Gupta	/* x1 = SMC_GLBL_BASE */
326*bdfad087SPankaj Gupta
327*bdfad087SPankaj Gupta	mov x2, #LAST_SMC_GLBL_OFFSET
328*bdfad087SPankaj Gupta	add x2, x2, x1
329*bdfad087SPankaj Gupta1:
330*bdfad087SPankaj Gupta	str  xzr, [x1]
331*bdfad087SPankaj Gupta	dc   cvac, x1
332*bdfad087SPankaj Gupta	cmp  x2, x1
333*bdfad087SPankaj Gupta	add  x1, x1, #8
334*bdfad087SPankaj Gupta	b.hi 1b
335*bdfad087SPankaj Gupta
336*bdfad087SPankaj Gupta	dsb  sy
337*bdfad087SPankaj Gupta	isb
338*bdfad087SPankaj Gupta	ret
339*bdfad087SPankaj Guptaendfunc _init_global_data
340*bdfad087SPankaj Gupta
341*bdfad087SPankaj Gupta
342*bdfad087SPankaj Gupta/* Function gets the value of the specified global data element
343*bdfad087SPankaj Gupta * in:  x0 = offset of data element
344*bdfad087SPankaj Gupta * out: x0 = requested data element
345*bdfad087SPankaj Gupta * uses x0, x1
346*bdfad087SPankaj Gupta */
347*bdfad087SPankaj Guptafunc _get_global_data
348*bdfad087SPankaj Gupta
349*bdfad087SPankaj Gupta	ldr  x1, =SMC_GLBL_BASE
350*bdfad087SPankaj Gupta	add  x1, x1, x0
351*bdfad087SPankaj Gupta	dc   ivac, x1
352*bdfad087SPankaj Gupta	isb
353*bdfad087SPankaj Gupta
354*bdfad087SPankaj Gupta	ldr  x0, [x1]
355*bdfad087SPankaj Gupta	ret
356*bdfad087SPankaj Guptaendfunc _get_global_data
357*bdfad087SPankaj Gupta
358*bdfad087SPankaj Gupta
359*bdfad087SPankaj Gupta/* Function sets the value of the specified global data element
360*bdfad087SPankaj Gupta * in:  x0 = offset of data element
361*bdfad087SPankaj Gupta *	  x1 = value to write
362*bdfad087SPankaj Gupta * out: none
363*bdfad087SPankaj Gupta * uses x0, x1, x2
364*bdfad087SPankaj Gupta */
365*bdfad087SPankaj Guptafunc _set_global_data
366*bdfad087SPankaj Gupta
367*bdfad087SPankaj Gupta	ldr  x2, =SMC_GLBL_BASE
368*bdfad087SPankaj Gupta	add  x0, x0, x2
369*bdfad087SPankaj Gupta	str  x1, [x0]
370*bdfad087SPankaj Gupta	dc   cvac, x0
371*bdfad087SPankaj Gupta
372*bdfad087SPankaj Gupta	dsb  sy
373*bdfad087SPankaj Gupta	isb
374*bdfad087SPankaj Gupta	ret
375*bdfad087SPankaj Guptaendfunc _set_global_data
376*bdfad087SPankaj Gupta
377*bdfad087SPankaj Gupta
378*bdfad087SPankaj Gupta/* Function initializes the core data areas
379*bdfad087SPankaj Gupta * only executed by the boot core
380*bdfad087SPankaj Gupta * in:   none
381*bdfad087SPankaj Gupta * out:  none
382*bdfad087SPankaj Gupta * uses: x0, x1, x2, x3, x4, x5, x6, x7, [x13, x14, x15]
383*bdfad087SPankaj Gupta */
384*bdfad087SPankaj Guptafunc _initialize_psci
385*bdfad087SPankaj Gupta	mov   x7, x30
386*bdfad087SPankaj Gupta
387*bdfad087SPankaj Gupta	/* initialize the bootcore psci data */
388*bdfad087SPankaj Gupta	ldr   x5, =BC_PSCI_BASE
389*bdfad087SPankaj Gupta	mov   x6, #CORE_RELEASED
390*bdfad087SPankaj Gupta
391*bdfad087SPankaj Gupta	str   x6,  [x5], #8
392*bdfad087SPankaj Gupta	dc cvac, x5
393*bdfad087SPankaj Gupta	str   xzr, [x5], #8
394*bdfad087SPankaj Gupta	dc cvac, x5
395*bdfad087SPankaj Gupta	str   xzr, [x5], #8
396*bdfad087SPankaj Gupta	dc cvac, x5
397*bdfad087SPankaj Gupta	str   xzr, [x5], #8
398*bdfad087SPankaj Gupta	dc cvac, x5
399*bdfad087SPankaj Gupta	str   xzr, [x5], #8
400*bdfad087SPankaj Gupta	dc cvac, x5
401*bdfad087SPankaj Gupta	str   xzr, [x5], #8
402*bdfad087SPankaj Gupta	dc cvac, x5
403*bdfad087SPankaj Gupta	str   xzr, [x5], #8
404*bdfad087SPankaj Gupta	dc cvac, x5
405*bdfad087SPankaj Gupta	str   xzr, [x5], #8
406*bdfad087SPankaj Gupta	dc cvac, x5
407*bdfad087SPankaj Gupta	str   xzr, [x5], #8
408*bdfad087SPankaj Gupta	dc cvac, x5
409*bdfad087SPankaj Gupta	str   xzr, [x5], #8
410*bdfad087SPankaj Gupta	dc cvac, x5
411*bdfad087SPankaj Gupta	str   xzr, [x5], #8
412*bdfad087SPankaj Gupta	dc cvac, x5
413*bdfad087SPankaj Gupta	str   xzr, [x5], #8
414*bdfad087SPankaj Gupta	dc cvac, x5
415*bdfad087SPankaj Gupta	str   xzr, [x5], #8
416*bdfad087SPankaj Gupta	dc cvac, x5
417*bdfad087SPankaj Gupta	str   xzr, [x5], #8
418*bdfad087SPankaj Gupta	dc cvac, x5
419*bdfad087SPankaj Gupta	str   xzr, [x5], #8
420*bdfad087SPankaj Gupta	dc cvac, x5
421*bdfad087SPankaj Gupta	str   xzr, [x5]
422*bdfad087SPankaj Gupta	dc cvac, x5
423*bdfad087SPankaj Gupta	dsb sy
424*bdfad087SPankaj Gupta	isb
425*bdfad087SPankaj Gupta
426*bdfad087SPankaj Gupta	/* see if we have any secondary cores */
427*bdfad087SPankaj Gupta	mov   x4, #PLATFORM_CORE_COUNT
428*bdfad087SPankaj Gupta	sub   x4, x4, #1
429*bdfad087SPankaj Gupta	cbz   x4, 3f
430*bdfad087SPankaj Gupta
431*bdfad087SPankaj Gupta	/* initialize the secondary core's psci data */
432*bdfad087SPankaj Gupta	ldr  x5, =SECONDARY_TOP
433*bdfad087SPankaj Gupta	/* core mask lsb for core 1 */
434*bdfad087SPankaj Gupta	mov  x3, #2
435*bdfad087SPankaj Gupta	sub  x5, x5, #SEC_REGION_SIZE
436*bdfad087SPankaj Gupta
437*bdfad087SPankaj Gupta	/* x3 = core1 mask lsb */
438*bdfad087SPankaj Gupta	/* x4 = number of secondary cores */
439*bdfad087SPankaj Gupta	/* x5 = core1 psci data base address */
440*bdfad087SPankaj Gupta2:
441*bdfad087SPankaj Gupta	/* set core state in x6 */
442*bdfad087SPankaj Gupta	mov  x0, x3
443*bdfad087SPankaj Gupta	mov  x6, #CORE_IN_RESET
444*bdfad087SPankaj Gupta	bl   _soc_ck_disabled
445*bdfad087SPankaj Gupta	cbz  x0, 1f
446*bdfad087SPankaj Gupta	mov  x6, #CORE_DISABLED
447*bdfad087SPankaj Gupta1:
448*bdfad087SPankaj Gupta	add   x2, x5, #CORE_STATE_DATA
449*bdfad087SPankaj Gupta	str   x6,  [x2]
450*bdfad087SPankaj Gupta	dc cvac, x2
451*bdfad087SPankaj Gupta	add   x2, x5, #SPSR_EL3_DATA
452*bdfad087SPankaj Gupta	str   xzr, [x2]
453*bdfad087SPankaj Gupta	dc cvac, x2
454*bdfad087SPankaj Gupta	add   x2, x5, #CNTXT_ID_DATA
455*bdfad087SPankaj Gupta	str   xzr, [x2]
456*bdfad087SPankaj Gupta	dc cvac, x2
457*bdfad087SPankaj Gupta	add   x2, x5, #START_ADDR_DATA
458*bdfad087SPankaj Gupta	str   xzr, [x2]
459*bdfad087SPankaj Gupta	dc cvac, x2
460*bdfad087SPankaj Gupta	add   x2, x5, #LINK_REG_DATA
461*bdfad087SPankaj Gupta	str   xzr, [x2]
462*bdfad087SPankaj Gupta	dc cvac, x2
463*bdfad087SPankaj Gupta	add   x2, x5, #GICC_CTLR_DATA
464*bdfad087SPankaj Gupta	str   xzr, [x2]
465*bdfad087SPankaj Gupta	dc cvac, x2
466*bdfad087SPankaj Gupta	add   x2, x5, #ABORT_FLAG_DATA
467*bdfad087SPankaj Gupta	str   xzr, [x2]
468*bdfad087SPankaj Gupta	dc cvac, x2
469*bdfad087SPankaj Gupta	add   x2, x5, #SCTLR_DATA
470*bdfad087SPankaj Gupta	str   xzr, [x2]
471*bdfad087SPankaj Gupta	dc cvac, x2
472*bdfad087SPankaj Gupta	add   x2, x5, #CPUECTLR_DATA
473*bdfad087SPankaj Gupta	str   xzr, [x2]
474*bdfad087SPankaj Gupta	dc cvac, x2
475*bdfad087SPankaj Gupta	add   x2, x5, #AUX_01_DATA
476*bdfad087SPankaj Gupta	str   xzr, [x2]
477*bdfad087SPankaj Gupta	dc cvac, x2
478*bdfad087SPankaj Gupta	add   x2, x5, #AUX_02_DATA
479*bdfad087SPankaj Gupta	str   xzr, [x2]
480*bdfad087SPankaj Gupta	dc cvac, x2
481*bdfad087SPankaj Gupta	add   x2, x5, #AUX_03_DATA
482*bdfad087SPankaj Gupta	str   xzr, [x2]
483*bdfad087SPankaj Gupta	dc cvac, x2
484*bdfad087SPankaj Gupta	add   x2, x5, #AUX_04_DATA
485*bdfad087SPankaj Gupta	str   xzr, [x2]
486*bdfad087SPankaj Gupta	dc cvac, x2
487*bdfad087SPankaj Gupta	add   x2, x5, #AUX_05_DATA
488*bdfad087SPankaj Gupta	str   xzr, [x2]
489*bdfad087SPankaj Gupta	dc cvac, x2
490*bdfad087SPankaj Gupta	add   x2, x5, #SCR_EL3_DATA
491*bdfad087SPankaj Gupta	str   xzr, [x2]
492*bdfad087SPankaj Gupta	dc cvac, x2
493*bdfad087SPankaj Gupta	add   x2, x5, #HCR_EL2_DATA
494*bdfad087SPankaj Gupta	str   xzr, [x2]
495*bdfad087SPankaj Gupta	dc cvac, x2
496*bdfad087SPankaj Gupta	dsb sy
497*bdfad087SPankaj Gupta	isb
498*bdfad087SPankaj Gupta
499*bdfad087SPankaj Gupta	sub   x4, x4, #1
500*bdfad087SPankaj Gupta	cbz   x4, 3f
501*bdfad087SPankaj Gupta
502*bdfad087SPankaj Gupta	/* generate next core mask */
503*bdfad087SPankaj Gupta	lsl  x3, x3, #1
504*bdfad087SPankaj Gupta
505*bdfad087SPankaj Gupta	/* decrement base address to next data area */
506*bdfad087SPankaj Gupta	sub  x5, x5, #SEC_REGION_SIZE
507*bdfad087SPankaj Gupta	b	2b
508*bdfad087SPankaj Gupta3:
509*bdfad087SPankaj Gupta	mov   x30, x7
510*bdfad087SPankaj Gupta	ret
511*bdfad087SPankaj Guptaendfunc _initialize_psci
512*bdfad087SPankaj Gupta
513*bdfad087SPankaj Gupta
514*bdfad087SPankaj Gupta/* Function initializes the soc init task flags
515*bdfad087SPankaj Gupta * in:  none
516*bdfad087SPankaj Gupta * out: none
517*bdfad087SPankaj Gupta * uses x0, x1, [x13, x14, x15]
518*bdfad087SPankaj Gupta */
519*bdfad087SPankaj Guptafunc _init_task_flags
520*bdfad087SPankaj Gupta
521*bdfad087SPankaj Gupta	/* get the base address of the first task structure */
522*bdfad087SPankaj Gupta	ldr  x0, =SMC_TASK1_BASE
523*bdfad087SPankaj Gupta
524*bdfad087SPankaj Gupta	/* x0 = task1 base address */
525*bdfad087SPankaj Gupta
526*bdfad087SPankaj Gupta	str  wzr, [x0, #TSK_START_OFFSET]
527*bdfad087SPankaj Gupta	str  wzr, [x0, #TSK_DONE_OFFSET]
528*bdfad087SPankaj Gupta	str  wzr, [x0, #TSK_CORE_OFFSET]
529*bdfad087SPankaj Gupta	dc   cvac, x0
530*bdfad087SPankaj Gupta
531*bdfad087SPankaj Gupta	/* move to task2 structure */
532*bdfad087SPankaj Gupta	add  x0, x0, #SMC_TASK_OFFSET
533*bdfad087SPankaj Gupta
534*bdfad087SPankaj Gupta	str  wzr, [x0, #TSK_START_OFFSET]
535*bdfad087SPankaj Gupta	str  wzr, [x0, #TSK_DONE_OFFSET]
536*bdfad087SPankaj Gupta	str  wzr, [x0, #TSK_CORE_OFFSET]
537*bdfad087SPankaj Gupta	dc   cvac, x0
538*bdfad087SPankaj Gupta
539*bdfad087SPankaj Gupta	/* move to task3 structure */
540*bdfad087SPankaj Gupta	add  x0, x0, #SMC_TASK_OFFSET
541*bdfad087SPankaj Gupta
542*bdfad087SPankaj Gupta	str  wzr, [x0, #TSK_START_OFFSET]
543*bdfad087SPankaj Gupta	str  wzr, [x0, #TSK_DONE_OFFSET]
544*bdfad087SPankaj Gupta	str  wzr, [x0, #TSK_CORE_OFFSET]
545*bdfad087SPankaj Gupta	dc   cvac, x0
546*bdfad087SPankaj Gupta
547*bdfad087SPankaj Gupta	/* move to task4 structure */
548*bdfad087SPankaj Gupta	add  x0, x0, #SMC_TASK_OFFSET
549*bdfad087SPankaj Gupta
550*bdfad087SPankaj Gupta	str  wzr, [x0, #TSK_START_OFFSET]
551*bdfad087SPankaj Gupta	str  wzr, [x0, #TSK_DONE_OFFSET]
552*bdfad087SPankaj Gupta	str  wzr, [x0, #TSK_CORE_OFFSET]
553*bdfad087SPankaj Gupta	dc   cvac, x0
554*bdfad087SPankaj Gupta
555*bdfad087SPankaj Gupta	dsb  sy
556*bdfad087SPankaj Gupta	isb
557*bdfad087SPankaj Gupta	ret
558*bdfad087SPankaj Guptaendfunc _init_task_flags
559