[PATCH v2] cmd: sf: Fix the flash_is_unlocked api size parameter

When flash erase is called with size parameter, code is checking if sectors are locked or not. But for checking, the whole device length minus offset is used instead of actual size which should be erased. That's why when only some sectors are locked it is not possible to erase unlocked sectors.
The length is calculated as "length = max_chipsize - offset", flash_is_unlocked() api is getting updated with length which is incorrect. Fix this flash_is_unlocked() api by passing the size parameter.
ZynqMP> sf erase 0 100000 len=0x8000000 which is flash size size=0x100000
We need to update the size in the flash_is_unlocked() api and not the length.
Signed-off-by: Venkatesh Yadav Abbarapu venkatesh.abbarapu@amd.com --- Changes in v2: - Updated the commit description. --- cmd/sf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/cmd/sf.c b/cmd/sf.c index 55bef2f769..977ffcb63c 100644 --- a/cmd/sf.c +++ b/cmd/sf.c @@ -366,7 +366,7 @@ static int do_spi_flash_erase(int argc, char *const argv[]) }
if (flash->flash_is_unlocked && - !flash->flash_is_unlocked(flash, offset, len)) { + !flash->flash_is_unlocked(flash, offset, size)) { printf("ERROR: flash area is locked\n"); return CMD_RET_FAILURE; }

On Tue, 19 Sept 2023 at 21:42, Venkatesh Yadav Abbarapu venkatesh.abbarapu@amd.com wrote:
When flash erase is called with size parameter, code is checking if sectors are locked or not. But for checking, the whole device length minus offset is used instead of actual size which should be erased. That's why when only some sectors are locked it is not possible to erase unlocked sectors.
The length is calculated as "length = max_chipsize - offset", flash_is_unlocked() api is getting updated with length which is incorrect. Fix this flash_is_unlocked() api by passing the size parameter.
ZynqMP> sf erase 0 100000 len=0x8000000 which is flash size size=0x100000
We need to update the size in the flash_is_unlocked() api and not the length.
Signed-off-by: Venkatesh Yadav Abbarapu venkatesh.abbarapu@amd.com
Changes in v2:
- Updated the commit description.
cmd/sf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Reviewed-by: Simon Glass sjg@chromium.org

On 9/20/23 04:54, Venkatesh Yadav Abbarapu wrote:
When flash erase is called with size parameter, code is checking if sectors are locked or not. But for checking, the whole device length minus offset is used instead of actual size which should be erased. That's why when only some sectors are locked it is not possible to erase unlocked sectors.
The length is calculated as "length = max_chipsize - offset", flash_is_unlocked() api is getting updated with length which is incorrect. Fix this flash_is_unlocked() api by passing the size parameter.
ZynqMP> sf erase 0 100000 len=0x8000000 which is flash size size=0x100000
We need to update the size in the flash_is_unlocked() api and not the length.
Signed-off-by: Venkatesh Yadav Abbarapu venkatesh.abbarapu@amd.com
Changes in v2:
- Updated the commit description.
cmd/sf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/cmd/sf.c b/cmd/sf.c index 55bef2f769..977ffcb63c 100644 --- a/cmd/sf.c +++ b/cmd/sf.c @@ -366,7 +366,7 @@ static int do_spi_flash_erase(int argc, char *const argv[]) }
if (flash->flash_is_unlocked &&
!flash->flash_is_unlocked(flash, offset, len)) {
printf("ERROR: flash area is locked\n"); return CMD_RET_FAILURE; }!flash->flash_is_unlocked(flash, offset, size)) {
Applied. M
participants (3)
-
Michal Simek
-
Simon Glass
-
Venkatesh Yadav Abbarapu