Lines Matching +full:reserved +full:- +full:memory

2  * Procedures for maintaining information about logical memory blocks.
7 * SPDX-License-Identifier: GPL-2.0+
21 debug(" memory.cnt = 0x%lx\n", lmb->memory.cnt); in lmb_dump_all()
22 debug(" memory.size = 0x%llx\n", in lmb_dump_all()
23 (unsigned long long)lmb->memory.size); in lmb_dump_all()
24 for (i=0; i < lmb->memory.cnt ;i++) { in lmb_dump_all()
25 debug(" memory.reg[0x%lx].base = 0x%llx\n", i, in lmb_dump_all()
26 (long long unsigned)lmb->memory.region[i].base); in lmb_dump_all()
28 (long long unsigned)lmb->memory.region[i].size); in lmb_dump_all()
31 debug("\n reserved.cnt = 0x%lx\n", in lmb_dump_all()
32 lmb->reserved.cnt); in lmb_dump_all()
33 debug(" reserved.size = 0x%llx\n", in lmb_dump_all()
34 (long long unsigned)lmb->reserved.size); in lmb_dump_all()
35 for (i=0; i < lmb->reserved.cnt ;i++) { in lmb_dump_all()
36 debug(" reserved.reg[0x%lx].base = 0x%llx\n", i, in lmb_dump_all()
37 (long long unsigned)lmb->reserved.region[i].base); in lmb_dump_all()
39 (long long unsigned)lmb->reserved.region[i].size); in lmb_dump_all()
56 return -1; in lmb_addrs_adjacent()
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()
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()
87 rgn->region[r1].size += rgn->region[r2].size; in lmb_coalesce_regions()
96 lmb->memory.region[0].base = 0; in lmb_init()
97 lmb->memory.region[0].size = 0; in lmb_init()
98 lmb->memory.cnt = 1; in lmb_init()
99 lmb->memory.size = 0; in lmb_init()
102 lmb->reserved.region[0].base = 0; in lmb_init()
103 lmb->reserved.region[0].size = 0; in lmb_init()
104 lmb->reserved.cnt = 1; in lmb_init()
105 lmb->reserved.size = 0; in lmb_init()
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()
150 if (rgn->cnt >= MAX_LMB_REGIONS) in lmb_add_region()
151 return -1; 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()
178 struct lmb_region *_rgn = &(lmb->memory); in lmb_add()
185 struct lmb_region *rgn = &(lmb->reserved); in lmb_free()
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()
203 return -1; 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()
225 * We need to split the entry - adjust the current one to the 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()
234 struct lmb_region *_rgn = &(lmb->reserved); in lmb_reserve()
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()
275 return addr & ~(size - 1); in lmb_align_down()
280 return (addr + (size - 1)) & ~(size - 1); in lmb_align_up()
289 for (i = lmb->memory.cnt-1; i >= 0; i--) { in __lmb_alloc_base()
290 phys_addr_t lmbbase = lmb->memory.region[i].base; in __lmb_alloc_base()
291 phys_size_t lmbsize = lmb->memory.region[i].size; in __lmb_alloc_base()
296 base = lmb_align_down(lmbbase + lmbsize - size, align); in __lmb_alloc_base()
300 base = -1; in __lmb_alloc_base()
302 base = lmb_align_down(base - size, align); in __lmb_alloc_base()
307 j = lmb_overlaps_region(&lmb->reserved, base, size); in __lmb_alloc_base()
309 /* This area isn't reserved, take it */ in __lmb_alloc_base()
310 if (lmb_add_region(&lmb->reserved, base, in __lmb_alloc_base()
316 res_base = lmb->reserved.region[j].base; in __lmb_alloc_base()
319 base = lmb_align_down(res_base - size, align); in __lmb_alloc_base()
329 for (i = 0; i < lmb->reserved.cnt; i++) { in lmb_is_reserved()
330 phys_addr_t upper = lmb->reserved.region[i].base + in lmb_is_reserved()
331 lmb->reserved.region[i].size - 1; in lmb_is_reserved()
332 if ((addr >= lmb->reserved.region[i].base) && (addr <= upper)) in lmb_is_reserved()