summaryrefslogtreecommitdiff
path: root/lib/utils/sys/sifive_test.c
diff options
context:
space:
mode:
authorAnup Patel <[email protected]>2020-11-24 11:59:05 +0530
committerAnup Patel <[email protected]>2020-12-01 17:10:31 +0530
commit5c429ae2133e1a82b81403146a3e38e2b4b8350e (patch)
tree09b02a0042a7ba5697e2f44082d08d05db147b3f /lib/utils/sys/sifive_test.c
parentda074796df871f6323d052f123b7668d390980dc (diff)
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 <[email protected]> Reviewed-by: Atish Patra <[email protected]>
Diffstat (limited to 'lib/utils/sys/sifive_test.c')
-rw-r--r--lib/utils/sys/sifive_test.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/lib/utils/sys/sifive_test.c b/lib/utils/sys/sifive_test.c
index 06fbfb22..fdf31690 100644
--- a/lib/utils/sys/sifive_test.c
+++ b/lib/utils/sys/sifive_test.c
@@ -8,7 +8,7 @@
*/
#include <sbi/riscv_io.h>
-#include <sbi/sbi_platform.h>
+#include <sbi/sbi_ecall_interface.h>
#include <sbi_utils/sys/sifive_test.h>
#define FINISHER_FAIL 0x3333
@@ -17,7 +17,19 @@
static void *sifive_test_base;
-int sifive_test_system_reset(u32 type)
+int sifive_test_system_reset_check(u32 type, u32 reason)
+{
+ switch (type) {
+ case SBI_SRST_RESET_TYPE_SHUTDOWN:
+ case SBI_SRST_RESET_TYPE_COLD_REBOOT:
+ case SBI_SRST_RESET_TYPE_WARM_REBOOT:
+ return 1;
+ }
+
+ return 0;
+}
+
+void sifive_test_system_reset(u32 type, u32 reason)
{
/*
* Tell the "finisher" that the simulation
@@ -25,15 +37,16 @@ int sifive_test_system_reset(u32 type)
*/
switch (type) {
case SBI_SRST_RESET_TYPE_SHUTDOWN:
- writew(FINISHER_PASS, sifive_test_base);
+ if (reason == SBI_SRST_RESET_REASON_NONE)
+ writew(FINISHER_PASS, sifive_test_base);
+ else
+ writew(FINISHER_FAIL, sifive_test_base);
break;
case SBI_SRST_RESET_TYPE_COLD_REBOOT:
case SBI_SRST_RESET_TYPE_WARM_REBOOT:
writew(FINISHER_RESET, sifive_test_base);
break;
}
-
- return 0;
}
int sifive_test_init(unsigned long base)