aboutsummaryrefslogtreecommitdiff
path: root/libflash/libffs.c
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 /libflash/libffs.c
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>
Diffstat (limited to 'libflash/libffs.c')
-rw-r--r--libflash/libffs.c14
1 files changed, 12 insertions, 2 deletions
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;