diff options
author | hailfinger <hailfinger@2b7e53f0-3cfb-0310-b3e9-8179ed1497e1> | 2009-07-12 12:06:18 +0000 |
---|---|---|
committer | hailfinger <hailfinger@2b7e53f0-3cfb-0310-b3e9-8179ed1497e1> | 2009-07-12 12:06:18 +0000 |
commit | 4ae0b971bd30151458da59b73eb09a755a904d6f (patch) | |
tree | 836e46a0ba0fcd1ce41a52eddcb3437c2d08e2e5 | |
parent | e90ebab4eac1492d4ff0260f9070559940fe81ee (diff) | |
download | flashrom-4ae0b971bd30151458da59b73eb09a755a904d6f.tar.gz |
Convert SPI byte program to use the multicommand infrastructure.
Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
Tested it on Epia-m700 worked okay.
Acked-by: Jakob Bornecrantz <wallbraker@gmail.com>
Tested-by: Jakob Bornecrantz <wallbraker@gmail.com>
git-svn-id: https://code.coreboot.org/svn/flashrom/trunk@651 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
-rw-r--r-- | flash.h | 6 | ||||
-rw-r--r-- | ft2232_spi.c | 1 | ||||
-rw-r--r-- | it87spi.c | 6 | ||||
-rw-r--r-- | sb600spi.c | 5 | ||||
-rw-r--r-- | spi.c | 86 | ||||
-rw-r--r-- | wbsio_spi.c | 5 |
6 files changed, 63 insertions, 46 deletions
@@ -446,9 +446,9 @@ int spi_chip_write_256(struct flashchip *flash, uint8_t *buf); int spi_chip_read(struct flashchip *flash, uint8_t *buf, int start, int len); uint8_t spi_read_status_register(void); int spi_disable_blockprotect(void); -void spi_byte_program(int address, uint8_t byte); -int spi_nbyte_program(int address, uint8_t *bytes, int len); -int spi_nbyte_read(int address, uint8_t *bytes, int len); +int spi_byte_program(int addr, uint8_t byte); +int spi_nbyte_program(int addr, uint8_t *bytes, int len); +int spi_nbyte_read(int addr, uint8_t *bytes, int len); int spi_read_chunked(struct flashchip *flash, uint8_t *buf, int start, int len, int chunksize); int spi_aai_write(struct flashchip *flash, uint8_t *buf); uint32_t spi_get_valid_read_addr(void); diff --git a/ft2232_spi.c b/ft2232_spi.c index ea7a810..8e6e836 100644 --- a/ft2232_spi.c +++ b/ft2232_spi.c @@ -276,7 +276,6 @@ int ft2232_spi_write_256(struct flashchip *flash, uint8_t *buf) else l = total_size - i; - spi_write_enable(); if ((r = spi_nbyte_program(i, &buf[i], l))) { fprintf(stderr, "%s: write fail %d\n", __FUNCTION__, r); // spi_write_disable(); chip does this for us @@ -232,6 +232,7 @@ static int it8716f_spi_page_program(struct flashchip *flash, int block, uint8_t result = spi_write_enable(); if (result) return result; + /* FIXME: The command below seems to be redundant or wrong. */ OUTB(0x06, it8716f_flashport + 1); OUTB(((2 + (fast_spi ? 1 : 0)) << 4), it8716f_flashport); for (i = 0; i < 256; i++) { @@ -262,10 +263,7 @@ int it8716f_spi_chip_write_1(struct flashchip *flash, uint8_t *buf) spi_disable_blockprotect(); for (i = 0; i < total_size; i++) { - result = spi_write_enable(); - if (result) - return result; - spi_byte_program(i, buf[i]); + result = spi_byte_program(i, buf[i]); while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP) programmer_delay(10); } @@ -73,10 +73,7 @@ int sb600_spi_write_1(struct flashchip *flash, uint8_t *buf) printf("Programming flash"); for (i = 0; i < total_size; i++, buf++) { spi_disable_blockprotect(); - result = spi_write_enable(); - if (result) - return result; - spi_byte_program(i, *buf); + result = spi_byte_program(i, *buf); /* wait program complete. */ if (i % 0x8000 == 0) printf("."); @@ -154,21 +154,7 @@ int spi_write_enable(void) result = spi_send_command(sizeof(cmd), 0, cmd, NULL); if (result) - printf_debug("%s failed", __func__); - if (result == SPI_INVALID_OPCODE) { - switch (spi_controller) { - case SPI_CONTROLLER_ICH7: - case SPI_CONTROLLER_ICH9: - case SPI_CONTROLLER_VIA: - printf_debug(" due to SPI master limitation, ignoring" - " and hoping it will be run as PREOP\n"); - return 0; - default: - break; - } - } - if (result) - printf_debug("\n"); + printf_debug("%s failed\n", __func__); return result; } @@ -736,39 +722,80 @@ int spi_write_status_register(int status) return spi_send_command(sizeof(cmd), 0, cmd, NULL); } -void spi_byte_program(int address, uint8_t byte) +int spi_byte_program(int addr, uint8_t byte) { - const unsigned char cmd[JEDEC_BYTE_PROGRAM_OUTSIZE] = { - JEDEC_BYTE_PROGRAM, - (address >> 16) & 0xff, - (address >> 8) & 0xff, - (address >> 0) & 0xff, - byte - }; + int result; + struct spi_command spicommands[] = { + { + .writecnt = JEDEC_WREN_OUTSIZE, + .writearr = (const unsigned char[]){ JEDEC_WREN }, + .readcnt = 0, + .readarr = NULL, + }, { + .writecnt = JEDEC_BYTE_PROGRAM_OUTSIZE, + .writearr = (const unsigned char[]){ JEDEC_BYTE_PROGRAM, (addr >> 16) & 0xff, (addr >> 8) & 0xff, (addr & 0xff), byte }, + .readcnt = 0, + .readarr = NULL, + }, { + .writecnt = 0, + .writearr = NULL, + .readcnt = 0, + .readarr = NULL, + }}; - /* Send Byte-Program */ - spi_send_command(sizeof(cmd), 0, cmd, NULL); + result = spi_send_multicommand(spicommands); + if (result) { + printf_debug("%s failed during command execution\n", __func__); + return result; + } + return result; } int spi_nbyte_program(int address, uint8_t *bytes, int len) { + int result; + /* FIXME: Switch to malloc based on len unless that kills speed. */ unsigned char cmd[JEDEC_BYTE_PROGRAM_OUTSIZE - 1 + 256] = { JEDEC_BYTE_PROGRAM, (address >> 16) & 0xff, (address >> 8) & 0xff, (address >> 0) & 0xff, }; + struct spi_command spicommands[] = { + { + .writecnt = JEDEC_WREN_OUTSIZE, + .writearr = (const unsigned char[]){ JEDEC_WREN }, + .readcnt = 0, + .readarr = NULL, + }, { + .writecnt = JEDEC_BYTE_PROGRAM_OUTSIZE - 1 + len, + .writearr = cmd, + .readcnt = 0, + .readarr = NULL, + }, { + .writecnt = 0, + .writearr = NULL, + .readcnt = 0, + .readarr = NULL, + }}; + if (!len) { + printf_debug ("%s called for zero-length write\n", __func__); + return 1; + } if (len > 256) { - printf_debug ("%s called for too long a write\n", - __FUNCTION__); + printf_debug ("%s called for too long a write\n", __func__); return 1; } memcpy(&cmd[4], bytes, len); - /* Send Byte-Program */ - return spi_send_command(4 + len, 0, cmd, NULL); + result = spi_send_multicommand(spicommands); + if (result) { + printf_debug("%s failed during command execution\n", __func__); + return result; + } + return result; } int spi_disable_blockprotect(void) @@ -883,7 +910,6 @@ int spi_chip_write_1(struct flashchip *flash, uint8_t *buf) spi_disable_blockprotect(); for (i = 0; i < total_size; i++) { - spi_write_enable(); spi_byte_program(i, buf[i]); while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP) programmer_delay(10); diff --git a/wbsio_spi.c b/wbsio_spi.c index cbdddd2..7876198 100644 --- a/wbsio_spi.c +++ b/wbsio_spi.c @@ -200,11 +200,8 @@ int wbsio_spi_write_1(struct flashchip *flash, uint8_t *buf) fprintf(stderr, "ERASE FAILED!\n"); return -1; } - result = spi_write_enable(); - if (result) - return result; for (pos = 0; pos < size; pos++) { - spi_byte_program(pos, buf[pos]); + result = spi_byte_program(pos, buf[pos]); while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP) programmer_delay(10); } |