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 <c-d.hailfinger.devel.2006@gmx.net> Acked-by: Chris Lingard <chris@stockwith.co.uk> git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3091 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
parent
a7c92a6dc4
commit
c23b3a5732
|
@ -158,7 +158,20 @@ extern struct flashchip flashchips[];
|
||||||
/* Programmable Micro Corp is listed in JEP106W in bank 2, so it should have
|
/* Programmable Micro Corp is listed in JEP106W in bank 2, so it should have
|
||||||
* a 0x7F continuation code prefix.
|
* 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_49FL002 0x6D
|
||||||
#define PMC_49FL004 0x6E
|
#define PMC_49FL004 0x6E
|
||||||
|
|
||||||
|
|
|
@ -100,10 +100,22 @@ struct flashchip flashchips[] = {
|
||||||
probe_49lfxxxc, erase_49lfxxxc, write_49lfxxxc},
|
probe_49lfxxxc, erase_49lfxxxc, write_49lfxxxc},
|
||||||
{"SST49LF160C", SST_ID, SST_49LF160C, 2048, 4 * 1024 ,
|
{"SST49LF160C", SST_ID, SST_49LF160C, 2048, 4 * 1024 ,
|
||||||
probe_49lfxxxc, erase_49lfxxxc, write_49lfxxxc},
|
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},
|
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},
|
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,
|
{"W29C011", WINBOND_ID, W_29C011, 128, 128,
|
||||||
probe_jedec, erase_chip_jedec, write_jedec},
|
probe_jedec, erase_chip_jedec, write_jedec},
|
||||||
{"W29C040P", WINBOND_ID, W_29C040P, 512, 256,
|
{"W29C040P", WINBOND_ID, W_29C040P, 512, 256,
|
||||||
|
@ -205,6 +217,8 @@ struct flashchip flashchips[] = {
|
||||||
probe_spi, NULL, NULL},
|
probe_spi, NULL, NULL},
|
||||||
{"MX unknown SPI chip", MX_ID, GENERIC_DEVICE_ID, 0, 0,
|
{"MX unknown SPI chip", MX_ID, GENERIC_DEVICE_ID, 0, 0,
|
||||||
probe_spi, NULL, NULL},
|
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,
|
{"SST unknown SPI chip", SST_ID, GENERIC_DEVICE_ID, 0, 0,
|
||||||
probe_spi, NULL, NULL},
|
probe_spi, NULL, NULL},
|
||||||
{"ST unknown SPI chip", ST_ID, GENERIC_DEVICE_ID, 0, 0,
|
{"ST unknown SPI chip", ST_ID, GENERIC_DEVICE_ID, 0, 0,
|
||||||
|
|
|
@ -278,11 +278,17 @@ void generic_spi_write_disable()
|
||||||
int probe_spi(struct flashchip *flash)
|
int probe_spi(struct flashchip *flash)
|
||||||
{
|
{
|
||||||
unsigned char readarr[3];
|
unsigned char readarr[3];
|
||||||
uint8_t manuf_id;
|
uint32_t manuf_id;
|
||||||
uint16_t model_id;
|
uint32_t model_id;
|
||||||
if (!generic_spi_rdid(readarr)) {
|
if (!generic_spi_rdid(readarr)) {
|
||||||
|
/* 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];
|
manuf_id = readarr[0];
|
||||||
model_id = (readarr[1] << 8) | readarr[2];
|
model_id = (readarr[1] << 8) | readarr[2];
|
||||||
|
}
|
||||||
printf_debug("%s: id1 0x%x, id2 0x%x\n", __FUNCTION__, manuf_id, model_id);
|
printf_debug("%s: id1 0x%x, id2 0x%x\n", __FUNCTION__, manuf_id, model_id);
|
||||||
if (manuf_id == flash->manufacture_id &&
|
if (manuf_id == flash->manufacture_id &&
|
||||||
model_id == flash->model_id) {
|
model_id == flash->model_id) {
|
||||||
|
|
Loading…
Reference in New Issue