cfi: Check for blank before erase
PATCH 1/2 cfi: Check for blank before erase
Added an optional check in the CFI driver to evaluate if the sector is already blank before issuing an erase command. Improves erase time by over a factor of 10 if already blank.
--- drivers/mtd/cfi_flash.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+)
drivers/mtd/cfi_flash.c +26 -0
@@ -1078,6 +1078,32 @@ int flash_erase (flash_info_t * info, int s_first, int s_last)for (sect = s_first; sect <= s_last; sect++) {if (info->protect[sect] ==0 ) {/* not protected */ +#ifdef CONFIG_SYS_FLASH_CHECK_BLANK_BEFORE_ERASE +int k; +int size; +int erased; +u32 *flash; + +/* +* Check if whole sector is erased +*/ + size =flash_sector_size (info, sect); + erased =1 ; + flash = (u32 *)info->start[sect]; +/* divide by 4 for longword access */ + size = size >>2 ; +for (k =0 ; k < size; k++) { +if (flash_read32 (flash++) !=0xffffffff ) { + erased =0 ; +break ; + } + } +if (erased) { +if (flash_verbose) +putc (',' ); +continue ; + } +#endif switch (info->vendor) {case CFI_CMDSET_INTEL_PROG_REGIONS :case CFI_CMDSET_INTEL_STANDARD :
Signature · 1 line
1.7.11.5
PATCH 2/2 cfi: Make the flash erase and write operations abortable
Check for ctrlc() in operations that take time and loop over the flash addresses.
In netconsole, tstc() is expensive. Only check once in a while to not slow down the operation significantly.
--- common/cmd_flash.c | 3 ++- common/flash.c | 3 +++ drivers/mtd/cfi_flash.c | 11 +++++++++++ include/flash.h | 1 + 4 files changed, 17 insertions(+), 1 deletion(-)
common/cmd_flash.c +2 -1
@@ -443,7 +443,8 @@ int flash_sect_erase (ulong addr_first, ulong addr_last) rcode =flash_erase (info, s_first[bank], s_last[bank]); } } -printf ("Erased %d sectors\n" , erased); +if (rcode ==0 ) +printf ("Erased %d sectors\n" , erased); }else if (rcode ==0 ) {puts ("Error: start and/or end address" " not on sector boundary\n" );
common/flash.c +3 -0
@@ -221,6 +221,9 @@ void flash_perror (int err)case ERR_PROG_ERROR :puts ("General Flash Programming Error\n" );break ; +case ERR_ABORTED : +puts ("Flash Programming Aborted\n" ); +break ;default :printf ("%s[%d] FIXME: rc=%d\n" , __FILE__, __LINE__, err);break ;
drivers/mtd/cfi_flash.c +11 -0
@@ -1077,6 +1077,11 @@ int flash_erase (flash_info_t * info, int s_first, int s_last)for (sect = s_first; sect <= s_last; sect++) { +if (ctrlc ()) { +printf ("\n" ); +return 1 ; + } +if (info->protect[sect] ==0 ) {/* not protected */ #ifdef CONFIG_SYS_FLASH_CHECK_BLANK_BEFORE_ERASE int k;
@@ -1379,6 +1384,9 @@ int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt) src += i; cnt -= i;FLASH_SHOW_PROGRESS (scale, dots, digit, i); +/* Only check every once in a while */ +if ((cnt &0xFFFF ) < buffered_size &&ctrlc ()) + return ERR_ABORTED; }#else while (cnt >= info->portwidth) {
@@ -1391,6 +1399,9 @@ int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt) wp += info->portwidth; cnt -= info->portwidth;FLASH_SHOW_PROGRESS (scale, dots, digit, info->portwidth); +/* Only check every once in a while */ +if ((cnt &0xFFFF ) < info->portwidth &&ctrlc ()) + return ERR_ABORTED; }#endif /* CONFIG_SYS_FLASH_USE_BUFFER_WRITE */
include/flash.h +1 -0
@@ -141,6 +141,7 @@ extern flash_info_t *flash_get_info(ulong base);#define ERR_UNKNOWN_FLASH_VENDOR 32#define ERR_UNKNOWN_FLASH_TYPE 64#define ERR_PROG_ERROR 128 +#define ERR_ABORTED 256/*----------------------------------------------------------------------- * Protection Flags for flash_protect():
Signature · 1 line
1.7.11.5
PATCH 2/2 cfi: Make the flash erase and write operations abortable
Quoted 7 lines · Joe Hershberger
Check for
ctrlc()in operations that take time and loop over the flash addresses.In netconsole,
tstc()is expensive. Only check once in a while to not slow down the operation significantly.Signed-off-by Joe Hershberger <[email protected]>
Applied to u-boot-cfi-flash/master.
Thanks,
Stefan
PATCH 1/2 cfi: Check for blank before erase
In reply to Joe HershbergerQuoted 5 lines · Joe Hershberger
Added an optional check in the CFI driver to evaluate if the sector is already blank before issuing an erase command. Improves erase time by over a factor of 10 if already blank.
Signed-off-by Joe Hershberger <[email protected]>
Applied to u-boot-cfi-flash/master.
Thanks,
Stefan