Browse Source

rv32: fix ABC memory-mapping logic

Accidentally had if (!data) instead of if (data), so the whole memory
map ended up zero (= not mapped.)

Print out some more detailed/informative information during the
mapping process, too.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
H. Peter Anvin 1 year ago
parent
commit
fb0bca2036

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 = 21:30:15  October 12, 2023
+# Date created = 23:28:11  October 12, 2023
 #
 # -------------------------------------------------------------------------- #
 
 QUARTUS_VERSION = "22.1"
-DATE = "21:30:15  October 12, 2023"
+DATE = "23:28:11  October 12, 2023"
 
 # Revisions
 
-PROJECT_REVISION = "v1"
 PROJECT_REVISION = "v2"
+PROJECT_REVISION = "v1"

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


+ 38 - 40
rv32/abcmem.c

@@ -7,22 +7,23 @@
 #include "roms.h"
 
 /* Configure ABC memory map */
-struct data_len {
+struct rom {
     const char *data;
     size_t len;
+    const char *name;
 };
 struct abc_mem_init {
     int addr;
     uint32_t flags;
     enum sysvar_enum enable;
-    struct data_len dl;
+    struct rom r;
 };
 #define RD ABCMEMMAP_RD
 #define WR ABCMEMMAP_WR
 
 #define K 1024
-#define DD(x)	{ (x), sizeof(x) }
-#define END { -1, 0, sysvar_null, { NULL, 0 } }
+#define R(x)	{ (x), sizeof(x), #x }
+#define END { -1, 0, sysvar_null, { NULL, 0, NULL } }
 
 /* ---- ABC80 memory configurations ---- */
 
@@ -34,42 +35,42 @@ static char __dram_bss __aligned(512) abc80_extmem[16*K];
 
 static const struct abc_mem_init mem_init_abc80[] = {
     /* Put these here in case someone wants to enable both */
-    { 20*K, RD|WR, config_abc_mem_abc80_nvram_20k,  DD(abc80_nvram[0]) },
-    { 22*K, RD|WR, config_abc_mem_abc80_nvram_22k,  DD(abc80_nvram[1]) },
-
-    { 16*K, RD,    config_abc_mem_abc80_smartaid3,  DD(rom_abc80_smartaid3) },
-    { 16*K, RD,    config_abc_mem_abc80_superbasic, DD(rom_abc80_superbasic16k) },
-    { 20*K, RD,    config_abc_mem_abc80_abc80l,     DD(rom_abc80_abc80l) },
-    { 28*K, RD,    config_abc_mem_abc80_superbasic, DD(rom_abc80_superbasic28k) },
-    { 32*K, RD|WR, config_abc_mem_abc80_ram,        DD(abc80_extmem) },
+    { 20*K, RD|WR, config_abc_mem_abc80_nvram_20k,  R(abc80_nvram[0]) },
+    { 22*K, RD|WR, config_abc_mem_abc80_nvram_22k,  R(abc80_nvram[1]) },
+
+    { 16*K, RD,    config_abc_mem_abc80_smartaid3,  R(rom_abc80_smartaid3) },
+    { 16*K, RD,    config_abc_mem_abc80_superbasic, R(rom_abc80_superbasic16k) },
+    { 20*K, RD,    config_abc_mem_abc80_abc80l,     R(rom_abc80_abc80l) },
+    { 28*K, RD,    config_abc_mem_abc80_superbasic, R(rom_abc80_superbasic28k) },
+    { 32*K, RD|WR, config_abc_mem_abc80_ram,        R(abc80_extmem) },
     END
 };
 static const struct abc_mem_init mem_init_abc80_nvram_20k[] = {
-    { 24*K, RD,    config_abc_mem_abc80_ufddos,	    DD(rom_abc80_nvram_20k_ufddos80) },
-    { 28*K, RD,    config_abc_mem_abc80_pun80_28k,  DD(rom_abc80_nvram_20k_print80_28) },
-    { 29*K, RD,    config_abc_mem_abc80_pun80_29k,  DD(rom_abc80_nvram_20k_print80_29) },
-    { 30*K, RD,    config_abc_mem_abc80_pun80_30k,  DD(rom_abc80_nvram_20k_print80_30) },
+    { 24*K, RD,    config_abc_mem_abc80_ufddos,	    R(rom_abc80_nvram_20k_ufddos80) },
+    { 28*K, RD,    config_abc_mem_abc80_pun80_28k,  R(rom_abc80_nvram_20k_print80_28) },
+    { 29*K, RD,    config_abc_mem_abc80_pun80_29k,  R(rom_abc80_nvram_20k_print80_29) },
+    { 30*K, RD,    config_abc_mem_abc80_pun80_30k,  R(rom_abc80_nvram_20k_print80_30) },
     END
 };
 static const struct abc_mem_init mem_init_abc80_nvram_22k[] = {
-    { 24*K, RD,    config_abc_mem_abc80_ufddos,	    DD(rom_abc80_nvram_22k_ufddos80) },
-    { 28*K, RD,    config_abc_mem_abc80_pun80_28k,  DD(rom_abc80_nvram_22k_print80_28) },
-    { 29*K, RD,    config_abc_mem_abc80_pun80_29k,  DD(rom_abc80_nvram_22k_print80_29) },
-    { 30*K, RD,    config_abc_mem_abc80_pun80_30k,  DD(rom_abc80_nvram_22k_print80_30) },
+    { 24*K, RD,    config_abc_mem_abc80_ufddos,	    R(rom_abc80_nvram_22k_ufddos80) },
+    { 28*K, RD,    config_abc_mem_abc80_pun80_28k,  R(rom_abc80_nvram_22k_print80_28) },
+    { 29*K, RD,    config_abc_mem_abc80_pun80_29k,  R(rom_abc80_nvram_22k_print80_29) },
+    { 30*K, RD,    config_abc_mem_abc80_pun80_30k,  R(rom_abc80_nvram_22k_print80_30) },
     END
 };
 static const struct abc_mem_init mem_init_abc80_no_nvram[] = {
-    { 24*K, RD,    config_abc_mem_abc80_ufddos,	    DD(rom_abc80_no_nvram_ufddos80) },
-    { 28*K, RD,    config_abc_mem_abc80_pun80_28k,  DD(rom_abc80_no_nvram_print80_28) },
-    { 29*K, RD,    config_abc_mem_abc80_pun80_29k,  DD(rom_abc80_no_nvram_print80_29) },
-    { 30*K, RD,    config_abc_mem_abc80_pun80_30k,  DD(rom_abc80_no_nvram_print80_30) },
+    { 24*K, RD,    config_abc_mem_abc80_ufddos,	    R(rom_abc80_no_nvram_ufddos80) },
+    { 28*K, RD,    config_abc_mem_abc80_pun80_28k,  R(rom_abc80_no_nvram_print80_28) },
+    { 29*K, RD,    config_abc_mem_abc80_pun80_29k,  R(rom_abc80_no_nvram_print80_29) },
+    { 30*K, RD,    config_abc_mem_abc80_pun80_30k,  R(rom_abc80_no_nvram_print80_30) },
     END
 };
 
 /* ---- ABC800 memory configurations ---- */
 
 static const struct abc_mem_init mem_init_abc800[] = {
-    { 24*K, RD,    config_abc_mem_abc800_ufddos,    DD(rom_abc800_ufddos) },
+    { 24*K, RD,    config_abc_mem_abc800_ufddos,    R(rom_abc800_ufddos) },
     END
 };
 
@@ -82,19 +83,21 @@ static void abc_map_list(uint32_t *memmap, const struct abc_mem_init *mem)
 {
     while (mem->addr >= 0) {
 	bool enabled = !mem->enable || getvar_bool(mem->enable);
-	const void *data = mem->dl.data;
-	size_t len = mem->dl.len;
+	const void *data = mem->r.data;
+	size_t len = mem->r.len;
 
 	if (!len)
 	    continue;		/* Empty range, skip */
 
 	uint32_t addr = mem->addr;
 	bool bad = ((addr | len) & ~ABC_PAGE_MASK) ||
-	    len > 0x10000 - addr ||
-	    (size_t)data & (ABC_PAGE_SIZE-1);
+	    (len > 0x10000 - addr) ||
+	    ((size_t)data & (ABC_PAGE_SIZE-1));
 
-	con_printf("abcmem: %s memory range @ 0x%04x len 0x%04x\n",
-		   bad ? "invalid" : !enabled ? "ignoring" :
+	con_printf("abcmem: %s %s @ 0x%04x len 0x%04x\n",
+		   mem->r.name ? mem->r.name : "(none)",
+		   bad ? "invalid" :
+		   !enabled ? "disabled" :
 		   data ? "mapping" : "unmapping",
 		   addr, len);
 
@@ -102,7 +105,7 @@ static void abc_map_list(uint32_t *memmap, const struct abc_mem_init *mem)
 	    uint32_t *pg = &memmap[addr >> ABC_PAGE_SHIFT];
 	    uint32_t flags = mem->flags;
 
-	    if (!data) {
+	    if (data) {
 		/* Mapped range */
 		for (uint32_t bytes = 0; bytes < len; bytes += ABC_PAGE_SIZE)
 		    *pg++ = ((size_t)(data + bytes) & SDRAM_MASK) | flags;
@@ -117,13 +120,10 @@ static void abc_map_list(uint32_t *memmap, const struct abc_mem_init *mem)
 
 void __cold abc_init_memmap(void)
 {
-    uint32_t *memmap = calloc(sizeof(uint32_t), ABC_PAGE_COUNT);
+    static uint32_t memmap[ABC_PAGE_COUNT];
     const struct abc_mem_init *mem;
 
-    if (!memmap) {
-	con_printf("abcmem: memory map initialization failure\n");
-	return;
-    }
+    memset(memmap, 0, sizeof memmap);
 
     if (is_abc800()) {
 	abc_map_list(memmap, mem_init_abc800);
@@ -140,7 +140,5 @@ void __cold abc_init_memmap(void)
     }
 
     /* Install memory map into hardware registers */
-    memcpy((void *)&ABCMEMMAP_PAGE(0), memmap,
-	   ABC_PAGE_COUNT*sizeof(uint32_t));
-    free(memmap);
+    memcpy(&ABCMEMMAP_PAGE(0), memmap, sizeof memmap);
 }

+ 1 - 1
rv32/checksum.h

@@ -1,4 +1,4 @@
 #ifndef CHECKSUM_H
 #define CHECKSUM_H
-#define SDRAM_SUM 0x37b8f62c
+#define SDRAM_SUM 0x26a2fc68
 #endif