summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>2008-05-14 12:03:06 +0000
committerCarl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>2008-05-14 12:03:06 +0000
commit68db3a2bdc335519003c7f18ead043d7507718aa (patch)
tree581d02c85a09d3370291069b9fb0f393fee1f0a3
parentb69e46bca3ee8e25ee45ba04ff812e507fccb0fc (diff)
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
-rw-r--r--util/flashrom/flash.h1
-rw-r--r--util/flashrom/jedec.c13
-rw-r--r--util/flashrom/spi.c4
3 files changed, 17 insertions, 1 deletions
diff --git a/util/flashrom/flash.h b/util/flashrom/flash.h
index 67f49c6932..37d7dc0caf 100644
--- a/util/flashrom/flash.h
+++ b/util/flashrom/flash.h
@@ -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);
/* jedec.c */
+uint8_t oddparity(uint8_t val);
void toggle_ready_jedec(volatile uint8_t *dst);
void data_polling_jedec(volatile uint8_t *dst, uint8_t data);
void unprotect_jedec(volatile uint8_t *bios);
diff --git a/util/flashrom/jedec.c b/util/flashrom/jedec.c
index 958875194a..e818294f0e 100644
--- a/util/flashrom/jedec.c
+++ b/util/flashrom/jedec.c
@@ -27,6 +27,14 @@
#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)
{
unsigned int i = 0;
@@ -123,7 +131,10 @@ int probe_jedec(struct flashchip *flash)
*(volatile uint8_t *)(bios + 0x5555) = 0xF0;
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)
return 1;
diff --git a/util/flashrom/spi.c b/util/flashrom/spi.c
index 5cfc052103..786d555ee9 100644
--- a/util/flashrom/spi.c
+++ b/util/flashrom/spi.c
@@ -71,8 +71,12 @@ int probe_spi(struct flashchip *flash)
uint32_t manuf_id;
uint32_t model_id;
if (!spi_rdid(readarr)) {
+ if (!oddparity(readarr[0]))
+ printf_debug("RDID byte 0 parity violation.\n");
/* Check if this is a continuation vendor ID */
if (readarr[0] == 0x7f) {
+ if (!oddparity(readarr[1]))
+ printf_debug("RDID byte 1 parity violation.\n");
manuf_id = (readarr[0] << 8) | readarr[1];
model_id = readarr[2];
} else {