Check the JEDEC vendor ID for correct parity. Flash chips which can be
detected by JEDEC probe routines all have vendor IDs with correct parity. Use a parity check as additional hint whether a vendor ID makes sense. Note: Device IDs have no parity requirements whatsoever. Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> Acked-by: Peter Stuge <peter@stuge.se> git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3308 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
parent
b69e46bca3
commit
68db3a2bdc
|
@ -396,6 +396,7 @@ int it8716f_spi_chip_write(struct flashchip *flash, uint8_t *buf);
|
||||||
void it8716f_spi_page_program(int block, uint8_t *buf, uint8_t *bios);
|
void it8716f_spi_page_program(int block, uint8_t *buf, uint8_t *bios);
|
||||||
|
|
||||||
/* jedec.c */
|
/* jedec.c */
|
||||||
|
uint8_t oddparity(uint8_t val);
|
||||||
void toggle_ready_jedec(volatile uint8_t *dst);
|
void toggle_ready_jedec(volatile uint8_t *dst);
|
||||||
void data_polling_jedec(volatile uint8_t *dst, uint8_t data);
|
void data_polling_jedec(volatile uint8_t *dst, uint8_t data);
|
||||||
void unprotect_jedec(volatile uint8_t *bios);
|
void unprotect_jedec(volatile uint8_t *bios);
|
||||||
|
|
|
@ -27,6 +27,14 @@
|
||||||
|
|
||||||
#define MAX_REFLASH_TRIES 0x10
|
#define MAX_REFLASH_TRIES 0x10
|
||||||
|
|
||||||
|
/* Check one byte for odd parity */
|
||||||
|
uint8_t oddparity(uint8_t val)
|
||||||
|
{
|
||||||
|
val = (val ^ (val >> 4)) & 0xf;
|
||||||
|
val = (val ^ (val >> 2)) & 0x3;
|
||||||
|
return (val ^ (val >> 1)) & 0x1;
|
||||||
|
}
|
||||||
|
|
||||||
void toggle_ready_jedec(volatile uint8_t *dst)
|
void toggle_ready_jedec(volatile uint8_t *dst)
|
||||||
{
|
{
|
||||||
unsigned int i = 0;
|
unsigned int i = 0;
|
||||||
|
@ -123,7 +131,10 @@ int probe_jedec(struct flashchip *flash)
|
||||||
*(volatile uint8_t *)(bios + 0x5555) = 0xF0;
|
*(volatile uint8_t *)(bios + 0x5555) = 0xF0;
|
||||||
myusec_delay(40);
|
myusec_delay(40);
|
||||||
|
|
||||||
printf_debug("%s: id1 0x%x, id2 0x%x\n", __FUNCTION__, largeid1, largeid2);
|
printf_debug("%s: id1 0x%x, id2 0x%x", __FUNCTION__, largeid1, largeid2);
|
||||||
|
if (!oddparity(id1))
|
||||||
|
printf_debug(", id1 parity violation");
|
||||||
|
printf_debug("\n");
|
||||||
if (largeid1 == flash->manufacture_id && largeid2 == flash->model_id)
|
if (largeid1 == flash->manufacture_id && largeid2 == flash->model_id)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
|
|
@ -71,8 +71,12 @@ int probe_spi(struct flashchip *flash)
|
||||||
uint32_t manuf_id;
|
uint32_t manuf_id;
|
||||||
uint32_t model_id;
|
uint32_t model_id;
|
||||||
if (!spi_rdid(readarr)) {
|
if (!spi_rdid(readarr)) {
|
||||||
|
if (!oddparity(readarr[0]))
|
||||||
|
printf_debug("RDID byte 0 parity violation.\n");
|
||||||
/* Check if this is a continuation vendor ID */
|
/* Check if this is a continuation vendor ID */
|
||||||
if (readarr[0] == 0x7f) {
|
if (readarr[0] == 0x7f) {
|
||||||
|
if (!oddparity(readarr[1]))
|
||||||
|
printf_debug("RDID byte 1 parity violation.\n");
|
||||||
manuf_id = (readarr[0] << 8) | readarr[1];
|
manuf_id = (readarr[0] << 8) | readarr[1];
|
||||||
model_id = readarr[2];
|
model_id = readarr[2];
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue