summaryrefslogtreecommitdiffstats
path: root/libflash
diff options
context:
space:
mode:
authorCyril Bur <cyril.bur@au1.ibm.com>2018-03-15 16:58:14 +1100
committerStewart Smith <stewart@linux.ibm.com>2018-04-09 03:45:23 -0500
commit60b8ea49c8a6249820e586f92cf65b42c5514813 (patch)
treee30d0b3fa763e23872886aec7524a3e9771a2201 /libflash
parent267e65357c2e6d98cedebe55ec4cbca95af68f13 (diff)
downloadblackbird-skiboot-60b8ea49c8a6249820e586f92cf65b42c5514813.tar.gz
blackbird-skiboot-60b8ea49c8a6249820e586f92cf65b42c5514813.zip
libffs: Standardise ffs partition flags
It seems we've developed a character respresentation for ffs partition flags. Currently only pflash really prints them so it hasn't been a problem but now ffspart wants to read them in from user input. It is important that what libffs reads and what pflash prints remain consistent, we should move the code into libffs to avoid problems. Signed-off-by: Cyril Bur <cyril.bur@au1.ibm.com> Signed-off-by: Stewart Smith <stewart@linux.ibm.com>
Diffstat (limited to 'libflash')
-rw-r--r--libflash/ffs.h1
-rw-r--r--libflash/libffs.c107
-rw-r--r--libflash/libffs.h7
3 files changed, 114 insertions, 1 deletions
diff --git a/libflash/ffs.h b/libflash/ffs.h
index 433ecac9..72ba2576 100644
--- a/libflash/ffs.h
+++ b/libflash/ffs.h
@@ -78,6 +78,7 @@ enum ffs_type {
#define FFS_MISCFLAGS_REPROVISION 0x10
#define FFS_MISCFLAGS_VOLATILE 0x08
#define FFS_MISCFLAGS_CLEARECC 0x04
+#define FFS_MISCFLAGS_GOLDEN 0x01
/**
* struct __ffs_entry_user - On flash user data entries
diff --git a/libflash/libffs.c b/libflash/libffs.c
index 57dca496..9a80a56e 100644
--- a/libflash/libffs.c
+++ b/libflash/libffs.c
@@ -188,6 +188,100 @@ static int ffs_entry_to_cpu(struct ffs_hdr *hdr,
return rc;
}
+char *ffs_entry_user_to_string(struct ffs_entry_user *user)
+{
+ char *ret;
+
+ if (!user)
+ return NULL;
+
+ ret = strdup("----------");
+ if (!ret)
+ return NULL;
+
+ if (user->datainteg & FFS_ENRY_INTEG_ECC)
+ ret[0] = 'E';
+
+ if (user->vercheck & FFS_VERCHECK_SHA512V)
+ ret[1] = 'L';
+
+ if (user->vercheck & FFS_VERCHECK_SHA512EC)
+ ret[2] = 'I';
+
+ if (user->miscflags & FFS_MISCFLAGS_PRESERVED)
+ ret[3] = 'P';
+
+ if (user->miscflags & FFS_MISCFLAGS_READONLY)
+ ret[4] = 'R';
+
+ if (user->miscflags & FFS_MISCFLAGS_BACKUP)
+ ret[5] = 'B';
+
+ if (user->miscflags & FFS_MISCFLAGS_REPROVISION)
+ ret[6] = 'F';
+
+ if (user->miscflags & FFS_MISCFLAGS_GOLDEN)
+ ret[7] = 'G';
+
+ if (user->miscflags & FFS_MISCFLAGS_CLEARECC)
+ ret[8] = 'C';
+
+ if (user->miscflags & FFS_MISCFLAGS_VOLATILE)
+ ret[9] = 'V';
+
+ return ret;
+}
+
+int ffs_string_to_entry_user(const char *flags, int nflags,
+ struct ffs_entry_user *user)
+{
+ int i;
+
+ if (!user || !flags)
+ return FLASH_ERR_PARM_ERROR;
+
+ memset(user, 0, sizeof(struct ffs_entry_user));
+ for (i = 0; i < nflags; i++) {
+ switch (flags[i]) {
+ case 'E':
+ user->datainteg |= FFS_ENRY_INTEG_ECC;
+ break;
+ case 'L':
+ user->vercheck |= FFS_VERCHECK_SHA512V;
+ break;
+ case 'I':
+ user->vercheck |= FFS_VERCHECK_SHA512EC;
+ break;
+ case 'P':
+ user->miscflags |= FFS_MISCFLAGS_PRESERVED;
+ break;
+ case 'R':
+ user->miscflags |= FFS_MISCFLAGS_READONLY;
+ break;
+ case 'B':
+ user->miscflags |= FFS_MISCFLAGS_BACKUP;
+ break;
+ case 'F':
+ user->miscflags |= FFS_MISCFLAGS_REPROVISION;
+ break;
+ case 'G':
+ user->miscflags |= FFS_MISCFLAGS_GOLDEN;
+ break;
+ case 'C':
+ user->miscflags |= FFS_MISCFLAGS_CLEARECC;
+ break;
+ case 'V':
+ user->miscflags |= FFS_MISCFLAGS_VOLATILE;
+ break;
+ default:
+ FL_DBG("Unknown flag '%c'\n", flags[i]);
+ return FLASH_ERR_PARM_ERROR;
+ }
+ }
+
+ return 0;
+}
+
bool has_flag(struct ffs_entry *ent, uint16_t flag)
{
return ((ent->user.miscflags & flag) != 0);
@@ -724,13 +818,24 @@ 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_CLEARECC))
+ FFS_MISCFLAGS_VOLATILE | FFS_MISCFLAGS_GOLDEN |
+ FFS_MISCFLAGS_CLEARECC))
return -1;
memcpy(&ent->user, user, sizeof(*user));
return 0;
}
+struct ffs_entry_user ffs_entry_user_get(struct ffs_entry *ent)
+{
+ struct ffs_entry_user user = { 0 };
+
+ if (ent)
+ memcpy(&user, &ent->user, sizeof(user));
+
+ return user;
+}
+
int ffs_entry_new(const char *name, uint32_t base, uint32_t size, struct ffs_entry **r)
{
struct ffs_entry *ret;
diff --git a/libflash/libffs.h b/libflash/libffs.h
index 47a3808d..dfdcbbc0 100644
--- a/libflash/libffs.h
+++ b/libflash/libffs.h
@@ -90,8 +90,13 @@ struct ffs_entry_user {
#define FFS_MISCFLAGS_REPROVISION 0x10
#define FFS_MISCFLAGS_VOLATILE 0x08
#define FFS_MISCFLAGS_CLEARECC 0x04
+#define FFS_MISCFLAGS_GOLDEN 0x01
+int ffs_string_to_entry_user(const char *flags, int nflags,
+ struct ffs_entry_user *user);
+char *ffs_entry_user_to_string(struct ffs_entry_user *user);
+
bool has_ecc(struct ffs_entry *ent);
bool has_flag(struct ffs_entry *ent, uint16_t flag);
@@ -146,6 +151,8 @@ int ffs_entry_user_set(struct ffs_entry *ent, struct ffs_entry_user *user);
int ffs_entry_add(struct ffs_hdr *hdr, struct ffs_entry *entry, unsigned int side);
+struct ffs_entry_user ffs_entry_user_get(struct ffs_entry *ent);
+
int ffs_hdr_create_backup(struct ffs_hdr *hdr);
int ffs_hdr_finalise(struct blocklevel_device *bl, struct ffs_hdr *hdr);
OpenPOWER on IntegriCloud