summaryrefslogtreecommitdiffstats
path: root/libflashrom.c
diff options
context:
space:
mode:
authorNikolai Artemiev <nartemiev@google.com>2022-02-13 22:32:59 +1100
committerEdward O'Callaghan <quasisec@chromium.org>2022-04-05 23:47:46 +0000
commit9b20174fda038ef633af2163c9b1570f4dbf9a37 (patch)
treeeb3b03cd25dc3e158c6c6de34f66bb7a79b70c99 /libflashrom.c
parenta850fd0aa8054a1125a9231fa3317428f15900f4 (diff)
downloadflashrom-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.c25
1 files changed, 9 insertions, 16 deletions
diff --git a/libflashrom.c b/libflashrom.c
index 39b0c67b6..658d8122b 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;
}