[flashrom] Migrate towards common JEDEC functions

Carl-Daniel Hailfinger c-d.hailfinger.devel.2006 at gmx.net
Thu Nov 26 18:43:15 CET 2009


On 26.11.2009 18:05, Michael Karcher wrote:
> Use common jedec functionality where appropriate. The deleted function
> in en29f002a.c is reintroduced as write_by_byte_jedec in jedec.c as it
> contains no chip-specific instructions. It is not yet used in other
> chip drivers, as key addresses (0x2AAA/0x5555) are often specified with
> less bits. After crosschecking datasheets, most of the fixmes can
> probably be resolved as indicated in them, causing significant code
> reduction.
>
> Similar analysis should be performed for the read id stuff.
>
> Signed-off-by: flashrom at mkarcher.dialup.fu-berlin.de
>   

You forgot your name in the signoff. The common format is
Signed-off-by: Firstname Lastname <email at address>
and the email address has to be in <> angle brackets. Our commit hooks
check for that.


> Index: flash.h
> ===================================================================
> --- flash.h	(Revision 784)
> +++ flash.h	(Arbeitskopie)
> @@ -653,6 +653,7 @@
>  int probe_jedec(struct flashchip *flash);
>  int erase_chip_jedec(struct flashchip *flash);
>  int write_jedec(struct flashchip *flash, uint8_t *buf);
> +int write_by_byte_jedec(struct flashchip *flash, uint8_t *buf);
>   

Maybe call it write_jedec_1 instead? That would fit the pattern of
spi_chip_write_256 and spi_chip_write_1 used elsewhere in the code.

>  int erase_sector_jedec(struct flashchip *flash, unsigned int page, unsigned int pagesize);
>  int erase_block_jedec(struct flashchip *flash, unsigned int page, unsigned int blocksize);
>  int write_sector_jedec(chipaddr bios, uint8_t *src,
> Index: en29f002a.c
> ===================================================================
> --- en29f002a.c	(Revision 784)
> +++ en29f002a.c	(Arbeitskopie)
> @@ -87,39 +87,3 @@
>  
>  	return 0;
>  }
> -
> -/* The EN29F002 chip needs repeated single byte writing, no block writing. */
> -int write_en29f002a(struct flashchip *flash, uint8_t *buf)
>   

Did you know that replacing this with standard JEDEC is a behaviour
change? Standard JEDEC ignores write of 0xff, this function does write
0xff. If any of the chips using this function have TEST_OK_PREW, please
change it to TEST_OK_PRE. We want reports that the new version works as
well. Oh, and please note this in the changelog.


> -{
> -	int i;
> -	int total_size = flash->total_size * 1024;
> -	chipaddr bios = flash->virtual_memory;
> -	chipaddr dst = bios;
> -
> -	//chip_writeb(0xF0, bios);
> -	programmer_delay(10);
> -	if (erase_chip_jedec(flash)) {
> -		fprintf(stderr, "ERASE FAILED!\n");
> -		return -1;
> -	}
> -
> -	printf("Programming page: ");
> -	for (i = 0; i < total_size; i++) {
> -		/* write to the sector */
> -		if ((i & 0xfff) == 0)
> -			printf("address: 0x%08lx", (unsigned long)i);
> -		chip_writeb(0xAA, bios + 0x5555);
> -		chip_writeb(0x55, bios + 0x2AAA);
> -		chip_writeb(0xA0, bios + 0x5555);
> -		chip_writeb(*buf++, dst++);
> -
> -		/* wait for Toggle bit ready */
> -		toggle_ready_jedec(dst);
> -
> -		if ((i & 0xfff) == 0)
> -			printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
> -	}
> -
> -	printf("\n");
> -	return 0;
> -}
> Index: jedec.c
> ===================================================================
> --- jedec.c	(Revision 784)
> +++ jedec.c	(Arbeitskopie)
> @@ -353,3 +353,31 @@
>  
>  	return failed;
>  }
> +
> +int write_by_byte_jedec(struct flashchip *flash, uint8_t * buf)
>   

Name. Please see above.


> +{
> +	int i;
> +	int total_size = flash->total_size * 1024;
> +	chipaddr bios = flash->virtual_memory;
> +	chipaddr dst = bios;
> +
> +	programmer_delay(10);
> +	if (erase_chip_jedec(flash)) {
> +		fprintf(stderr, "ERASE FAILED!\n");
> +		return -1;
> +	}
> +
> +	printf("Programming page: ");
> +	for (i = 0; i < flash->total_size; i++) {
> +		if ((i & 0x3) == 0)
> +			printf("address: 0x%08lx", (unsigned long)i * 1024);
> +
> +                write_sector_jedec(bios, buf + i * 1024, dst + i * 1024)
> +
> +		if ((i & 0x3) == 0)
> +			printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
> +	}
> +
> +	printf("\n");
> +	return 0;
> +}
> Index: pm29f002.c
> ===================================================================
> --- pm29f002.c	(Revision 784)
> +++ pm29f002.c	(Arbeitskopie)
> @@ -20,18 +20,22 @@
>  
>  #include "flash.h"
>  
> +/* if erase_chip_jedec/write_sector_jedec is used,
> +   this is write_by_byte_jedec */
>   

Name.


>  int write_pm29f002(struct flashchip *flash, uint8_t *buf)
>  {
>  	int i, total_size = flash->total_size * 1024;
>  	chipaddr bios = flash->virtual_memory;
>  	chipaddr dst = bios;
>  
> -	/* Pm29F002T/B use the same erase method... */
> +	/* Pm29F002T/B use the same erase method...
> +	   FIXME: use erase_chip_jedec? */
>  	if (erase_29f040b(flash)) {
>   

You could run erase_flash(flash) here. erase_flash calls the standard
erase function for the chip, and this is hopefully erase_29f040b.


>  		fprintf(stderr, "ERASE FAILED!\n");
>  		return -1;
>  	}
>  
> +	/* FIXME: use write_sector_jedec? */
>  	printf("Programming page: ");
>  	for (i = 0; i < total_size; i++) {
>  		if ((i & 0xfff) == 0)
> Index: flashchips.c
> ===================================================================
> --- flashchips.c	(Revision 784)
> +++ flashchips.c	(Arbeitskopie)
> @@ -81,7 +81,7 @@
>  		.probe		= probe_jedec,
>  		.probe_timing	= TIMING_ZERO,
>  		.erase		= erase_chip_jedec,
> -		.write		= write_en29f002a,
> +		.write		= write_by_byte_jedec,
>  		.read		= read_memmapped,
>  	},
>  
> @@ -97,7 +97,7 @@
>  		.probe		= probe_jedec,
>  		.probe_timing	= TIMING_ZERO,
>  		.erase		= erase_chip_jedec,
> -		.write		= write_en29f002a,
> +		.write		= write_by_byte_jedec,
>  		.read		= read_memmapped,
>  	},
>  
> @@ -1075,7 +1075,7 @@
>  		.probe		= probe_jedec,
>  		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
>  		.erase		= erase_chip_jedec,
> -		.write		= write_en29f002a,
> +		.write		= write_by_byte_jedec,
>  		.read		= read_memmapped,
>  	},
>  
> @@ -1091,7 +1091,7 @@
>  		.probe		= probe_jedec,
>  		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
>  		.erase		= erase_chip_jedec,
> -		.write		= write_en29f002a,
> +		.write		= write_by_byte_jedec,
>  		.read		= read_memmapped,
>  	},
>  
> Index: m29f002.c
> ===================================================================
> --- m29f002.c	(Revision 784)
> +++ m29f002.c	(Arbeitskopie)
> @@ -45,6 +45,7 @@
>  	chipaddr dst = bios + start;
>  
>  	/* erase */
> +	/* FIXME: use erase_sector_jedec? */
>  	chip_writeb(0xaa, bios + 0x555);
>  	chip_writeb(0x55, bios + 0xaaa);
>  	chip_writeb(0x80, bios + 0x555);
> @@ -59,6 +60,7 @@
>  	}
>  
>  	/* program */
> +	/* FIXME: use write_sector_jedec? */
>  	while (size--) {
>  		chip_writeb(0xaa, bios + 0x555);
>  		chip_writeb(0x55, bios + 0xaaa);
> Index: am29f040b.c
> ===================================================================
> --- am29f040b.c	(Revision 784)
> +++ am29f040b.c	(Arbeitskopie)
> @@ -20,6 +20,8 @@
>  
>  #include "flash.h"
>  
> +/* FIMXE: check that the 2 second delay is really needed.
> +          Use erase_sector_jedec if not? */
>   

If the only difference is the delay, you could make this a wrapper for
erase_sector_jedec with a delay at the end.
Quite a few probe functions act as wrapper for probe_jedec.


>  static int erase_sector_29f040b(struct flashchip *flash, unsigned long address)
>  {
>  	int page_size = flash->page_size;
> @@ -44,6 +46,7 @@
>  	return 0;
>  }
>  
> +/* FIXME: use write_sector_jedec? */
>  static int write_sector_29f040b(chipaddr bios, uint8_t *src, chipaddr dst,
>  				unsigned int page_size)
>  {
> @@ -91,6 +94,7 @@
>  	return 0;
>  }
>  
> +/* FIXME: use erase_chip_jedec */
>  int erase_29f040b(struct flashchip *flash)
>  {
>  	int total_size = flash->total_size * 1024;
> Index: mx29f002.c
> ===================================================================
> --- mx29f002.c	(Revision 784)
> +++ mx29f002.c	(Arbeitskopie)
> @@ -43,6 +43,8 @@
>  	return 0;
>  }
>  
> +/* FIXME: Use erase_chip_jedec?
> + * (does not send 0xF0 (exit ID mode) and uses 0x5555/0x2AAA adresses) */
>   

Please reword that comment a bit. If the addresses are normal, don't
mention them to avoid confusion.


>  int erase_29f002(struct flashchip *flash)
>  {
>  	chipaddr bios = flash->virtual_memory;
> @@ -65,6 +67,8 @@
>  	return 0;
>  }
>  
> +/* FIXME: If erase_29f002 has been replaced by erase_chip_jedec, this
> +          function is write_by_byte_jedec */
>  int write_29f002(struct flashchip *flash, uint8_t *buf)
>  {
>  	int i;
> @@ -83,14 +87,8 @@
>  		/* write to the sector */
>  		if ((i & 0xfff) == 0)
>  			printf("address: 0x%08lx", (unsigned long)i);
> -		chip_writeb(0xAA, bios + 0x5555);
> -		chip_writeb(0x55, bios + 0x2AAA);
> -		chip_writeb(0xA0, bios + 0x5555);
> -		chip_writeb(*buf++, dst++);
> +		write_byte_program_jedec(bios, buf++, dst++);
>  
> -		/* wait for Toggle bit ready */
> -		toggle_ready_jedec(dst);
> -
>  		if ((i & 0xfff) == 0)
>  			printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
>  	}
> Index: m29f400bt.c
> ===================================================================
> --- m29f400bt.c	(Revision 784)
> +++ m29f400bt.c	(Arbeitskopie)
>   

This file needs special care. It uses 0xAAA,0x555,0xAAA instead of the
common 0x555,0xAAA,0x555 sequence. Please add that info to the various
fixme comments in the file to avoid conversion by accident.

> @@ -20,6 +20,7 @@
>  
>  #include "flash.h"
>  
> +/* FIXME: use write_sector_jedec? */
>  void write_page_m29f400bt(chipaddr bios, uint8_t *src,
>  			  chipaddr dst, int page_size)
>  {
> @@ -74,6 +75,7 @@
>  	return 0;
>  }
>  
> +/* FIXME: Use erase_chip_jedec? */
>  int erase_m29f400bt(struct flashchip *flash)
>  {
>  	chipaddr bios = flash->virtual_memory;
> @@ -96,6 +98,7 @@
>  	return 0;
>  }
>  
> +/* FIXME: Use erase_sector_jedec? */
>  int block_erase_m29f400bt(struct flashchip *flash, int start, int len)
>  {
>  	chipaddr bios = flash->virtual_memory;
>   

Overall, I think this needs one more iteration and then it can be
committed. Feel free to include Sean's Ack in your next patch. That way,
he doesn't have to ack again.

Regards,
Carl-Daniel

-- 
Developer quote of the month: 
"We are juggling too many chainsaws and flaming arrows and tigers."





More information about the flashrom mailing list