summaryrefslogtreecommitdiffstats
path: root/spi25_statusreg.c
diff options
context:
space:
mode:
authorEdward O'Callaghan <quasisec@google.com>2022-11-23 22:37:19 +1100
committerEdward O'Callaghan <quasisec@chromium.org>2023-03-22 21:19:09 +0000
commit5cff668d1ad152e3f70f725e667b23690e2d9f1a (patch)
treee724ecd415a611543a80b5f6f790d25e9305559d /spi25_statusreg.c
parente1cdbdbbfb98a28fe7198ae6cd3e571269a04403 (diff)
downloadflashrom-5cff668d1ad152e3f70f725e667b23690e2d9f1a.tar.gz
flashrom-5cff668d1ad152e3f70f725e667b23690e2d9f1a.tar.bz2
flashrom-5cff668d1ad152e3f70f725e667b23690e2d9f1a.zip
tree/: Convert printlock func ptr into enumerate values
Converting the printlock function pointer within the flashchip struct into enum values allows for the flashchips db to be turn into pure, declarative data. A nice side-effect of this is to reduce link-time symbol space of chipdrivers and increase modularity of the spi25_statusreg.c and related implementations. BUG=none TEST=ninja test. Change-Id: I9131348f72c1010e2c213dca4dc4b675a8d8681e Signed-off-by: Edward O'Callaghan <quasisec@google.com> Reviewed-on: https://review.coreboot.org/c/flashrom/+/69934 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Sam McNally <sammc@google.com> Reviewed-by: Nikolai Artemiev <nartemiev@google.com>
Diffstat (limited to 'spi25_statusreg.c')
-rw-r--r--spi25_statusreg.c108
1 files changed, 82 insertions, 26 deletions
diff --git a/spi25_statusreg.c b/spi25_statusreg.c
index 21a1a1519..60e0b46b2 100644
--- a/spi25_statusreg.c
+++ b/spi25_statusreg.c
@@ -354,8 +354,9 @@ static int spi_disable_blockprotect_generic(struct flashctx *flash, uint8_t bp_m
if ((status & bp_mask) != 0) {
msg_cerr("Block protection could not be disabled!\n");
- if (flash->chip->printlock)
- flash->chip->printlock(flash);
+ printlockfunc_t *printlock = lookup_printlock_func_ptr(flash);
+ if (printlock)
+ printlock(flash);
return 1;
}
msg_cdbg("disabled.\n");
@@ -470,7 +471,7 @@ void spi_prettyprint_status_register_bit(uint8_t status, int bit)
msg_cdbg("Chip status register: Bit %i is %sset\n", bit, (status & (1 << bit)) ? "" : "not ");
}
-int spi_prettyprint_status_register_plain(struct flashctx *flash)
+static int spi_prettyprint_status_register_plain(struct flashctx *flash)
{
uint8_t status;
int ret = spi_read_register(flash, STATUS1, &status);
@@ -481,7 +482,7 @@ int spi_prettyprint_status_register_plain(struct flashctx *flash)
}
/* Print the plain hex value and the welwip bits only. */
-int spi_prettyprint_status_register_default_welwip(struct flashctx *flash)
+static int spi_prettyprint_status_register_default_welwip(struct flashctx *flash)
{
uint8_t status;
int ret = spi_read_register(flash, STATUS1, &status);
@@ -497,7 +498,7 @@ int spi_prettyprint_status_register_default_welwip(struct flashctx *flash)
* AMIC A25L series
* and MX MX25L512
*/
-int spi_prettyprint_status_register_bp1_srwd(struct flashctx *flash)
+static int spi_prettyprint_status_register_bp1_srwd(struct flashctx *flash)
{
uint8_t status;
int ret = spi_read_register(flash, STATUS1, &status);
@@ -518,7 +519,7 @@ int spi_prettyprint_status_register_bp1_srwd(struct flashctx *flash)
* AMIC A25L series
* PMC Pm25LD series
*/
-int spi_prettyprint_status_register_bp2_srwd(struct flashctx *flash)
+static int spi_prettyprint_status_register_bp2_srwd(struct flashctx *flash)
{
uint8_t status;
int ret = spi_read_register(flash, STATUS1, &status);
@@ -538,7 +539,7 @@ int spi_prettyprint_status_register_bp2_srwd(struct flashctx *flash)
* ST M25P series
* MX MX25L series
*/
-int spi_prettyprint_status_register_bp3_srwd(struct flashctx *flash)
+static int spi_prettyprint_status_register_bp3_srwd(struct flashctx *flash)
{
uint8_t status;
int ret = spi_read_register(flash, STATUS1, &status);
@@ -553,7 +554,7 @@ int spi_prettyprint_status_register_bp3_srwd(struct flashctx *flash)
return 0;
}
-int spi_prettyprint_status_register_bp4_srwd(struct flashctx *flash)
+static int spi_prettyprint_status_register_bp4_srwd(struct flashctx *flash)
{
uint8_t status;
int ret = spi_read_register(flash, STATUS1, &status);
@@ -567,7 +568,7 @@ int spi_prettyprint_status_register_bp4_srwd(struct flashctx *flash)
return 0;
}
-int spi_prettyprint_status_register_bp2_bpl(struct flashctx *flash)
+static int spi_prettyprint_status_register_bp2_bpl(struct flashctx *flash)
{
uint8_t status;
int ret = spi_read_register(flash, STATUS1, &status);
@@ -583,7 +584,7 @@ int spi_prettyprint_status_register_bp2_bpl(struct flashctx *flash)
return 0;
}
-int spi_prettyprint_status_register_bp2_tb_bpl(struct flashctx *flash)
+static int spi_prettyprint_status_register_bp2_tb_bpl(struct flashctx *flash)
{
uint8_t status;
int ret = spi_read_register(flash, STATUS1, &status);
@@ -608,7 +609,7 @@ int spi_prettyprint_status_register_bp2_tb_bpl(struct flashctx *flash)
* by the second status register.
*/
-int spi_prettyprint_status_register_amic_a25l032(struct flashctx *flash)
+static int spi_prettyprint_status_register_amic_a25l032(struct flashctx *flash)
{
uint8_t status;
int ret = spi_read_register(flash, STATUS1, &status);
@@ -667,7 +668,7 @@ static void spi_prettyprint_status_register_atmel_at25_swp(uint8_t status)
}
}
-int spi_prettyprint_status_register_at25df(struct flashctx *flash)
+static int spi_prettyprint_status_register_at25df(struct flashctx *flash)
{
uint8_t status;
int ret = spi_read_register(flash, STATUS1, &status);
@@ -684,7 +685,7 @@ int spi_prettyprint_status_register_at25df(struct flashctx *flash)
return 0;
}
-int spi_prettyprint_status_register_at25df_sec(struct flashctx *flash)
+static int spi_prettyprint_status_register_at25df_sec(struct flashctx *flash)
{
/* FIXME: We should check the security lockdown. */
msg_cdbg("Ignoring security lockdown (if present)\n");
@@ -693,7 +694,7 @@ int spi_prettyprint_status_register_at25df_sec(struct flashctx *flash)
}
/* used for AT25F512, AT25F1024(A), AT25F2048 */
-int spi_prettyprint_status_register_at25f(struct flashctx *flash)
+static int spi_prettyprint_status_register_at25f(struct flashctx *flash)
{
uint8_t status;
int ret = spi_read_register(flash, STATUS1, &status);
@@ -711,7 +712,7 @@ int spi_prettyprint_status_register_at25f(struct flashctx *flash)
return 0;
}
-int spi_prettyprint_status_register_at25f512a(struct flashctx *flash)
+static int spi_prettyprint_status_register_at25f512a(struct flashctx *flash)
{
uint8_t status;
int ret = spi_read_register(flash, STATUS1, &status);
@@ -730,7 +731,7 @@ int spi_prettyprint_status_register_at25f512a(struct flashctx *flash)
return 0;
}
-int spi_prettyprint_status_register_at25f512b(struct flashctx *flash)
+static int spi_prettyprint_status_register_at25f512b(struct flashctx *flash)
{
uint8_t status;
int ret = spi_read_register(flash, STATUS1, &status);
@@ -747,7 +748,7 @@ int spi_prettyprint_status_register_at25f512b(struct flashctx *flash)
return 0;
}
-int spi_prettyprint_status_register_at25f4096(struct flashctx *flash)
+static int spi_prettyprint_status_register_at25f4096(struct flashctx *flash)
{
uint8_t status;
@@ -765,7 +766,7 @@ int spi_prettyprint_status_register_at25f4096(struct flashctx *flash)
return 0;
}
-int spi_prettyprint_status_register_at25fs010(struct flashctx *flash)
+static int spi_prettyprint_status_register_at25fs010(struct flashctx *flash)
{
uint8_t status;
int ret = spi_read_register(flash, STATUS1, &status);
@@ -788,7 +789,7 @@ int spi_prettyprint_status_register_at25fs010(struct flashctx *flash)
return 0;
}
-int spi_prettyprint_status_register_at25fs040(struct flashctx *flash)
+static int spi_prettyprint_status_register_at25fs040(struct flashctx *flash)
{
uint8_t status;
int ret = spi_read_register(flash, STATUS1, &status);
@@ -803,7 +804,7 @@ int spi_prettyprint_status_register_at25fs040(struct flashctx *flash)
return 0;
}
-int spi_prettyprint_status_register_at26df081a(struct flashctx *flash)
+static int spi_prettyprint_status_register_at26df081a(struct flashctx *flash)
{
uint8_t status;
int ret = spi_read_register(flash, STATUS1, &status);
@@ -864,7 +865,7 @@ static int spi_disable_blockprotect_at25fs040(struct flashctx *flash)
/* === Eon === */
-int spi_prettyprint_status_register_en25s_wp(struct flashctx *flash)
+static int spi_prettyprint_status_register_en25s_wp(struct flashctx *flash)
{
uint8_t status;
int ret = spi_read_register(flash, STATUS1, &status);
@@ -886,7 +887,7 @@ static int spi_disable_blockprotect_n25q(struct flashctx *flash)
return spi_disable_blockprotect_generic(flash, 0x5C, 1 << 7, 0, 0xFF);
}
-int spi_prettyprint_status_register_n25q(struct flashctx *flash)
+static int spi_prettyprint_status_register_n25q(struct flashctx *flash)
{
uint8_t status;
int ret = spi_read_register(flash, STATUS1, &status);
@@ -959,7 +960,7 @@ blockprotect_func_t *lookup_blockprotect_func_ptr(const struct flashchip *const
}
/* Used by Intel/Numonyx S33 and Spansion S25FL-S chips */
-int spi_prettyprint_status_register_bp2_ep_srwd(struct flashctx *flash)
+static int spi_prettyprint_status_register_bp2_ep_srwd(struct flashctx *flash)
{
uint8_t status;
int ret = spi_read_register(flash, STATUS1, &status);
@@ -990,7 +991,7 @@ static void spi_prettyprint_status_register_sst25_common(uint8_t status)
spi_prettyprint_status_register_welwip(status);
}
-int spi_prettyprint_status_register_sst25(struct flashctx *flash)
+static int spi_prettyprint_status_register_sst25(struct flashctx *flash)
{
uint8_t status;
int ret = spi_read_register(flash, STATUS1, &status);
@@ -1000,7 +1001,7 @@ int spi_prettyprint_status_register_sst25(struct flashctx *flash)
return 0;
}
-int spi_prettyprint_status_register_sst25vf016(struct flashctx *flash)
+static int spi_prettyprint_status_register_sst25vf016(struct flashctx *flash)
{
static const char *const bpt[] = {
"none",
@@ -1020,7 +1021,7 @@ int spi_prettyprint_status_register_sst25vf016(struct flashctx *flash)
return 0;
}
-int spi_prettyprint_status_register_sst25vf040b(struct flashctx *flash)
+static int spi_prettyprint_status_register_sst25vf040b(struct flashctx *flash)
{
static const char *const bpt[] = {
"none",
@@ -1037,3 +1038,58 @@ int spi_prettyprint_status_register_sst25vf040b(struct flashctx *flash)
msg_cdbg("Resulting block protection : %s\n", bpt[(status & 0x1c) >> 2]);
return 0;
}
+
+printlockfunc_t *lookup_printlock_func_ptr(struct flashctx *flash)
+{
+ switch (flash->chip->printlock) {
+ case PRINTLOCK_AT49F: return &printlock_at49f;
+ case PRINTLOCK_REGSPACE2_BLOCK_ERASER_0: return &printlock_regspace2_block_eraser_0;
+ case PRINTLOCK_REGSPACE2_BLOCK_ERASER_1: return &printlock_regspace2_block_eraser_1;
+ case PRINTLOCK_SST_FWHUB: return &printlock_sst_fwhub;
+ case PRINTLOCK_W39F010: return &printlock_w39f010;
+ case PRINTLOCK_W39L010: return &printlock_w39l010;
+ case PRINTLOCK_W39L020: return &printlock_w39l020;
+ case PRINTLOCK_W39L040: return &printlock_w39l040;
+ case PRINTLOCK_W39V040A: return &printlock_w39v040a;
+ case PRINTLOCK_W39V040B: return &printlock_w39v040b;
+ case PRINTLOCK_W39V040C: return &printlock_w39v040c;
+ case PRINTLOCK_W39V040FA: return &printlock_w39v040fa;
+ case PRINTLOCK_W39V040FB: return &printlock_w39v040fb;
+ case PRINTLOCK_W39V040FC: return &printlock_w39v040fc;
+ case PRINTLOCK_W39V080A: return &printlock_w39v080a;
+ case PRINTLOCK_W39V080FA: return &printlock_w39v080fa;
+ case PRINTLOCK_W39V080FA_DUAL: return &printlock_w39v080fa_dual;
+ case SPI_PRETTYPRINT_STATUS_REGISTER_AMIC_A25L032: return &spi_prettyprint_status_register_amic_a25l032;
+ case SPI_PRETTYPRINT_STATUS_REGISTER_AT25DF: return &spi_prettyprint_status_register_at25df;
+ case SPI_PRETTYPRINT_STATUS_REGISTER_AT25DF_SEC: return &spi_prettyprint_status_register_at25df_sec;
+ case SPI_PRETTYPRINT_STATUS_REGISTER_AT25F: return &spi_prettyprint_status_register_at25f;
+ case SPI_PRETTYPRINT_STATUS_REGISTER_AT25F4096: return &spi_prettyprint_status_register_at25f4096;
+ case SPI_PRETTYPRINT_STATUS_REGISTER_AT25F512A: return &spi_prettyprint_status_register_at25f512a;
+ case SPI_PRETTYPRINT_STATUS_REGISTER_AT25F512B: return &spi_prettyprint_status_register_at25f512b;
+ case SPI_PRETTYPRINT_STATUS_REGISTER_AT25FS010: return &spi_prettyprint_status_register_at25fs010;
+ case SPI_PRETTYPRINT_STATUS_REGISTER_AT25FS040: return &spi_prettyprint_status_register_at25fs040;
+ case SPI_PRETTYPRINT_STATUS_REGISTER_AT26DF081A: return &spi_prettyprint_status_register_at26df081a;
+ case SPI_PRETTYPRINT_STATUS_REGISTER_AT45DB: return &spi_prettyprint_status_register_at45db;
+ case SPI_PRETTYPRINT_STATUS_REGISTER_BP1_SRWD: return &spi_prettyprint_status_register_bp1_srwd;
+ case SPI_PRETTYPRINT_STATUS_REGISTER_BP2_BPL: return &spi_prettyprint_status_register_bp2_bpl;
+ case SPI_PRETTYPRINT_STATUS_REGISTER_BP2_EP_SRWD: return &spi_prettyprint_status_register_bp2_ep_srwd;
+ case SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD: return &spi_prettyprint_status_register_bp2_srwd;
+ case SPI_PRETTYPRINT_STATUS_REGISTER_BP2_TB_BPL: return &spi_prettyprint_status_register_bp2_tb_bpl;
+ case SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD: return &spi_prettyprint_status_register_bp3_srwd;
+ case SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD: return &spi_prettyprint_status_register_bp4_srwd;
+ case SPI_PRETTYPRINT_STATUS_REGISTER_DEFAULT_WELWIP: return &spi_prettyprint_status_register_default_welwip;
+ case SPI_PRETTYPRINT_STATUS_REGISTER_EN25S_WP: return &spi_prettyprint_status_register_en25s_wp;
+ case SPI_PRETTYPRINT_STATUS_REGISTER_N25Q: return &spi_prettyprint_status_register_n25q;
+ case SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN: return &spi_prettyprint_status_register_plain;
+ case SPI_PRETTYPRINT_STATUS_REGISTER_SST25: return &spi_prettyprint_status_register_sst25;
+ case SPI_PRETTYPRINT_STATUS_REGISTER_SST25VF016: return &spi_prettyprint_status_register_sst25vf016;
+ case SPI_PRETTYPRINT_STATUS_REGISTER_SST25VF040B: return &spi_prettyprint_status_register_sst25vf040b;
+ /* default: non-total function, 0 indicates no unlock 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_PRINTLOCK_FUNC: return NULL;
+ };
+
+ return NULL;
+}