mirror of
https://review.coreboot.org/flashrom.git
synced 2025-06-30 21:52:36 +02:00
Add additional SPI sector erase and chip erase command functions
Not all chips support all commands, so allow the implementer to select the matching function. Fix a layering violation in ICH SPI code to be less bad. Still not perfect, but the new code is shorter, more generic and architecturally more sound. TODO (in a separate patch): - move the generic sector erase code to spi.c - decide which erase command to use based on info about the chip - create a generic spi_erase_all_sectors function which calls the generic sector erase function Thanks to Stefan for reviewing and commenting. Corresponding to flashrom svn r337 and coreboot v2 svn r3722. Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> Acked-by: Stefan Reinauer <stepan@coresystems.de>
This commit is contained in:
21
ichspi.c
21
ichspi.c
@ -154,7 +154,6 @@ static int ich_spi_read_page(struct flashchip *flash, uint8_t * buf,
|
||||
int offset, int maxdata);
|
||||
static int ich_spi_write_page(struct flashchip *flash, uint8_t * bytes,
|
||||
int offset, int maxdata);
|
||||
static int ich_spi_erase_block(struct flashchip *flash, int offset);
|
||||
|
||||
OPCODES O_ST_M25P = {
|
||||
{
|
||||
@ -479,20 +478,6 @@ static int run_opcode(OPCODE op, uint32_t offset,
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int ich_spi_erase_block(struct flashchip *flash, int offset)
|
||||
{
|
||||
printf_debug("ich_spi_erase_block: offset=%d, sectors=%d\n", offset, 1);
|
||||
|
||||
if (run_opcode(curopcodes->opcode[2], offset, 0, NULL) != 0) {
|
||||
printf_debug("Error erasing sector at 0x%x", offset);
|
||||
return -1;
|
||||
}
|
||||
|
||||
printf("DONE BLOCK 0x%x\n", offset);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ich_spi_read_page(struct flashchip *flash, uint8_t * buf, int offset,
|
||||
int maxdata)
|
||||
{
|
||||
@ -596,7 +581,11 @@ int ich_spi_write(struct flashchip *flash, uint8_t * buf)
|
||||
printf("Programming page: \n");
|
||||
|
||||
for (i = 0; i < total_size / erase_size; i++) {
|
||||
rc = ich_spi_erase_block(flash, i * erase_size);
|
||||
/* FIMXE: call the chip-specific spi_block_erase_XX instead.
|
||||
* For this, we need to add a block erase function to
|
||||
* struct flashchip.
|
||||
*/
|
||||
rc = spi_block_erase_d8(flash, i * erase_size);
|
||||
if (rc) {
|
||||
printf("Error erasing block at 0x%x\n", i);
|
||||
break;
|
||||
|
Reference in New Issue
Block a user