Browse Source

rv32: flush disk cache on reconfiguration reboot

When doing a non-emergency reboot, e.g. due to a new configuration, do
it nicely by flushing the disk cache and making sure than any console
output has been delivered before rebooting.
H. Peter Anvin 1 year ago
parent
commit
98143f3b66

BIN
esp32/output/max80.ino.bin


+ 3 - 3
fpga/max80.qpf

@@ -19,14 +19,14 @@
 #
 # Quartus Prime
 # Version 22.1std.2 Build 922 07/20/2023 SC Lite Edition
-# Date created = 16:00:14  September 17, 2023
+# Date created = 16:28:19  September 17, 2023
 #
 # -------------------------------------------------------------------------- #
 
 QUARTUS_VERSION = "22.1"
-DATE = "16:00:14  September 17, 2023"
+DATE = "16:28:19  September 17, 2023"
 
 # Revisions
 
-PROJECT_REVISION = "v2"
 PROJECT_REVISION = "v1"
+PROJECT_REVISION = "v2"

BIN
fpga/output/bypass.jic


BIN
fpga/output/max80.fw


BIN
fpga/output/v1.fw


BIN
fpga/output/v1.jic


BIN
fpga/output/v1.sof


BIN
fpga/output/v2.fw


BIN
fpga/output/v2.jic


BIN
fpga/output/v2.sof


+ 1 - 1
rv32/Makefile

@@ -52,7 +52,7 @@ COMMONOBJ := $(patsubst ../common/%.c,%.o,$(wildcard ../common/*.c))
 
 LIBOBJ   = debug.o ioregsa.o irqasm.o irqtable.o spurious_irq.o \
 	   console.o rtc.o romcopy.o spiflash.o esp.o matchver.o \
-	   config.o \
+	   config.o shutdown.o \
 	   sdcard.o \
 	   abcmem.o abcio.o abcdisk.o abcrtc.o abcpun80.o \
 	   memset.o memcpy.o \

+ 1 - 1
rv32/checksum.h

@@ -1,4 +1,4 @@
 #ifndef CHECKSUM_H
 #define CHECKSUM_H
-#define SDRAM_SUM 0x2b5459df
+#define SDRAM_SUM 0x9c04cf95
 #endif

+ 2 - 0
rv32/common.h

@@ -110,4 +110,6 @@ extern void run_test_image(void);
 extern void rom_flash_from_memory(void *, size_t);
 extern void rom_flash_from_sdcard(void);
 
+extern no_return shutdown(unsigned int);
+
 #endif /* COMMON_H */

+ 1 - 1
rv32/config.c

@@ -41,7 +41,7 @@ void update_config(void)
 	udelay(20000);
     }
     if (getvar_bool(config_fpga_reset)) {
-	reset(SYS_RESET_SOFT);
+	shutdown(SYS_RESET_SOFT);
     }
     ABC_BUSCTL = busctl;
 }

+ 8 - 2
rv32/console.h

@@ -70,12 +70,18 @@ static __always_inline void con_puts(const char *str)
 
 #endif
 
-static __always_inline void con_flush(void)
+static __always_inline void con_flush_unconditional(void)
 {
-    while (CON_FLOW_CTL && !(CON_STATUS & TTY_STATUS_TX_EMPTY))
+    while (!(CON_STATUS & TTY_STATUS_TX_EMPTY))
 	relax();
 }
 
+static __always_inline void con_flush(void)
+{
+    if (CON_FLOW_CTL)
+	con_flush_unconditional();
+}
+
 void con_print_hex(unsigned int); /* For pre-SDRAM capable code */
 void con_hexdump(const void *data, size_t len); /* For debugging */
 

+ 17 - 0
rv32/shutdown.c

@@ -0,0 +1,17 @@
+#include "common.h"
+#include "io.h"
+#include "sdcard.h"
+#include "console.h"
+
+/*
+ * Do a clean shutdown and reboot
+ */
+no_return shutdown(unsigned int type)
+{
+    /* Flush disk cache */
+    disk_ioctl(0, CTRL_SYNC, NULL);
+
+    con_puts("Rebooting...\n");
+    con_flush_unconditional();
+    reset(SYS_RESET_SOFT);
+}