Carl-Daniel Hailfinger wrote: > Chris: Please try this against latest flashrom with the switch in both > positions. It supersedes all previous patches. > > Handle JEDEC JEP106W continuation codes in SPI RDID. Some vendors like > Programmable Micro Corp 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 untested support for the PMC Pm25LV family of SPI flash chips. > > Signed-off-by: Carl-Daniel Hailfinger <[EMAIL PROTECTED]> > > http://www.hailfinger.org/ > > Index: flashrom-spi_pm25/flash.h > =================================================================== > --- flashrom-spi_pm25/flash.h (Revision 3090) > +++ flashrom-spi_pm25/flash.h (Arbeitskopie) > @@ -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 > > Index: flashrom-spi_pm25/flashchips.c > =================================================================== > --- flashrom-spi_pm25/flashchips.c (Revision 3090) > +++ flashrom-spi_pm25/flashchips.c (Arbeitskopie) > @@ -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, > Index: flashrom-spi_pm25/spi.c > =================================================================== > --- flashrom-spi_pm25/spi.c (Revision 3090) > +++ flashrom-spi_pm25/spi.c (Arbeitskopie) > @@ -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) {
Works beautifully Acked-by: Chris Lingard <[EMAIL PROTECTED]> -- coreboot mailing list [email protected] http://www.coreboot.org/mailman/listinfo/coreboot

