summaryrefslogtreecommitdiffstats
path: root/flashrom.c
diff options
context:
space:
mode:
authorEdward O'Callaghan <quasisec@google.com>2022-08-15 12:05:31 +1000
committerFelix Singer <felixsinger@posteo.net>2022-11-01 01:15:21 +0000
commit10e7a0ebd74db72f00b8fc1b741f411d5a49b92d (patch)
treece00649acaeb036526489740af32b9a8cc3c403b /flashrom.c
parent74c3e56ec24f0d2800ea376d73d9b244cd8a4b40 (diff)
downloadflashrom-10e7a0ebd74db72f00b8fc1b741f411d5a49b92d.tar.gz
flashrom-10e7a0ebd74db72f00b8fc1b741f411d5a49b92d.tar.bz2
flashrom-10e7a0ebd74db72f00b8fc1b741f411d5a49b92d.zip
tree/: Convert flashchip probe func ptr to enumerate
This forges the way for flashchips.c to be pure declarative data and lookup functions for dispatch to be pure. This means that the flashchips data could be extracted out to be agnostic data of the flashrom code and algorithms. TEST='R|W|E && --flash-name' on ARM, AMD & Intel DUT's. Change-Id: I00aaab9c83f305cd47e78c36d9c2867f2b73c396 Signed-off-by: Edward O'Callaghan <quasisec@google.com> Reviewed-on: https://review.coreboot.org/c/flashrom/+/66781 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Nikolai Artemiev <nartemiev@google.com> Reviewed-by: Felix Singer <felixsinger@posteo.net>
Diffstat (limited to 'flashrom.c')
-rw-r--r--flashrom.c37
1 files changed, 35 insertions, 2 deletions
diff --git a/flashrom.c b/flashrom.c
index 0f982c910..c8c7dd564 100644
--- a/flashrom.c
+++ b/flashrom.c
@@ -729,6 +729,38 @@ static int init_default_layout(struct flashctx *flash)
return 0;
}
+typedef int (probe_func_t)(struct flashctx *flash);
+
+static probe_func_t *lookup_probe_func_ptr(const struct flashchip *chip)
+{
+ switch (chip->probe) {
+ case PROBE_JEDEC: return &probe_jedec;
+ case PROBE_JEDEC_29GL: return &probe_jedec_29gl;
+ case PROBE_OPAQUE: return &probe_opaque;
+ case PROBE_EDI_KB9012: return &edi_probe_kb9012;
+ case PROBE_AT82802AB: return &probe_82802ab;
+ case PROBE_W29EE011: return &probe_w29ee011;
+ case PROBE_EN29LV640B: return &probe_en29lv640b;
+ case PROBE_SPI_AT25F: return &probe_spi_at25f;
+ case PROBE_SPI_AT45DB: return &probe_spi_at45db;
+ case PROBE_SPI_BIG_SPANSION: return &probe_spi_big_spansion;
+ case PROBE_SPI_RDID: return &probe_spi_rdid;
+ case PROBE_SPI_RDID4: return &probe_spi_rdid4;
+ case PROBE_SPI_REMS: return &probe_spi_rems;
+ case PROBE_SPI_RES1: return &probe_spi_res1;
+ case PROBE_SPI_RES2: return &probe_spi_res2;
+ case PROBE_SPI_SFDP: return &probe_spi_sfdp;
+ case PROBE_SPI_ST95: return &probe_spi_st95;
+ /* default: total function, 0 indicates no probe function set.
+ * We explicitly do not want a default catch-all case in the switch
+ * to ensure unhandled enum's are compiler warnings.
+ */
+ case NO_PROBE_FUNC: return NULL;
+ };
+
+ return NULL;
+}
+
int probe_flash(struct registered_master *mst, int startchip, struct flashctx *flash, int force)
{
const struct flashchip *chip;
@@ -745,7 +777,8 @@ int probe_flash(struct registered_master *mst, int startchip, struct flashctx *f
if (chip->bustype == BUS_SPI && !chip_to_probe && chip->spi_cmd_set != SPI25)
continue;
msg_gdbg("Probing for %s %s, %d kB: ", chip->vendor, chip->name, chip->total_size);
- if (!chip->probe && !force) {
+ probe_func_t *probe_func = lookup_probe_func_ptr(chip);
+ if (!probe_func && !force) {
msg_gdbg("failed! flashrom has no probe function for this flash chip.\n");
continue;
}
@@ -768,7 +801,7 @@ int probe_flash(struct registered_master *mst, int startchip, struct flashctx *f
if (force)
break;
- if (flash->chip->probe(flash) != 1)
+ if (probe_func(flash) != 1)
goto notfound;
/* If this is the first chip found, accept it.