[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