Browse Source

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>
Heinrich Schuchardt 3 years ago
parent
commit
ec5274b04c
2 changed files with 28 additions and 0 deletions
  1. 19 0
      platform/kendryte/k210/platform.c
  2. 9 0
      platform/kendryte/k210/platform.h

+ 19 - 0
platform/kendryte/k210/platform.c

@@ -129,6 +129,22 @@ static int k210_timer_init(bool cold_boot)
 	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 = {
 	.final_init	= k210_final_init,
 
@@ -142,6 +158,9 @@ const struct sbi_platform_operations platform_ops = {
 	.ipi_send  = clint_ipi_send,
 	.ipi_clear = clint_ipi_clear,
 
+	.system_reset_check	= k210_system_reset_check,
+	.system_reset		= k210_system_reset,
+
 	.timer_init	   = k210_timer_init,
 	.timer_value	   = clint_timer_value,
 	.timer_event_stop  = clint_timer_event_stop,

+ 9 - 0
platform/kendryte/k210/platform.h

@@ -27,10 +27,19 @@
 /* Registers */
 #define K210_PLL0		0x08
 #define K210_CLKSEL0		0x20
+#define K210_RESET		0x30
+
+/* Register bit masks */
+#define K210_RESET_MASK		0x01
 
 static inline u32 k210_read_sysreg(u32 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_ */