xref: /rk3399_rockchip-uboot/cmd/ddr_tool/ddr_tool_mp.S (revision 2d08ea87864a34c9e03c965b76b5fb18c1573675)
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