[PATCH v6 3/7] lib: sbi_domain: make is_region_subset public
Anup Patel
anup at brainfault.org
Thu Dec 18 06:38:51 PST 2025
On Thu, Dec 18, 2025 at 4:14 PM Bo Gan <ganboing at gmail.com> wrote:
>
> 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 <ganboing at gmail.com>
LGTM.
Reviewed-by: Anup Patel <anup at brainfault.org>
Regards,
Anup
> ---
> include/sbi/sbi_domain.h | 22 ++++++++++++++++++++++
> lib/sbi/sbi_domain.c | 23 +++--------------------
> 2 files changed, 25 insertions(+), 20 deletions(-)
>
> 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
> diff --git a/lib/sbi/sbi_domain.c b/lib/sbi/sbi_domain.c
> index 74cc1e3f..a19bf25b 100644
> --- a/lib/sbi/sbi_domain.c
> +++ b/lib/sbi/sbi_domain.c
> @@ -285,29 +285,12 @@ static bool is_region_valid(const struct sbi_domain_memregion *reg)
> return true;
> }
>
> -/** Check if regionA is sub-region of regionB */
> -static bool is_region_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;
> -}
> -
> /** Check if regionA can be replaced by regionB */
> static bool is_region_compatible(const struct sbi_domain_memregion *regA,
> const struct sbi_domain_memregion *regB)
> {
> - if (is_region_subset(regA, regB) && regA->flags == regB->flags)
> + if (sbi_domain_memregion_is_subset(regA, regB) &&
> + regA->flags == regB->flags)
> return true;
>
> return false;
> @@ -367,7 +350,7 @@ static const struct sbi_domain_memregion *find_next_subset_region(
>
> sbi_domain_for_each_memregion(dom, sreg) {
> if (sreg == reg || (sreg->base <= addr) ||
> - !is_region_subset(sreg, reg))
> + !sbi_domain_memregion_is_subset(sreg, reg))
> continue;
>
> if (!ret || (sreg->base < ret->base) ||
> --
> 2.34.1
>
>
> --
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi
More information about the opensbi
mailing list