Lines Matching refs:rgn

60 static long lmb_regions_adjacent(struct lmb_region *rgn,  in lmb_regions_adjacent()  argument
63 phys_addr_t base1 = rgn->region[r1].base; in lmb_regions_adjacent()
64 phys_size_t size1 = rgn->region[r1].size; in lmb_regions_adjacent()
65 phys_addr_t base2 = rgn->region[r2].base; in lmb_regions_adjacent()
66 phys_size_t size2 = rgn->region[r2].size; in lmb_regions_adjacent()
71 static void lmb_remove_region(struct lmb_region *rgn, unsigned long r) in lmb_remove_region() argument
75 for (i = r; i < rgn->cnt - 1; i++) { in lmb_remove_region()
76 rgn->region[i].base = rgn->region[i + 1].base; in lmb_remove_region()
77 rgn->region[i].size = rgn->region[i + 1].size; in lmb_remove_region()
79 rgn->cnt--; in lmb_remove_region()
83 static void lmb_coalesce_regions(struct lmb_region *rgn, in lmb_coalesce_regions() argument
86 rgn->region[r1].size += rgn->region[r2].size; in lmb_coalesce_regions()
87 lmb_remove_region(rgn, r2); in lmb_coalesce_regions()
108 static long lmb_add_region(struct lmb_region *rgn, phys_addr_t base, phys_size_t size) in lmb_add_region() argument
113 if ((rgn->cnt == 1) && (rgn->region[0].size == 0)) { in lmb_add_region()
114 rgn->region[0].base = base; in lmb_add_region()
115 rgn->region[0].size = size; in lmb_add_region()
120 for (i=0; i < rgn->cnt; i++) { in lmb_add_region()
121 phys_addr_t rgnbase = rgn->region[i].base; in lmb_add_region()
122 phys_size_t rgnsize = rgn->region[i].size; in lmb_add_region()
130 rgn->region[i].base -= size; in lmb_add_region()
131 rgn->region[i].size += size; in lmb_add_region()
136 rgn->region[i].size += size; in lmb_add_region()
142 if ((i < rgn->cnt-1) && lmb_regions_adjacent(rgn, i, i+1) ) { in lmb_add_region()
143 lmb_coalesce_regions(rgn, i, i+1); in lmb_add_region()
149 if (rgn->cnt >= MAX_LMB_REGIONS) in lmb_add_region()
153 for (i = rgn->cnt-1; i >= 0; i--) { in lmb_add_region()
154 if (base < rgn->region[i].base) { in lmb_add_region()
155 rgn->region[i+1].base = rgn->region[i].base; in lmb_add_region()
156 rgn->region[i+1].size = rgn->region[i].size; in lmb_add_region()
158 rgn->region[i+1].base = base; in lmb_add_region()
159 rgn->region[i+1].size = size; in lmb_add_region()
164 if (base < rgn->region[0].base) { in lmb_add_region()
165 rgn->region[0].base = base; in lmb_add_region()
166 rgn->region[0].size = size; in lmb_add_region()
169 rgn->cnt++; in lmb_add_region()
184 struct lmb_region *rgn = &(lmb->reserved); in lmb_free() local
192 for (i=0; i < rgn->cnt; i++) { in lmb_free()
193 rgnbegin = rgn->region[i].base; in lmb_free()
194 rgnend = rgnbegin + rgn->region[i].size; in lmb_free()
201 if (i == rgn->cnt) in lmb_free()
206 lmb_remove_region(rgn, i); in lmb_free()
212 rgn->region[i].base = end; in lmb_free()
213 rgn->region[i].size -= size; in lmb_free()
219 rgn->region[i].size -= size; in lmb_free()
227 rgn->region[i].size = base - rgn->region[i].base; in lmb_free()
228 return lmb_add_region(rgn, end, rgnend - end); in lmb_free()
238 static long lmb_overlaps_region(struct lmb_region *rgn, phys_addr_t base, in lmb_overlaps_region() argument
243 for (i=0; i < rgn->cnt; i++) { in lmb_overlaps_region()
244 phys_addr_t rgnbase = rgn->region[i].base; in lmb_overlaps_region()
245 phys_size_t rgnsize = rgn->region[i].size; in lmb_overlaps_region()
251 return (i < rgn->cnt) ? i : -1; in lmb_overlaps_region()