mirror of
https://github.com/riscv-software-src/opensbi.git
synced 2026-06-13 06:31:51 +01:00
lib: sbi: Apply budget restriction when polling Zkr CSR state transition
Zkr architecture doesn't define a time limit on state transitions which results in hanging on unresponsive or event-driven platforms. To prevent this, we need to limit polling iterations and fall back in case the budget is over, and stack guard keeps its initial value. The budget is configurable with CONFIG_ZKR_POLL_BUDGET, defaulting to 1000 iterations. Successful reads do not consume a try. Signed-off-by: Evgeny Voevodin <evvoevod@tenstorrent.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260519225014.244672-1-evvoevod@tenstorrent.com Signed-off-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
committed by
Anup Patel
parent
ecc92e87a9
commit
e134d52106
+9
-3
@@ -280,20 +280,26 @@ static void __noreturn init_coldboot(struct sbi_scratch *scratch, u32 hartid)
|
||||
if (sbi_hart_has_extension(scratch, SBI_HART_EXT_ZKR)) {
|
||||
unsigned long guard_val = 0;
|
||||
int chunks = sizeof(unsigned long) / sizeof(uint16_t);
|
||||
bool res = true;
|
||||
unsigned int tries = CONFIG_ZKR_POLL_BUDGET;
|
||||
bool res = false;
|
||||
|
||||
while (chunks) {
|
||||
while (chunks && tries) {
|
||||
unsigned long seed = csr_swap(CSR_SEED, 0);
|
||||
unsigned long opst = seed & SEED_OPTS_MASK;
|
||||
res = false;
|
||||
|
||||
if (opst == SEED_OPTS_DEAD) {
|
||||
res = false;
|
||||
break;
|
||||
}
|
||||
if (opst == SEED_OPTS_ES16) {
|
||||
guard_val = (guard_val << 16) | (seed & SEED_ENTROPY_MASK);
|
||||
chunks--;
|
||||
res = true;
|
||||
/* Successful read doesn't consume a try */
|
||||
tries++;
|
||||
}
|
||||
|
||||
tries--;
|
||||
continue;
|
||||
}
|
||||
if (res)
|
||||
|
||||
Reference in New Issue
Block a user