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>
This commit is contained in:
Anup Patel
2020-11-24 11:59:05 +05:30
committed by Anup Patel
parent da074796df
commit 5c429ae213
17 changed files with 137 additions and 36 deletions

View File

@@ -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)