[coreboot] [PATCH] flashrom: Check the JEDEC vendor ID for correct parity

Peter Stuge peter at stuge.se
Wed May 14 13:48:35 CEST 2008


On Wed, May 14, 2008 at 06:56:20AM +0200, Carl-Daniel Hailfinger wrote:
> 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 at gmx.net>

Acked-by: Peter Stuge <peter at stuge.se>


> Index: flashrom-spijedecparity/flash.h
> ===================================================================
> --- flashrom-spijedecparity/flash.h	(Revision 3306)
> +++ flashrom-spijedecparity/flash.h	(Arbeitskopie)
> @@ -396,6 +396,7 @@
>  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);
> Index: flashrom-spijedecparity/jedec.c
> ===================================================================
> --- flashrom-spijedecparity/jedec.c	(Revision 3306)
> +++ flashrom-spijedecparity/jedec.c	(Arbeitskopie)
> @@ -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;
>  
> Index: flashrom-spijedecparity/spi.c
> ===================================================================
> --- flashrom-spijedecparity/spi.c	(Revision 3306)
> +++ flashrom-spijedecparity/spi.c	(Arbeitskopie)
> @@ -71,8 +71,12 @@
>  	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 {




More information about the coreboot mailing list