debug(" memory.size = 0x%llx\n",
(unsigned long long)lmb->memory.size);
for (i=0; i < lmb->memory.cnt ;i++) {
- debug(" memory.reg[0x%x].base = 0x%llx\n", i,
- lmb->memory.region[i].base);
+ debug(" memory.reg[0x%lx].base = 0x%llx\n", i,
+ (long long unsigned)lmb->memory.region[i].base);
debug(" .size = 0x%llx\n",
- lmb->memory.region[i].size);
+ (long long unsigned)lmb->memory.region[i].size);
}
- debug("\n reserved.cnt = 0x%lx\n", lmb->reserved.cnt);
- debug(" reserved.size = 0x%llx\n", lmb->reserved.size);
+ debug("\n reserved.cnt = 0x%lx\n",
+ lmb->reserved.cnt);
+ debug(" reserved.size = 0x%llx\n",
+ (long long unsigned)lmb->reserved.size);
for (i=0; i < lmb->reserved.cnt ;i++) {
- debug(" reserved.reg[0x%x].base = 0x%llx\n", i,
- lmb->reserved.region[i].base);
+ debug(" reserved.reg[0x%lx].base = 0x%llx\n", i,
+ (long long unsigned)lmb->reserved.region[i].base);
debug(" .size = 0x%llx\n",
- lmb->reserved.region[i].size);
+ (long long unsigned)lmb->reserved.region[i].size);
}
#endif /* DEBUG */
}
return lmb_add_region(_rgn, base, size);
}
-long lmb_free(struct lmb *lmb, u64 base, u64 size)
+long lmb_free(struct lmb *lmb, phys_addr_t base, phys_size_t size)
{
struct lmb_region *rgn = &(lmb->reserved);
- u64 rgnbegin, rgnend;
- u64 end = base + size;
+ phys_addr_t rgnbegin, rgnend;
+ phys_addr_t end = base + size;
int i;
rgnbegin = rgnend = 0; /* supress gcc warnings */
if (alloc == 0)
printf("ERROR: Failed to allocate 0x%lx bytes below 0x%lx.\n",
- size, max_addr);
+ (ulong)size, (ulong)max_addr);
return alloc;
}
{
long i, j;
phys_addr_t base = 0;
+ phys_addr_t res_base;
for (i = lmb->memory.cnt-1; i >= 0; i--) {
phys_addr_t lmbbase = lmb->memory.region[i].base;
phys_size_t lmbsize = lmb->memory.region[i].size;
+ if (lmbsize < size)
+ continue;
if (max_addr == LMB_ALLOC_ANYWHERE)
base = lmb_align_down(lmbbase + lmbsize - size, align);
else if (lmbbase < max_addr) {
} else
continue;
- while ((lmbbase <= base) &&
- ((j = lmb_overlaps_region(&(lmb->reserved), base, size)) >= 0) )
- base = lmb_align_down(lmb->reserved.region[j].base - size,
- align);
-
- if ((base != 0) && (lmbbase <= base))
- break;
+ while (base && lmbbase <= base) {
+ j = lmb_overlaps_region(&lmb->reserved, base, size);
+ if (j < 0) {
+ /* This area isn't reserved, take it */
+ if (lmb_add_region(&lmb->reserved, base,
+ lmb_align_up(size,
+ align)) < 0)
+ return 0;
+ return base;
+ }
+ res_base = lmb->reserved.region[j].base;
+ if (res_base < size)
+ break;
+ base = lmb_align_down(res_base - size, align);
+ }
}
-
- if (i < 0)
- return 0;
-
- if (lmb_add_region(&(lmb->reserved), base, lmb_align_up(size, align)) < 0)
- return 0;
-
- return base;
+ return 0;
}
int lmb_is_reserved(struct lmb *lmb, phys_addr_t addr)