[PATCH 07/11] lib: sbi_domain: Make domain regions as fixed array

Anup Patel anup.patel at oss.qualcomm.com
Tue Sep 22 20:23:55 PDT 2026


Instead of separately allocating domain regions, let us have a fixed
size array so that regions are automatically allocated along with
domain allocation and one SBI_DOMAIN_MEMREGION_MAX macro defines
maximum number of regions for all domains.

Signed-off-by: Anup Patel <anup.patel at oss.qualcomm.com>
---
 include/sbi/sbi_domain.h       |  3 ++-
 lib/sbi/sbi_domain.c           | 42 ++++++++++------------------------
 lib/utils/fdt/fdt_domain.c     | 17 +++-----------
 platform/generic/mips/eyeq7h.c |  6 ++---
 4 files changed, 20 insertions(+), 48 deletions(-)

diff --git a/include/sbi/sbi_domain.h b/include/sbi/sbi_domain.h
index 394e7ddf..5e5b2227 100644
--- a/include/sbi/sbi_domain.h
+++ b/include/sbi/sbi_domain.h
@@ -204,7 +204,8 @@ struct sbi_domain {
 	/** Possible HARTs in this domain */
 	const struct sbi_hartmask *possible_harts;
 	/** Array of memory regions terminated by a region with order zero */
-	struct sbi_domain_memregion *regions;
+#define SBI_DOMAIN_MEMREGION_MAX	32
+	struct sbi_domain_memregion regions[SBI_DOMAIN_MEMREGION_MAX + 1];
 	/** HART id of the HART booting this domain */
 	u32 boot_hartid;
 	/** Arg1 (or 'a1' register) of next booting stage for this domain */
diff --git a/lib/sbi/sbi_domain.c b/lib/sbi/sbi_domain.c
index f5c62509..c28eeba6 100644
--- a/lib/sbi/sbi_domain.c
+++ b/lib/sbi/sbi_domain.c
@@ -24,13 +24,10 @@ SBI_LIST_HEAD(domain_list);
 static u32 domain_count = 0;
 static bool domain_finalized = false;
 
-#define ROOT_REGION_MAX	32
-
 struct sbi_domain root = {
 	.name = "root",
 	.init_order = -1U,
 	.possible_harts = NULL,
-	.regions = NULL,
 	.system_reset_allowed = true,
 	.system_suspend_allowed = true,
 	.fw_region_inited = false,
@@ -225,7 +222,7 @@ bool sbi_domain_check_addr(const struct sbi_domain *dom,
 			   unsigned long access_flags)
 {
 	bool rmmio, mmio = false;
-	struct sbi_domain_memregion *reg;
+	const struct sbi_domain_memregion *reg;
 	unsigned long rstart, rend, rflags, rwx = 0, rrwx = 0;
 
 	if (!dom)
@@ -331,7 +328,7 @@ static const struct sbi_domain_memregion *find_region(
 						unsigned long addr)
 {
 	unsigned long rstart, rend;
-	struct sbi_domain_memregion *reg;
+	const struct sbi_domain_memregion *reg;
 
 	sbi_domain_for_each_memregion(dom, reg) {
 		rstart = reg->base;
@@ -349,7 +346,7 @@ static const struct sbi_domain_memregion *find_next_subset_region(
 				const struct sbi_domain_memregion *reg,
 				unsigned long addr)
 {
-	struct sbi_domain_memregion *sreg, *ret = NULL;
+	const struct sbi_domain_memregion *sreg, *ret = NULL;
 
 	sbi_domain_for_each_memregion(dom, sreg) {
 		if (sreg == reg || (sreg->base <= addr) ||
@@ -377,7 +374,7 @@ static void swap_region(struct sbi_domain_memregion* reg1,
 static int sbi_domain_used_memregions(const struct sbi_domain *dom)
 {
 	int count = 0;
-	struct sbi_domain_memregion *reg;
+	const struct sbi_domain_memregion *reg;
 
 	sbi_domain_for_each_memregion(dom, reg)
 		count++;
@@ -407,11 +404,6 @@ static int sanitize_domain(struct sbi_domain *dom)
 	}
 
 	/* Check memory regions */
-	if (!dom->regions) {
-		sbi_printf("%s: %s regions is NULL\n",
-			   __func__, dom->name);
-		return SBI_EINVAL;
-	}
 	sbi_domain_for_each_memregion(dom, reg) {
 		if (!is_region_valid(reg)) {
 			sbi_printf("%s: %s has invalid region base=0x%lx "
@@ -550,7 +542,7 @@ void sbi_domain_dump(const struct sbi_domain *dom, const char *suffix)
 {
 	u32 i, j, k;
 	unsigned long rstart, rend;
-	struct sbi_domain_memregion *reg;
+	const struct sbi_domain_memregion *reg;
 
 	sbi_printf("Domain%d Name        %s: %s\n",
 		   dom->index, suffix, dom->name);
@@ -738,8 +730,8 @@ static int root_add_memregion(const struct sbi_domain_memregion *reg)
 	int root_memregs_count = sbi_domain_used_memregions(&root);
 
 	/* Sanity checks */
-	if (!reg || domain_finalized || !root.regions ||
-	    (ROOT_REGION_MAX <= root_memregs_count))
+	if (!reg || domain_finalized ||
+	    (SBI_DOMAIN_MEMREGION_MAX <= root_memregs_count))
 		return SBI_EINVAL;
 
 	/* Check whether compatible region exists for the new one */
@@ -901,12 +893,12 @@ int sbi_domain_finalize(struct sbi_scratch *scratch)
 
 int sbi_domain_init(struct sbi_scratch *scratch, u32 cold_hartid)
 {
-	int rc;
-	struct sbi_hartmask *root_hmask;
-	struct sbi_domain_memregion *root_memregs;
-	int root_memregs_count = 0;
 	const struct sbi_platform *plat = sbi_platform_ptr(scratch);
 	bool fw_single_region = sbi_platform_single_fw_region(plat);
+	struct sbi_domain_memregion *root_memregs = root.regions;
+	struct sbi_hartmask *root_hmask;
+	int root_memregs_count = 0;
+	int rc;
 
 	SBI_INIT_LIST_HEAD(&domain_list);
 
@@ -933,19 +925,11 @@ int sbi_domain_init(struct sbi_scratch *scratch, u32 cold_hartid)
 	if (rc)
 		goto fail_free_domain_hart_ptr_offset;
 
-	root_memregs = sbi_calloc(sizeof(*root_memregs), ROOT_REGION_MAX + 1);
-	if (!root_memregs) {
-		sbi_printf("%s: no memory for root regions\n", __func__);
-		rc = SBI_ENOMEM;
-		goto fail_deinit_context;
-	}
-	root.regions = root_memregs;
-
 	root_hmask = sbi_zalloc(sizeof(*root_hmask));
 	if (!root_hmask) {
 		sbi_printf("%s: no memory for root hartmask\n", __func__);
 		rc = SBI_ENOMEM;
-		goto fail_free_root_memregs;
+		goto fail_deinit_context;
 	}
 	root.possible_harts = root_hmask;
 
@@ -1014,8 +998,6 @@ int sbi_domain_init(struct sbi_scratch *scratch, u32 cold_hartid)
 
 fail_free_root_hmask:
 	sbi_free(root_hmask);
-fail_free_root_memregs:
-	sbi_free(root_memregs);
 fail_deinit_context:
 	sbi_domain_context_deinit();
 fail_free_domain_hart_ptr_offset:
diff --git a/lib/utils/fdt/fdt_domain.c b/lib/utils/fdt/fdt_domain.c
index 575fbdf0..e4cce8c3 100644
--- a/lib/utils/fdt/fdt_domain.c
+++ b/lib/utils/fdt/fdt_domain.c
@@ -223,14 +223,12 @@ skip_device_disable:
 	fdt_nop_node(fdt, poffset);
 }
 
-#define FDT_DOMAIN_REGION_MAX_COUNT		16
 #define FDT_ROOT_REGION_INHERIT_M_ONLY		0
 #define FDT_ROOT_REGION_INHERIT_ALL		1
 
 struct parse_region_data {
 	struct sbi_domain *dom;
 	u32 region_count;
-	u32 max_regions;
 };
 
 static int __fdt_parse_region(const void *fdt, int domain_offset,
@@ -257,7 +255,7 @@ static int __fdt_parse_region(const void *fdt, int domain_offset,
 		return SBI_EINVAL;
 
 	/* Find next region of the domain */
-	if (preg->max_regions <= preg->region_count)
+	if (SBI_DOMAIN_MEMREGION_MAX <= preg->region_count)
 		return SBI_ENOSPC;
 
 	/* Read "base" DT property */
@@ -309,20 +307,13 @@ static int __fdt_parse_domain(const void *fdt, int domain_offset, void *opaque)
 	if (!dom)
 		return SBI_ENOMEM;
 
-	dom->regions = sbi_calloc(sizeof(*dom->regions),
-				  FDT_DOMAIN_REGION_MAX_COUNT + 1);
-	if (!dom->regions) {
-		err = SBI_ENOMEM;
-		goto fail_free_domain;
-	}
 	preg.dom = dom;
 	preg.region_count = 0;
-	preg.max_regions = FDT_DOMAIN_REGION_MAX_COUNT;
 
 	mask = sbi_zalloc(sizeof(*mask));
 	if (!mask) {
 		err = SBI_ENOMEM;
-		goto fail_free_regions;
+		goto fail_free_domain;
 	}
 
 	/* Read DT node name */
@@ -405,7 +396,7 @@ static int __fdt_parse_domain(const void *fdt, int domain_offset, void *opaque)
 		if (!copy)
 			continue;
 
-		if (preg.max_regions <= preg.region_count) {
+		if (SBI_DOMAIN_MEMREGION_MAX <= preg.region_count) {
 			err = SBI_EINVAL;
 			goto fail_free_all;
 		}
@@ -481,8 +472,6 @@ static int __fdt_parse_domain(const void *fdt, int domain_offset, void *opaque)
 
 fail_free_all:
 	sbi_free(mask);
-fail_free_regions:
-	sbi_free(dom->regions);
 fail_free_domain:
 	sbi_free(dom);
 	return err;
diff --git a/platform/generic/mips/eyeq7h.c b/platform/generic/mips/eyeq7h.c
index 30af096c..f08b5197 100644
--- a/platform/generic/mips/eyeq7h.c
+++ b/platform/generic/mips/eyeq7h.c
@@ -120,7 +120,7 @@ static const struct sbi_hsm_device eyeq7h_hsm = {
 	.hart_stop	= mips_p8700_hart_stop,
 };
 
-static struct sbi_domain_memregion *find_last_memregion(const struct sbi_domain *dom)
+static struct sbi_domain_memregion *find_last_memregion(struct sbi_domain *dom)
 {
 	struct sbi_domain_memregion *reg;
 
@@ -128,7 +128,7 @@ static struct sbi_domain_memregion *find_last_memregion(const struct sbi_domain
 	return --reg;
 }
 
-static int fixup_dram_region(const struct sbi_domain *dom,
+static int fixup_dram_region(struct sbi_domain *dom,
 			     struct sbi_domain_memregion *reg)
 {
 	const void *fdt = fdt_get_address();
@@ -297,7 +297,7 @@ static void eyeq7h_init_clusters(void)
 
 static int eyeq7h_early_init(bool cold_boot)
 {
-	const struct sbi_domain *dom;
+	struct sbi_domain *dom;
 	struct sbi_domain_memregion *reg;
 	int rc;
 	unsigned long cm_base;
-- 
2.43.0




More information about the opensbi mailing list