[Skiboot] [PATCH 09/17] external/pflash: Correct erase alignment checks

Cyril Bur cyril.bur at au1.ibm.com
Fri Jul 21 16:36:00 AEST 2017


Either the user has specified sizes manually in which case pflash should
be as flexible as possible, blocklevel_smart_erase() permits this. To
prevent possible mistakes pflash will require --force to perform a
manual erase of unaligned sizes.
Alternatively they would have used -P to specify a partition, partitions
aren't necessarily erase granule aligned anymore, pflash should still
work, blocklevel_smart_erase() will handle - skip the checks in this
case.

This commit also starts using write_sizes and standard addresses to pass
to the erase code since pflash no longer needs to handle erase
alignment.

Signed-off-by: Cyril Bur <cyril.bur at au1.ibm.com>
---
 external/pflash/pflash.c | 40 +++++++++++++---------------------------
 1 file changed, 13 insertions(+), 27 deletions(-)

diff --git a/external/pflash/pflash.c b/external/pflash/pflash.c
index c0a63fca..f73ba1c5 100644
--- a/external/pflash/pflash.c
+++ b/external/pflash/pflash.c
@@ -608,7 +608,6 @@ int main(int argc, char *argv[])
 {
 	const char *pname = argv[0];
 	uint32_t address = 0, read_size = 0, write_size = 0, detail_id = UINT_MAX;
-	uint32_t erase_start = 0, erase_size = 0;
 	bool erase = false, do_clear = false;
 	bool program = false, erase_all = false, info = false, do_read = false;
 	bool enable_4B = false, disable_4B = false;
@@ -979,33 +978,20 @@ int main(int argc, char *argv[])
 			goto out;
 		}
 
-
-		/* If erasing, check partition alignment */
-		if (erase && ((pstart | pmaxsz) & 0xfff)) {
-			fprintf(stderr,"Partition not aligned properly\n");
-			goto out;
-		}
-
 		/* Set address */
 		address = pstart;
-	}
-
-	/* Align erase boundaries */
-	if (erase && !erase_all) {
-		uint32_t mask = 0xfff;
-		uint32_t erase_end;
-
-		/* Dummy size for erase, will be adjusted later */
-		if (!write_size)
-			write_size = 1;
-		erase_start = address & ~mask;
-		erase_end = ((address + write_size) + mask) & ~mask;
-		erase_size = erase_end - erase_start;
-
-		if (erase_start != address || erase_size != write_size)
-			fprintf(stderr, "WARNING: Erase region adjusted"
-				" to 0x%08x..0x%08x\n",
-				erase_start, erase_end);
+	} else if (erase) {
+		if ((address | write_size) & (fl_erase_granule - 1)) {
+			if (must_confirm) {
+				printf("ERROR: Erase at 0x%08x for 0x%08x isn't erase block aligned\n",
+						address, write_size);
+				printf("Use --force to force\n");
+				goto out;
+			} else {
+				printf("WARNING: Erase at 0x%08x for 0x%08x isn't erase block aligned\n",
+						address, write_size);
+			}
+		}
 	}
 
 	/* Process commands */
@@ -1039,7 +1025,7 @@ int main(int argc, char *argv[])
 	if (erase_all)
 		erase_chip();
 	else if (erase)
-		erase_range(erase_start, erase_size, program);
+		erase_range(address, write_size, program);
 	if (program)
 		program_file(write_file, address, write_size);
 	if (do_clear)
-- 
2.13.3



More information about the Skiboot mailing list