lib: sbi: Add system_suspend_allowed domain property

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@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
Andrew Jones
2023-02-27 11:31:03 +01:00
committed by Anup Patel
parent 73623a0aca
commit c9917b6108
4 changed files with 18 additions and 0 deletions

View File

@@ -52,6 +52,7 @@ has following details:
* **next_mode** - Privilege mode of the next booting stage for this * **next_mode** - Privilege mode of the next booting stage for this
domain. This can be either S-mode or U-mode. domain. This can be either S-mode or U-mode.
* **system_reset_allowed** - Is domain allowed to reset the system? * **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 The memory regions represented by **regions** in **struct sbi_domain** have
following additional constraints to align with RISC-V PMP requirements: 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 * **next_mode** - Next booting stage mode in coldboot HART scratch space
is the next mode for the ROOT domain is the next mode for the ROOT domain
* **system_reset_allowed** - The ROOT domain is allowed to reset the system * **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 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. stage mode of coldboot HART** is used as default value.
* **system-reset-allowed** (Optional) - A boolean flag representing * **system-reset-allowed** (Optional) - A boolean flag representing
whether the domain instance is allowed to do system reset. 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 ### Assigning HART To Domain Instance
@@ -260,6 +264,7 @@ be done:
next-addr = <0x0 0x80100000>; next-addr = <0x0 0x80100000>;
next-mode = <0x0>; next-mode = <0x0>;
system-reset-allowed; system-reset-allowed;
system-suspend-allowed;
}; };
udomain: untrusted-domain { udomain: untrusted-domain {

View File

@@ -120,6 +120,8 @@ struct sbi_domain {
unsigned long next_mode; unsigned long next_mode;
/** Is domain allowed to reset the system */ /** Is domain allowed to reset the system */
bool system_reset_allowed; bool system_reset_allowed;
/** Is domain allowed to suspend the system */
bool system_suspend_allowed;
}; };
/** The root domain instance */ /** The root domain instance */

View File

@@ -38,6 +38,7 @@ struct sbi_domain root = {
.possible_harts = &root_hmask, .possible_harts = &root_hmask,
.regions = root_memregs, .regions = root_memregs,
.system_reset_allowed = true, .system_reset_allowed = true,
.system_suspend_allowed = true,
}; };
bool sbi_domain_is_assigned_hart(const struct sbi_domain *dom, u32 hartid) 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", sbi_printf("Domain%d SysReset %s: %s\n",
dom->index, suffix, (dom->system_reset_allowed) ? "yes" : "no"); 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) void sbi_domain_dump_all(const char *suffix)

View File

@@ -417,6 +417,13 @@ static int __fdt_parse_domain(void *fdt, int domain_offset, void *opaque)
else else
dom->system_reset_allowed = false; 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 */ /* Find /cpus DT node */
cpus_offset = fdt_path_offset(fdt, "/cpus"); cpus_offset = fdt_path_offset(fdt, "/cpus");
if (cpus_offset < 0) if (cpus_offset < 0)