1
0
mirror of https://review.coreboot.org/flashrom.git synced 2025-04-26 22:52:34 +02:00

tree/: Convert flashchip write func ptr to enumerate

This forges the way for flashchips.c to be pure declarative
data and lookup functions for dispatch to be pure. This
means that the flashchips data could be extracted out to
be agnostic data of the flashrom code and algorithms.

TEST='R|W|E && --flash-name' on ARM, AMD & Intel DUT's.

Change-Id: I80149de169464b204fb09f1424a86fc645b740fd
Signed-off-by: Edward O'Callaghan <quasisec@google.com>
Reviewed-on: https://review.coreboot.org/c/flashrom/+/66782
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Nikolai Artemiev <nartemiev@google.com>
Reviewed-by: Felix Singer <felixsinger@posteo.net>
This commit is contained in:
Edward O'Callaghan 2022-08-16 11:48:40 +10:00 committed by Felix Singer
parent 10e7a0ebd7
commit 985ad5623f
7 changed files with 656 additions and 599 deletions

File diff suppressed because it is too large Load Diff

View File

@ -729,6 +729,40 @@ static int init_default_layout(struct flashctx *flash)
return 0;
}
/* special unit-test hook */
write_func_t *g_test_write_injector;
static write_func_t *lookup_write_func_ptr(const struct flashchip *chip)
{
switch (chip->write) {
case WRITE_JEDEC: return &write_jedec;
case WRITE_JEDEC1: return &write_jedec_1;
case WRITE_OPAQUE: return &write_opaque;
case SPI_CHIP_WRITE1: return &spi_chip_write_1;
case SPI_CHIP_WRITE256: return &spi_chip_write_256;
case SPI_WRITE_AAI: return &spi_aai_write;
case SPI_WRITE_AT45DB: return &spi_write_at45db;
case WRITE_28SF040: return &write_28sf040;
case WRITE_82802AB: return &write_82802ab;
case WRITE_EN29LV640B: return &write_en29lv640b;
case EDI_CHIP_WRITE: return &edi_chip_write;
case TEST_WRITE_INJECTOR: return g_test_write_injector;
/* default: total function, 0 indicates no write function set.
* We explicitly do not want a default catch-all case in the switch
* to ensure unhandled enum's are compiler warnings.
*/
case NO_WRITE_FUNC: return NULL;
};
return NULL;
}
static int write_flash(struct flashctx *flash, const uint8_t *buf, unsigned int start, unsigned int len)
{
write_func_t *write_func = lookup_write_func_ptr(flash->chip);
return write_func(flash, buf, start, len);
}
typedef int (probe_func_t)(struct flashctx *flash);
static probe_func_t *lookup_probe_func_ptr(const struct flashchip *chip)
@ -1161,7 +1195,7 @@ static int erase_block(struct flashctx *const flashctx,
if (!writecount++)
msg_cdbg("W");
/* Needs the partial write function signature. */
if (flashctx->chip->write(flashctx, backup_contents + starthere,
if (write_flash(flashctx, backup_contents + starthere,
info->erase_start + starthere, lenhere))
goto _free_ret;
starthere += lenhere;
@ -1265,7 +1299,7 @@ static int read_erase_write_block(struct flashctx *const flashctx,
if (!writecount++)
msg_cdbg("W");
/* Needs the partial write function signature. */
if (flashctx->chip->write(flashctx, newcontents + starthere,
if (write_flash(flashctx, newcontents + starthere,
info->erase_start + starthere, lenhere))
goto _free_ret;
starthere += lenhere;
@ -1555,7 +1589,7 @@ static int chip_safety_check(const struct flashctx *flash, int force,
return 1;
msg_cerr("Continuing anyway.\n");
}
if (!chip->write) {
if (!lookup_write_func_ptr(chip)) {
msg_cerr("flashrom has no write function for this "
"flash chip.\n");
return 1;

View File

@ -238,6 +238,23 @@ enum probe_func {
PROBE_SPI_ST95,
};
enum write_func {
NO_WRITE_FUNC = 0, /* 0 indicates no write function set. */
WRITE_JEDEC = 1,
WRITE_JEDEC1,
WRITE_OPAQUE,
SPI_CHIP_WRITE1,
SPI_CHIP_WRITE256,
SPI_WRITE_AAI,
SPI_WRITE_AT45DB,
WRITE_28SF040,
WRITE_82802AB,
WRITE_EN29LV640B,
EDI_CHIP_WRITE,
TEST_WRITE_INJECTOR, /* special case must come last. */
};
typedef int (write_func_t)(struct flashctx *flash, const uint8_t *buf, unsigned int start, unsigned int len);
struct flashchip {
const char *vendor;
const char *name;
@ -305,7 +322,7 @@ struct flashchip {
int (*printlock) (struct flashctx *flash);
int (*unlock) (struct flashctx *flash);
int (*write) (struct flashctx *flash, const uint8_t *buf, unsigned int start, unsigned int len);
enum write_func write;
int (*read) (struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len);
struct voltage {
uint16_t min;

4
sfdp.c
View File

@ -179,11 +179,11 @@ static int sfdp_fill_flash(struct flashchip *chip, uint8_t *buf, uint16_t len)
if (tmp32 & (1 << 2)) {
msg_cdbg2("at least 64 B.\n");
chip->page_size = 64;
chip->write = spi_chip_write_256;
chip->write = SPI_CHIP_WRITE256;
} else {
msg_cdbg2("1 B only.\n");
chip->page_size = 256;
chip->write = spi_chip_write_1;
chip->write = SPI_CHIP_WRITE1;
}
if ((tmp32 & 0x3) == 0x1) {

View File

@ -146,12 +146,14 @@ static void teardown(struct flashrom_layout **layout)
io_mock_register(NULL);
}
extern write_func_t *g_test_write_injector;
static const struct flashchip chip_8MiB = {
.vendor = "aklm",
.total_size = MOCK_CHIP_SIZE / KiB,
.tested = TEST_OK_PREW,
.read = read_chip,
.write = write_chip,
.write = TEST_WRITE_INJECTOR,
.unlock = unlock_chip,
.block_erasers =
{{
@ -167,7 +169,7 @@ static const struct flashchip chip_W25Q128_V = {
.total_size = 16 * 1024,
.tested = TEST_OK_PREW,
.read = spi_chip_read,
.write = spi_chip_write_256,
.write = SPI_CHIP_WRITE256,
.unlock = spi_disable_blockprotect,
.page_size = 256,
.block_erasers =
@ -203,6 +205,7 @@ void erase_chip_test_success(void **state)
.fallback_open_state = &data,
};
g_test_write_injector = write_chip;
struct flashrom_flashctx flashctx = { 0 };
struct flashrom_layout *layout;
struct flashchip mock_chip = chip_8MiB;
@ -261,6 +264,7 @@ void read_chip_test_success(void **state)
.fallback_open_state = &data,
};
g_test_write_injector = write_chip;
struct flashrom_flashctx flashctx = { 0 };
struct flashrom_layout *layout;
struct flashchip mock_chip = chip_8MiB;
@ -332,6 +336,7 @@ void write_chip_test_success(void **state)
.fallback_open_state = &data,
};
g_test_write_injector = write_chip;
struct flashrom_flashctx flashctx = { 0 };
struct flashrom_layout *layout;
struct flashchip mock_chip = chip_8MiB;
@ -429,6 +434,7 @@ void verify_chip_test_success(void **state)
.fallback_open_state = &data,
};
g_test_write_injector = write_chip;
struct flashrom_flashctx flashctx = { 0 };
struct flashrom_layout *layout;
struct flashchip mock_chip = chip_8MiB;

View File

@ -65,7 +65,7 @@ static const struct flashchip chip_W25Q128_V = {
.total_size = 16 * 1024,
.tested = TEST_OK_PREW,
.read = spi_chip_read,
.write = spi_chip_write_256,
.write = SPI_CHIP_WRITE256,
.unlock = spi_disable_blockprotect,
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3,
.block_erasers =

View File

@ -32,7 +32,7 @@ struct flashchip mock_chip = {
.page_size = 256,
.tested = TEST_BAD_PREW,
.probe = PROBE_SPI_RDID,
.write = NULL,
.write = NO_WRITE_FUNC,
};
/*