[Skiboot] [PATCH v2] ffspart: Support flashing already ECC protected images
Stewart Smith
stewart at linux.ibm.com
Tue Dec 11 15:29:44 AEDT 2018
Samuel Mendoza-Jonas <sam at mendozajonas.com> writes:
> On Mon, 2018-12-10 at 17:48 +1100, Stewart Smith wrote:
>> We do this by assuming filenames with '.ecc' in them are already ECC
>> protected.
>>
>> This solves a practical problem in transitioning op-build to use ffspart
>> for pnor assembly rather than three perl scripts and a lot of XML.
>>
>> We also update the ffspart tests to take into account ECC requirements.
>>
>> Signed-off-by: Stewart Smith <stewart at linux.ibm.com>
>> ---
>> Changes since v1:
>> - make the test suite pass
>> ---
>> external/ffspart/ffspart.c | 16 ++++++++++++++--
>> external/ffspart/test/files/04-tiny-pnor2.out | Bin 2560 -> 2560 bytes
>> .../ffspart/test/results/07-big-files.err | 2 +-
>> external/ffspart/test/tests/04-tiny-pnor2 | 2 +-
>> external/ffspart/test/tests/08-small-files | 2 +-
>> 5 files changed, 17 insertions(+), 5 deletions(-)
>>
>> diff --git a/external/ffspart/ffspart.c b/external/ffspart/ffspart.c
>> index eeee0d4d657b..bb46a9eaf311 100644
>> --- a/external/ffspart/ffspart.c
>> +++ b/external/ffspart/ffspart.c
>> @@ -31,6 +31,7 @@
>> #include <libflash/libflash.h>
>> #include <libflash/libffs.h>
>> #include <libflash/blocklevel.h>
>> +#include <libflash/ecc.h>
>> #include <common/arch_flash.h>
>>
>> /*
>> @@ -250,6 +251,14 @@ static int parse_entry(struct blocklevel_device *bl,
>>
>> if (*line != '\0' && *(line + 1) != '\0') {
>> filename = line + 1;
>> +
>> + /*
>> + * Support flashing already ecc'd data as this is the case
>> + * for POWER8 SBE image binary.
>> + */
>> + if (has_ecc(new_entry) && !strstr(filename, ".ecc"))
>> + blocklevel_ecc_protect(bl, pbase, psize);
>
> If the entry has the ECC bit shouldn't we mark it protected regardless of
> the contents of the file?
The blocklevel_write() call will add ECC based on what's been
blocklevel_ecc_protect()ed, and we don't have a
blocklevel_write_but_i_did_ecc_already() call to bypass it... so this is
a bit of a hack I guess. I do want to remove it eventually though.
>> +
>> data_fd = open(filename, O_RDONLY);
>> if (data_fd == -1) {
>> fprintf(stderr, "Couldn't open file '%s' for '%s' partition "
>> @@ -269,9 +278,12 @@ static int parse_entry(struct blocklevel_device *bl,
>> * Sanity check that the file isn't too large for
>> * partition
>> */
>> + if (has_ecc(new_entry) && !strstr(filename, ".ecc"))
>> + psize = ecc_buffer_size_minus_ecc(psize);
>> if (pactual > psize) {
>
> I needed to stare at this for a while but I think I'm happy with it -
> checking if the size of the non-ECC file is less than the size of the
> ECC-partition less the ECC bits?
yes.
--
Stewart Smith
OPAL Architect, IBM.
More information about the Skiboot
mailing list