From: Anup Patel <anup.patel@oss.qualcomm.com>
To: Atish Patra <atish.patra@linux.dev>
Cc: Andrew Jones <andrew.jones@oss.qualcomm.com>,
Samuel Holland <samuel.holland@sifive.com>,
Anup Patel <anup@brainfault.org>,
opensbi@lists.infradead.org,
Anup Patel <anup.patel@oss.qualcomm.com>,
Pawandeep Oza <pawandeep.oza@oss.qualcomm.com>
Subject: [PATCH v2 3/3] lib: sbi_domain: Introduce domain intialization order
Date: Mon, 17 Aug 2026 20:00:25 +0530 [thread overview]
Message-ID: <20260817143025.3068512-4-anup.patel@oss.qualcomm.com> (raw)
In-Reply-To: <20260817143025.3068512-1-anup.patel@oss.qualcomm.com>
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@oss.qualcomm.com>
Reviewed-by: Pawandeep Oza <pawandeep.oza@oss.qualcomm.com>
Tested-by: Pawandeep Oza <pawandeep.oza@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 | 17 +++++++++--------
lib/utils/fdt/fdt_domain.c | 8 ++++++++
5 files changed, 38 insertions(+), 15 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..2b504300 100644
--- a/lib/sbi/sbi_domain_context.c
+++ b/lib/sbi/sbi_domain_context.c
@@ -291,28 +291,29 @@ 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 3857831d..a649330c 100644
--- a/lib/utils/fdt/fdt_domain.c
+++ b/lib/utils/fdt/fdt_domain.c
@@ -330,6 +330,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
--
opensbi mailing list
opensbi@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/opensbi
next prev parent reply other threads:[~2026-08-17 14:31 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-17 14:30 [PATCH v2 0/3] OpenSBI domain initialization order Anup Patel
2026-08-17 14:30 ` [PATCH v2 1/3] lib: sbi_domain: Check possible harts in sbi_domain_context_enter/exit() Anup Patel
2026-08-28 10:09 ` Yu-Chien Peter Lin
2026-08-17 14:30 ` [PATCH v2 2/3] lib: sbi_domain: Re-work boot-time assignment of HARTs to non-ROOT domains Anup Patel
2026-08-28 12:45 ` Yu-Chien Peter Lin
2026-08-17 14:30 ` Anup Patel [this message]
2026-08-28 10:19 ` [PATCH v2 3/3] lib: sbi_domain: Introduce domain intialization order Yu-Chien Peter Lin
2026-08-17 19:08 ` [PATCH v2 0/3] OpenSBI domain initialization order Pawandeep Oza
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260817143025.3068512-4-anup.patel@oss.qualcomm.com \
--to=anup.patel@oss.qualcomm.com \
--cc=andrew.jones@oss.qualcomm.com \
--cc=anup@brainfault.org \
--cc=atish.patra@linux.dev \
--cc=opensbi@lists.infradead.org \
--cc=pawandeep.oza@oss.qualcomm.com \
--cc=samuel.holland@sifive.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.