Hello Josh
I dove into the code yesterday and here is what I found. When the bits BP0 and
BP1 in the status register need to be cleared the function
spi_disable_blockprotect(flash) is called. To clear these bits (for the
sst25lf080a ROM chip) the commands EWSR and WRSR need to be sent to the chip.
In the function spi_write_status_register(...)
the function spi_write_status_register_flag(...) is call to send the commands
WREN and WRSR. The expectation seems to be that if this function fails to
clear BP0 and BP1 bits it will return a no-zerero value and then
spi_write_status_register_flag(...) will be call again to send the commands
EWSR and WRSR. But spi_write_status_register_flag(...) returns a zero value
for the first case so the second calll is never made.
The EWSR and WRSR commands are never sent and the chip remains in protected
mode.
To correct the code the commands EWSR and WRSR must be sent to the sst25lf080a.
How this should be done so that the code works for other chips I leave to the
people at flashrom.
Still a mystery is how the code works for the sst25lf040a chip and not the
sst25lf080a chip.
Thanks
Boyce
int spi_write_status_register_flag(struct flashctx *flash,int status,const
unsigned char enable_opcode) {
.
.
.
result = spi_send_multicommand(flash,cmds);
if (result) {
.
.
.
return result;
}
.
.
.
return 0;
}
int spi_write_status_register(struct flashctx *flash,int status) {
int feature_bits = flash->chip->feature_bits;
.
.
.
if (feature_bits & FEATURE_WRSR_WREN)
ret = spi_write_status_register_flag(flash,status,JEDEC_WREN);
if (ret && feature_bits & FEATURE_WRSR_EWSR)
ret = spi_write_status_register_flag(flash,status,JEDEC_EWSR);
return ret;
}
int spi_disable_blockprotect_generic(struct flashctx *flash,uint8_t
bp_mask,uint8_t lock_mask,uint8_t wp_mask,
uint8_t unprotect_mask) {
.
.
.
/* Global unprotect. ... */
result = spi_write_status_register(flash,status & ~(bp_mask |
lock_mask) & unprotect_mask);
if (result) {
.
.
.
return result;
}
.
.
.
return 0;
}
int spi_disable_blockprotect(struct flashctx *flash) {
return spi_disable_blockprotect_generic(flash,0x3c,0,0,0xFF);
}
_______________________________________________
flashrom mailing list
[email protected]
https://mail.coreboot.org/mailman/listinfo/flashrom