Lines Matching refs:rgn
61 static long lmb_regions_adjacent(struct lmb_region *rgn, in lmb_regions_adjacent() argument
64 phys_addr_t base1 = rgn->region[r1].base; in lmb_regions_adjacent()
65 phys_size_t size1 = rgn->region[r1].size; in lmb_regions_adjacent()
66 phys_addr_t base2 = rgn->region[r2].base; in lmb_regions_adjacent()
67 phys_size_t size2 = rgn->region[r2].size; in lmb_regions_adjacent()
72 static void lmb_remove_region(struct lmb_region *rgn, unsigned long r) in lmb_remove_region() argument
76 for (i = r; i < rgn->cnt - 1; i++) { in lmb_remove_region()
77 rgn->region[i].base = rgn->region[i + 1].base; in lmb_remove_region()
78 rgn->region[i].size = rgn->region[i + 1].size; in lmb_remove_region()
80 rgn->cnt--; in lmb_remove_region()
84 static void lmb_coalesce_regions(struct lmb_region *rgn, in lmb_coalesce_regions() argument
87 rgn->region[r1].size += rgn->region[r2].size; in lmb_coalesce_regions()
88 lmb_remove_region(rgn, r2); in lmb_coalesce_regions()
109 static long lmb_add_region(struct lmb_region *rgn, phys_addr_t base, phys_size_t size) in lmb_add_region() argument
114 if ((rgn->cnt == 1) && (rgn->region[0].size == 0)) { in lmb_add_region()
115 rgn->region[0].base = base; in lmb_add_region()
116 rgn->region[0].size = size; in lmb_add_region()
121 for (i=0; i < rgn->cnt; i++) { in lmb_add_region()
122 phys_addr_t rgnbase = rgn->region[i].base; in lmb_add_region()
123 phys_size_t rgnsize = rgn->region[i].size; in lmb_add_region()
131 rgn->region[i].base -= size; in lmb_add_region()
132 rgn->region[i].size += size; in lmb_add_region()
137 rgn->region[i].size += size; in lmb_add_region()
143 if ((i < rgn->cnt-1) && lmb_regions_adjacent(rgn, i, i+1) ) { in lmb_add_region()
144 lmb_coalesce_regions(rgn, i, i+1); in lmb_add_region()
150 if (rgn->cnt >= MAX_LMB_REGIONS) in lmb_add_region()
154 for (i = rgn->cnt-1; i >= 0; i--) { in lmb_add_region()
155 if (base < rgn->region[i].base) { in lmb_add_region()
156 rgn->region[i+1].base = rgn->region[i].base; in lmb_add_region()
157 rgn->region[i+1].size = rgn->region[i].size; in lmb_add_region()
159 rgn->region[i+1].base = base; in lmb_add_region()
160 rgn->region[i+1].size = size; in lmb_add_region()
165 if (base < rgn->region[0].base) { in lmb_add_region()
166 rgn->region[0].base = base; in lmb_add_region()
167 rgn->region[0].size = size; in lmb_add_region()
170 rgn->cnt++; in lmb_add_region()
185 struct lmb_region *rgn = &(lmb->reserved); in lmb_free() local
193 for (i=0; i < rgn->cnt; i++) { in lmb_free()
194 rgnbegin = rgn->region[i].base; in lmb_free()
195 rgnend = rgnbegin + rgn->region[i].size; in lmb_free()
202 if (i == rgn->cnt) in lmb_free()
207 lmb_remove_region(rgn, i); in lmb_free()
213 rgn->region[i].base = end; in lmb_free()
214 rgn->region[i].size -= size; in lmb_free()
220 rgn->region[i].size -= size; in lmb_free()
228 rgn->region[i].size = base - rgn->region[i].base; in lmb_free()
229 return lmb_add_region(rgn, end, rgnend - end); in lmb_free()
239 static long lmb_overlaps_region(struct lmb_region *rgn, phys_addr_t base, in lmb_overlaps_region() argument
244 for (i=0; i < rgn->cnt; i++) { in lmb_overlaps_region()
245 phys_addr_t rgnbase = rgn->region[i].base; in lmb_overlaps_region()
246 phys_size_t rgnsize = rgn->region[i].size; in lmb_overlaps_region()
252 return (i < rgn->cnt) ? i : -1; in lmb_overlaps_region()