diff options
author | Anup Patel <anup.patel@wdc.com> | 2020-11-24 09:29:05 +0300 |
---|---|---|
committer | Anup Patel <anup@brainfault.org> | 2020-12-01 14:40:31 +0300 |
commit | 5c429ae2133e1a82b81403146a3e38e2b4b8350e (patch) | |
tree | 09b02a0042a7ba5697e2f44082d08d05db147b3f /lib/sbi | |
parent | da074796df871f6323d052f123b7668d390980dc (diff) | |
download | opensbi-5c429ae2133e1a82b81403146a3e38e2b4b8350e.tar.xz |
lib: sbi: Improve system reset platform operations
To implement the SBI SRST extension, we need two platform operations
for system reset:
1) system_reset_check() - This operation will check whether given
reset type and reason are supported by the platform
2) system_reset() - This operation will do the actual platform
system reset and it will not return if reset type and reason
are supported by the platform
This patch updates system reset related code everywhere as-per above.
Signed-off-by: Anup Patel <anup.patel@wdc.com>
Reviewed-by: Atish Patra <atish.patra@wdc.com>
Diffstat (limited to 'lib/sbi')
-rw-r--r-- | lib/sbi/sbi_ecall_legacy.c | 3 | ||||
-rw-r--r-- | lib/sbi/sbi_system.c | 13 |
2 files changed, 13 insertions, 3 deletions
diff --git a/lib/sbi/sbi_ecall_legacy.c b/lib/sbi/sbi_ecall_legacy.c index 683b8dc..7844fbb 100644 --- a/lib/sbi/sbi_ecall_legacy.c +++ b/lib/sbi/sbi_ecall_legacy.c @@ -103,7 +103,8 @@ static int sbi_ecall_legacy_handler(unsigned long extid, unsigned long funcid, } break; case SBI_EXT_0_1_SHUTDOWN: - sbi_system_reset(SBI_SRST_RESET_TYPE_SHUTDOWN); + sbi_system_reset(SBI_SRST_RESET_TYPE_SHUTDOWN, + SBI_SRST_RESET_REASON_NONE); break; default: ret = SBI_ENOTSUPP; diff --git a/lib/sbi/sbi_system.c b/lib/sbi/sbi_system.c index 2f1b7fb..08a8b47 100644 --- a/lib/sbi/sbi_system.c +++ b/lib/sbi/sbi_system.c @@ -18,7 +18,16 @@ #include <sbi/sbi_ipi.h> #include <sbi/sbi_init.h> -void __noreturn sbi_system_reset(u32 reset_type) +bool sbi_system_reset_supported(u32 reset_type, u32 reset_reason) +{ + if (sbi_platform_system_reset_check(sbi_platform_thishart_ptr(), + reset_type, reset_reason)) + return TRUE; + + return FALSE; +} + +void __noreturn sbi_system_reset(u32 reset_type, u32 reset_reason) { ulong hbase = 0, hmask; u32 cur_hartid = current_hartid(); @@ -40,7 +49,7 @@ void __noreturn sbi_system_reset(u32 reset_type) /* Platform specific reset if domain allowed system reset */ if (dom->system_reset_allowed) sbi_platform_system_reset(sbi_platform_ptr(scratch), - reset_type); + reset_type, reset_reason); /* If platform specific reset did not work then do sbi_exit() */ sbi_exit(scratch); |