Skip to content

Commit f1d29fb

Browse files
committed
arch/tricore: disarm WDTCPU1 before CSA init on secondary
- Backport from main for 0.1.0
1 parent 347aab6 commit f1d29fb

1 file changed

Lines changed: 148 additions & 0 deletions

File tree

arch/tricore/secondary.S

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
/* SPDX-License-Identifier: MIT */
2+
/*
3+
* CPU1 cold entry — arch/tricore/secondary.S
4+
*
5+
* Reset leaves CPU1 halted. CPU0 programs PC to _ulmk_cpu1_start and clears
6+
* DBGSR.HALT. This prologue builds a private CSA free list in DSPR1
7+
* (segment 0x6), loads park SP + small-data anchors, then jumps to
8+
* ulmk_arch_smp_park() which waits for release and calls the kernel entry.
9+
*/
10+
11+
.extern _ulmk_park_stack_cpu1_top
12+
.extern _ulmk_csa_pool_cpu1_start
13+
.extern _ulmk_csa_pool_cpu1_end
14+
.extern _small_data_
15+
.extern _small_data2_
16+
.extern _small_data3_
17+
.extern _small_data4_
18+
.extern ulmk_arch_smp_park
19+
20+
.section .text._ulmk_cpu1_start, "ax"
21+
.global _ulmk_cpu1_start
22+
.type _ulmk_cpu1_start, @function
23+
.set WDTCPU1_CON0, 0xF003610C
24+
.set WDTCPU1_CON1, 0xF0036110
25+
26+
_ulmk_cpu1_start:
27+
disable
28+
29+
movh.a %a10, hi:_ulmk_park_stack_cpu1_top
30+
lea %a10, [%a10] lo:_ulmk_park_stack_cpu1_top
31+
32+
/*
33+
* Disarm WDTCPU1 before CSA construction. OpenOCD reset-end may
34+
* already have set DR, but button/PORST and flash paths without a
35+
* sticky DAP poke leave the default timeout armed — CSA init is
36+
* long enough to expire it. Own-core EndInit only (never from CPU0).
37+
*/
38+
movh.a %a2, hi:WDTCPU1_CON0
39+
lea %a2, [%a2] lo:WDTCPU1_CON0
40+
ld.w %d0, [%a2]0
41+
extr.u %d8, %d0, 2, 14 /* PW */
42+
mov %d1, 0x3F
43+
xor %d8, %d1
44+
extr.u %d9, %d0, 16, 16 /* REL */
45+
extr.u %d2, %d0, 1, 1 /* LCK? */
46+
jz %d2, .L_wdt1_cle2
47+
sh %d0, %d8, 2
48+
mov %d1, 1
49+
or %d0, %d1
50+
sh %d1, %d9, 16
51+
or %d0, %d1
52+
st.w [%a2]0, %d0
53+
.L_wdt1_cle2:
54+
sh %d0, %d8, 2
55+
mov %d1, 2 /* ENDINIT=0 LCK=1 */
56+
or %d0, %d1
57+
sh %d1, %d9, 16
58+
or %d0, %d1
59+
st.w [%a2]0, %d0
60+
.L_wdt1_wait0:
61+
ld.w %d0, [%a2]0
62+
and %d1, %d0, 1
63+
jnz %d1, .L_wdt1_wait0
64+
65+
movh.a %a3, hi:WDTCPU1_CON1
66+
lea %a3, [%a3] lo:WDTCPU1_CON1
67+
mov %d0, 8 /* DR=1 */
68+
st.w [%a3]0, %d0
69+
70+
ld.w %d0, [%a2]0
71+
extr.u %d9, %d0, 16, 16
72+
extr.u %d2, %d0, 1, 1
73+
jz %d2, .L_wdt1_set2
74+
sh %d0, %d8, 2
75+
mov %d1, 1
76+
or %d0, %d1
77+
sh %d1, %d9, 16
78+
or %d0, %d1
79+
st.w [%a2]0, %d0
80+
.L_wdt1_set2:
81+
sh %d0, %d8, 2
82+
mov %d1, 3 /* ENDINIT=1 LCK=1 */
83+
or %d0, %d1
84+
sh %d1, %d9, 16
85+
or %d0, %d1
86+
st.w [%a2]0, %d0
87+
.L_wdt1_wait1:
88+
ld.w %d0, [%a2]0
89+
and %d1, %d0, 1
90+
jz %d1, .L_wdt1_wait1
91+
92+
/*
93+
* CSA free list for DSPR1 @ 0x6xxx_xxxx:
94+
* link = 0x00060000 | extr.u(addr, 6, 16)
95+
*/
96+
movh.a %a2, hi:_ulmk_csa_pool_cpu1_start
97+
lea %a2, [%a2] lo:_ulmk_csa_pool_cpu1_start
98+
movh.a %a3, hi:_ulmk_csa_pool_cpu1_end
99+
lea %a3, [%a3] lo:_ulmk_csa_pool_cpu1_end
100+
101+
lea %a4, [%a2] 0
102+
103+
.L_csa1_link:
104+
lea %a5, [%a4] 64
105+
mov.d %d0, %a5
106+
extr.u %d0, %d0, 6, 16
107+
movh %d1, 6
108+
or %d0, %d1
109+
mov.d %d2, %a5
110+
mov.d %d3, %a3
111+
jge %d2, %d3, .L_csa1_last
112+
st.w [%a4], %d0
113+
lea %a4, [%a5] 0
114+
j .L_csa1_link
115+
116+
.L_csa1_last:
117+
mov %d0, 0
118+
st.w [%a4], %d0
119+
120+
mov.d %d0, %a2
121+
extr.u %d0, %d0, 6, 16
122+
movh %d1, 6
123+
or %d0, %d1
124+
dsync
125+
mtcr 0xFE38, %d0 /* FCX */
126+
isync
127+
128+
lea %a6, [%a4] 0
129+
mov.d %d0, %a6
130+
extr.u %d0, %d0, 6, 16
131+
movh %d1, 6
132+
or %d0, %d1
133+
dsync
134+
mtcr 0xFE3C, %d0 /* LCX */
135+
isync
136+
137+
movh.a %a0, hi:_small_data_
138+
lea %a0, [%a0] lo:_small_data_
139+
movh.a %a1, hi:_small_data2_
140+
lea %a1, [%a1] lo:_small_data2_
141+
movh.a %a8, hi:_small_data3_
142+
lea %a8, [%a8] lo:_small_data3_
143+
movh.a %a9, hi:_small_data4_
144+
lea %a9, [%a9] lo:_small_data4_
145+
146+
j ulmk_arch_smp_park
147+
148+
.size _ulmk_cpu1_start, . - _ulmk_cpu1_start

0 commit comments

Comments
 (0)