|
| 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