diff options
-rw-r--r-- | core/flash.c | 4 | ||||
-rw-r--r-- | external/pflash/pflash.c | 4 | ||||
-rw-r--r-- | libflash/libffs.c | 14 | ||||
-rw-r--r-- | libflash/libffs.h | 2 |
4 files changed, 17 insertions, 7 deletions
diff --git a/core/flash.c b/core/flash.c index b9c739d..f2c70e7 100644 --- a/core/flash.c +++ b/core/flash.c @@ -261,7 +261,7 @@ int flash_register(struct blocklevel_device *bl, bool is_system_flash) return OPAL_RESOURCE; } - rc = ffs_init(0, flash->size, bl, &ffs); + rc = ffs_init(0, flash->size, bl, &ffs, 0); if (rc) { prlog(PR_WARNING, "FLASH: No ffs info; " "using raw device only\n"); @@ -541,7 +541,7 @@ static int flash_load_resource(enum resource_id id, uint32_t subid, goto out_unlock; } - rc = ffs_init(0, flash->size, flash->bl, &ffs); + rc = ffs_init(0, flash->size, flash->bl, &ffs, 0); if (rc) { prerror("FLASH: Can't open ffs handle\n"); goto out_unlock; diff --git a/external/pflash/pflash.c b/external/pflash/pflash.c index ae1d873..0d2d669 100644 --- a/external/pflash/pflash.c +++ b/external/pflash/pflash.c @@ -80,7 +80,7 @@ static void print_ffs_info(uint32_t toc_offset) int rc; uint32_t i; - rc = ffs_init(toc_offset, fl_total_size, bl, &ffs_handle); + rc = ffs_init(toc_offset, fl_total_size, bl, &ffs_handle, 0); if (rc) { fprintf(stderr, "Error %d opening ffs !\n", rc); return; @@ -140,7 +140,7 @@ static int open_partition(const char *name) /* Open libffs if needed */ if (!ffsh) { - rc = ffs_init(ffs_toc, fl_total_size, bl, &ffsh); + rc = ffs_init(ffs_toc, fl_total_size, bl, &ffsh, 0); if (rc) { fprintf(stderr, "Error %d opening ffs !\n", rc); if (ffs_toc) diff --git a/libflash/libffs.c b/libflash/libffs.c index c03c56a..f4aafd8 100644 --- a/libflash/libffs.c +++ b/libflash/libffs.c @@ -73,12 +73,12 @@ static int ffs_check_convert_header(struct ffs_hdr *dst, struct ffs_hdr *src) } int ffs_init(uint32_t offset, uint32_t max_size, struct blocklevel_device *bl, - struct ffs_handle **ffs) + struct ffs_handle **ffs, int mark_ecc) { struct ffs_hdr hdr; struct ffs_handle *f; uint32_t total_size; - int rc; + int rc, i; if (!ffs || !bl) return FLASH_ERR_PARM_ERROR; @@ -140,6 +140,16 @@ int ffs_init(uint32_t offset, uint32_t max_size, struct blocklevel_device *bl, goto out; } + if (mark_ecc) { + uint32_t start, total_size; + bool ecc; + for (i = 0; i < f->hdr.entry_count; i++) { + ffs_part_info(f, i, NULL, &start, &total_size, NULL, &ecc); + if (ecc) + blocklevel_ecc_protect(bl, start, total_size); + } + } + out: if (rc == 0) *ffs = f; diff --git a/libflash/libffs.h b/libflash/libffs.h index a0040e9..ddf3793 100644 --- a/libflash/libffs.h +++ b/libflash/libffs.h @@ -38,7 +38,7 @@ struct ffs_handle; /* Init */ int ffs_init(uint32_t offset, uint32_t max_size, - struct blocklevel_device *bl, struct ffs_handle **ffs); + struct blocklevel_device *bl, struct ffs_handle **ffs, int mark_ecc); /* ffs_open_image is Linux only as it uses lseek, which skiboot does not * implement */ |