From c23b3a57321dfa1b3341608074facde81aa2a8de Mon Sep 17 00:00:00 2001 From: Carl-Daniel Hailfinger Date: Wed, 6 Feb 2008 22:07:58 +0000 Subject: 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. Signed-off-by: Carl-Daniel Hailfinger Acked-by: Chris Lingard git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3091 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1 --- util/flashrom/flash.h | 15 ++++++++++++++- util/flashrom/flashchips.c | 18 ++++++++++++++++-- util/flashrom/spi.c | 14 ++++++++++---- 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/util/flashrom/flash.h b/util/flashrom/flash.h index dc30f717cf..67d276ff56 100644 --- a/util/flashrom/flash.h +++ b/util/flashrom/flash.h @@ -158,7 +158,20 @@ extern struct flashchip flashchips[]; /* 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/util/flashrom/flashchips.c b/util/flashrom/flashchips.c index 964591ff50..89a37530b6 100644 --- a/util/flashrom/flashchips.c +++ b/util/flashrom/flashchips.c @@ -100,10 +100,22 @@ struct flashchip flashchips[] = { 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 @@ struct flashchip flashchips[] = { 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/util/flashrom/spi.c b/util/flashrom/spi.c index 9313850521..a322d31ae0 100644 --- a/util/flashrom/spi.c +++ b/util/flashrom/spi.c @@ -278,11 +278,17 @@ void generic_spi_write_disable() 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) { -- cgit v1.2.3