Edward O'Callaghan submitted this change.

View Change



8 is the latest approved patch-set.
No files were changed between the latest approved patch-set and the submitted one.

Approvals: build bot (Jenkins): Verified Felix Singer: Looks good to me, but someone else must approve Edward O'Callaghan: Looks good to me, approved
tree/: Convert flashchip decode range func ptr to enum

Replace the `decode_range` function pointer in `struct flashchip` to an
enum value. The enum value can be used to find the corresponding
function pointer by passing it to `lookup_decode_range_func_ptr()`.

Removing function pointers like `decode_range` makes it possible to represent chip data in a declarative format that does not have to be
stored as C source code.

BUG=b:242479049
BRANCH=none
TEST=ninja && ninja test

Signed-off-by: Nikolai Artemiev <nartemiev@google.com>
Change-Id: If6d08d414d3d1ddadc95ca1d407fc87c23ab543d
Reviewed-on: https://review.coreboot.org/c/flashrom/+/67195
Reviewed-by: Edward O'Callaghan <quasisec@chromium.org>
Reviewed-by: Felix Singer <felixsinger@posteo.net>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
---
M flashchips.c
M include/flash.h
M tests/chip_wp.c
M writeprotect.c
4 files changed, 76 insertions(+), 28 deletions(-)

diff --git a/flashchips.c b/flashchips.c
index 41e4c42..cbfbc7b 100644
--- a/flashchips.c
+++ b/flashchips.c
@@ -2451,7 +2451,7 @@
.sec = {STATUS1, 6, RW},
.cmp = {STATUS2, 6, RW},
},
- .decode_range = decode_range_spi25,
+ .decode_range = DECODE_RANGE_SPI25,
},

{
@@ -5183,7 +5183,7 @@
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
},
- .decode_range = decode_range_spi25,
+ .decode_range = DECODE_RANGE_SPI25,
},

{
@@ -6371,7 +6371,7 @@
.sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
.cmp = {STATUS2, 6, RW},
},
- .decode_range = decode_range_spi25,
+ .decode_range = DECODE_RANGE_SPI25,
},

{
@@ -6537,7 +6537,7 @@
.sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
.cmp = {STATUS2, 6, RW},
},
- .decode_range = decode_range_spi25,
+ .decode_range = DECODE_RANGE_SPI25,
},

{
@@ -6665,7 +6665,7 @@
.sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
.cmp = {STATUS2, 6, RW},
},
- .decode_range = decode_range_spi25,
+ .decode_range = DECODE_RANGE_SPI25,
},

{
@@ -6798,7 +6798,7 @@
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
.tb = {STATUS1, 6, RW},
},
- .decode_range = decode_range_spi25,
+ .decode_range = DECODE_RANGE_SPI25,
},

{
@@ -6847,7 +6847,7 @@
.sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
.cmp = {STATUS2, 6, RW},
},
- .decode_range = decode_range_spi25,
+ .decode_range = DECODE_RANGE_SPI25,
},

{
@@ -6969,7 +6969,7 @@
.sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
.cmp = {STATUS2, 6, RW},
},
- .decode_range = decode_range_spi25,
+ .decode_range = DECODE_RANGE_SPI25,
},

{
@@ -16236,7 +16236,7 @@
.cmp = {STATUS2, 6, RW},
.wps = {STATUS3, 2, RW},
},
- .decode_range = decode_range_spi25,
+ .decode_range = DECODE_RANGE_SPI25,
},

{
@@ -16729,7 +16729,7 @@
.cmp = {STATUS2, 6, RW},
.wps = {STATUS3, 2, RW},
},
- .decode_range = decode_range_spi25,
+ .decode_range = DECODE_RANGE_SPI25,
},

{
@@ -17347,7 +17347,7 @@
.cmp = {STATUS2, 6, RW},
.wps = {STATUS3, 2, RW},
},
- .decode_range = decode_range_spi25,
+ .decode_range = DECODE_RANGE_SPI25,
},

{
@@ -17395,7 +17395,7 @@
.sec = {STATUS1, 6, RW},
.cmp = {STATUS2, 6, RW},
},
- .decode_range = decode_range_spi25,
+ .decode_range = DECODE_RANGE_SPI25,
},

{
@@ -17445,7 +17445,7 @@
.sec = {STATUS1, 6, RW},
.cmp = {STATUS2, 6, RW},
},
- .decode_range = decode_range_spi25,
+ .decode_range = DECODE_RANGE_SPI25,
},

{
@@ -17493,7 +17493,7 @@
.sec = {STATUS1, 6, RW},
.cmp = {STATUS2, 6, RW},
},
- .decode_range = decode_range_spi25,
+ .decode_range = DECODE_RANGE_SPI25,
},

{
@@ -17663,7 +17663,7 @@
.tb = {STATUS1, 6, RW},
.cmp = {STATUS2, 6, RW},
},
- .decode_range = decode_range_spi25,
+ .decode_range = DECODE_RANGE_SPI25,
},

{
@@ -17718,7 +17718,7 @@
.tb = {STATUS1, 6, RW},
.cmp = {STATUS2, 6, RW},
},
- .decode_range = decode_range_spi25,
+ .decode_range = DECODE_RANGE_SPI25,
},

{
@@ -17773,7 +17773,7 @@
.tb = {STATUS1, 6, RW},
.cmp = {STATUS2, 6, RW},
},
- .decode_range = decode_range_spi25,
+ .decode_range = DECODE_RANGE_SPI25,
},

{
@@ -18238,7 +18238,7 @@
.sec = {STATUS1, 6, RW},
.cmp = {STATUS2, 6, RW},
},
- .decode_range = decode_range_spi25,
+ .decode_range = DECODE_RANGE_SPI25,
},

{
@@ -18290,7 +18290,7 @@
.cmp = {STATUS2, 6, RW},
.wps = {STATUS3, 2, RW},
},
- .decode_range = decode_range_spi25,
+ .decode_range = DECODE_RANGE_SPI25,
},

{
@@ -18380,7 +18380,7 @@
.sec = {STATUS1, 6, RW},
.cmp = {STATUS2, 6, RW},
},
- .decode_range = decode_range_spi25,
+ .decode_range = DECODE_RANGE_SPI25,
},

{
@@ -19752,7 +19752,7 @@
.sec = {STATUS1, 6, RW},
.cmp = {STATUS2, 6, RW},
},
- .decode_range = decode_range_spi25,
+ .decode_range = DECODE_RANGE_SPI25,
},

{
@@ -19842,7 +19842,7 @@
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
.tb = {STATUS1, 6, RW},
},
- .decode_range = decode_range_spi25,
+ .decode_range = DECODE_RANGE_SPI25,
},

{
diff --git a/include/flash.h b/include/flash.h
index 633601d..32290e4 100644
--- a/include/flash.h
+++ b/include/flash.h
@@ -211,6 +211,12 @@

struct wp_bits;

+enum decode_range_func {
+ NO_DECODE_RANGE_FUNC = 0, /* 0 indicates no range decode funciton is set. */
+ DECODE_RANGE_SPI25 = 1,
+};
+typedef void (decode_range_func_t)(size_t *start, size_t *len, const struct wp_bits *, size_t chip_len);
+
struct flashchip {
const char *vendor;
const char *name;
@@ -321,9 +327,11 @@
struct reg_bit_info wps;
} reg_bits;

- /* Function that takes a set of WP config bits (e.g. BP, SEC, TB, etc) */
- /* and determines what protection range they select. */
- void (*decode_range)(size_t *start, size_t *len, const struct wp_bits *, size_t chip_len);
+ /*
+ * Function that takes a set of WP config bits (e.g. BP, SEC, TB, etc)
+ * and determines what protection range they select.
+ */
+ enum decode_range_func decode_range;
};

typedef int (*chip_restore_fn_cb_t)(struct flashctx *flash, uint8_t status);
diff --git a/tests/chip_wp.c b/tests/chip_wp.c
index 95e6b05..e4eff99 100644
--- a/tests/chip_wp.c
+++ b/tests/chip_wp.c
@@ -97,7 +97,7 @@
.cmp = {STATUS2, 6, RW},
.wps = {STATUS3, 2, RW},
},
- .decode_range = decode_range_spi25,
+ .decode_range = DECODE_RANGE_SPI25,
};

/* Trying to set an unsupported WP range fails */
diff --git a/writeprotect.c b/writeprotect.c
index 57d0f9b..dcffe03 100644
--- a/writeprotect.c
+++ b/writeprotect.c
@@ -174,11 +174,26 @@
return FLASHROM_WP_OK;
}

+static decode_range_func_t *lookup_decode_range_func_ptr(const struct flashchip *chip)
+{
+ switch (chip->decode_range) {
+ case DECODE_RANGE_SPI25: return &decode_range_spi25;
+ /* default: total function, 0 indicates no decode range function set. */
+ case NO_DECODE_RANGE_FUNC: return NULL;
+ };
+
+ return NULL;
+}
+
+
/** Get the range selected by a WP configuration. */
static enum flashrom_wp_result get_wp_range(struct wp_range *range, struct flashctx *flash, const struct wp_bits *bits)
{
- flash->chip->decode_range(&range->start, &range->len, bits, flashrom_flash_getsize(flash));
+ decode_range_func_t *decode_range = lookup_decode_range_func_ptr(flash->chip);
+ if (decode_range == NULL)
+ return FLASHROM_WP_ERR_OTHER;

+ decode_range(&range->start, &range->len, bits, flashrom_flash_getsize(flash));
return FLASHROM_WP_OK;
}

@@ -424,7 +439,7 @@

static bool chip_supported(struct flashctx *flash)
{
- return (flash->chip != NULL) && (flash->chip->decode_range != NULL);
+ return (flash->chip != NULL) && (flash->chip->decode_range != NO_DECODE_RANGE_FUNC);
}



To view, visit change 67195. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: flashrom
Gerrit-Branch: master
Gerrit-Change-Id: If6d08d414d3d1ddadc95ca1d407fc87c23ab543d
Gerrit-Change-Number: 67195
Gerrit-PatchSet: 14
Gerrit-Owner: Nikolai Artemiev <nartemiev@google.com>
Gerrit-Reviewer: Anastasia Klimchuk <aklm@chromium.org>
Gerrit-Reviewer: Edward O'Callaghan <quasisec@chromium.org>
Gerrit-Reviewer: Felix Singer <felixsinger@posteo.net>
Gerrit-Reviewer: build bot (Jenkins) <no-reply@coreboot.org>
Gerrit-MessageType: merged