aboutsummaryrefslogtreecommitdiffstats
path: root/writeprotect.c
diff options
context:
space:
mode:
Diffstat (limited to 'writeprotect.c')
-rw-r--r--writeprotect.c37
1 files changed, 33 insertions, 4 deletions
diff --git a/writeprotect.c b/writeprotect.c
index 60d8ead1..57d0f9bd 100644
--- a/writeprotect.c
+++ b/writeprotect.c
@@ -23,13 +23,33 @@
#include "libflashrom.h"
#include "chipdrivers.h"
#include "writeprotect.h"
+#include "programmer.h"
+
+/*
+ * Allow specialisation in opaque masters, such as ichspi hwseq, to r/w to status registers.
+ */
+static int wp_write_register(const struct flashctx *flash, enum flash_reg reg, uint8_t value)
+{
+ if ((flash->mst->buses_supported & BUS_PROG) && flash->mst->opaque.write_register) {
+ return flash->mst->opaque.write_register(flash, reg, value);
+ }
+ return spi_write_register(flash, reg, value);
+}
+
+static int wp_read_register(const struct flashctx *flash, enum flash_reg reg, uint8_t *value)
+{
+ if ((flash->mst->buses_supported & BUS_PROG) && flash->mst->opaque.read_register) {
+ return flash->mst->opaque.read_register(flash, reg, value);
+ }
+ return spi_read_register(flash, reg, value);
+}
/** Read and extract a single bit from the chip's registers */
static enum flashrom_wp_result read_bit(uint8_t *value, bool *present, struct flashctx *flash, struct reg_bit_info bit)
{
*present = bit.reg != INVALID_REG;
if (*present) {
- if (spi_read_register(flash, bit.reg, value))
+ if (wp_read_register(flash, bit.reg, value))
return FLASHROM_WP_ERR_READ_FAILED;
*value = (*value >> bit.bit_index) & 1;
} else {
@@ -126,12 +146,12 @@ static enum flashrom_wp_result write_wp_bits(struct flashctx *flash, struct wp_b
continue;
uint8_t value;
- if (spi_read_register(flash, reg, &value))
+ if (wp_read_register(flash, reg, &value))
return FLASHROM_WP_ERR_READ_FAILED;
value = (value & ~write_masks[reg]) | (reg_values[reg] & write_masks[reg]);
- if (spi_write_register(flash, reg, value))
+ if (wp_write_register(flash, reg, value))
return FLASHROM_WP_ERR_WRITE_FAILED;
}
@@ -141,7 +161,7 @@ static enum flashrom_wp_result write_wp_bits(struct flashctx *flash, struct wp_b
continue;
uint8_t value;
- if (spi_read_register(flash, reg, &value))
+ if (wp_read_register(flash, reg, &value))
return FLASHROM_WP_ERR_READ_FAILED;
uint8_t actual = value & write_masks[reg];
@@ -407,6 +427,15 @@ static bool chip_supported(struct flashctx *flash)
return (flash->chip != NULL) && (flash->chip->decode_range != NULL);
}
+
+bool wp_operations_available(struct flashrom_flashctx *flash)
+{
+ return (flash->mst->buses_supported & BUS_SPI) ||
+ ((flash->mst->buses_supported & BUS_PROG) &&
+ flash->mst->opaque.read_register &&
+ flash->mst->opaque.write_register);
+}
+
enum flashrom_wp_result wp_read_cfg(struct flashrom_wp_cfg *cfg, struct flashctx *flash)
{
struct wp_bits bits;