aboutsummaryrefslogtreecommitdiffstats
path: root/writeprotect.c
diff options
context:
space:
mode:
authorNikolai Artemiev <nartemiev@google.com>2021-10-21 02:29:22 +1100
committerAnastasia Klimchuk <aklm@chromium.org>2022-03-01 05:15:32 +0000
commit12dbc4e04508aecfff53ad95b6f68865da1b4f07 (patch)
treef202f9d1804b0c6a16661d92cf0eba4a84605404 /writeprotect.c
parent4cb8464e902e14ccc910398fc55874627d88be9b (diff)
downloadflashrom-12dbc4e04508aecfff53ad95b6f68865da1b4f07.tar.gz
flashrom-12dbc4e04508aecfff53ad95b6f68865da1b4f07.tar.bz2
flashrom-12dbc4e04508aecfff53ad95b6f68865da1b4f07.zip
writeprotect: add {get,set}_wp_mode()
BUG=b:195381327,b:153800563 BRANCH=none TEST=flashrom --wp-{enable,disable,status} Change-Id: I7b68e940f0e1359281806c98e1da119b4caf8405 Signed-off-by: Nikolai Artemiev <nartemiev@google.com> Reviewed-on: https://review.coreboot.org/c/flashrom/+/58483 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Anastasia Klimchuk <aklm@chromium.org> Reviewed-by: Angel Pons <th3fanbus@gmail.com> Reviewed-by: Nico Huber <nico.h@gmx.de> Reviewed-by: Edward O'Callaghan <quasisec@chromium.org>
Diffstat (limited to 'writeprotect.c')
-rw-r--r--writeprotect.c50
1 files changed, 44 insertions, 6 deletions
diff --git a/writeprotect.c b/writeprotect.c
index 82ecd8e6..6b3bbcf3 100644
--- a/writeprotect.c
+++ b/writeprotect.c
@@ -348,6 +348,50 @@ static int set_wp_range(struct wp_bits *bits, struct flashctx *flash, const stru
return ret;
}
+/** Get the mode selected by a WP configuration. */
+static int get_wp_mode(enum flashrom_wp_mode *mode, const struct wp_bits *bits)
+{
+ if (!bits->srp_bit_present)
+ return FLASHROM_WP_ERR_CHIP_UNSUPPORTED;
+
+ if (bits->srl_bit_present && bits->srl == 1) {
+ *mode = bits->srp ? FLASHROM_WP_MODE_PERMANENT :
+ FLASHROM_WP_MODE_POWER_CYCLE;
+ } else {
+ *mode = bits->srp ? FLASHROM_WP_MODE_HARDWARE :
+ FLASHROM_WP_MODE_DISABLED;
+ }
+
+ return FLASHROM_WP_OK;
+}
+
+/** Modify a wp_bits structure such that it will select a specified protection mode. */
+static int set_wp_mode(struct wp_bits *bits, const enum flashrom_wp_mode mode)
+{
+ switch (mode) {
+ case FLASHROM_WP_MODE_DISABLED:
+ bits->srl = 0;
+ bits->srp = 0;
+ return FLASHROM_WP_OK;
+
+ case FLASHROM_WP_MODE_HARDWARE:
+ bits->srl = 0;
+ bits->srp = 1;
+ return FLASHROM_WP_OK;
+
+ case FLASHROM_WP_MODE_POWER_CYCLE:
+ case FLASHROM_WP_MODE_PERMANENT:
+ default:
+ /*
+ * Don't try to enable power cycle or permanent protection for
+ * now. Those modes may be possible to activate on some chips,
+ * but they are usually unavailable by default or require special
+ * commands to activate.
+ */
+ return FLASHROM_WP_ERR_MODE_UNSUPPORTED;
+ }
+}
+
static bool chip_supported(struct flashctx *flash)
{
return (flash->chip != NULL) && (flash->chip->decode_range != NULL);
@@ -367,11 +411,8 @@ enum flashrom_wp_result wp_read_cfg(struct flashrom_wp_cfg *cfg, struct flashctx
if (ret == FLASHROM_WP_OK)
ret = get_wp_range(&cfg->range, flash, &bits);
- /* TODO: implement and get_wp_mode() and call it */
- /*
if (ret == FLASHROM_WP_OK)
ret = get_wp_mode(&cfg->mode, &bits);
- */
return ret;
}
@@ -394,11 +435,8 @@ enum flashrom_wp_result wp_write_cfg(struct flashctx *flash, const struct flashr
ret = write_wp_bits(flash, bits);
/* Set protection mode */
- /* TODO: implement set_wp_mode() and use it */
- /*
if (ret == FLASHROM_WP_OK)
ret = set_wp_mode(&bits, cfg->mode);
- */
if (ret == FLASHROM_WP_OK)
ret = write_wp_bits(flash, bits);