diff options
author | Nikolai Artemiev <nartemiev@google.com> | 2022-08-30 11:11:13 +1000 |
---|---|---|
committer | Edward O'Callaghan <quasisec@chromium.org> | 2022-10-28 00:41:32 +0000 |
commit | 2e00f736714c3117354106c502a8c89b23896b2b (patch) | |
tree | fa51e602529c445891de23cafb36a1f4f42b6434 /writeprotect.c | |
parent | bd8a02de6cd9a6fb909be7e246ab7bb0dc558798 (diff) | |
download | flashrom-2e00f736714c3117354106c502a8c89b23896b2b.tar.gz flashrom-2e00f736714c3117354106c502a8c89b23896b2b.tar.bz2 flashrom-2e00f736714c3117354106c502a8c89b23896b2b.zip |
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>
Diffstat (limited to 'writeprotect.c')
-rw-r--r-- | writeprotect.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/writeprotect.c b/writeprotect.c index 57d0f9bd..dcffe030 100644 --- a/writeprotect.c +++ b/writeprotect.c @@ -174,11 +174,26 @@ static enum flashrom_wp_result write_wp_bits(struct flashctx *flash, struct wp_b 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 int set_wp_mode(struct wp_bits *bits, const enum flashrom_wp_mode mode) 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); } |