[PATCH v2 2/2] lib/sbi: get rid of static variable to hold root memregions count
Vladimir Kondratiev
vladimir.kondratiev at mobileye.com
Tue Nov 11 02:43:27 PST 2025
Calculate number of used memory regions if needed.
Signed-off-by: Vladimir Kondratiev <vladimir.kondratiev at mobileye.com>
---
lib/sbi/sbi_domain.c | 38 ++++++++++++++++++++++++--------------
1 file changed, 24 insertions(+), 14 deletions(-)
diff --git a/lib/sbi/sbi_domain.c b/lib/sbi/sbi_domain.c
index 039da39ecd6c..9fabfc105710 100644
--- a/lib/sbi/sbi_domain.c
+++ b/lib/sbi/sbi_domain.c
@@ -25,7 +25,6 @@ static u32 domain_count = 0;
static bool domain_finalized = false;
#define ROOT_REGION_MAX 32
-static u32 root_memregs_count = 0;
struct sbi_domain root = {
.name = "root",
@@ -281,6 +280,17 @@ static void clear_region(struct sbi_domain_memregion* reg)
sbi_memset(reg, 0x0, sizeof(*reg));
}
+static int sbi_domain_used_memregions(const struct sbi_domain *dom)
+{
+ int count = 0;
+ struct sbi_domain_memregion *reg;
+
+ sbi_domain_for_each_memregion(dom, reg)
+ count++;
+
+ return count;
+}
+
static int sanitize_domain(struct sbi_domain *dom)
{
u32 i, j, count;
@@ -319,9 +329,7 @@ static int sanitize_domain(struct sbi_domain *dom)
}
/* Count memory regions */
- count = 0;
- sbi_domain_for_each_memregion(dom, reg)
- count++;
+ count = sbi_domain_used_memregions(dom);
/* Check presence of firmware regions */
if (!dom->fw_region_inited) {
@@ -364,7 +372,6 @@ static int sanitize_domain(struct sbi_domain *dom)
&dom->regions[j + 1]);
clear_region(&dom->regions[count - 1]);
count--;
- root_memregs_count--;
} else
i++;
}
@@ -604,10 +611,12 @@ static int root_add_memregion(const struct sbi_domain_memregion *reg)
int rc;
bool reg_merged;
struct sbi_domain_memregion *nreg, *nreg1, *nreg2;
+ struct sbi_domain *dom = &root;
+ int count = sbi_domain_used_memregions(dom);
/* Sanity checks */
if (!reg || domain_finalized || !root.regions ||
- (ROOT_REGION_MAX <= root_memregs_count))
+ (ROOT_REGION_MAX <= count))
return SBI_EINVAL;
/* Check whether compatible region exists for the new one */
@@ -617,10 +626,10 @@ static int root_add_memregion(const struct sbi_domain_memregion *reg)
}
/* Append the memregion to root memregions */
- nreg = &root.regions[root_memregs_count];
+ nreg = &root.regions[count];
sbi_memcpy(nreg, reg, sizeof(*reg));
- root_memregs_count++;
- root.regions[root_memregs_count].order = 0;
+ count++;
+ root.regions[count].order = 0;
/* Sort and optimize root regions */
do {
@@ -651,7 +660,7 @@ static int root_add_memregion(const struct sbi_domain_memregion *reg)
nreg1++;
}
reg_merged = true;
- root_memregs_count--;
+ count--;
}
}
} while (reg_merged);
@@ -777,6 +786,7 @@ 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 count = 0;
SBI_INIT_LIST_HEAD(&domain_list);
@@ -822,13 +832,13 @@ int sbi_domain_init(struct sbi_scratch *scratch, u32 cold_hartid)
sbi_domain_memregion_init(scratch->fw_start, scratch->fw_rw_offset,
(SBI_DOMAIN_MEMREGION_M_READABLE |
SBI_DOMAIN_MEMREGION_M_EXECUTABLE),
- &root_memregs[root_memregs_count++]);
+ &root_memregs[count++]);
sbi_domain_memregion_init((scratch->fw_start + scratch->fw_rw_offset),
(scratch->fw_size - scratch->fw_rw_offset),
(SBI_DOMAIN_MEMREGION_M_READABLE |
SBI_DOMAIN_MEMREGION_M_WRITABLE),
- &root_memregs[root_memregs_count++]);
+ &root_memregs[count++]);
root.fw_region_inited = true;
@@ -843,10 +853,10 @@ int sbi_domain_init(struct sbi_scratch *scratch, u32 cold_hartid)
(SBI_DOMAIN_MEMREGION_SU_READABLE |
SBI_DOMAIN_MEMREGION_SU_WRITABLE |
SBI_DOMAIN_MEMREGION_SU_EXECUTABLE),
- &root_memregs[root_memregs_count++]);
+ &root_memregs[count++]);
/* Root domain memory region end */
- root_memregs[root_memregs_count].order = 0;
+ root_memregs[count].order = 0;
/* Root domain boot HART id is same as coldboot HART id */
root.boot_hartid = cold_hartid;
--
2.43.0
More information about the opensbi
mailing list