summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNikolai Artemiev <nartemiev@google.com>2020-12-14 07:39:02 +1100
committerEdward O'Callaghan <quasisec@chromium.org>2021-01-13 01:46:37 +0000
commitf384161b5a122411bd22cc90a19f8a1a08de73e7 (patch)
treefa35c56a62a6b8e544775a0aa23f59c8c2861270
parent3170bc3a8e62fe5be8af840454031b39487b31d5 (diff)
downloadflashrom-f384161b5a122411bd22cc90a19f8a1a08de73e7.tar.gz
flashrom-f384161b5a122411bd22cc90a19f8a1a08de73e7.tar.bz2
flashrom-f384161b5a122411bd22cc90a19f8a1a08de73e7.zip
spi25_statusreg.c: restore SR contents at flashrom exit
register_chip_restore() provides a general mechanism for restoring a chip's state at flashrom exit; it can be used whenever the SR needs to be changed temporarily to perform some operation and changed back after the operation is complete. The only current current use case is in s25f.c, which changes the SR's sector layout bits so that entire flash accessible. This patch uses the chip restore functionality to reset changes to the status register made by spi_disable_blockprotect_generic(). This should help to ensure consistency across multiple runs of flashrom and make it easier to predict how a specific operation will change the flash. Imported from cros flashrom at `b170dd4e1d5c33b169c5` Change-Id: If2f0e73518d40519b7569f627c90a34c364df47c Signed-off-by: Nikolai Artemiev <nartemiev@google.com> Reviewed-on: https://review.coreboot.org/c/flashrom/+/48778 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Edward O'Callaghan <quasisec@chromium.org>
-rw-r--r--spi25_statusreg.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/spi25_statusreg.c b/spi25_statusreg.c
index 34f9ad4e1..a0b0fcf5e 100644
--- a/spi25_statusreg.c
+++ b/spi25_statusreg.c
@@ -108,6 +108,12 @@ uint8_t spi_read_status_register(const struct flashctx *flash)
return readarr[0];
}
+static int spi_restore_status(struct flashctx *flash, uint8_t status)
+{
+ msg_cdbg("restoring chip status (0x%02x)\n", status);
+ return spi_write_status_register(flash, status);
+}
+
/* A generic block protection disable.
* Tests if a protection is enabled with the block protection mask (bp_mask) and returns success otherwise.
* Tests if the register bits are locked with the lock_mask (lock_mask).
@@ -139,6 +145,9 @@ static int spi_disable_blockprotect_generic(struct flashctx *flash, uint8_t bp_m
return 0;
}
+ /* Restore status register content upon exit in finalize_flash_access(). */
+ register_chip_restore(spi_restore_status, flash, status);
+
msg_cdbg("Some block protection in effect, disabling... ");
if ((status & lock_mask) != 0) {
msg_cdbg("\n\tNeed to disable the register lock first... ");