[Skiboot] [PATCH v2 5/6] external/pflash: perform flashing on flash sides other than side 0
Cyril Bur
cyril.bur at au1.ibm.com
Fri May 22 16:57:55 AEST 2015
On Fri, 2015-05-22 at 12:55 +1000, Alistair Popple wrote:
> Hi,
>
> Minor comment below, but it should work fine as it is.
>
> On Thu, 14 May 2015 12:02:38 Cyril Bur wrote:
> > Currently pflash only looks at the first ffs TOC it finds in order to locate
> > an ffs partition. Problems arise when there are identical partitions in
> > both sides of the flash as it is current impossible to specify the second
> > side. This adds a parameter to specify the second side of the flash when
> > pflash does the lookup for the partition.
> >
> > Signed-off-by: Cyril Bur <cyril.bur at au1.ibm.com>
> > ---
> > external/pflash/pflash.c | 56
> > +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 51
> > insertions(+), 5 deletions(-)
> >
> > diff --git a/external/pflash/pflash.c b/external/pflash/pflash.c
> > index 3fedac0..efcf9ff 100644
> > --- a/external/pflash/pflash.c
> > +++ b/external/pflash/pflash.c
> > @@ -29,6 +29,7 @@ static bool must_confirm = true;
> > static bool dummy_run;
> > static bool need_relock;
> > static bool bmc_flash;
> > +static int flash_side = 0;
>
> In the next patch you add another global (ffs_toc) to track where the toc
> should be read from. You could simplify the code by just using flash_side to
> set ffs_toc as described below.
>
Since I sent out v3 for your comments to 6/6, I added this too.
Thanks.
> > #ifdef __powerpc__
> > static bool using_sfc;
> > #endif
> > @@ -129,7 +130,7 @@ static void print_flash_info(void)
> > print_ffs_info(0);
> > }
> >
> > -static void lookup_partition(const char *name)
> > +static int open_partition(const char *name)
> > {
> > uint32_t index;
> > int rc;
> > @@ -139,7 +140,7 @@ static void lookup_partition(const char *name)
> > rc = ffs_open_flash(fl_chip, 0, 0, &ffsh);
> > if (rc) {
> > fprintf(stderr, "Error %d opening ffs !\n", rc);
> > - exit(1);
> > + return rc;
> > }
> > }
> >
> > @@ -147,14 +148,47 @@ static void lookup_partition(const char *name)
> > rc = ffs_lookup_part(ffsh, name, &index);
> > if (rc == FFS_ERR_PART_NOT_FOUND) {
> > fprintf(stderr, "Partition '%s' not found !\n", name);
> > - exit(1);
> > + return rc;
> > }
> > if (rc) {
> > fprintf(stderr, "Error %d looking for partition '%s' !\n",
> > rc, name);
> > - exit(1);
> > + return rc;
> > }
> > +
> > ffs_index = index;
> > + return 0;
> > +}
> > +
> > +static void lookup_partition(const char *name)
> > +{
> > + int rc;
> > +
> > + if (flash_side == 1) {
> > + uint32_t other_side_offset;
> > +
> > + rc = open_partition("OTHER_SIDE");
> > + if (rc == FFS_ERR_PART_NOT_FOUND)
> > + fprintf(stderr, "side 1 was specified but there
> doesn't appear"
> > + " to be a second side to this
> flash\n");
> > + if (rc)
> > + exit(1);
> > +
> > + /* Just need to know where it starts */
> > + rc = ffs_part_info(ffsh, ffs_index, NULL, &other_side_offset,
> NULL, NULL,
> > NULL); + if (rc)
> > + exit(1);
> > +
> > + ffs_close(ffsh);
>
> Here you would set ffs_toc = other_side_offset
>
> > + rc = ffs_open_flash(fl_chip, other_side_offset, 0, &ffsh);
> > + if (rc)
> > + exit(1);
> > + }
>
> Then you could remove the above and just call it from one place (in
> open_partition) with ffs_toc.
>
> > + rc = open_partition(name);
> > + if (rc)
> > + exit(1);
> > }
> >
> > static void erase_chip(void)
> > @@ -510,6 +544,8 @@ static void print_help(const char *pname)
> > printf("\t-t, --tune\n");
> > printf("\t\tJust tune the flash controller & access size\n");
> > printf("\t\t(Implicit for all other operations)\n\n");
> > + printf("\t-S, --side\n");
> > + printf("\t\tSide of the flash on which to operate, 0 (default) or
> 1\n\n");
> > printf("\t-i, --info\n");
> > printf("\t\tDisplay some information about the flash.\n\n");
> > printf("\t-h, --help\n");
> > @@ -550,10 +586,11 @@ int main(int argc, char *argv[])
> > {"help", no_argument, NULL, 'h'},
> > {"version", no_argument, NULL, 'v'},
> > {"debug", no_argument, NULL, 'g'},
> > + {"side", required_argument, NULL, 'S'},
> > };
> > int c, oidx = 0;
> >
> > - c = getopt_long(argc, argv, "a:s:P:r:43Eep:fdihlvbtg",
> > + c = getopt_long(argc, argv, "a:s:P:r:43Eep:fdihlvbtgS:",
> > long_opts, &oidx);
> > if (c == EOF)
> > break;
> > @@ -615,6 +652,9 @@ int main(int argc, char *argv[])
> > case 'g':
> > libflash_debug = true;
> > break;
> > + case 'S':
> > + flash_side = atoi(optarg);
> > + break;
> > default:
> > exit(1);
> > }
> > @@ -682,6 +722,12 @@ int main(int argc, char *argv[])
> > exit(1);
> > }
> >
> > + /* Explicitly only support two sides */
> > + if (flash_side != 0 && flash_side != 1) {
> > + fprintf(stderr, "Unexpected value for --side '%d'\n",
> flash_side);
> > + exit(1);
> > + }
> > +
> > /* If file specified but not size, get size from file
> > */
> > if (write_file && !write_size) {
>
More information about the Skiboot
mailing list