* [U-Boot] [PATCH 1/2] cfi: Check for blank before erase @ 2012-08-17 20:36 Joe Hershberger 2012-08-17 20:36 ` [U-Boot] [PATCH 2/2] cfi: Make the flash erase and write operations abortable Joe Hershberger 2012-09-03 9:34 ` [U-Boot] [PATCH 1/2] cfi: Check for blank before erase Stefan Roese 0 siblings, 2 replies; 4+ messages in thread From: Joe Hershberger @ 2012-08-17 20:36 UTC (permalink / raw) To: u-boot 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 <joe.hershberger@ni.com> --- drivers/mtd/cfi_flash.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/drivers/mtd/cfi_flash.c b/drivers/mtd/cfi_flash.c index f0f301a..97a4fd7 100644 --- a/drivers/mtd/cfi_flash.c +++ b/drivers/mtd/cfi_flash.c @@ -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: -- 1.7.11.5 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* [U-Boot] [PATCH 2/2] cfi: Make the flash erase and write operations abortable 2012-08-17 20:36 [U-Boot] [PATCH 1/2] cfi: Check for blank before erase Joe Hershberger @ 2012-08-17 20:36 ` Joe Hershberger 2012-09-03 9:35 ` Stefan Roese 2012-09-03 9:34 ` [U-Boot] [PATCH 1/2] cfi: Check for blank before erase Stefan Roese 1 sibling, 1 reply; 4+ messages in thread From: Joe Hershberger @ 2012-08-17 20:36 UTC (permalink / raw) To: u-boot 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 <joe.hershberger@ni.com> --- 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(-) diff --git a/common/cmd_flash.c b/common/cmd_flash.c index 0e9b2e3..e55d366 100644 --- a/common/cmd_flash.c +++ b/common/cmd_flash.c @@ -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"); diff --git a/common/flash.c b/common/flash.c index 781cb9c..8244ba2 100644 --- a/common/flash.c +++ b/common/flash.c @@ -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; diff --git a/drivers/mtd/cfi_flash.c b/drivers/mtd/cfi_flash.c index 97a4fd7..43140f3 100644 --- a/drivers/mtd/cfi_flash.c +++ b/drivers/mtd/cfi_flash.c @@ -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 */ diff --git a/include/flash.h b/include/flash.h index e614d07..6d70bdd 100644 --- a/include/flash.h +++ b/include/flash.h @@ -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(): -- 1.7.11.5 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* [U-Boot] [PATCH 2/2] cfi: Make the flash erase and write operations abortable 2012-08-17 20:36 ` [U-Boot] [PATCH 2/2] cfi: Make the flash erase and write operations abortable Joe Hershberger @ 2012-09-03 9:35 ` Stefan Roese 0 siblings, 0 replies; 4+ messages in thread From: Stefan Roese @ 2012-09-03 9:35 UTC (permalink / raw) To: u-boot On 08/17/2012 10:36 PM, Joe Hershberger wrote: > 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 <joe.hershberger@ni.com> Applied to u-boot-cfi-flash/master. Thanks, Stefan ^ permalink raw reply [flat|nested] 4+ messages in thread
* [U-Boot] [PATCH 1/2] cfi: Check for blank before erase 2012-08-17 20:36 [U-Boot] [PATCH 1/2] cfi: Check for blank before erase Joe Hershberger 2012-08-17 20:36 ` [U-Boot] [PATCH 2/2] cfi: Make the flash erase and write operations abortable Joe Hershberger @ 2012-09-03 9:34 ` Stefan Roese 1 sibling, 0 replies; 4+ messages in thread From: Stefan Roese @ 2012-09-03 9:34 UTC (permalink / raw) To: u-boot On 08/17/2012 10:36 PM, Joe Hershberger wrote: > 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 <joe.hershberger@ni.com> Applied to u-boot-cfi-flash/master. Thanks, Stefan ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2012-09-03 9:35 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2012-08-17 20:36 [U-Boot] [PATCH 1/2] cfi: Check for blank before erase Joe Hershberger 2012-08-17 20:36 ` [U-Boot] [PATCH 2/2] cfi: Make the flash erase and write operations abortable Joe Hershberger 2012-09-03 9:35 ` Stefan Roese 2012-09-03 9:34 ` [U-Boot] [PATCH 1/2] cfi: Check for blank before erase Stefan Roese
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox