aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCyril Bur <cyril.bur@au1.ibm.com>2015-06-23 13:22:14 +1000
committerStewart Smith <stewart@linux.vnet.ibm.com>2015-06-23 13:38:42 +1000
commitdf307e0eecf119a26be838428311199f23e43c69 (patch)
tree057fd186de920a8b0962c244d1e49ca6659b1c02
parent29d1e6f7810982d2c8f057ae35a39c2ac0cf484b (diff)
downloadskiboot-df307e0eecf119a26be838428311199f23e43c69.zip
skiboot-df307e0eecf119a26be838428311199f23e43c69.tar.gz
skiboot-df307e0eecf119a26be838428311199f23e43c69.tar.bz2
libffs: init with ecc protection at blocklevel level
Passing a flag on libffs init will register all regions of the flash with ecc (as per the libffs partition information) as being ecc protected (or not). This saves the consumer needing to know or care about the presence of ecc. Reviewed-By: Alistair Popple <alistair@popple.id.au> Signed-off-by: Cyril Bur <cyril.bur@au1.ibm.com> Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
-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 */