diff options
author | Nikolai Artemiev <nartemiev@google.com> | 2022-02-13 22:32:59 +1100 |
---|---|---|
committer | Edward O'Callaghan <quasisec@chromium.org> | 2022-04-05 23:47:46 +0000 |
commit | 9b20174fda038ef633af2163c9b1570f4dbf9a37 (patch) | |
tree | eb3b03cd25dc3e158c6c6de34f66bb7a79b70c99 /libflashrom.c | |
parent | a850fd0aa8054a1125a9231fa3317428f15900f4 (diff) | |
download | flashrom-9b20174fda038ef633af2163c9b1570f4dbf9a37.tar.gz flashrom-9b20174fda038ef633af2163c9b1570f4dbf9a37.tar.bz2 flashrom-9b20174fda038ef633af2163c9b1570f4dbf9a37.zip |
libflashrom,linux_mtd: add linux_mtd writeprotect support
This commit adds a generic framework to allow opaque programmers to
implement writeprotect operations and uses the framework to support
writeprotect operations on linux MTD device files.
The generic framework comprises three new functions in
`struct opaque_master` that are called from libflashrom:
- wp_write_cfg()
- wp_read_cfg()
- wp_get_ranges()
For linux_mtd, only the read/write functions are implemented. Linux's
MTD interface doesn't provide a way to get available ranges, so calling
get_wp_ranges() on the linux_mtd master will return
FLASHROM_WP_ERR_RANGE_LIST_UNAVAILABLE.
BUG=b:182223106
BRANCH=none
TEST=WP ops on hana DUT (MT8173) with W25Q32DW flash
TEST=flashrom --wp-enable --wp-range <non-empty> succeeds
TEST=flashrom --wp-enable --wp-range <empty> fails as expected
TEST=flashrom --wp-disable --wp-range <empty> succeeds
TEST=flashrom --wp-disable --wp-range <non-empty> fails as expected
TEST=flashrom --wp-status succeeds
Change-Id: I5c86e28cdec44bec49ba1d36f8ab62241b9b01da
Signed-off-by: Nikolai Artemiev <nartemiev@google.com>
Reviewed-on: https://review.coreboot.org/c/flashrom/+/61897
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Anastasia Klimchuk <aklm@chromium.org>
Reviewed-by: Edward O'Callaghan <quasisec@chromium.org>
Diffstat (limited to 'libflashrom.c')
-rw-r--r-- | libflashrom.c | 25 |
1 files changed, 9 insertions, 16 deletions
diff --git a/libflashrom.c b/libflashrom.c index 39b0c67b..658d8122 100644 --- a/libflashrom.c +++ b/libflashrom.c @@ -714,14 +714,12 @@ void flashrom_wp_get_range(size_t *start, size_t *len, const struct flashrom_wp_ */ enum flashrom_wp_result flashrom_wp_write_cfg(struct flashctx *flash, const struct flashrom_wp_cfg *cfg) { - /* - * TODO: Call custom implementation if the programmer is opaque, as - * direct WP operations require SPI access. In particular, linux_mtd - * has its own WP operations we should use instead. - */ if (flash->mst->buses_supported & BUS_SPI) return wp_write_cfg(flash, cfg); + if (flash->mst->buses_supported & BUS_PROG && flash->mst->opaque.wp_write_cfg) + return flash->mst->opaque.wp_write_cfg(flash, cfg); + return FLASHROM_WP_ERR_OTHER; } @@ -736,14 +734,12 @@ enum flashrom_wp_result flashrom_wp_write_cfg(struct flashctx *flash, const stru */ enum flashrom_wp_result flashrom_wp_read_cfg(struct flashrom_wp_cfg *cfg, struct flashctx *flash) { - /* - * TODO: Call custom implementation if the programmer is opaque, as - * direct WP operations require SPI access. In particular, linux_mtd - * has its own WP operations we should use instead. - */ if (flash->mst->buses_supported & BUS_SPI) return wp_read_cfg(cfg, flash); + if (flash->mst->buses_supported & BUS_PROG && flash->mst->opaque.wp_read_cfg) + return flash->mst->opaque.wp_read_cfg(cfg, flash); + return FLASHROM_WP_ERR_OTHER; } @@ -761,15 +757,12 @@ enum flashrom_wp_result flashrom_wp_read_cfg(struct flashrom_wp_cfg *cfg, struct */ enum flashrom_wp_result flashrom_wp_get_available_ranges(struct flashrom_wp_ranges **list, struct flashrom_flashctx *flash) { - /* - * TODO: Call custom implementation if the programmer is opaque, as - * direct WP operations require SPI access. We actually can't implement - * this in linux_mtd right now, but we should adopt a proper generic - * architechure to match the read and write functions anyway. - */ if (flash->mst->buses_supported & BUS_SPI) return wp_get_available_ranges(list, flash); + if (flash->mst->buses_supported & BUS_PROG && flash->mst->opaque.wp_get_ranges) + return flash->mst->opaque.wp_get_ranges(list, flash); + return FLASHROM_WP_ERR_OTHER; } |