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,
> 

Reply via email to