1*9bf9a700SWesley Yao/* SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause */ 2*9bf9a700SWesley Yao/* 3*9bf9a700SWesley Yao * Copyright (C) 2023 Rockchip Electronics Co., Ltd. 4*9bf9a700SWesley Yao */ 5*9bf9a700SWesley Yao 6*9bf9a700SWesley Yao .global __sp 7*9bf9a700SWesley Yao 8*9bf9a700SWesley Yao .global secondary_main 9*9bf9a700SWesley Yao .global secondary_init 10*9bf9a700SWesley Yao .global get_cpu_id 11*9bf9a700SWesley Yao .global lock_byte_mutex 12*9bf9a700SWesley Yao .global unlock_byte_mutex 13*9bf9a700SWesley Yao 14*9bf9a700SWesley Yao#ifndef CONFIG_ARM64 15*9bf9a700SWesley Yao .align 7 16*9bf9a700SWesley Yaovectors_2: 17*9bf9a700SWesley Yao ldr pc, =die_loop /* reset */ 18*9bf9a700SWesley Yao ldr pc, =die_loop /* undefine */ 19*9bf9a700SWesley Yao ldr pc, =die_loop /* swi */ 20*9bf9a700SWesley Yao ldr pc, =die_loop /* iabort */ 21*9bf9a700SWesley Yao ldr pc, =die_loop /* dabort */ 22*9bf9a700SWesley Yao ldr pc, =die_loop /* reserved */ 23*9bf9a700SWesley Yao ldr pc, =die_loop /* irq */ 24*9bf9a700SWesley Yao ldr pc, =die_loop /* fiq */ 25*9bf9a700SWesley Yao 26*9bf9a700SWesley Yao .align 7 27*9bf9a700SWesley Yaodie_loop: 28*9bf9a700SWesley Yao b die_loop 29*9bf9a700SWesley Yao 30*9bf9a700SWesley Yao .align 7 31*9bf9a700SWesley Yao .type secondary_init, %function 32*9bf9a700SWesley Yaosecondary_init: 33*9bf9a700SWesley Yao bl irq_disable 34*9bf9a700SWesley Yao bl icache_invalid 35*9bf9a700SWesley Yao 36*9bf9a700SWesley Yao /* set sp */ 37*9bf9a700SWesley Yao ldr r2, =__sp 38*9bf9a700SWesley Yao ldr r1, [r2] 39*9bf9a700SWesley Yao bic r1, r1, #0xf 40*9bf9a700SWesley Yao mov sp, r1 41*9bf9a700SWesley Yao bl icache_invalid 42*9bf9a700SWesley Yao 43*9bf9a700SWesley Yao mrc p15, 0, r0, c1, c0, 0 /* CP15 C1 System Control Register */ 44*9bf9a700SWesley Yao bic r0, r0, #0x2000 /* clear V (bit[13], VBAR) */ 45*9bf9a700SWesley Yao mcr p15, 0, r0, c1, c0, 0 /* for remap VBAR */ 46*9bf9a700SWesley Yao ldr r0, =vectors_2 47*9bf9a700SWesley Yao mcr p15, 0, r0, c12, c0, 0 48*9bf9a700SWesley Yao bl icache_invalid 49*9bf9a700SWesley Yao 50*9bf9a700SWesley Yao b secondary_main 51*9bf9a700SWesley Yao 52*9bf9a700SWesley Yaoirq_disable: 53*9bf9a700SWesley Yao mrs r0, cpsr 54*9bf9a700SWesley Yao orr r0, r0, #0xc0 55*9bf9a700SWesley Yao msr cpsr, r0 56*9bf9a700SWesley Yao bx lr 57*9bf9a700SWesley Yao 58*9bf9a700SWesley Yaoicache_invalid: 59*9bf9a700SWesley Yao mov r0, #0 60*9bf9a700SWesley Yao mcr p15, 0, r0, c7, c5, 0 61*9bf9a700SWesley Yao bx lr 62*9bf9a700SWesley Yao 63*9bf9a700SWesley Yao .type get_cpu_id, %function 64*9bf9a700SWesley Yaoget_cpu_id: 65*9bf9a700SWesley Yao mrc p15, 0, r0, c0, c0, 5 66*9bf9a700SWesley Yao and r0, r0, #0x3 67*9bf9a700SWesley Yao bx lr 68*9bf9a700SWesley Yao 69*9bf9a700SWesley Yao .align 7 70*9bf9a700SWesley Yao .type lock_byte_mutex, %function 71*9bf9a700SWesley Yaolock_byte_mutex: 72*9bf9a700SWesley Yao mov r2, #0x1 73*9bf9a700SWesley Yaotry: 74*9bf9a700SWesley Yao ldrex r1, [r0] 75*9bf9a700SWesley Yao cmp r1, #0 76*9bf9a700SWesley Yao strexeq r1, r2, [r0] 77*9bf9a700SWesley Yao cmpeq r1, #0 78*9bf9a700SWesley Yao bne try 79*9bf9a700SWesley Yao dmb 80*9bf9a700SWesley Yao bx lr 81*9bf9a700SWesley Yao 82*9bf9a700SWesley Yao .align 7 83*9bf9a700SWesley Yao .type unlock_byte_mutex, %function 84*9bf9a700SWesley Yaounlock_byte_mutex: 85*9bf9a700SWesley Yao dmb 86*9bf9a700SWesley Yao mov r1, #0 87*9bf9a700SWesley Yao str r1, [r0] 88*9bf9a700SWesley Yao dsb 89*9bf9a700SWesley Yao bx lr 90*9bf9a700SWesley Yao#else /* CONFIG_ARM64 */ 91*9bf9a700SWesley Yao .align 7 92*9bf9a700SWesley Yaoel2_vectors: 93*9bf9a700SWesley Yaosynchronous_sp0: 94*9bf9a700SWesley Yao b secondary_init 95*9bf9a700SWesley Yao .align 7 96*9bf9a700SWesley Yaoirq_sp0: 97*9bf9a700SWesley Yao b irq_sp0 98*9bf9a700SWesley Yao .align 7 99*9bf9a700SWesley Yaofiq_sp0: 100*9bf9a700SWesley Yao b fiq_sp0 101*9bf9a700SWesley Yao .align 7 102*9bf9a700SWesley Yaoserror_sp0: 103*9bf9a700SWesley Yao b serror_sp0 104*9bf9a700SWesley Yao .align 7 105*9bf9a700SWesley Yaosynchronous_spx: 106*9bf9a700SWesley Yao b synchronous_spx 107*9bf9a700SWesley Yao .align 7 108*9bf9a700SWesley Yaoirq_spx: 109*9bf9a700SWesley Yao b irq_spx 110*9bf9a700SWesley Yao .align 7 111*9bf9a700SWesley Yaofiq_spx: 112*9bf9a700SWesley Yao b fiq_spx 113*9bf9a700SWesley Yao .align 7 114*9bf9a700SWesley Yaoserror_spx: 115*9bf9a700SWesley Yao b serror_spx 116*9bf9a700SWesley Yao 117*9bf9a700SWesley Yao .align 7 118*9bf9a700SWesley Yao .type secondary_init, %function 119*9bf9a700SWesley Yaosecondary_init: 120*9bf9a700SWesley Yao bl irq_disable 121*9bf9a700SWesley Yao 122*9bf9a700SWesley Yao /* set sp */ 123*9bf9a700SWesley Yao ldr x2, =__sp 124*9bf9a700SWesley Yao ldr x1, [x2] 125*9bf9a700SWesley Yao bic x1, x1, #0xf 126*9bf9a700SWesley Yao mov sp, x1 127*9bf9a700SWesley Yao bl icache_invalid 128*9bf9a700SWesley Yao 129*9bf9a700SWesley Yao ldr w0, =el2_vectors 130*9bf9a700SWesley Yao msr vbar_el2, x0 131*9bf9a700SWesley Yao bl icache_invalid 132*9bf9a700SWesley Yao 133*9bf9a700SWesley Yao bl secondary_main 134*9bf9a700SWesley Yao 135*9bf9a700SWesley Yao .type irq_disable, %function 136*9bf9a700SWesley Yaoirq_disable: 137*9bf9a700SWesley Yao msr daifset, #0x3 138*9bf9a700SWesley Yao ic iallu 139*9bf9a700SWesley Yao ret 140*9bf9a700SWesley Yao 141*9bf9a700SWesley Yao .type icache_invalid, %function 142*9bf9a700SWesley Yaoicache_invalid: 143*9bf9a700SWesley Yao ic iallu 144*9bf9a700SWesley Yao ret 145*9bf9a700SWesley Yao 146*9bf9a700SWesley Yao .align 7 147*9bf9a700SWesley Yao .type lock_byte_mutex, %function 148*9bf9a700SWesley Yaolock_byte_mutex: 149*9bf9a700SWesley Yao ldxrb w1, [x0] 150*9bf9a700SWesley Yao cmp w1, #1 151*9bf9a700SWesley Yao bne 1f 152*9bf9a700SWesley Yao wfe 153*9bf9a700SWesley Yao b lock_byte_mutex 154*9bf9a700SWesley Yao1: 155*9bf9a700SWesley Yao mov x1, #1 156*9bf9a700SWesley Yao stxrb w2, w1, [x0] 157*9bf9a700SWesley Yao cmp w2, #0 158*9bf9a700SWesley Yao bne lock_byte_mutex 159*9bf9a700SWesley Yao dmb sy 160*9bf9a700SWesley Yao ret 161*9bf9a700SWesley Yao 162*9bf9a700SWesley Yao .align 7 163*9bf9a700SWesley Yao .type unlock_byte_mutex, %function 164*9bf9a700SWesley Yaounlock_byte_mutex: 165*9bf9a700SWesley Yao dmb sy 166*9bf9a700SWesley Yao mov x1, #0 167*9bf9a700SWesley Yao strb w1, [x0] 168*9bf9a700SWesley Yao dsb sy 169*9bf9a700SWesley Yao sev 170*9bf9a700SWesley Yao ret 171*9bf9a700SWesley Yao#endif /* #ifdef CONFIG_ARM */ 172