mirror of
https://review.coreboot.org/flashrom.git
synced 2025-04-28 07:23:43 +02:00
Ignore RES (1 byte) if chip replied to REMS (2 bytes)
SPI RES is the most unreliable way to identify chips because it only returns a 1-byte ID for most chips. For every given ID out there, probably a dozen incompatible flash chips match it. We already refuse to identify a chip with RES if that chip responds to RDID (3 bytes, good match), and with this patch we additionally refuse RES if the chip responds to REMS (2 bytes, still a good match). This increases matching accuracy a lot. Besides that, the RDID/REMS response checking has been cleaned up for better readability. Corresponding to flashrom svn r899. Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> Acked-by: Sean Nelson <audiohacked@gmail.com>
This commit is contained in:
parent
fb0828f3db
commit
e4edb067a6
21
spi.c
21
spi.c
@ -385,17 +385,30 @@ int probe_spi_res(struct flashchip *flash)
|
|||||||
{
|
{
|
||||||
unsigned char readarr[3];
|
unsigned char readarr[3];
|
||||||
uint32_t id2;
|
uint32_t id2;
|
||||||
|
const unsigned char allff[] = {0xff, 0xff, 0xff};
|
||||||
|
const unsigned char all00[] = {0x00, 0x00, 0x00};
|
||||||
|
|
||||||
/* Check if RDID was successful and did not return 0xff 0xff 0xff.
|
/* Check if RDID is usable and does not return 0xff 0xff 0xff or
|
||||||
* In that case, RES is pointless.
|
* 0x00 0x00 0x00. In that case, RES is pointless.
|
||||||
*/
|
*/
|
||||||
if (!spi_rdid(readarr, 3) && ((readarr[0] != 0xff) ||
|
if (!spi_rdid(readarr, 3) && memcmp(readarr, allff, 3) &&
|
||||||
(readarr[1] != 0xff) || (readarr[2] != 0xff)))
|
memcmp(readarr, all00, 3)) {
|
||||||
|
msg_cdbg("Ignoring RES in favour of RDID.\n");
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
/* Check if REMS is usable and does not return 0xff 0xff or
|
||||||
|
* 0x00 0x00. In that case, RES is pointless.
|
||||||
|
*/
|
||||||
|
if (!spi_rems(readarr) && memcmp(readarr, allff, JEDEC_REMS_INSIZE) &&
|
||||||
|
memcmp(readarr, all00, JEDEC_REMS_INSIZE)) {
|
||||||
|
msg_cdbg("Ignoring RES in favour of REMS.\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (spi_res(readarr))
|
if (spi_res(readarr))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
/* FIXME: Handle the case where RES gives a 2-byte response. */
|
||||||
id2 = readarr[0];
|
id2 = readarr[0];
|
||||||
printf_debug("%s: id 0x%x\n", __func__, id2);
|
printf_debug("%s: id 0x%x\n", __func__, id2);
|
||||||
if (id2 != flash->model_id)
|
if (id2 != flash->model_id)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user