mirror of
https://github.com/riscv-software-src/opensbi.git
synced 2025-08-25 07:41:42 +01:00
platform: implement K210 system reset
Implement rebooting the K210 via the system reset extension. All reset types are treated in the same way. A request for shutdown results in a reboot. Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de> Reviewed-by: Damien Le Moal <damien.lemoal@wdc.com> Reviewed-by: Anup Patel <anup.patel@wdc.com>
This commit is contained in:

committed by
Anup Patel

parent
234ed8e427
commit
ec5274b04c
@@ -129,6 +129,22 @@ static int k210_timer_init(bool cold_boot)
|
|||||||
return clint_warm_timer_init();
|
return clint_warm_timer_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int k210_system_reset_check(u32 type, u32 reason)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void k210_system_reset(u32 type, u32 reason)
|
||||||
|
{
|
||||||
|
u32 val;
|
||||||
|
|
||||||
|
val = k210_read_sysreg(K210_RESET);
|
||||||
|
val |= K210_RESET_MASK;
|
||||||
|
k210_write_sysreg(val, K210_RESET);
|
||||||
|
|
||||||
|
while (1);
|
||||||
|
}
|
||||||
|
|
||||||
const struct sbi_platform_operations platform_ops = {
|
const struct sbi_platform_operations platform_ops = {
|
||||||
.final_init = k210_final_init,
|
.final_init = k210_final_init,
|
||||||
|
|
||||||
@@ -142,6 +158,9 @@ const struct sbi_platform_operations platform_ops = {
|
|||||||
.ipi_send = clint_ipi_send,
|
.ipi_send = clint_ipi_send,
|
||||||
.ipi_clear = clint_ipi_clear,
|
.ipi_clear = clint_ipi_clear,
|
||||||
|
|
||||||
|
.system_reset_check = k210_system_reset_check,
|
||||||
|
.system_reset = k210_system_reset,
|
||||||
|
|
||||||
.timer_init = k210_timer_init,
|
.timer_init = k210_timer_init,
|
||||||
.timer_value = clint_timer_value,
|
.timer_value = clint_timer_value,
|
||||||
.timer_event_stop = clint_timer_event_stop,
|
.timer_event_stop = clint_timer_event_stop,
|
||||||
|
@@ -27,10 +27,19 @@
|
|||||||
/* Registers */
|
/* Registers */
|
||||||
#define K210_PLL0 0x08
|
#define K210_PLL0 0x08
|
||||||
#define K210_CLKSEL0 0x20
|
#define K210_CLKSEL0 0x20
|
||||||
|
#define K210_RESET 0x30
|
||||||
|
|
||||||
|
/* Register bit masks */
|
||||||
|
#define K210_RESET_MASK 0x01
|
||||||
|
|
||||||
static inline u32 k210_read_sysreg(u32 reg)
|
static inline u32 k210_read_sysreg(u32 reg)
|
||||||
{
|
{
|
||||||
return readl((volatile void *)(K210_SYSCTL_BASE_ADDR + reg));
|
return readl((volatile void *)(K210_SYSCTL_BASE_ADDR + reg));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void k210_write_sysreg(u32 val, u32 reg)
|
||||||
|
{
|
||||||
|
writel(val, (volatile void *)(K210_SYSCTL_BASE_ADDR + reg));
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* _K210_PLATFORM_H_ */
|
#endif /* _K210_PLATFORM_H_ */
|
||||||
|
Reference in New Issue
Block a user