firmware: fw_base.S: Fix boot hart status synchronization

It's wrong to put the fence after setting the boot status flag because
all relocation operations must be finished before setting the status
flag. So, this fence must be put before the setting status flag, and
there is no use in putting a fence between _start_warm and setting
status flag.

Also, nop can't delay other harts too much, so use div instead, just
like Linux cpu_relax. Current opensbi force enables “M” Standard
Extension, and mul instructions have been used in the fw_base.S.

After the above two fixes, the boot hart index param of the
fw_dynamic_info could be guaranteed properly for all platforms.

Signed-off-by: Guo Ren <guoren@linux.alibaba.com>
Signed-off-by: Guo Ren <guoren@kernel.org>
Reviewed-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
Guo Ren
2023-10-19 05:27:34 -04:00
committed by Anup Patel
parent 07f2ccd990
commit fccdf41d32

View File

@@ -399,8 +399,8 @@ _fdt_reloc_done:
/* mark boot hart done */ /* mark boot hart done */
li t0, BOOT_STATUS_BOOT_HART_DONE li t0, BOOT_STATUS_BOOT_HART_DONE
lla t1, _boot_status lla t1, _boot_status
REG_S t0, 0(t1)
fence rw, rw fence rw, rw
REG_S t0, 0(t1)
j _start_warm j _start_warm
/* waiting for boot hart to be done (_boot_status == 2) */ /* waiting for boot hart to be done (_boot_status == 2) */
@@ -409,9 +409,9 @@ _wait_for_boot_hart:
lla t1, _boot_status lla t1, _boot_status
REG_L t1, 0(t1) REG_L t1, 0(t1)
/* Reduce the bus traffic so that boot hart may proceed faster */ /* Reduce the bus traffic so that boot hart may proceed faster */
nop div t2, t2, zero
nop div t2, t2, zero
nop div t2, t2, zero
bne t0, t1, _wait_for_boot_hart bne t0, t1, _wait_for_boot_hart
_start_warm: _start_warm: