android: persistent_ram: Allow specifying ecc parameters in platform data
Change-Id: If5aaa968f6ce85ac8e18f07cca286f20f0aa6e58 Signed-off-by: Arve Hjønnevåg <arve@android.com>
This commit is contained in:
@@ -190,7 +190,7 @@ static void persistent_ram_ecc_old(struct persistent_ram_zone *prz)
|
||||
}
|
||||
|
||||
static int persistent_ram_init_ecc(struct persistent_ram_zone *prz,
|
||||
size_t buffer_size)
|
||||
size_t buffer_size, struct persistent_ram *ram)
|
||||
{
|
||||
int numerr;
|
||||
struct persistent_ram_buffer *buffer = prz->buffer;
|
||||
@@ -199,10 +199,10 @@ static int persistent_ram_init_ecc(struct persistent_ram_zone *prz,
|
||||
if (!prz->ecc)
|
||||
return 0;
|
||||
|
||||
prz->ecc_block_size = 128;
|
||||
prz->ecc_size = 16;
|
||||
prz->ecc_symsize = 8;
|
||||
prz->ecc_poly = 0x11d;
|
||||
prz->ecc_block_size = ram->ecc_block_size ?: 128;
|
||||
prz->ecc_size = ram->ecc_size ?: 16;
|
||||
prz->ecc_symsize = ram->ecc_symsize ?: 8;
|
||||
prz->ecc_poly = ram->ecc_poly ?: 0x11d;
|
||||
|
||||
ecc_blocks = DIV_ROUND_UP(prz->buffer_size - prz->ecc_size,
|
||||
prz->ecc_block_size + prz->ecc_size);
|
||||
@@ -375,7 +375,7 @@ static int persistent_ram_buffer_map(phys_addr_t start, phys_addr_t size,
|
||||
}
|
||||
|
||||
static int __devinit persistent_ram_buffer_init(const char *name,
|
||||
struct persistent_ram_zone *prz)
|
||||
struct persistent_ram_zone *prz, struct persistent_ram **ramp)
|
||||
{
|
||||
int i;
|
||||
struct persistent_ram *ram;
|
||||
@@ -386,9 +386,11 @@ static int __devinit persistent_ram_buffer_init(const char *name,
|
||||
start = ram->start;
|
||||
for (i = 0; i < ram->num_descs; i++) {
|
||||
desc = &ram->descs[i];
|
||||
if (!strcmp(desc->name, name))
|
||||
if (!strcmp(desc->name, name)) {
|
||||
*ramp = ram;
|
||||
return persistent_ram_buffer_map(start,
|
||||
desc->size, prz);
|
||||
}
|
||||
start += desc->size;
|
||||
}
|
||||
}
|
||||
@@ -399,6 +401,7 @@ static int __devinit persistent_ram_buffer_init(const char *name,
|
||||
static __devinit
|
||||
struct persistent_ram_zone *__persistent_ram_init(struct device *dev, bool ecc)
|
||||
{
|
||||
struct persistent_ram *ram;
|
||||
struct persistent_ram_zone *prz;
|
||||
int ret = -ENOMEM;
|
||||
|
||||
@@ -410,14 +413,14 @@ struct persistent_ram_zone *__persistent_ram_init(struct device *dev, bool ecc)
|
||||
|
||||
INIT_LIST_HEAD(&prz->node);
|
||||
|
||||
ret = persistent_ram_buffer_init(dev_name(dev), prz);
|
||||
ret = persistent_ram_buffer_init(dev_name(dev), prz, &ram);
|
||||
if (ret) {
|
||||
pr_err("persistent_ram: failed to initialize buffer\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
prz->ecc = ecc;
|
||||
ret = persistent_ram_init_ecc(prz, prz->buffer_size);
|
||||
ret = persistent_ram_init_ecc(prz, prz->buffer_size, ram);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
|
||||
@@ -31,6 +31,11 @@ struct persistent_ram {
|
||||
phys_addr_t start;
|
||||
phys_addr_t size;
|
||||
|
||||
int ecc_block_size;
|
||||
int ecc_size;
|
||||
int ecc_symsize;
|
||||
int ecc_poly;
|
||||
|
||||
int num_descs;
|
||||
struct persistent_ram_descriptor *descs;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user