[PATCH v2 08/11] lib: sbi: Add system_suspend_allowed domain property

Anup Patel anup at brainfault.org
Mon Feb 27 06:24:31 PST 2023


On Mon, Feb 27, 2023 at 4:01 PM Andrew Jones <ajones at ventanamicro.com> wrote:
>
> Only privileged domains should be allowed to suspend the entire
> system. Give the root domain this property by default and allow
> other domains to be given the property by specifying it in the
> DT.
>
> Signed-off-by: Andrew Jones <ajones at ventanamicro.com>
> Reviewed-by: Anup Patel <anup at brainfault.org>

Applied this patch to the riscv/opensbi repo.

Thanks,
Anup

> ---
>  docs/domain_support.md     | 5 +++++
>  include/sbi/sbi_domain.h   | 2 ++
>  lib/sbi/sbi_domain.c       | 4 ++++
>  lib/utils/fdt/fdt_domain.c | 7 +++++++
>  4 files changed, 18 insertions(+)
>
> diff --git a/docs/domain_support.md b/docs/domain_support.md
> index 4ccbcff87195..e2ff896bd550 100644
> --- a/docs/domain_support.md
> +++ b/docs/domain_support.md
> @@ -52,6 +52,7 @@ has following details:
>  * **next_mode** - Privilege mode of the next booting stage for this
>    domain. This can be either S-mode or U-mode.
>  * **system_reset_allowed** - Is domain allowed to reset the system?
> +* **system_suspend_allowed** - Is domain allowed to suspend the system?
>
>  The memory regions represented by **regions** in **struct sbi_domain** have
>  following additional constraints to align with RISC-V PMP requirements:
> @@ -91,6 +92,7 @@ following manner:
>  * **next_mode** - Next booting stage mode in coldboot HART scratch space
>    is the next mode for the ROOT domain
>  * **system_reset_allowed** - The ROOT domain is allowed to reset the system
> +* **system_suspend_allowed** - The ROOT domain is allowed to suspend the system
>
>  Domain Effects
>  --------------
> @@ -195,6 +197,8 @@ The DT properties of a domain instance DT node are as follows:
>    stage mode of coldboot HART** is used as default value.
>  * **system-reset-allowed** (Optional) - A boolean flag representing
>    whether the domain instance is allowed to do system reset.
> +* **system-suspend-allowed** (Optional) - A boolean flag representing
> +  whether the domain instance is allowed to do system suspend.
>
>  ### Assigning HART To Domain Instance
>
> @@ -260,6 +264,7 @@ be done:
>                  next-addr = <0x0 0x80100000>;
>                  next-mode = <0x0>;
>                  system-reset-allowed;
> +                system-suspend-allowed;
>              };
>
>              udomain: untrusted-domain {
> diff --git a/include/sbi/sbi_domain.h b/include/sbi/sbi_domain.h
> index ab1a944b474b..eaca7f093271 100644
> --- a/include/sbi/sbi_domain.h
> +++ b/include/sbi/sbi_domain.h
> @@ -120,6 +120,8 @@ struct sbi_domain {
>         unsigned long next_mode;
>         /** Is domain allowed to reset the system */
>         bool system_reset_allowed;
> +       /** Is domain allowed to suspend the system */
> +       bool system_suspend_allowed;
>  };
>
>  /** The root domain instance */
> diff --git a/lib/sbi/sbi_domain.c b/lib/sbi/sbi_domain.c
> index dc825b0d95f6..b1cd837e4b70 100644
> --- a/lib/sbi/sbi_domain.c
> +++ b/lib/sbi/sbi_domain.c
> @@ -38,6 +38,7 @@ struct sbi_domain root = {
>         .possible_harts = &root_hmask,
>         .regions = root_memregs,
>         .system_reset_allowed = true,
> +       .system_suspend_allowed = true,
>  };
>
>  bool sbi_domain_is_assigned_hart(const struct sbi_domain *dom, u32 hartid)
> @@ -467,6 +468,9 @@ void sbi_domain_dump(const struct sbi_domain *dom, const char *suffix)
>
>         sbi_printf("Domain%d SysReset    %s: %s\n",
>                    dom->index, suffix, (dom->system_reset_allowed) ? "yes" : "no");
> +
> +       sbi_printf("Domain%d SysSuspend  %s: %s\n",
> +                  dom->index, suffix, (dom->system_suspend_allowed) ? "yes" : "no");
>  }
>
>  void sbi_domain_dump_all(const char *suffix)
> diff --git a/lib/utils/fdt/fdt_domain.c b/lib/utils/fdt/fdt_domain.c
> index 2b51a8ebe132..33653e2f555f 100644
> --- a/lib/utils/fdt/fdt_domain.c
> +++ b/lib/utils/fdt/fdt_domain.c
> @@ -419,6 +419,13 @@ static int __fdt_parse_domain(void *fdt, int domain_offset, void *opaque)
>         else
>                 dom->system_reset_allowed = false;
>
> +       /* Read "system-suspend-allowed" DT property */
> +       if (fdt_get_property(fdt, domain_offset,
> +                            "system-suspend-allowed", NULL))
> +               dom->system_suspend_allowed = true;
> +       else
> +               dom->system_suspend_allowed = false;
> +
>         /* Find /cpus DT node */
>         cpus_offset = fdt_path_offset(fdt, "/cpus");
>         if (cpus_offset < 0)
> --
> 2.39.1
>



More information about the opensbi mailing list