Author: hailfinger
Date: Fri Feb 12 20:37:25 2010
New Revision: 899
URL: http://flashrom.org/trac/coreboot/changeset/899

Log:
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 <[email protected]>
Acked-by: Sean Nelson <[email protected]>

Modified:
   trunk/spi.c

Modified: trunk/spi.c
==============================================================================
--- trunk/spi.c Fri Feb 12 20:35:25 2010        (r898)
+++ trunk/spi.c Fri Feb 12 20:37:25 2010        (r899)
@@ -385,17 +385,30 @@
 {
        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)

_______________________________________________
flashrom mailing list
[email protected]
http://www.flashrom.org/mailman/listinfo/flashrom

Reply via email to