[PATCH v2 05/12] lib: sbi: domain: ensure boot_hartid is assigned
Raymond Mao
raymondmaoca at gmail.com
Thu Oct 29 08:59:22 PDT 2026
From: Raymond Mao <raymond.mao at riscstar.com>
When boot_hartid points to a hart that is not in the domain's
assigned hartmask (e.g. due to cold boot hart differences),
the domain startup can skip starting the intended boot hart,
leading to intermittent Linux boot failures.
Scan the assigned hartmask and pick the first available hartid
to provide a valid boot target when assigned HARTs are available.
Select boot HARTs during domain finalization, after all domains have
been registered, rather than changing them during startup. This keeps
the selected target stable for physical interrupt affinity setup.
Preserve the configured boot HART when no HART is initially assigned.
Signed-off-by: Raymond Mao <raymond.mao at riscstar.com>
---
lib/sbi/sbi_domain.c | 35 +++++++++++++++++++++++++++++++++++
1 file changed, 35 insertions(+)
diff --git a/lib/sbi/sbi_domain.c b/lib/sbi/sbi_domain.c
index b3f5892d..604c5b7a 100644
--- a/lib/sbi/sbi_domain.c
+++ b/lib/sbi/sbi_domain.c
@@ -799,6 +799,38 @@ int sbi_domain_root_add_memrange(unsigned long addr, unsigned long size,
return 0;
}
+static void domain_select_boot_harts(void)
+{
+ u32 dhart;
+ struct sbi_domain *dom;
+
+ sbi_domain_for_each(dom) {
+ u32 boot_hartindex = sbi_hartid_to_hartindex(dom->boot_hartid);
+ bool boot_assigned = false;
+
+ if (sbi_hartindex_valid(boot_hartindex)) {
+ spin_lock(&dom->assigned_harts_lock);
+ boot_assigned = sbi_hartmask_test_hartindex(
+ boot_hartindex, &dom->assigned_harts);
+ spin_unlock(&dom->assigned_harts_lock);
+ }
+
+ if (!boot_assigned) {
+ u32 new_hartid = -1U;
+
+ spin_lock(&dom->assigned_harts_lock);
+ sbi_hartmask_for_each_hartindex(dhart, &dom->assigned_harts) {
+ new_hartid = sbi_hartindex_to_hartid(dhart);
+ break;
+ }
+ spin_unlock(&dom->assigned_harts_lock);
+
+ if (new_hartid != -1U)
+ dom->boot_hartid = new_hartid;
+ }
+ }
+}
+
int sbi_domain_startup(struct sbi_scratch *scratch, u32 cold_hartid)
{
int rc;
@@ -873,6 +905,9 @@ int sbi_domain_finalize(struct sbi_scratch *scratch)
return rc;
}
+ /* Select stable boot HARTs before programming physical IRQ targets. */
+ domain_select_boot_harts();
+
/*
* Set the finalized flag so that the root domain
* regions can't be changed.
--
2.25.1
More information about the opensbi
mailing list