target smp {*}$_TARGETS
+# Service processor
+target create $_CHIPNAME.sp cortex_a -dap $_CHIPNAME.dap -ap-num 0 -dbgbase 0x80138000
+
+# Normally you will not need to call this, but if you are using the hard-coded
+# Reset Configuration Word (RCW) you will need to call this manually. The CPU's
+# reset vector is 0, and the boot ROM at that location contains ARMv7-A 32-bit
+# instructions. This will cause the CPU to almost immediately execute an
+# illegal instruction.
+#
+# This code is idempotent; releasing a released CPU has no effect, although it
+# will halt/resume the service processor.
+add_help_text release_cpu "Release a cpu which is held off"
+proc release_cpu {cpu} {
+ set RST_BRRL 0x1e60060
+
+ set old [target current]
+ targets $::_CHIPNAME.sp
+ set not_halted [string compare halted [$::_CHIPNAME.sp curstate]]
+ if {$not_halted} {
+ halt
+ }
+
+ # Release the cpu; it will start executing something bogus
+ mem2array regs 32 $RST_BRRL 1
+ mww $RST_BRRL [expr {$regs(0) | 1 << $cpu}]
+
+ if {$not_halted} {
+ resume
+ }
+ targets $old
+}
+
targets $_CHIPNAME.cpu0
# Seems to work OK in testing