[PATCH 3/3] lib: sbi_domain: Introduce domain intialization order
Anup Patel
anup.patel at oss.qualcomm.com
Thu Aug 6 21:50:02 PDT 2026
Currently, the domain initialization order is implied by the order
in which domains are populated by sbi_platform_domains_init() from
sbi_domain_finalize(). This is not documented anywhere and forces
unecessary ordering between domain DT nodes.
To address the above, introduce per-domain 32-bit integer to represent
intialization order (aka "init_order") where domain with a lower
initialization order will be booted first and two domains must not
have same initialization order. For DT based domain creation, new
"init-order" DT property can be used in domain DT node to specify
the initialization order. The ROOT domain is assumed to have lowest
initialization order (aka 0xffffffff).
Signed-off-by: Anup Patel <anup.patel at oss.qualcomm.com>
---
docs/domain_support.md | 5 +++++
include/sbi/sbi_domain.h | 2 ++
lib/sbi/sbi_domain.c | 21 ++++++++++++++-------
lib/sbi/sbi_domain_context.c | 15 +++++++++------
lib/utils/fdt/fdt_domain.c | 8 ++++++++
5 files changed, 38 insertions(+), 13 deletions(-)
diff --git a/docs/domain_support.md b/docs/domain_support.md
index 82f155e1..655bf474 100644
--- a/docs/domain_support.md
+++ b/docs/domain_support.md
@@ -39,6 +39,9 @@ has following details:
* **index** - Logical index of this domain
* **name** - Name of this domain
+* **init_order** - Initialization order of this domain. Domain with a
+ lower initialization order will be booted first and two domains must
+ not have same initialization order.
* **assigned_harts** - HARTs assigned to this domain
* **possible_harts** - HARTs possible in this domain
* **regions** - Array of memory regions terminated by a memory region
@@ -75,6 +78,8 @@ following manner:
* **index** - Logical index of the ROOT domain is always zero
* **name** - Name of the ROOT domain is "root"
+* **init_order** - Initialization order of the ROOT domain is always
+ 0xffffffff (aka maximum possible 32-bit value)
* **assigned_harts** - At boot-time all valid HARTs of a RISC-V platform
are assigned the ROOT domain which changes later based on OpenSBI
platform support
diff --git a/include/sbi/sbi_domain.h b/include/sbi/sbi_domain.h
index b6731c04..b35ea99f 100644
--- a/include/sbi/sbi_domain.h
+++ b/include/sbi/sbi_domain.h
@@ -199,6 +199,8 @@ struct sbi_domain {
spinlock_t assigned_harts_lock;
/** Name of this domain */
char name[64];
+ /** Initialization order of this domain */
+ u32 init_order;
/** Possible HARTs in this domain */
const struct sbi_hartmask *possible_harts;
/** Array of memory regions terminated by a region with order zero */
diff --git a/lib/sbi/sbi_domain.c b/lib/sbi/sbi_domain.c
index af753459..747c346c 100644
--- a/lib/sbi/sbi_domain.c
+++ b/lib/sbi/sbi_domain.c
@@ -28,6 +28,7 @@ static bool domain_finalized = false;
struct sbi_domain root = {
.name = "root",
+ .init_order = -1U,
.possible_harts = NULL,
.regions = NULL,
.system_reset_allowed = true,
@@ -537,6 +538,9 @@ void sbi_domain_dump(const struct sbi_domain *dom, const char *suffix)
sbi_printf("Domain%d Name %s: %s\n",
dom->index, suffix, dom->name);
+ sbi_printf("Domain%d Init Order %s: 0x%x\n",
+ dom->index, suffix, dom->init_order);
+
sbi_printf("Domain%d Boot HART %s: %d\n",
dom->index, suffix, dom->boot_hartid);
@@ -635,9 +639,14 @@ int sbi_domain_register(struct sbi_domain *dom)
if (!dom || domain_finalized)
return SBI_EINVAL;
- /* Check if domain already discovered */
+ /*
+ * Ensure that:
+ * 1) Domain not already registered
+ * 2) Initialization order is unique
+ */
sbi_domain_for_each(tdom) {
- if (tdom == dom)
+ if (tdom == dom ||
+ tdom->init_order == dom->init_order)
return SBI_EALREADY;
}
@@ -662,15 +671,13 @@ int sbi_domain_register(struct sbi_domain *dom)
sbi_hartmask_clear_all(&dom->assigned_harts);
/*
- * Assign a non-ROOT domain to a HART on first come first serve
- * basis if the HART is listed as a possible HART of the non-ROOT
- * domain. If no non-ROOT domain list a HART as possible HART then
- * the HART is assigned to the ROOT domain.
+ * Assign HART to a domain with the least initialization order
+ * where the HART is listed as a possible HART of the domain.
*/
sbi_hartmask_for_each_hartindex(i, dom->possible_harts) {
tdom = sbi_hartindex_to_domain(i);
if (tdom) {
- if (tdom == &root)
+ if (tdom->init_order > dom->init_order)
sbi_hartmask_clear_hartindex(i, &tdom->assigned_harts);
else
continue;
diff --git a/lib/sbi/sbi_domain_context.c b/lib/sbi/sbi_domain_context.c
index 837ff54f..e39c10fa 100644
--- a/lib/sbi/sbi_domain_context.c
+++ b/lib/sbi/sbi_domain_context.c
@@ -291,28 +291,31 @@ int sbi_domain_context_exit(void)
}
dom_ctx = ctx->prev_ctx;
+ ctx->prev_ctx = NULL;
/* If no previous caller context */
if (!dom_ctx) {
- /* Try to find next uninitialized user-defined domain's context */
+ /* Try to find next uninitialized domain with least initialization order */
+ dom_ctx = NULL;
sbi_domain_for_each(dom) {
- if (dom == &root || dom == sbi_domain_thishart_ptr())
+ if (dom == sbi_domain_thishart_ptr())
continue;
if (!sbi_hartmask_test_hartindex(hartindex, dom->possible_harts))
continue;
tmp = hart_context_get(dom, hartindex);
- if (tmp && !tmp->initialized) {
+ if (tmp && tmp->initialized)
+ continue;
+
+ if (!dom_ctx || tmp->dom->init_order < dom_ctx->dom->init_order) {
dom_ctx = tmp;
break;
}
}
}
-
- /* Take the root domain context if fail to find */
if (!dom_ctx)
- dom_ctx = hart_context_get(&root, hartindex);
+ return SBI_ENOENT;
return switch_to_next_domain_context(ctx, dom_ctx);
}
diff --git a/lib/utils/fdt/fdt_domain.c b/lib/utils/fdt/fdt_domain.c
index 31786e0e..366ab138 100644
--- a/lib/utils/fdt/fdt_domain.c
+++ b/lib/utils/fdt/fdt_domain.c
@@ -331,6 +331,14 @@ static int __fdt_parse_domain(const void *fdt, int domain_offset, void *opaque)
sizeof(dom->name));
dom->name[sizeof(dom->name) - 1] = '\0';
+ /* Read initalization order */
+ val = fdt_getprop(fdt, domain_offset, "init-order", &len);
+ len = len / sizeof(u32);
+ if (val && len)
+ dom->init_order = fdt32_to_cpu(val[0]);
+ else
+ dom->init_order = (u32)domain_offset;
+
/* Setup possible HARTs mask */
SBI_HARTMASK_INIT(mask);
dom->possible_harts = mask;
--
2.43.0
More information about the opensbi
mailing list