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