On 06/06/17 14:41, Chris Packham wrote: > The #address-cells and #size-cells properties need to be accounted for > when dealing with the "memory" device tree node. > > Signed-off-by: Chris Packham <chris.pack...@alliedtelesis.co.nz> > --- > drivers/edac/mv64x60_edac.c | 30 +++++++++++++++++++++--------- > 1 file changed, 21 insertions(+), 9 deletions(-) > > diff --git a/drivers/edac/mv64x60_edac.c b/drivers/edac/mv64x60_edac.c > index 43efb086c0b4..09abb963688f 100644 > --- a/drivers/edac/mv64x60_edac.c > +++ b/drivers/edac/mv64x60_edac.c > @@ -644,15 +644,27 @@ static irqreturn_t mv64x60_mc_isr(int irq, void *dev_id) > static void get_total_mem(struct mv64x60_mc_pdata *pdata) > { > struct device_node *np = NULL; > - const unsigned int *reg; > - > - np = of_find_node_by_type(NULL, "memory"); > - if (!np) > - return; > - > - reg = of_get_property(np, "reg", NULL); > - > - pdata->total_mem = reg[1]; > + const unsigned int *reg, *reg_end; > + int len, sw, aw; > + unsigned long start, size, total_mem = 0; > + > + for_each_node_by_type(np, "memory") { > + aw = of_n_addr_cells(np); > + sw = of_n_size_cells(np); > + reg = of_get_property(np, "reg", &len); > + reg_end = reg + (len / sizeof(u32)); > + > + total_mem = 0; > + do { > + start = of_read_number(reg, aw); > + reg += aw; > + size = of_read_number(reg, sw); > + reg += sw; > + total_mem += size; > + } while (reg < reg_end); > + } > + > + pdata->total_mem = total_mem;
Just after I sent this I realized the following is probably a better approach + struct resource res; + int ret; + unsigned long total_mem = 0; + + for_each_node_by_type(np, "memory") { + ret = of_address_to_resource(np, 0, &res); + if (ret) + continue; + + total_mem += resource_size(&res); + } + + pdata->total_mem = total_mem; I'll wait for feedback before sending a v2. > } > > static void mv64x60_init_csrows(struct mem_ctl_info *mci, >