From ed1deab09ef6284d018fbf37ab397dcd4b9f82b8 Mon Sep 17 00:00:00 2001 From: Bo Gan Date: Thu, 18 Dec 2025 02:42:39 -0800 Subject: lib: sbi_domain: make is_region_subset public The helper function is renamed as sbi_domain_memregion_is_subset, and made public in header file. Also add a convenient helper of sbi_domain_for_each_memregion_idx. Signed-off-by: Bo Gan Reviewed-by: Anup Patel Link: https://lore.kernel.org/r/20251218104243.562667-4-ganboing@gmail.com Signed-off-by: Anup Patel --- include/sbi/sbi_domain.h | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'include') diff --git a/include/sbi/sbi_domain.h b/include/sbi/sbi_domain.h index 3360e090..c8a6da99 100644 --- a/include/sbi/sbi_domain.h +++ b/include/sbi/sbi_domain.h @@ -164,6 +164,25 @@ struct sbi_domain_memregion { unsigned long flags; }; +/** Check if regionA is sub-region of regionB */ +static inline bool sbi_domain_memregion_is_subset( + const struct sbi_domain_memregion *regA, + const struct sbi_domain_memregion *regB) +{ + ulong regA_start = regA->base; + ulong regA_end = regA->base + (BIT(regA->order) - 1); + ulong regB_start = regB->base; + ulong regB_end = regB->base + (BIT(regB->order) - 1); + + if ((regB_start <= regA_start) && + (regA_start < regB_end) && + (regB_start < regA_end) && + (regA_end <= regB_end)) + return true; + + return false; +} + /** Representation of OpenSBI domain */ struct sbi_domain { /** Node in linked list of domains */ @@ -222,6 +241,9 @@ extern struct sbi_dlist domain_list; #define sbi_domain_for_each_memregion(__d, __r) \ for ((__r) = (__d)->regions; (__r)->order; (__r)++) +#define sbi_domain_for_each_memregion_idx(__d, __r, __i) \ + for ((__r) = (__d)->regions, (__i) = 0; (__r)->order; (__r)++, (__i)++) + /** * Check whether given HART is assigned to specified domain * @param dom pointer to domain -- cgit v1.3.1