Re: [PATCH] lib: utils: fdt_domain: add support for root domain region inheritance

Anup Patel <[email protected]>
Newsgroups org.infradead.lists.opensbi
Message-ID <CAAhSdy2P4D41w5fM=gYwn8ObRjUW3D5p_rdc8EMB7qFa_n-U4w@mail.gmail.com>
On Fri, Mar 27, 2026 at 10:04 AM Yu-Chien Peter Lin
<[email protected]> wrote:
>
> Add the "root-regions" property in domain device-tree nodes to
> allow domains to inherit all regions from the root domain. This
> simplifies configuration for domains that need access to most
> root domain regions with only minor exclusions or additions.

Overall, this is a good approach but I suggest renaming this property
to "root-regions-inheritance" which takes the following possible values:

1) "all" : Inherit all regions from the root domain
2) "su-only": Inherit regions accessible to S-mode or U-mode from the
root domain
3) "none": Inherit no regions from the root domain

From the above, if "root-regions-inheritance" is not set then it is
assumed to be "su-only".

Regards,
Anup

>
> Signed-off-by: Yu-Chien Peter Lin <[email protected]>
> ---
>  docs/domain_support.md     |  4 ++++
>  lib/utils/fdt/fdt_domain.c | 46 +++++++++++++++++++++++---------------
>  2 files changed, 32 insertions(+), 18 deletions(-)
>
> diff --git a/docs/domain_support.md b/docs/domain_support.md
> index 93186c4a..a88f1cfb 100644
> --- a/docs/domain_support.md
> +++ b/docs/domain_support.md
> @@ -159,6 +159,10 @@ The DT properties of a domain instance DT node are as follows:
>  * **possible-harts** (Optional) - The list of CPU DT node phandles for the
>    the domain instance. This list represents the possible HARTs of the
>    domain instance.
> +* **root-regions** (Optional) - A boolean flag indicating whether this domain
> +  inherits ALL memory regions from the root domain. If this property is present,
> +  the domain will include with all root domain regions and then overlay with
> +  regions specified in the **regions** property for additional restrictions.
>  * **regions** (Optional) - The list of domain memory region DT node phandle
>    and access permissions for the domain instance. Each list entry is a pair
>    of DT node phandle and access permissions. The access permissions are
> diff --git a/lib/utils/fdt/fdt_domain.c b/lib/utils/fdt/fdt_domain.c
> index b2fa8633..45407c22 100644
> --- a/lib/utils/fdt/fdt_domain.c
> +++ b/lib/utils/fdt/fdt_domain.c
> @@ -373,25 +373,35 @@ static int __fdt_parse_domain(const void *fdt, int domain_offset, void *opaque)
>         if (err)
>                 goto fail_free_all;
>
> -       /*
> -        * Copy over root domain memregions which don't allow
> -        * read, write and execute from lower privilege modes.
> -        *
> -        * These root domain memregions without read, write,
> -        * and execute permissions include:
> -        * 1) firmware region protecting the firmware memory
> -        * 2) mmio regions protecting M-mode only mmio devices
> -        */
> -       sbi_domain_for_each_memregion(&root, reg) {
> -               if ((reg->flags & SBI_DOMAIN_MEMREGION_SU_READABLE) ||
> -                   (reg->flags & SBI_DOMAIN_MEMREGION_SU_WRITABLE) ||
> -                   (reg->flags & SBI_DOMAIN_MEMREGION_SU_EXECUTABLE))
> -                       continue;
> -               if (preg.max_regions <= preg.region_count) {
> -                       err = SBI_EINVAL;
> -                       goto fail_free_all;
> +       if (fdt_get_property(fdt, domain_offset, "root-regions", NULL)) {
> +               sbi_domain_for_each_memregion(&root, reg) {
> +                       if (preg.max_regions <= preg.region_count) {
> +                               err = SBI_EINVAL;
> +                               goto fail_free_all;
> +                       }
> +                       memcpy(&dom->regions[preg.region_count++], reg, sizeof(*reg));
> +               }
> +       } else {
> +               /*
> +                * Copy over root domain memregions which don't allow
> +                * read, write and execute from lower privilege modes.
> +                *
> +                * These root domain memregions without read, write,
> +                * and execute permissions include:
> +                * 1) firmware region protecting the firmware memory
> +                * 2) mmio regions protecting M-mode only mmio devices
> +                */
> +               sbi_domain_for_each_memregion(&root, reg) {
> +                       if ((reg->flags & SBI_DOMAIN_MEMREGION_SU_READABLE) ||
> +                           (reg->flags & SBI_DOMAIN_MEMREGION_SU_WRITABLE) ||
> +                           (reg->flags & SBI_DOMAIN_MEMREGION_SU_EXECUTABLE))
> +                               continue;
> +                       if (preg.max_regions <= preg.region_count) {
> +                               err = SBI_EINVAL;
> +                               goto fail_free_all;
> +                       }
> +                       memcpy(&dom->regions[preg.region_count++], reg, sizeof(*reg));
>                 }
> -               memcpy(&dom->regions[preg.region_count++], reg, sizeof(*reg));
>         }
>         dom->fw_region_inited = root.fw_region_inited;
>
> --
> 2.48.0
>
>
> --
> opensbi mailing list
> [email protected]
> http://lists.infradead.org/mailman/listinfo/opensbi

-- 
opensbi mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/opensbi
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.