diff options
author | Edward O'Callaghan <quasisec@google.com> | 2022-09-07 12:51:16 +1000 |
---|---|---|
committer | Edward O'Callaghan <quasisec@chromium.org> | 2022-12-12 00:01:10 +0000 |
commit | 78e421bdf73d5739daa25a9f71b2c323dc98e840 (patch) | |
tree | 293a63c17096eb667bea701e332d6ed911e8d7d0 /serprog.c | |
parent | 048aab6d66c45423386d0216fd7bf445fbd1dc7f (diff) | |
download | flashrom-78e421bdf73d5739daa25a9f71b2c323dc98e840.tar.gz flashrom-78e421bdf73d5739daa25a9f71b2c323dc98e840.tar.bz2 flashrom-78e421bdf73d5739daa25a9f71b2c323dc98e840.zip |
tree/: Move programmer_delay() out of programmer state machine
Handle the special cases of both serprog and ch341a_spi.
Also rewrite programmer_delay() to handle the two base
cases of zero time and no valid flashctx yet before
handling per master branching.
Additionally, modify the custom delay function pointer
signature to allow closure over the flashctx. This allows
driver specific delay implementations to recover programmer
specific opaque data within their delay implementations.
Therefore programmer specific delay functions can avoid
programmer specific globals.
Change-Id: Id059abb58b31a066a408009073912da2b224d40c
Signed-off-by: Edward O'Callaghan <quasisec@google.com>
Reviewed-on: https://review.coreboot.org/c/flashrom/+/67393
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Anastasia Klimchuk <aklm@chromium.org>
Diffstat (limited to 'serprog.c')
-rw-r--r-- | serprog.c | 47 |
1 files changed, 25 insertions, 22 deletions
@@ -453,6 +453,8 @@ static void *serprog_map(const char *descr, uintptr_t phys_addr, size_t len) return NULL; } +static void serprog_delay(const struct flashctx *flash, unsigned int usecs); + static struct spi_master spi_master_serprog = { .map_flash_region = serprog_map, .features = SPI_MASTER_4BA, @@ -464,6 +466,7 @@ static struct spi_master spi_master_serprog = { .write_256 = default_spi_write_256, .write_aai = default_spi_write_aai, .probe_opcode = default_spi_probe_opcode, + .delay = serprog_delay, }; static int sp_check_opbuf_usage(int bytes_to_be_added) @@ -568,6 +571,27 @@ static void serprog_chip_readn(const struct flashctx *flash, uint8_t * buf, sp_do_read_n(&(buf[addrm-addr]), addrm, lenm); // FIXME: return error } +static void serprog_delay(const struct flashctx *flash, unsigned int usecs) +{ + unsigned char buf[4]; + msg_pspew("%s usecs=%d\n", __func__, usecs); + if (!sp_check_commandavail(S_CMD_O_DELAY)) { + msg_pdbg2("serprog_delay used, but programmer doesn't support delays natively - emulating\n"); + internal_delay(usecs); + return; + } + if ((sp_max_write_n) && (sp_write_n_bytes)) + sp_pass_writen(); + sp_check_opbuf_usage(5); + buf[0] = ((usecs >> 0) & 0xFF); + buf[1] = ((usecs >> 8) & 0xFF); + buf[2] = ((usecs >> 16) & 0xFF); + buf[3] = ((usecs >> 24) & 0xFF); + sp_stream_buffer_op(S_CMD_O_DELAY, 4, buf); + sp_opbuf_usage += 5; + sp_prev_was_write = 0; +} + static const struct par_master par_master_serprog = { .map_flash_region = serprog_map, .chip_readb = serprog_chip_readb, @@ -578,6 +602,7 @@ static const struct par_master par_master_serprog = { .chip_writew = fallback_chip_writew, .chip_writel = fallback_chip_writel, .chip_writen = fallback_chip_writen, + .delay = serprog_delay, }; static enum chipbustype serprog_buses_supported = BUS_NONE; @@ -941,32 +966,10 @@ init_err_cleanup_exit: return 1; } -static void serprog_delay(unsigned int usecs) -{ - unsigned char buf[4]; - msg_pspew("%s usecs=%d\n", __func__, usecs); - if (!sp_check_commandavail(S_CMD_O_DELAY)) { - msg_pdbg2("serprog_delay used, but programmer doesn't support delays natively - emulating\n"); - internal_delay(usecs); - return; - } - if ((sp_max_write_n) && (sp_write_n_bytes)) - sp_pass_writen(); - sp_check_opbuf_usage(5); - buf[0] = ((usecs >> 0) & 0xFF); - buf[1] = ((usecs >> 8) & 0xFF); - buf[2] = ((usecs >> 16) & 0xFF); - buf[3] = ((usecs >> 24) & 0xFF); - sp_stream_buffer_op(S_CMD_O_DELAY, 4, buf); - sp_opbuf_usage += 5; - sp_prev_was_write = 0; -} - const struct programmer_entry programmer_serprog = { .name = "serprog", .type = OTHER, /* FIXME */ .devs.note = "All programmer devices speaking the serprog protocol\n", .init = serprog_init, - .delay = serprog_delay, }; |