riscv: Add a Zalrsc-only alternative for synchronization in start.S

Add an alternative implementation that use Zalrsc extension only for
HART lottery and SMP locking to support SMP on cores without "Zaamo"
extension available. The Zaamo implementation is still prioritized if
both of them are available, since it takes fewer instructions.

Signed-off-by: Yao Zi <ziyao@disroot.org>
Reviewed-by: Leo Yu-Chi Liang <ycliang@andestech.com>
This commit is contained in:
Yao Zi
2025-09-19 19:22:29 +08:00
committed by Leo Yu-Chi Liang
parent 06b22f38af
commit a681cfecb4
+25 -1
View File
@@ -151,8 +151,15 @@ call_harts_early_init:
*/
la t0, hart_lottery
li t1, 1
#if CONFIG_IS_ENABLED(RISCV_ISA_ZAAMO)
amoswap.w s2, t1, 0(t0)
bnez s2, wait_for_gd_init
#else
lr.w s2, (t0)
bnez s2, wait_for_gd_init
sc.w s2, t1, (t0)
bnez s2, wait_for_gd_init
#endif
#else
/*
* FIXME: gp is set before it is initialized. If an XIP U-Boot ever
@@ -177,7 +184,12 @@ call_harts_early_init:
#if !CONFIG_IS_ENABLED(XIP)
#ifdef CONFIG_AVAILABLE_HARTS
la t0, available_harts_lock
#if CONFIG_IS_ENABLED(RISCV_ISA_ZAAMO)
amoswap.w.rl zero, zero, 0(t0)
#else
fence rw, w
sw zero, 0(t0)
#endif
#endif
wait_for_gd_init:
@@ -190,7 +202,14 @@ wait_for_gd_init:
#ifdef CONFIG_AVAILABLE_HARTS
la t0, available_harts_lock
li t1, 1
1: amoswap.w.aq t1, t1, 0(t0)
1:
#if CONFIG_IS_ENABLED(RISCV_ISA_ZAAMO)
amoswap.w.aq t1, t1, 0(t0)
#else
lr.w.aq t1, 0(t0)
bnez t1, 1b
sc.w.rl t1, t1, 0(t0)
#endif
bnez t1, 1b
/* register available harts in the available_harts mask */
@@ -200,7 +219,12 @@ wait_for_gd_init:
or t2, t2, t1
SREG t2, GD_AVAILABLE_HARTS(gp)
#if CONFIG_IS_ENABLED(RISCV_ISA_ZAAMO)
amoswap.w.rl zero, zero, 0(t0)
#else
fence rw, w
sw zero, 0(t0)
#endif
#endif
/*