Handle JEDEC JEP106W continuation codes in SPI RDID
Some vendors like Programmable Micro Corp (PMC) need this. Both the
serial and parallel flash JEDEC detection routines would benefit from a
parity/sanity check of the vendor ID. Will do this later.
Add support for the PMC Pm25LV family of SPI flash chips.
Corresponding to flashrom svn r191 and coreboot v2 svn r3091.
Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
Acked-by: Chris Lingard <chris@stockwith.co.uk>
diff --git a/flash.h b/flash.h
index dc30f71..67d276f 100644
--- a/flash.h
+++ b/flash.h
@@ -158,7 +158,20 @@
/* Programmable Micro Corp is listed in JEP106W in bank 2, so it should have
* a 0x7F continuation code prefix.
*/
-#define PMC_ID 0x9D /* PMC */
+#define PMC_ID 0x7F9D /* PMC */
+#define PMC_ID_NOPREFIX 0x9D /* PMC, missing 0x7F prefix */
+#define PMC_25LV512 0x7B
+#define PMC_25LV010 0x7C
+#define PMC_25LV020 0x7D
+#define PMC_25LV040 0x7E
+#define PMC_25LV080B 0x13
+#define PMC_25LV016B 0x14
+#define PMC_39LV512 0x1B
+#define PMC_39F010 0x1C /* also Pm39LV010 */
+#define PMC_39LV020 0x3D
+#define PMC_39LV040 0x3E
+#define PMC_39F020 0x4D
+#define PMC_39F040 0x4E
#define PMC_49FL002 0x6D
#define PMC_49FL004 0x6E
diff --git a/flashchips.c b/flashchips.c
index 964591f..89a3753 100644
--- a/flashchips.c
+++ b/flashchips.c
@@ -100,10 +100,22 @@
probe_49lfxxxc, erase_49lfxxxc, write_49lfxxxc},
{"SST49LF160C", SST_ID, SST_49LF160C, 2048, 4 * 1024 ,
probe_49lfxxxc, erase_49lfxxxc, write_49lfxxxc},
- {"Pm49FL002", PMC_ID, PMC_49FL002, 256, 16 * 1024,
+ {"Pm49FL002", PMC_ID_NOPREFIX, PMC_49FL002, 256, 16 * 1024,
probe_jedec, erase_chip_jedec, write_49fl004},
- {"Pm49FL004", PMC_ID, PMC_49FL004, 512, 64 * 1024,
+ {"Pm49FL004", PMC_ID_NOPREFIX, PMC_49FL004, 512, 64 * 1024,
probe_jedec, erase_chip_jedec, write_49fl004},
+ {"Pm25LV512", PMC_ID, PMC_25LV512, 64, 256,
+ probe_spi, generic_spi_chip_erase_c7, generic_spi_chip_write, generic_spi_chip_read},
+ {"Pm25LV010", PMC_ID, PMC_25LV010, 128, 256,
+ probe_spi, generic_spi_chip_erase_c7, generic_spi_chip_write, generic_spi_chip_read},
+ {"Pm25LV020", PMC_ID, PMC_25LV020, 256, 256,
+ probe_spi, generic_spi_chip_erase_c7, generic_spi_chip_write, generic_spi_chip_read},
+ {"Pm25LV040", PMC_ID, PMC_25LV040, 512, 256,
+ probe_spi, generic_spi_chip_erase_c7, generic_spi_chip_write, generic_spi_chip_read},
+ {"Pm25LV080B", PMC_ID, PMC_25LV080B, 1024, 256,
+ probe_spi, generic_spi_chip_erase_c7, generic_spi_chip_write, generic_spi_chip_read},
+ {"Pm25LV016B", PMC_ID, PMC_25LV016B, 2048, 256,
+ probe_spi, generic_spi_chip_erase_c7, generic_spi_chip_write, generic_spi_chip_read},
{"W29C011", WINBOND_ID, W_29C011, 128, 128,
probe_jedec, erase_chip_jedec, write_jedec},
{"W29C040P", WINBOND_ID, W_29C040P, 512, 256,
@@ -205,6 +217,8 @@
probe_spi, NULL, NULL},
{"MX unknown SPI chip", MX_ID, GENERIC_DEVICE_ID, 0, 0,
probe_spi, NULL, NULL},
+ {"PMC unknown SPI chip", PMC_ID, GENERIC_DEVICE_ID, 0, 0,
+ probe_spi, NULL, NULL},
{"SST unknown SPI chip", SST_ID, GENERIC_DEVICE_ID, 0, 0,
probe_spi, NULL, NULL},
{"ST unknown SPI chip", ST_ID, GENERIC_DEVICE_ID, 0, 0,
diff --git a/spi.c b/spi.c
index 9313850..a322d31 100644
--- a/spi.c
+++ b/spi.c
@@ -278,11 +278,17 @@
int probe_spi(struct flashchip *flash)
{
unsigned char readarr[3];
- uint8_t manuf_id;
- uint16_t model_id;
+ uint32_t manuf_id;
+ uint32_t model_id;
if (!generic_spi_rdid(readarr)) {
- manuf_id = readarr[0];
- model_id = (readarr[1] << 8) | readarr[2];
+ /* Check if this is a continuation vendor ID */
+ if (readarr[0] == 0x7f) {
+ manuf_id = (readarr[0] << 8) | readarr[1];
+ model_id = readarr[2];
+ } else {
+ manuf_id = readarr[0];
+ model_id = (readarr[1] << 8) | readarr[2];
+ }
printf_debug("%s: id1 0x%x, id2 0x%x\n", __FUNCTION__, manuf_id, model_id);
if (manuf_id == flash->manufacture_id &&
model_id == flash->model_id) {