mirror of
https://review.coreboot.org/flashrom.git
synced 2025-04-28 07:23:43 +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:
parent
f9a8da595d
commit
b2d5f6abbc
58
ichspi.c
58
ichspi.c
@ -922,37 +922,31 @@ static int ich9_run_opcode(OPCODE op, uint32_t offset,
|
|||||||
static int run_opcode(OPCODE op, uint32_t offset,
|
static int run_opcode(OPCODE op, uint32_t offset,
|
||||||
uint8_t datalength, uint8_t * data)
|
uint8_t datalength, uint8_t * data)
|
||||||
{
|
{
|
||||||
switch (spi_programmer->type) {
|
/* max_data_read == max_data_write for all Intel/VIA SPI masters */
|
||||||
case SPI_CONTROLLER_VIA:
|
uint8_t maxlength = spi_programmer->max_data_read;
|
||||||
if (datalength > 16) {
|
|
||||||
msg_perr("%s: Internal command size error for "
|
if (spi_programmer->type == SPI_CONTROLLER_NONE) {
|
||||||
"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:
|
|
||||||
msg_perr("%s: unsupported chipset\n", __func__);
|
msg_perr("%s: unsupported chipset\n", __func__);
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If we ever get here, something really weird happened */
|
if (datalength > maxlength) {
|
||||||
return -1;
|
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,
|
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) {
|
if (opcode->spi_type == SPI_OPCODE_TYPE_WRITE_NO_ADDRESS) {
|
||||||
data = (uint8_t *) (writearr + 1);
|
data = (uint8_t *) (writearr + 1);
|
||||||
count = writecnt - 1;
|
count = writecnt - 1;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user