aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/flash.c4
-rw-r--r--external/pflash/pflash.c4
-rw-r--r--libflash/libffs.c14
-rw-r--r--libflash/libffs.h2
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 */