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

@@ -137,8 +137,10 @@ struct sbi_platform_operations {
*/
int (*hart_stop)(void);
/* Check whether reset type and reason supported by the platform */
int (*system_reset_check)(u32 reset_type, u32 reset_reason);
/** Reset the platform */
int (*system_reset)(u32 reset_type);
void (*system_reset)(u32 reset_type, u32 reset_reason);
/** platform specific SBI extension implementation probe function */
int (*vendor_ext_check)(long extid);
@@ -653,19 +655,38 @@ static inline void sbi_platform_timer_exit(const struct sbi_platform *plat)
}
/**
* Reset the platform
* Check whether reset type and reason supported by the platform
*
* @param plat pointer to struct sbi_platform
* @param reset_type type of reset
* @param reset_reason reason for reset
*
* @return 0 on success and negative error code on failure
* @return 0 if reset type and reason not supported and 1 if supported
*/
static inline int sbi_platform_system_reset(const struct sbi_platform *plat,
u32 reset_type)
static inline int sbi_platform_system_reset_check(
const struct sbi_platform *plat,
u32 reset_type, u32 reset_reason)
{
if (plat && sbi_platform_ops(plat)->system_reset_check)
return sbi_platform_ops(plat)->system_reset_check(reset_type,
reset_reason);
return 0;
}
/**
* Reset the platform
*
* This function will not return for supported reset type and reset reason
*
* @param plat pointer to struct sbi_platform
* @param reset_type type of reset
* @param reset_reason reason for reset
*/
static inline void sbi_platform_system_reset(const struct sbi_platform *plat,
u32 reset_type, u32 reset_reason)
{
if (plat && sbi_platform_ops(plat)->system_reset)
return sbi_platform_ops(plat)->system_reset(reset_type);
return 0;
sbi_platform_ops(plat)->system_reset(reset_type, reset_reason);
}
/**

View File

@@ -12,6 +12,8 @@
#include <sbi/sbi_types.h>
void __noreturn sbi_system_reset(u32 reset_type);
bool sbi_system_reset_supported(u32 reset_type, u32 reset_reason);
void __noreturn sbi_system_reset(u32 reset_type, u32 reset_reason);
#endif

View File

@@ -15,10 +15,13 @@
struct fdt_reset {
const struct fdt_match *match_table;
int (*init)(void *fdt, int nodeoff, const struct fdt_match *match);
int (*system_reset)(u32 reset_type);
int (*system_reset_check)(u32 reset_type, u32 reset_reason);
void (*system_reset)(u32 reset_type, u32 reset_reason);
};
int fdt_system_reset(u32 reset_type);
int fdt_system_reset_check(u32 reset_type, u32 reset_reason);
void fdt_system_reset(u32 reset_type, u32 reset_reason);
int fdt_reset_init(void);

View File

@@ -14,6 +14,8 @@ void htif_putc(char ch);
int htif_getc(void);
int htif_system_reset(u32 type);
int htif_system_reset_check(u32 type, u32 reason);
void htif_system_reset(u32 type, u32 reason);
#endif

View File

@@ -12,7 +12,9 @@
#include <sbi/sbi_types.h>
int sifive_test_system_reset(u32 type);
int sifive_test_system_reset_check(u32 type, u32 reason);
void sifive_test_system_reset(u32 type, u32 reason);
int sifive_test_init(unsigned long base);