diff options
author | hailfinger <hailfinger@2b7e53f0-3cfb-0310-b3e9-8179ed1497e1> | 2010-02-12 19:37:25 +0000 |
---|---|---|
committer | hailfinger <hailfinger@2b7e53f0-3cfb-0310-b3e9-8179ed1497e1> | 2010-02-12 19:37:25 +0000 |
commit | 0d06f37b1c520d60402704e6cc9d89f890c8b7c4 (patch) | |
tree | 89298b49e35ca9af4ead9eb194ac2abdcf1020ec /spi.c | |
parent | e76549a2fd7717af1344cfdb96026fff0d470be1 (diff) | |
download | flashrom-0d06f37b1c520d60402704e6cc9d89f890c8b7c4.tar.gz |
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.
Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
Acked-by: Sean Nelson <audiohacked@gmail.com>
git-svn-id: https://code.coreboot.org/svn/flashrom/trunk@899 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
Diffstat (limited to 'spi.c')
-rw-r--r-- | spi.c | 21 |
1 files changed, 17 insertions, 4 deletions
@@ -385,17 +385,30 @@ int probe_spi_res(struct flashchip *flash) { unsigned char readarr[3]; 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. - * In that case, RES is pointless. + /* Check if RDID is usable and does not return 0xff 0xff 0xff or + * 0x00 0x00 0x00. In that case, RES is pointless. */ - if (!spi_rdid(readarr, 3) && ((readarr[0] != 0xff) || - (readarr[1] != 0xff) || (readarr[2] != 0xff))) + if (!spi_rdid(readarr, 3) && memcmp(readarr, allff, 3) && + memcmp(readarr, all00, 3)) { + msg_cdbg("Ignoring RES in favour of RDID.\n"); 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)) return 0; + /* FIXME: Handle the case where RES gives a 2-byte response. */ id2 = readarr[0]; printf_debug("%s: id 0x%x\n", __func__, id2); if (id2 != flash->model_id) |