/* This routine called with relocation disabled. */ static long lmb_add_region(struct lmb_region *rgn, u64 base, u64 size) { u64 i, coalesced = 0; long adjacent; /* First try and coalesce this LMB with another. */ for (i=0; i < rgn->cnt; i++) { u64 rgnbase = rgn->region[i].base; u64 rgnsize = rgn->region[i].size; adjacent = lmb_addrs_adjacent(base,size,rgnbase,rgnsize); if ( adjacent > 0 ) { rgn->region[i].base -= size; rgn->region[i].physbase -= size; rgn->region[i].size += size; coalesced++; break; } else if ( adjacent < 0 ) { rgn->region[i].size += size; coalesced++; break; } } if ((i < rgn->cnt-1) && lmb_regions_adjacent(rgn, i, i+1) ) { lmb_coalesce_regions(rgn, i, i+1); coalesced++; } if ( coalesced ) { return coalesced; } else if ( rgn->cnt >= MAX_LMB_REGIONS ) { return -1; } /* Couldn't coalesce the LMB, so add it to the sorted table. */ for (i=rgn->cnt-1; i >= 0; i--) { if (base < rgn->region[i].base) { rgn->region[i+1].base = rgn->region[i].base; rgn->region[i+1].physbase = rgn->region[i].physbase; rgn->region[i+1].size = rgn->region[i].size; } else { rgn->region[i+1].base = base; rgn->region[i+1].physbase = lmb_abs_to_phys(base); rgn->region[i+1].size = size; break; } } rgn->cnt++; return 0; }
/* This routine called with relocation disabled. */ static long __init lmb_add_region(struct lmb_region *rgn, unsigned long base, unsigned long size) { unsigned long coalesced = 0; long adjacent, i; /* First try and coalesce this LMB with another. */ for (i=0; i < rgn->cnt; i++) { unsigned long rgnbase = rgn->region[i].base; unsigned long rgnsize = rgn->region[i].size; if ((rgnbase == base) && (rgnsize == size)) /* Already have this region, so we're done */ return 0; adjacent = lmb_addrs_adjacent(base,size,rgnbase,rgnsize); if ( adjacent > 0 ) { rgn->region[i].base -= size; rgn->region[i].size += size; coalesced++; break; } else if ( adjacent < 0 ) { rgn->region[i].size += size; coalesced++; break; } } if ((i < rgn->cnt-1) && lmb_regions_adjacent(rgn, i, i+1) ) { lmb_coalesce_regions(rgn, i, i+1); coalesced++; } if (coalesced) return coalesced; if (rgn->cnt >= MAX_LMB_REGIONS) return -1; /* Couldn't coalesce the LMB, so add it to the sorted table. */ for (i = rgn->cnt-1; i >= 0; i--) { if (base < rgn->region[i].base) { rgn->region[i+1].base = rgn->region[i].base; rgn->region[i+1].size = rgn->region[i].size; } else { rgn->region[i+1].base = base; rgn->region[i+1].size = size; break; } } rgn->cnt++; return 0; }