1
0
mirror of https://review.coreboot.org/flashrom.git synced 2025-04-27 15:12:36 +02:00

Use the max_data_read field of the new spi_programmer struct to simplify run_opcode

Also, explain the transformation of the read/write array/count in
ich_spi_send_command better.

Corresponding to flashrom svn r1333.

Signed-off-by: Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at>
Acked-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
This commit is contained in:
Stefan Tauner 2011-06-11 19:44:31 +00:00
parent f9a8da595d
commit b2d5f6abbc

View File

@ -922,37 +922,31 @@ static int ich9_run_opcode(OPCODE op, uint32_t offset,
static int run_opcode(OPCODE op, uint32_t offset,
uint8_t datalength, uint8_t * data)
{
switch (spi_programmer->type) {
case SPI_CONTROLLER_VIA:
if (datalength > 16) {
msg_perr("%s: Internal command size error for "
"opcode 0x%02x, got datalength=%i, want <=16\n",
__func__, op.opcode, datalength);
return SPI_INVALID_LENGTH;
}
return ich7_run_opcode(op, offset, datalength, data, 16);
case SPI_CONTROLLER_ICH7:
if (datalength > 64) {
msg_perr("%s: Internal command size error for "
"opcode 0x%02x, got datalength=%i, want <=16\n",
__func__, op.opcode, datalength);
return SPI_INVALID_LENGTH;
}
return ich7_run_opcode(op, offset, datalength, data, 64);
case SPI_CONTROLLER_ICH9:
if (datalength > 64) {
msg_perr("%s: Internal command size error for "
"opcode 0x%02x, got datalength=%i, want <=16\n",
__func__, op.opcode, datalength);
return SPI_INVALID_LENGTH;
}
return ich9_run_opcode(op, offset, datalength, data);
default:
/* max_data_read == max_data_write for all Intel/VIA SPI masters */
uint8_t maxlength = spi_programmer->max_data_read;
if (spi_programmer->type == SPI_CONTROLLER_NONE) {
msg_perr("%s: unsupported chipset\n", __func__);
return -1;
}
/* If we ever get here, something really weird happened */
return -1;
if (datalength > maxlength) {
msg_perr("%s: Internal command size error for "
"opcode 0x%02x, got datalength=%i, want <=%i\n",
__func__, op.opcode, datalength, maxlength);
return SPI_INVALID_LENGTH;
}
switch (spi_programmer->type) {
case SPI_CONTROLLER_VIA:
case SPI_CONTROLLER_ICH7:
return ich7_run_opcode(op, offset, datalength, data, maxlength);
case SPI_CONTROLLER_ICH9:
return ich9_run_opcode(op, offset, datalength, data);
default:
/* If we ever get here, something really weird happened */
return -1;
}
}
static int ich_spi_send_command(unsigned int writecnt, unsigned int readcnt,
@ -1038,7 +1032,13 @@ static int ich_spi_send_command(unsigned int writecnt, unsigned int readcnt,
}
}
/* translate read/write array/count */
/* Translate read/write array/count.
* The maximum data length is identical for the maximum read length and
* for the maximum write length excluding opcode and address. Opcode and
* address are stored in separate registers, not in the data registers
* and are thus not counted towards data length. The only exception
* applies if the opcode definition (un)intentionally classifies said
* opcode incorrectly as non-address opcode or vice versa. */
if (opcode->spi_type == SPI_OPCODE_TYPE_WRITE_NO_ADDRESS) {
data = (uint8_t *) (writearr + 1);
count = writecnt - 1;