Hello Chandru,

 static int __init early_init_dt_scan_drconf_memory(unsigned long node)
 {
-       cell_t *dm, *ls;
+       cell_t *dm, *ls, *endp, *usm;
        unsigned long l, n, flags;
        u64 base, size, lmb_size;
+       char buf[32], t[8];
ls = (cell_t *)of_get_flat_dt_prop(node, "ibm,lmb-size", &l);
        if (ls == NULL || l < dt_root_size_cells * sizeof(cell_t))
@@ -917,7 +918,33 @@ static int __init early_init_dt_scan_drc
                        if ((base + size) > 0x80000000ul)
                                size = 0x80000000ul - base;
                }
-               lmb_add(base, size);
+               strcpy(buf, "linux,usable-memory");
+               sprintf(t, "%d", (int)n);
+               strcat(buf, t);
+               usm = (cell_t *)of_get_flat_dt_prop(node,
+                                                (const char *)buf, &l);
+               if (usm != NULL) {
+                       endp = usm + (l / sizeof(cell_t));
+                       while ((endp - usm) >= (dt_root_addr_cells +
+                                                dt_root_size_cells)) {
+                               base = dt_mem_next_cell(dt_root_addr_cells,
+                                                                &usm);
+                               size = dt_mem_next_cell(dt_root_size_cells,
+                                                                &usm);
+                               if (size == 0)
+                                       continue;
+                               if (iommu_is_off) {
+                                       if ((base + size) > 0x80000000ul)
+                                               size = 0x80000000ul - base;
+                               }
+                               lmb_add(base, size);
+                       }
+
+                       /* Continue with next lmb entry */
+                       continue;
+               } else {
+                       lmb_add(base, size);
+               }
        }

I am still digging through the kexec tools but I don't think you want
the processing of the linux,usable-memory property inside of the
for (; n!= 0; --n) loop.  This should be moved up so that it looks for
the linux,usable-memory property and parses it, then if it is not found
look for the ibm,dynamic-reconfiguration-memory property and parse it.

There is no need to look for the linux-usable-memory property every time
a piece of the ibm,dynamic-reconfiguration-memory property is parsed.

-Nathan
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev

Reply via email to