Nico Huber has uploaded this change for review. ( https://review.coreboot.org/c/flashrom/+/30386
Change subject: dediprog: Disable 4BA completely ......................................................................
dediprog: Disable 4BA completely
This is an interim solution. We'll have to enable 4BA step-by-step for each dediprog protocol version.
Change-Id: I08efcbb09ab3499ef6902a698e9ce3d6232237c4 Signed-off-by: Nico Huber nico.h@gmx.de --- M dediprog.c M flashrom.c M programmer.h 3 files changed, 18 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/flashrom refs/changes/86/30386/1
diff --git a/dediprog.c b/dediprog.c index 72818ea..3cac360 100644 --- a/dediprog.c +++ b/dediprog.c @@ -933,6 +933,7 @@
static const struct spi_master spi_master_dediprog = { .type = SPI_CONTROLLER_DEDIPROG, + .features = SPI_MASTER_NO_4BA_MODES, .max_data_read = 16, /* 18 seems to work fine as well, but 19 times out sometimes with FW 5.15. */ .max_data_write = 16, .command = dediprog_spi_send_command, diff --git a/flashrom.c b/flashrom.c index 59a7531..b229228 100644 --- a/flashrom.c +++ b/flashrom.c @@ -2258,6 +2258,16 @@ flash->address_high_byte = -1; flash->in_4ba_mode = false;
+ /* Be careful about 4BA chips and broken masters */ + if (flash->chip->total_size > 16 * 1024 && spi_master_no_4ba_modes(flash)) { + /* If we can't use native instructions, bail out */ + if ((flash->chip->feature_bits & FEATURE_4BA_NATIVE) != FEATURE_4BA_NATIVE + || !spi_master_4ba(flash)) { + msg_cerr("Programmer doesn't support this chip. Aborting.\n"); + return 1; + } + } + /* Enable/disable 4-byte addressing mode if flash chip supports it */ if (flash->chip->feature_bits & (FEATURE_4BA_ENTER | FEATURE_4BA_ENTER_WREN | FEATURE_4BA_ENTER_EAR7)) { int ret; diff --git a/programmer.h b/programmer.h index 311992a..8c2ae28 100644 --- a/programmer.h +++ b/programmer.h @@ -648,6 +648,8 @@ #define MAX_DATA_WRITE_UNLIMITED 256
#define SPI_MASTER_4BA (1U << 0) /**< Can handle 4-byte addresses */ +#define SPI_MASTER_NO_4BA_MODES (1U << 1) /**< Compatibility modes (i.e. extended address + register, 4BA mode switch) don't work */
struct spi_master { enum spi_controller type; @@ -840,6 +842,11 @@ return flash->mst->buses_supported & BUS_SPI && flash->mst->spi.features & SPI_MASTER_4BA; } +static inline bool spi_master_no_4ba_modes(const struct flashctx *const flash) +{ + return flash->mst->buses_supported & BUS_SPI && + flash->mst->spi.features & SPI_MASTER_NO_4BA_MODES; +}
/* usbdev.c */ struct libusb_device_handle;