Re: [PATCH] EDAC: mv64x60 calculate memory size correctly

From: Chris Packham
Date: Mon Jun 05 2017 - 23:07:17 EST


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.packham@xxxxxxxxxxxxxxxxxxx>
> ---
> 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,
>