[Skiboot] [PATCH v2] pflash: Support for clean_on_ecc_error flag

Adriana Kobylak anoo at linux.vnet.ibm.com
Wed Dec 13 06:37:03 AEDT 2017


Add the misc flag clear_on_ecc_error to libflash/pflash. This was
the only missing flag. The generator of the virtual pnor image
relies on libflash/pflash to provide the partition information,
so all flags are needed to build an accurate virtual pnor partition
table.

Signed-off-by: Adriana Kobylak <anoo at linux.vnet.ibm.com>
---
 external/ffspart/ffspart.c                    |  3 +++
 external/pflash/pflash.c                      | 16 +++++++++-------
 external/pflash/test/files/01-info.ffs        |  1 +
 external/pflash/test/files/06-miscprint.ffs   |  1 +
 external/pflash/test/results/01-info.out      | 17 +++++++++--------
 external/pflash/test/results/06-miscprint.out |  9 +++++++++
 external/pflash/test/tests/06-miscprint       |  4 ++++
 libflash/ffs.h                                |  1 +
 libflash/libffs.c                             |  3 +--
 libflash/libffs.h                             |  1 +
 10 files changed, 39 insertions(+), 17 deletions(-)

diff --git a/external/ffspart/ffspart.c b/external/ffspart/ffspart.c
index a477018..0fe5840 100644
--- a/external/ffspart/ffspart.c
+++ b/external/ffspart/ffspart.c
@@ -298,6 +298,9 @@ int main(int argc, char *argv[])
 			case 'L':
 				user.miscflags |= FFS_MISCFLAGS_VOLATILE;
 				break;
+			case 'C':
+				user.miscflags |= FFS_MISCFLAGS_CLEARECC;
+				break;
 			/* Not sure these are valid */
 			case 'B':
 				user.miscflags |= FFS_MISCFLAGS_BACKUP;
diff --git a/external/pflash/pflash.c b/external/pflash/pflash.c
index a5e7bc3..b3ceef0 100644
--- a/external/pflash/pflash.c
+++ b/external/pflash/pflash.c
@@ -115,13 +115,14 @@ static uint32_t print_ffs_info(struct ffs_handle *ffsh, uint32_t toc)
 		    goto out;
 		}
 
-		l = asprintf(&flags, "[%c%c%c%c%c%c]",
+		l = asprintf(&flags, "[%c%c%c%c%c%c%c]",
 				has_ecc(ent) ? 'E' : '-',
 				has_flag(ent, FFS_MISCFLAGS_PRESERVED) ? 'P' : '-',
 				has_flag(ent, FFS_MISCFLAGS_READONLY) ? 'R' : '-',
 				has_flag(ent, FFS_MISCFLAGS_BACKUP) ? 'B' : '-',
 				has_flag(ent, FFS_MISCFLAGS_REPROVISION) ? 'F' : '-',
-				has_flag(ent, FFS_MISCFLAGS_VOLATILE) ? 'V' : '-');
+				has_flag(ent, FFS_MISCFLAGS_VOLATILE) ? 'V' : '-',
+				has_flag(ent, FFS_MISCFLAGS_CLEARECC) ? 'C' : '-');
 		if (l < 0)
 			goto out;
 
@@ -168,9 +169,9 @@ static void print_flash_info(struct flash_details *flash)
 	printf("Flash info:\n");
 	printf("-----------\n");
 	printf("Name          = %s\n", flash->name);
-	printf("Total size    = %" PRIu64 "MB\t Flags E:ECC, P:PRESERVED, R:READONLY\n",
-			flash->total_size >> 20);
-	printf("Erase granule = %2d%-13sB:BACKUP, F:REPROVISION, V:VOLATILE\n",
+	printf("Total size    = %" PRIu64 "MB\t Flags E:ECC, P:PRESERVED, R:READONLY, "
+			"B:BACKUP\n", flash->total_size >> 20);
+	printf("Erase granule = %2d%-13sF:REPROVISION, V:VOLATILE, C:CLEARECC\n",
 			flash->erase_granule >> 10, "KB");
 
 	if (bmc_flash)
@@ -581,13 +582,14 @@ static void print_partition_detail(struct ffs_handle *ffsh, uint32_t part_id)
 
 	printf("Flags:\n");
 
-	l = asprintf(&flags, "%s%s%s%s%s%s", has_ecc(ent) ? "ECC [E]\n" : "",
+	l = asprintf(&flags, "%s%s%s%s%s%s%s", has_ecc(ent) ? "ECC [E]\n" : "",
 			has_flag(ent, FFS_MISCFLAGS_PRESERVED) ? "PRESERVED [P]\n" : "",
 			has_flag(ent, FFS_MISCFLAGS_READONLY) ? "READONLY [R]\n" : "",
 			has_flag(ent, FFS_MISCFLAGS_BACKUP) ? "BACKUP [B]\n" : "",
 			has_flag(ent, FFS_MISCFLAGS_REPROVISION) ?
 					"REPROVISION [F]\n" : "",
-			has_flag(ent, FFS_MISCFLAGS_VOLATILE) ? "VOLATILE [V]\n" : "");
+			has_flag(ent, FFS_MISCFLAGS_VOLATILE) ? "VOLATILE [V]\n" : "",
+			has_flag(ent, FFS_MISCFLAGS_CLEARECC) ? "CLEARECC [C]\n" : "");
 	if (l < 0) {
 		fprintf(stderr, "Memory allocation failure printing flags!\n");
 		goto out;
diff --git a/external/pflash/test/files/01-info.ffs b/external/pflash/test/files/01-info.ffs
index 0992b33..9f8ccca 100644
--- a/external/pflash/test/files/01-info.ffs
+++ b/external/pflash/test/files/01-info.ffs
@@ -3,3 +3,4 @@ TWO,0x00004000,0x00001000,EF,/dev/zero
 THREE,0x00005000,0x00001000,EF,/dev/zero
 FOUR,0x00006000,0x00001000,EF,/dev/zero
 FIVE,0x00007000,0x1000,L,/dev/zero
+SIX,0x00008000,0x1000,C,/dev/zero
diff --git a/external/pflash/test/files/06-miscprint.ffs b/external/pflash/test/files/06-miscprint.ffs
index 461e408..885a6f2 100644
--- a/external/pflash/test/files/06-miscprint.ffs
+++ b/external/pflash/test/files/06-miscprint.ffs
@@ -3,3 +3,4 @@ READONLY,0x0004000,0x1000,R,/dev/zero
 REPROVISION,0x5000,0x1000,F,/dev/zero
 BACKUP,0x000006000,0x1000,B,/dev/zero
 VOLATILE,0x000007000,0x1000,L,/dev/zero
+CLEARECC,0x000008000,0x1000,C,/dev/zero
diff --git a/external/pflash/test/results/01-info.out b/external/pflash/test/results/01-info.out
index 628ddcc..204d594 100644
--- a/external/pflash/test/results/01-info.out
+++ b/external/pflash/test/results/01-info.out
@@ -1,14 +1,15 @@
 Flash info:
 -----------
 Name          = FILE
-Total size    = 0MB	 Flags E:ECC, P:PRESERVED, R:READONLY
-Erase granule =  0KB           B:BACKUP, F:REPROVISION, V:VOLATILE
+Total size    = 0MB	 Flags E:ECC, P:PRESERVED, R:READONLY, B:BACKUP
+Erase granule =  0KB           F:REPROVISION, V:VOLATILE, C:CLEARECC
 
 TOC at 0x00000000 Partitions:
 -----------
-ID=00            part 0x00000000..0x00001000 (actual=0x00001000) [------]
-ID=01             ONE 0x00003000..0x00004000 (actual=0x00001000) [E-----]
-ID=02             TWO 0x00004000..0x00005000 (actual=0x00001000) [E---F-]
-ID=03           THREE 0x00005000..0x00006000 (actual=0x00001000) [E---F-]
-ID=04            FOUR 0x00006000..0x00007000 (actual=0x00001000) [E---F-]
-ID=05            FIVE 0x00007000..0x00008000 (actual=0x00001000) [-----V]
+ID=00            part 0x00000000..0x00001000 (actual=0x00001000) [-------]
+ID=01             ONE 0x00003000..0x00004000 (actual=0x00001000) [E------]
+ID=02             TWO 0x00004000..0x00005000 (actual=0x00001000) [E---F--]
+ID=03           THREE 0x00005000..0x00006000 (actual=0x00001000) [E---F--]
+ID=04            FOUR 0x00006000..0x00007000 (actual=0x00001000) [E---F--]
+ID=05            FIVE 0x00007000..0x00008000 (actual=0x00001000) [-----V-]
+ID=06             SIX 0x00008000..0x00009000 (actual=0x00001000) [------C]
diff --git a/external/pflash/test/results/06-miscprint.out b/external/pflash/test/results/06-miscprint.out
index 9ee2af6..f28057d 100644
--- a/external/pflash/test/results/06-miscprint.out
+++ b/external/pflash/test/results/06-miscprint.out
@@ -43,3 +43,12 @@ Start       End         Actual
 
 Flags:
 VOLATILE [V]
+Detailed partition information
+Name:
+CLEARECC (ID=06)
+
+Start       End         Actual    
+0x00008000  0x00009000  0x00001000
+
+Flags:
+CLEARECC [C]
diff --git a/external/pflash/test/tests/06-miscprint b/external/pflash/test/tests/06-miscprint
index 858ab2b..2d94966 100644
--- a/external/pflash/test/tests/06-miscprint
+++ b/external/pflash/test/tests/06-miscprint
@@ -29,6 +29,10 @@ run_binary "./pflash" "--detail=5 -F $DATA_DIR/$CUR_TEST.pnor"
 if [ "$?" -ne 0 ] ; then
 	fail_test;
 fi
+run_binary "./pflash" "--detail=6 -F $DATA_DIR/$CUR_TEST.pnor"
+if [ "$?" -ne 0 ] ; then
+	fail_test;
+fi
 
 # The test infrastructure will clean up but lets no chew unnecessarily
 # though disk space
diff --git a/libflash/ffs.h b/libflash/ffs.h
index 26cb9d8..433ecac 100644
--- a/libflash/ffs.h
+++ b/libflash/ffs.h
@@ -77,6 +77,7 @@ enum ffs_type {
 #define FFS_MISCFLAGS_BACKUP 0x20
 #define FFS_MISCFLAGS_REPROVISION 0x10
 #define FFS_MISCFLAGS_VOLATILE 0x08
+#define FFS_MISCFLAGS_CLEARECC 0x04
 
 /**
  * struct __ffs_entry_user - On flash user data entries
diff --git a/libflash/libffs.c b/libflash/libffs.c
index 87c5197..57dca49 100644
--- a/libflash/libffs.c
+++ b/libflash/libffs.c
@@ -724,8 +724,7 @@ int ffs_entry_user_set(struct ffs_entry *ent, struct ffs_entry_user *user)
 		return -1;
 	if (user->miscflags & ~(FFS_MISCFLAGS_PRESERVED | FFS_MISCFLAGS_BACKUP |
 				FFS_MISCFLAGS_READONLY | FFS_MISCFLAGS_REPROVISION |
-				FFS_MISCFLAGS_VOLATILE
-))
+				FFS_MISCFLAGS_VOLATILE | FFS_MISCFLAGS_CLEARECC))
 		return -1;
 
 	memcpy(&ent->user, user, sizeof(*user));
diff --git a/libflash/libffs.h b/libflash/libffs.h
index 0610399..47a3808 100644
--- a/libflash/libffs.h
+++ b/libflash/libffs.h
@@ -89,6 +89,7 @@ struct ffs_entry_user {
 #define FFS_MISCFLAGS_BACKUP 0x20
 #define FFS_MISCFLAGS_REPROVISION 0x10
 #define FFS_MISCFLAGS_VOLATILE 0x08
+#define FFS_MISCFLAGS_CLEARECC 0x04
 
 
 bool has_ecc(struct ffs_entry *ent);
-- 
2.7.4



More information about the Skiboot mailing list