Skip to content

Commit

Permalink
libffs: Standardise ffs partition flags
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
cyrilbur-ibm authored and stewartsmith committed Apr 9, 2018
1 parent 267e653 commit 60b8ea4
Show file tree
Hide file tree
Showing 9 changed files with 122 additions and 9 deletions.
4 changes: 2 additions & 2 deletions external/ffspart/ffspart.c
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ int main(int argc, char *argv[])
case 'E':
user.datainteg |= FFS_ENRY_INTEG_ECC;
break;
case 'V':
case 'L':
user.vercheck |= FFS_VERCHECK_SHA512V;
break;
case 'I':
Expand All @@ -299,7 +299,7 @@ int main(int argc, char *argv[])
case 'F':
user.miscflags |= FFS_MISCFLAGS_REPROVISION;
break;
case 'L':
case 'V':
user.miscflags |= FFS_MISCFLAGS_VOLATILE;
break;
case 'C':
Expand Down
2 changes: 1 addition & 1 deletion external/ffspart/test/files/03-tiny-pnor.in
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
ONE,0x00400,0x00000100,EV,/dev/zero
ONE,0x00400,0x00000100,EL,/dev/zero
TWO,0x00500,0x00000100,EF,/dev/zero
THREE,0x600,0x00000100,EF,/dev/zero
FOUR,0x0700,0x00000100,EF,/dev/zero
2 changes: 1 addition & 1 deletion external/ffspart/test/files/03.1-tiny-pnor-backup.in
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
ONE,0x00400,0x100,EV,/dev/zero
ONE,0x00400,0x100,EL,/dev/zero
TWO,0x00500,0x100,EF,/dev/zero
THREE,0x600,0x100,EF,/dev/zero
FOUR,0x0700,0x100,EF,/dev/zero
2 changes: 1 addition & 1 deletion external/ffspart/test/files/04-tiny-pnor2.in
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
ONE,0x00000300,0x00000100,EV,SEDCATCH_1
ONE,0x00000300,0x00000100,EL,SEDCATCH_1
TWO,0x00000400,0x00000100,EF,SEDCATCH_2
THREE,0x00000500,0x00000100,EF,SEDCATCH_3
FOUR,0x00000600,0x00000100,EF,SEDCATCH_4
2 changes: 1 addition & 1 deletion external/pflash/test/files/06-miscprint.ffs
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@ PRESERVED,0x003000,0x1000,P,/dev/zero
READONLY,0x0004000,0x1000,R,/dev/zero
REPROVISION,0x5000,0x1000,F,/dev/zero
BACKUP,0x000006000,0x1000,B,/dev/zero
VOLATILE,0x000007000,0x1000,L,/dev/zero
VOLATILE,0x000007000,0x1000,V,/dev/zero
CLEARECC,0x000008000,0x1000,C,/dev/zero
4 changes: 2 additions & 2 deletions external/pflash/test/results/01-info.out
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ Erase granule = 0KB F:REPROVISION, V:VOLATILE, C:CLEARECC
TOC@0x00000000 Partitions:
-----------
ID=00 part 0x00000000..0x00001000 (actual=0x00001000) [-------]
ID=01 ONE 0x00003000..0x00004000 (actual=0x00001000) [E------]
ID=01 ONE 0x00003000..0x00004000 (actual=0x00001000) [E----V-]
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=05 FIVE 0x00007000..0x00008000 (actual=0x00001000) [-------]
ID=06 SIX 0x00008000..0x00009000 (actual=0x00001000) [------C]
1 change: 1 addition & 0 deletions libflash/ffs.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
107 changes: 106 additions & 1 deletion libflash/libffs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down
7 changes: 7 additions & 0 deletions libflash/libffs.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 60b8ea4

Please sign in to comment.