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 [email protected] https://ozlabs.org/mailman/listinfo/linuxppc-dev
