aboutsummaryrefslogtreecommitdiffstats
path: root/writeprotect.c
diff options
context:
space:
mode:
authorSergii Dmytruk <sergii.dmytruk@3mdeb.com>2022-08-17 18:29:10 +0300
committerAnastasia Klimchuk <aklm@chromium.org>2022-11-18 07:14:05 +0000
commit0f4767fd1e1eff8e20f82778e340b534af7ab190 (patch)
tree69468f6bb107928a4bd5b0be472f5a6ba48aac1e /writeprotect.c
parent6d475ec4ab99d7ff912cc491b861ca40a07ecf26 (diff)
downloadflashrom-0f4767fd1e1eff8e20f82778e340b534af7ab190.tar.gz
flashrom-0f4767fd1e1eff8e20f82778e340b534af7ab190.tar.bz2
flashrom-0f4767fd1e1eff8e20f82778e340b534af7ab190.zip
writeprotect.c: refuse to work with chip if OTP WPS == 1
Perform the check right in read_wp_bits() as it's used by various WP operations and also because its results won't make sense if WPS bit is on and can't be changed. Change-Id: I143186066a1d3af89809b7135886cb8b0d038085 Signed-off-by: Sergii Dmytruk <sergii.dmytruk@3mdeb.com> Reviewed-on: https://review.coreboot.org/c/flashrom/+/66836 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Edward O'Callaghan <quasisec@chromium.org> Reviewed-by: Nikolai Artemiev <nartemiev@google.com>
Diffstat (limited to 'writeprotect.c')
-rw-r--r--writeprotect.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/writeprotect.c b/writeprotect.c
index 3e8a8366..1ac0c1ac 100644
--- a/writeprotect.c
+++ b/writeprotect.c
@@ -73,6 +73,25 @@ static enum flashrom_wp_result read_wp_bits(struct wp_bits *bits, struct flashct
size_t i;
enum flashrom_wp_result ret;
+ /*
+ * Write protection select bit (WPS) controls kind of write protection
+ * that is used by the chip. When set, BP bits are ignored and each
+ * block/sector has its own WP bit managed by special commands. When
+ * the bit is set and we can't change it, just bail out until
+ * implementation is extended to handle this kind of WP.
+ */
+ if (bit_map->wps.reg != INVALID_REG && bit_map->wps.writability != RW) {
+ bool wps_bit_present;
+ uint8_t wps;
+
+ ret = read_bit(&wps, &wps_bit_present, flash, bit_map->wps);
+ if (ret != FLASHROM_WP_OK)
+ return ret;
+
+ if (wps_bit_present && wps)
+ return FLASHROM_WP_ERR_UNSUPPORTED_STATE;
+ }
+
ret = read_bit(&bits->tb, &bits->tb_bit_present, flash, bit_map->tb);
if (ret != FLASHROM_WP_OK)
return ret;
@@ -93,8 +112,6 @@ static enum flashrom_wp_result read_wp_bits(struct wp_bits *bits, struct flashct
if (ret != FLASHROM_WP_OK)
return ret;
- /* Note: WPS bit isn't read here, because it's not part of any range. */
-
for (i = 0; i < ARRAY_SIZE(bits->bp); i++) {
if (bit_map->bp[i].reg == INVALID_REG)
break;