memory_bus: Export functions to ad-hoc map flash

We want to avoid `struct flashctx` during probing, hence need functions
that work without it.

Change-Id: I65aa6bc8c563816ad69db11cc4065f5412aa463c
Signed-off-by: Nico Huber <nico.h@gmx.de>
Reviewed-on: https://review.sourcearcade.org/c/flashprog/+/439
diff --git a/include/chipdrivers/memory_bus.h b/include/chipdrivers/memory_bus.h
index 758fa64..2a5e080 100644
--- a/include/chipdrivers/memory_bus.h
+++ b/include/chipdrivers/memory_bus.h
@@ -90,6 +90,10 @@
 int write_en29lv640b(struct flashprog_flashctx *, const uint8_t *buf, unsigned int start, unsigned int len);
 
 /* memory_bus.c */
+struct par_master;
+void *programmer_map_flash_data(const struct par_master *, chipsize_t, const char *descr);
+void programmer_unmap_flash_region(const struct par_master *, void *, chipsize_t);
+
 enum preparation_steps;
 int prepare_memory_access(struct flashprog_flashctx *, enum preparation_steps);
 int prepare_memory_register_access(struct flashprog_flashctx *, enum preparation_steps);
diff --git a/memory_bus.c b/memory_bus.c
index 61058b9..2a94630 100644
--- a/memory_bus.c
+++ b/memory_bus.c
@@ -22,28 +22,45 @@
 
 #include "chipdrivers/memory_bus.h"
 
-static void *programmer_map_flash_region(const struct flashctx *flash, const char *descr,
-					 uintptr_t phys_addr, size_t len)
+static void *programmer_map_flash_region(const struct par_master *par, const char *descr,
+					 uintptr_t phys_addr, chipsize_t len)
 {
 	void *ret;
-	if (flash->mst.par->map_flash)
-		ret = flash->mst.par->map_flash(descr, phys_addr, len);
+	if (par->map_flash)
+		ret = par->map_flash(descr, phys_addr, len);
 	else
 		ret = fallback_map(descr, phys_addr, len);
-	msg_gspew("%s: mapping %s from 0x%0*" PRIxPTR " to 0x%0*" PRIxPTR "\n",
-		  __func__, descr, PRIxPTR_WIDTH, phys_addr, PRIxPTR_WIDTH, (uintptr_t) ret);
+	msg_gspew("%s: mapping%s%s from 0x%0*" PRIxPTR " to 0x%0*" PRIxPTR "\n",
+		  __func__, *descr ? " " : "", descr,
+		  PRIxPTR_WIDTH, phys_addr, PRIxPTR_WIDTH, (uintptr_t)ret);
 	return ret;
 }
 
-static void programmer_unmap_flash_region(const struct flashctx *flash, void *virt_addr, size_t len)
+void programmer_unmap_flash_region(const struct par_master *par, void *virt_addr, chipsize_t len)
 {
-	if (flash->mst.par->unmap_flash)
-		flash->mst.par->unmap_flash(virt_addr, len);
+	if (par->unmap_flash)
+		par->unmap_flash(virt_addr, len);
 	else
 		fallback_unmap(virt_addr, len);
 	msg_gspew("%s: unmapped 0x%0*" PRIxPTR "\n", __func__, PRIxPTR_WIDTH, (uintptr_t)virt_addr);
 }
 
+static uintptr_t calculate_flash_data_base(const struct par_master *par, chipsize_t size)
+{
+	return par->rom_base ? par->rom_base : (0xffffffff - size + 1);
+}
+
+void *programmer_map_flash_data(const struct par_master *par, chipsize_t size, const char *descr)
+{
+	uintptr_t base = calculate_flash_data_base(par, size);
+	void *const addr = programmer_map_flash_region(par, descr, base, size);
+	if (addr == ERROR_PTR) {
+		msg_perr("Could not map flash chip%s%s at 0x%0*" PRIxPTR ".\n",
+			 *descr ? " " : "", descr, PRIxPTR_WIDTH, base);
+	}
+	return addr;
+}
+
 int prepare_memory_access(struct flashctx *flash, enum preparation_steps prep)
 {
 	const struct par_master *const par = flash->mst.par;
@@ -56,14 +73,11 @@
 	flash->virtual_registers = (chipaddr)ERROR_PTR;
 
 	const chipsize_t size = flash->chip->total_size * 1024;
-	const uintptr_t base = par->rom_base ? par->rom_base : (0xffffffff - size + 1);
-	void *const addr = programmer_map_flash_region(flash, flash->chip->name, base, size);
-	if (addr == ERROR_PTR) {
-		msg_perr("Could not map flash chip %s at 0x%0*" PRIxPTR ".\n",
-			 flash->chip->name, PRIxPTR_WIDTH, base);
+	void *const addr = programmer_map_flash_data(par, size, flash->chip->name);
+	if (addr == ERROR_PTR)
 		return 1;
-	}
-	flash->physical_memory = base;
+
+	flash->physical_memory = calculate_flash_data_base(par, size);
 	flash->virtual_memory = (chipaddr)addr;
 
 	return 0;
@@ -71,6 +85,8 @@
 
 int prepare_memory_register_access(struct flashctx *flash, enum preparation_steps prep)
 {
+	const struct par_master *const par = flash->mst.par;
+
 	if (prep == PREPARE_POST_PROBE)
 		return 0;
 
@@ -84,7 +100,7 @@
 	 */
 	const chipsize_t size = flash->chip->total_size * 1024;
 	const uintptr_t base = 0xffffffff - size - 0x400000 + 1;
-	void *const addr = programmer_map_flash_region(flash, "flash chip registers", base, size);
+	void *const addr = programmer_map_flash_region(par, "flash chip registers", base, size);
 	if (addr == ERROR_PTR) {
 		msg_pdbg2("Could not map flash chip registers %s at 0x%0*" PRIxPTR ".\n",
 			 flash->chip->name, PRIxPTR_WIDTH, base);
@@ -101,13 +117,13 @@
 	const size_t size = flashprog_flash_getsize(flash);
 
 	if (flash->virtual_registers != (chipaddr)ERROR_PTR) {
-		programmer_unmap_flash_region(flash, (void *)flash->virtual_registers, size);
+		programmer_unmap_flash_region(flash->mst.par, (void *)flash->virtual_registers, size);
 		flash->physical_registers = 0;
 		flash->virtual_registers = (chipaddr)ERROR_PTR;
 	}
 
 	if (flash->virtual_memory != (chipaddr)ERROR_PTR) {
-		programmer_unmap_flash_region(flash, (void *)flash->virtual_memory, size);
+		programmer_unmap_flash_region(flash->mst.par, (void *)flash->virtual_memory, size);
 		flash->physical_memory = 0;
 		flash->virtual_memory = (chipaddr)ERROR_PTR;
 	}