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;
}