Lines Matching refs:rgn

66 static long lmb_regions_adjacent(struct lmb_region *rgn, unsigned long r1,  in lmb_regions_adjacent()  argument
69 phys_addr_t base1 = rgn->region[r1].base; in lmb_regions_adjacent()
70 phys_size_t size1 = rgn->region[r1].size; in lmb_regions_adjacent()
71 phys_addr_t base2 = rgn->region[r2].base; in lmb_regions_adjacent()
72 phys_size_t size2 = rgn->region[r2].size; in lmb_regions_adjacent()
77 static void lmb_remove_region(struct lmb_region *rgn, unsigned long r) in lmb_remove_region() argument
81 for (i = r; i < rgn->cnt - 1; i++) { in lmb_remove_region()
82 rgn->region[i].base = rgn->region[i + 1].base; in lmb_remove_region()
83 rgn->region[i].size = rgn->region[i + 1].size; in lmb_remove_region()
85 rgn->cnt--; in lmb_remove_region()
89 static void lmb_coalesce_regions(struct lmb_region *rgn, unsigned long r1, in lmb_coalesce_regions() argument
92 rgn->region[r1].size += rgn->region[r2].size; in lmb_coalesce_regions()
93 lmb_remove_region(rgn, r2); in lmb_coalesce_regions()
147 static long lmb_add_region(struct lmb_region *rgn, phys_addr_t base, phys_size_t size) in lmb_add_region() argument
152 if (rgn->cnt == 0) { in lmb_add_region()
153 rgn->region[0].base = base; in lmb_add_region()
154 rgn->region[0].size = size; in lmb_add_region()
155 rgn->cnt = 1; in lmb_add_region()
160 for (i = 0; i < rgn->cnt; i++) { in lmb_add_region()
161 phys_addr_t rgnbase = rgn->region[i].base; in lmb_add_region()
162 phys_size_t rgnsize = rgn->region[i].size; in lmb_add_region()
170 rgn->region[i].base -= size; in lmb_add_region()
171 rgn->region[i].size += size; in lmb_add_region()
175 rgn->region[i].size += size; in lmb_add_region()
184 if ((i < rgn->cnt - 1) && lmb_regions_adjacent(rgn, i, i + 1)) { in lmb_add_region()
185 lmb_coalesce_regions(rgn, i, i + 1); in lmb_add_region()
191 if (rgn->cnt >= rgn->max) in lmb_add_region()
195 for (i = rgn->cnt-1; i >= 0; i--) { in lmb_add_region()
196 if (base < rgn->region[i].base) { in lmb_add_region()
197 rgn->region[i + 1].base = rgn->region[i].base; in lmb_add_region()
198 rgn->region[i + 1].size = rgn->region[i].size; in lmb_add_region()
200 rgn->region[i + 1].base = base; in lmb_add_region()
201 rgn->region[i + 1].size = size; in lmb_add_region()
206 if (base < rgn->region[0].base) { in lmb_add_region()
207 rgn->region[0].base = base; in lmb_add_region()
208 rgn->region[0].size = size; in lmb_add_region()
211 rgn->cnt++; in lmb_add_region()
226 struct lmb_region *rgn = &(lmb->reserved); in lmb_free() local
234 for (i = 0; i < rgn->cnt; i++) { in lmb_free()
235 rgnbegin = rgn->region[i].base; in lmb_free()
236 rgnend = rgnbegin + rgn->region[i].size - 1; in lmb_free()
243 if (i == rgn->cnt) in lmb_free()
248 lmb_remove_region(rgn, i); in lmb_free()
254 rgn->region[i].base = end + 1; in lmb_free()
255 rgn->region[i].size -= size; in lmb_free()
261 rgn->region[i].size -= size; in lmb_free()
269 rgn->region[i].size = base - rgn->region[i].base; in lmb_free()
270 return lmb_add_region(rgn, end + 1, rgnend - end); in lmb_free()
280 static long lmb_overlaps_region(struct lmb_region *rgn, phys_addr_t base, in lmb_overlaps_region() argument
285 for (i = 0; i < rgn->cnt; i++) { in lmb_overlaps_region()
286 phys_addr_t rgnbase = rgn->region[i].base; in lmb_overlaps_region()
287 phys_size_t rgnsize = rgn->region[i].size; in lmb_overlaps_region()
292 return (i < rgn->cnt) ? i : -1; in lmb_overlaps_region()
320 long i, rgn; in __lmb_alloc_base() local
342 rgn = lmb_overlaps_region(&lmb->reserved, base, size); in __lmb_alloc_base()
343 if (rgn < 0) { in __lmb_alloc_base()
350 res_base = lmb->reserved.region[rgn].base; in __lmb_alloc_base()
365 long rgn; in lmb_alloc_addr() local
368 rgn = lmb_overlaps_region(&lmb->memory, base, size); in lmb_alloc_addr()
369 if (rgn >= 0) { in lmb_alloc_addr()
374 if (lmb_addrs_overlap(lmb->memory.region[rgn].base, in lmb_alloc_addr()
375 lmb->memory.region[rgn].size, in lmb_alloc_addr()
389 long rgn; in lmb_get_free_size() local
392 rgn = lmb_overlaps_region(&lmb->memory, addr, 1); in lmb_get_free_size()
393 if (rgn >= 0) { in lmb_get_free_size()