summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAnup Patel <anup.patel@wdc.com>2020-11-24 09:29:05 +0300
committerAnup Patel <anup@brainfault.org>2020-12-01 14:40:31 +0300
commit5c429ae2133e1a82b81403146a3e38e2b4b8350e (patch)
tree09b02a0042a7ba5697e2f44082d08d05db147b3f /lib
parentda074796df871f6323d052f123b7668d390980dc (diff)
downloadopensbi-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')
-rw-r--r--lib/sbi/sbi_ecall_legacy.c3
-rw-r--r--lib/sbi/sbi_system.c13
-rw-r--r--lib/utils/reset/fdt_reset.c13
-rw-r--r--lib/utils/reset/fdt_reset_htif.c1
-rw-r--r--lib/utils/reset/fdt_reset_sifive.c1
-rw-r--r--lib/utils/sys/htif.c7
-rw-r--r--lib/utils/sys/sifive_test.c23
7 files changed, 49 insertions, 12 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);
diff --git a/lib/utils/reset/fdt_reset.c b/lib/utils/reset/fdt_reset.c
index dfbd33e..dead8a3 100644
--- a/lib/utils/reset/fdt_reset.c
+++ b/lib/utils/reset/fdt_reset.c
@@ -21,13 +21,20 @@ static struct fdt_reset *reset_drivers[] = {
static struct fdt_reset *current_driver = NULL;
-int fdt_system_reset(u32 reset_type)
+int fdt_system_reset_check(u32 reset_type, u32 reset_reason)
{
- if (current_driver && current_driver->system_reset)
- return current_driver->system_reset(reset_type);
+ if (current_driver && current_driver->system_reset_check)
+ return current_driver->system_reset_check(reset_type,
+ reset_reason);
return 0;
}
+void fdt_system_reset(u32 reset_type, u32 reset_reason)
+{
+ if (current_driver && current_driver->system_reset)
+ current_driver->system_reset(reset_type, reset_reason);
+}
+
int fdt_reset_init(void)
{
int pos, noff, rc;
diff --git a/lib/utils/reset/fdt_reset_htif.c b/lib/utils/reset/fdt_reset_htif.c
index e453d05..587e7d6 100644
--- a/lib/utils/reset/fdt_reset_htif.c
+++ b/lib/utils/reset/fdt_reset_htif.c
@@ -18,5 +18,6 @@ static const struct fdt_match htif_reset_match[] = {
struct fdt_reset fdt_reset_htif = {
.match_table = htif_reset_match,
+ .system_reset_check = htif_system_reset_check,
.system_reset = htif_system_reset
};
diff --git a/lib/utils/reset/fdt_reset_sifive.c b/lib/utils/reset/fdt_reset_sifive.c
index 6a171ca..38b520c 100644
--- a/lib/utils/reset/fdt_reset_sifive.c
+++ b/lib/utils/reset/fdt_reset_sifive.c
@@ -33,5 +33,6 @@ static const struct fdt_match sifive_test_reset_match[] = {
struct fdt_reset fdt_reset_sifive = {
.match_table = sifive_test_reset_match,
.init = sifive_test_reset_init,
+ .system_reset_check = sifive_test_system_reset_check,
.system_reset = sifive_test_system_reset
};
diff --git a/lib/utils/sys/htif.c b/lib/utils/sys/htif.c
index ed800a5..fd70fb9 100644
--- a/lib/utils/sys/htif.c
+++ b/lib/utils/sys/htif.c
@@ -140,7 +140,12 @@ int htif_getc(void)
return ch - 1;
}
-int htif_system_reset(u32 type)
+int htif_system_reset_check(u32 type, u32 reason)
+{
+ return 1;
+}
+
+void htif_system_reset(u32 type, u32 reason)
{
while (1) {
fromhost = 0;
diff --git a/lib/utils/sys/sifive_test.c b/lib/utils/sys/sifive_test.c
index 06fbfb2..fdf3169 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)