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.

Corresponding to flashrom svn r231 and coreboot v2 svn r3308.

Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
Acked-by: Peter Stuge <peter@stuge.se>
diff --git a/jedec.c b/jedec.c
index 9588751..e818294 100644
--- a/jedec.c
+++ b/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 @@
 	*(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;