summaryrefslogtreecommitdiffstats
path: root/flash.h
diff options
context:
space:
mode:
authorNikolai Artemiev <nartemiev@google.com>2021-10-20 23:34:15 +1100
committerAnastasia Klimchuk <aklm@chromium.org>2022-03-01 03:56:22 +0000
commite00790865726b6f1a6492af0833e3cbf9c215496 (patch)
tree28ad15a5adc3f532488c5a8b0812de879067c41b /flash.h
parentb7ea3a9a5d481a09229abba0fe6d2509ef2713a1 (diff)
downloadflashrom-e00790865726b6f1a6492af0833e3cbf9c215496.tar.gz
flashrom-e00790865726b6f1a6492af0833e3cbf9c215496.tar.bz2
flashrom-e00790865726b6f1a6492af0833e3cbf9c215496.zip
flash.h,flashchips.c: add writeprotect bit layout map to chips
This patch adds a register bit map `struct reg_bit_info`, with fields for storing the register, bit index, and writability of each bit that affects the chip's write protection. This allows writeprotect code to be independent of the register layout of any specific chip. The new fields have been filled out for example chips. The representation is centered around describing how bits can be accessed and modified, rather than the layout of registers. This is generally easier to work with in code that needs to access specific bits and typically requires specifying the locations of fewer bits overall. BUG=b:195381327,b:153800563 BRANCH=none TEST=flashrom --wp-{enable,disable,range,list,status} at end of patch series Change-Id: Id08d77e6d4ca5109c0d698271146d026dbc21284 Signed-off-by: Nikolai Artemiev <nartemiev@google.com> Reviewed-on: https://review.coreboot.org/c/flashrom/+/58477 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Nico Huber <nico.h@gmx.de> Reviewed-by: Anastasia Klimchuk <aklm@chromium.org>
Diffstat (limited to 'flash.h')
-rw-r--r--flash.h50
1 files changed, 50 insertions, 0 deletions
diff --git a/flash.h b/flash.h
index cd40fa3ff..b935e9bc4 100644
--- a/flash.h
+++ b/flash.h
@@ -34,6 +34,7 @@
#include "libflashrom.h"
#include "layout.h"
+#include "writeprotect.h"
#define KiB (1024)
#define MiB (1024 * KiB)
@@ -176,6 +177,24 @@ enum flash_reg {
MAX_REGISTERS
};
+struct reg_bit_info {
+ /* Register containing the bit */
+ enum flash_reg reg;
+
+ /* Bit index within register */
+ uint8_t bit_index;
+
+ /*
+ * Writability of the bit. RW does not guarantee the bit will be
+ * writable, for example if status register protection is enabled.
+ */
+ enum {
+ RO, /* Read only */
+ RW, /* Readable and writable */
+ OTP /* One-time programmable */
+ } writability;
+};
+
struct flashchip {
const char *vendor;
const char *name;
@@ -255,6 +274,37 @@ struct flashchip {
/* SPI specific options (TODO: Make it a union in case other bustypes get specific options.) */
uint8_t wrea_override; /**< override opcode for write extended address register */
+ struct reg_bit_map {
+ /* Status register protection bit (SRP) */
+ struct reg_bit_info srp;
+
+ /* Status register lock bit (SRP) */
+ struct reg_bit_info srl;
+
+ /*
+ * Note: some datasheets refer to configuration bits that
+ * function like TB/SEC/CMP bits as BP bits (e.g. BP3 for a bit
+ * that functions like TB).
+ *
+ * As a convention, any config bit that functions like a
+ * TB/SEC/CMP bit should be assigned to the respective
+ * tb/sec/cmp field in this structure, even if the datasheet
+ * uses a different name.
+ */
+
+ /* Block protection bits (BP) */
+ /* Extra element for terminator */
+ struct reg_bit_info bp[MAX_BP_BITS + 1];
+
+ /* Top/bottom protection bit (TB) */
+ struct reg_bit_info tb;
+
+ /* Sector/block protection bit (SEC) */
+ struct reg_bit_info sec;
+
+ /* Complement bit (CMP) */
+ struct reg_bit_info cmp;
+ } reg_bits;
};
typedef int (*chip_restore_fn_cb_t)(struct flashctx *flash, uint8_t status);