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:
parent
10e7a0ebd7
commit
985ad5623f
1178
flashchips.c
1178
flashchips.c
File diff suppressed because it is too large
Load Diff
40
flashrom.c
40
flashrom.c
@ -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;
|
||||
|
@ -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
4
sfdp.c
@ -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) {
|
||||
|
10
tests/chip.c
10
tests/chip.c
@ -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;
|
||||
|
@ -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 =
|
||||
|
@ -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,
|
||||
};
|
||||
|
||||
/*
|
||||
|
Loading…
x
Reference in New Issue
Block a user