summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
authorAnup Patel <anup.patel@wdc.com>2019-10-31 11:41:55 +0300
committerAnup Patel <anup.patel@wdc.com>2019-11-05 06:20:04 +0300
commit98f4a208995b027662a7b04a25e4fa5df5f3eefe (patch)
treee099d38f51698f50e53d5ceec7ba27473edb068b /firmware
parentdd8ef28b2717140c0d6cc61a2d6ffbadb506235e (diff)
downloadopensbi-98f4a208995b027662a7b04a25e4fa5df5f3eefe.tar.xz
firmware: Introduce relocation lottery
Instead of forcing HART0 to do the relocation and scratch init work, we should have an atomic lottery to decide which HART does the relocation and scratch init. This way any HART can be boot/main HART. Signed-off-by: Anup Patel <anup.patel@wdc.com> Reviewed-by: Atish Patra <atish.patra@wdc.com>
Diffstat (limited to 'firmware')
-rw-r--r--firmware/fw_base.S17
1 files changed, 11 insertions, 6 deletions
diff --git a/firmware/fw_base.S b/firmware/fw_base.S
index 2c198cf..375c158 100644
--- a/firmware/fw_base.S
+++ b/firmware/fw_base.S
@@ -46,12 +46,11 @@
.globl _start
.globl _start_warm
_start:
- /*
- * Jump to warm-boot if this is not the first core booting,
- * that is, for mhartid != 0
- */
- csrr a6, CSR_MHARTID
- blt zero, a6, _wait_relocate_copy_done
+ /* Jump to relocation wait loop if we don't get relocation lottery */
+ la a6, _relocate_lottery
+ li a7, 1
+ amoadd.w a6, a7, (a6)
+ bnez a6, _wait_relocate_copy_done
/* Save load address */
la t0, _load_start
@@ -75,6 +74,8 @@ _relocate:
blt t2, t0, _relocate_copy_to_upper
_relocate_copy_to_lower:
ble t1, t2, _relocate_copy_to_lower_loop
+ la t3, _relocate_lottery
+ BRANGE t2, t1, t3, _start_hang
la t3, _boot_status
BRANGE t2, t1, t3, _start_hang
la t3, _relocate
@@ -91,6 +92,8 @@ _relocate_copy_to_lower_loop:
jr t4
_relocate_copy_to_upper:
ble t3, t0, _relocate_copy_to_upper_loop
+ la t2, _relocate_lottery
+ BRANGE t0, t3, t2, _start_hang
la t2, _boot_status
BRANGE t0, t3, t2, _start_hang
la t2, _relocate
@@ -381,6 +384,8 @@ _start_warm:
j _start_hang
.align 3
+_relocate_lottery:
+ RISCV_PTR 0
_boot_status:
RISCV_PTR 0
_load_start: