|
@@ -20,28 +20,28 @@ void lmb_dump_all(struct lmb *lmb)
|
|
|
debug(" memory.cnt = 0x%lx\n", lmb->memory.cnt);
|
|
|
debug(" memory.size = 0x%llx\n",
|
|
|
(unsigned long long)lmb->memory.size);
|
|
|
- for (i=0; i < lmb->memory.cnt ;i++) {
|
|
|
+ for (i = 0; i < lmb->memory.cnt; i++) {
|
|
|
debug(" memory.reg[0x%lx].base = 0x%llx\n", i,
|
|
|
- (long long unsigned)lmb->memory.region[i].base);
|
|
|
+ (unsigned long long)lmb->memory.region[i].base);
|
|
|
debug(" .size = 0x%llx\n",
|
|
|
- (long long unsigned)lmb->memory.region[i].size);
|
|
|
+ (unsigned long long)lmb->memory.region[i].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++) {
|
|
|
+ (unsigned long long)lmb->reserved.size);
|
|
|
+ for (i = 0; i < lmb->reserved.cnt; i++) {
|
|
|
debug(" reserved.reg[0x%lx].base = 0x%llx\n", i,
|
|
|
- (long long unsigned)lmb->reserved.region[i].base);
|
|
|
+ (unsigned long long)lmb->reserved.region[i].base);
|
|
|
debug(" .size = 0x%llx\n",
|
|
|
- (long long unsigned)lmb->reserved.region[i].size);
|
|
|
+ (unsigned long long)lmb->reserved.region[i].size);
|
|
|
}
|
|
|
#endif /* DEBUG */
|
|
|
}
|
|
|
|
|
|
-static long lmb_addrs_overlap(phys_addr_t base1,
|
|
|
- phys_size_t size1, phys_addr_t base2, phys_size_t size2)
|
|
|
+static long lmb_addrs_overlap(phys_addr_t base1, phys_size_t size1,
|
|
|
+ phys_addr_t base2, phys_size_t size2)
|
|
|
{
|
|
|
const phys_addr_t base1_end = base1 + size1 - 1;
|
|
|
const phys_addr_t base2_end = base2 + size2 - 1;
|
|
@@ -50,7 +50,7 @@ static long lmb_addrs_overlap(phys_addr_t base1,
|
|
|
}
|
|
|
|
|
|
static long lmb_addrs_adjacent(phys_addr_t base1, phys_size_t size1,
|
|
|
- phys_addr_t base2, phys_size_t size2)
|
|
|
+ phys_addr_t base2, phys_size_t size2)
|
|
|
{
|
|
|
if (base2 == base1 + size1)
|
|
|
return 1;
|
|
@@ -60,8 +60,8 @@ static long lmb_addrs_adjacent(phys_addr_t base1, phys_size_t size1,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static long lmb_regions_adjacent(struct lmb_region *rgn,
|
|
|
- unsigned long r1, unsigned long r2)
|
|
|
+static long lmb_regions_adjacent(struct lmb_region *rgn, unsigned long r1,
|
|
|
+ unsigned long r2)
|
|
|
{
|
|
|
phys_addr_t base1 = rgn->region[r1].base;
|
|
|
phys_size_t size1 = rgn->region[r1].size;
|
|
@@ -83,8 +83,8 @@ static void lmb_remove_region(struct lmb_region *rgn, unsigned long r)
|
|
|
}
|
|
|
|
|
|
/* Assumption: base addr of region 1 < base addr of region 2 */
|
|
|
-static void lmb_coalesce_regions(struct lmb_region *rgn,
|
|
|
- unsigned long r1, unsigned long r2)
|
|
|
+static void lmb_coalesce_regions(struct lmb_region *rgn, unsigned long r1,
|
|
|
+ unsigned long r2)
|
|
|
{
|
|
|
rgn->region[r1].size += rgn->region[r2].size;
|
|
|
lmb_remove_region(rgn, r2);
|
|
@@ -125,7 +125,7 @@ static long lmb_add_region(struct lmb_region *rgn, phys_addr_t base, phys_size_t
|
|
|
}
|
|
|
|
|
|
/* First try and coalesce this LMB with another. */
|
|
|
- for (i=0; i < rgn->cnt; i++) {
|
|
|
+ for (i = 0; i < rgn->cnt; i++) {
|
|
|
phys_addr_t rgnbase = rgn->region[i].base;
|
|
|
phys_size_t rgnsize = rgn->region[i].size;
|
|
|
|
|
@@ -133,14 +133,13 @@ static long lmb_add_region(struct lmb_region *rgn, phys_addr_t base, phys_size_t
|
|
|
/* Already have this region, so we're done */
|
|
|
return 0;
|
|
|
|
|
|
- adjacent = lmb_addrs_adjacent(base,size,rgnbase,rgnsize);
|
|
|
- if ( adjacent > 0 ) {
|
|
|
+ adjacent = lmb_addrs_adjacent(base, size, rgnbase, rgnsize);
|
|
|
+ if (adjacent > 0) {
|
|
|
rgn->region[i].base -= size;
|
|
|
rgn->region[i].size += size;
|
|
|
coalesced++;
|
|
|
break;
|
|
|
- }
|
|
|
- else if ( adjacent < 0 ) {
|
|
|
+ } else if (adjacent < 0) {
|
|
|
rgn->region[i].size += size;
|
|
|
coalesced++;
|
|
|
break;
|
|
@@ -150,8 +149,8 @@ static long lmb_add_region(struct lmb_region *rgn, phys_addr_t base, phys_size_t
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if ((i < rgn->cnt-1) && lmb_regions_adjacent(rgn, i, i+1) ) {
|
|
|
- lmb_coalesce_regions(rgn, i, i+1);
|
|
|
+ if ((i < rgn->cnt - 1) && lmb_regions_adjacent(rgn, i, i + 1)) {
|
|
|
+ lmb_coalesce_regions(rgn, i, i + 1);
|
|
|
coalesced++;
|
|
|
}
|
|
|
|
|
@@ -163,11 +162,11 @@ static long lmb_add_region(struct lmb_region *rgn, phys_addr_t base, phys_size_t
|
|
|
/* Couldn't coalesce the LMB, so add it to the sorted table. */
|
|
|
for (i = rgn->cnt-1; i >= 0; i--) {
|
|
|
if (base < rgn->region[i].base) {
|
|
|
- rgn->region[i+1].base = rgn->region[i].base;
|
|
|
- rgn->region[i+1].size = rgn->region[i].size;
|
|
|
+ rgn->region[i + 1].base = rgn->region[i].base;
|
|
|
+ rgn->region[i + 1].size = rgn->region[i].size;
|
|
|
} else {
|
|
|
- rgn->region[i+1].base = base;
|
|
|
- rgn->region[i+1].size = size;
|
|
|
+ rgn->region[i + 1].base = base;
|
|
|
+ rgn->region[i + 1].size = size;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
@@ -200,7 +199,7 @@ long lmb_free(struct lmb *lmb, phys_addr_t base, phys_size_t size)
|
|
|
rgnbegin = rgnend = 0; /* supress gcc warnings */
|
|
|
|
|
|
/* Find the region where (base, size) belongs to */
|
|
|
- for (i=0; i < rgn->cnt; i++) {
|
|
|
+ for (i = 0; i < rgn->cnt; i++) {
|
|
|
rgnbegin = rgn->region[i].base;
|
|
|
rgnend = rgnbegin + rgn->region[i].size - 1;
|
|
|
|
|
@@ -251,12 +250,11 @@ static long lmb_overlaps_region(struct lmb_region *rgn, phys_addr_t base,
|
|
|
{
|
|
|
unsigned long i;
|
|
|
|
|
|
- for (i=0; i < rgn->cnt; i++) {
|
|
|
+ for (i = 0; i < rgn->cnt; i++) {
|
|
|
phys_addr_t rgnbase = rgn->region[i].base;
|
|
|
phys_size_t rgnsize = rgn->region[i].size;
|
|
|
- if ( lmb_addrs_overlap(base,size,rgnbase,rgnsize) ) {
|
|
|
+ if (lmb_addrs_overlap(base, size, rgnbase, rgnsize))
|
|
|
break;
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
return (i < rgn->cnt) ? i : -1;
|
|
@@ -275,7 +273,7 @@ phys_addr_t lmb_alloc_base(struct lmb *lmb, phys_size_t size, ulong align, phys_
|
|
|
|
|
|
if (alloc == 0)
|
|
|
printf("ERROR: Failed to allocate 0x%lx bytes below 0x%lx.\n",
|
|
|
- (ulong)size, (ulong)max_addr);
|
|
|
+ (ulong)size, (ulong)max_addr);
|
|
|
|
|
|
return alloc;
|
|
|
}
|
|
@@ -287,11 +285,11 @@ static phys_addr_t lmb_align_down(phys_addr_t addr, phys_size_t size)
|
|
|
|
|
|
phys_addr_t __lmb_alloc_base(struct lmb *lmb, phys_size_t size, ulong align, phys_addr_t max_addr)
|
|
|
{
|
|
|
- long i, j;
|
|
|
+ long i, rgn;
|
|
|
phys_addr_t base = 0;
|
|
|
phys_addr_t res_base;
|
|
|
|
|
|
- for (i = lmb->memory.cnt-1; i >= 0; i--) {
|
|
|
+ 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;
|
|
|
|
|
@@ -309,15 +307,15 @@ phys_addr_t __lmb_alloc_base(struct lmb *lmb, phys_size_t size, ulong align, phy
|
|
|
continue;
|
|
|
|
|
|
while (base && lmbbase <= base) {
|
|
|
- j = lmb_overlaps_region(&lmb->reserved, base, size);
|
|
|
- if (j < 0) {
|
|
|
+ rgn = lmb_overlaps_region(&lmb->reserved, base, size);
|
|
|
+ if (rgn < 0) {
|
|
|
/* This area isn't reserved, take it */
|
|
|
if (lmb_add_region(&lmb->reserved, base,
|
|
|
size) < 0)
|
|
|
return 0;
|
|
|
return base;
|
|
|
}
|
|
|
- res_base = lmb->reserved.region[j].base;
|
|
|
+ res_base = lmb->reserved.region[rgn].base;
|
|
|
if (res_base < size)
|
|
|
break;
|
|
|
base = lmb_align_down(res_base - size, align);
|
|
@@ -332,18 +330,18 @@ phys_addr_t __lmb_alloc_base(struct lmb *lmb, phys_size_t size, ulong align, phy
|
|
|
*/
|
|
|
phys_addr_t lmb_alloc_addr(struct lmb *lmb, phys_addr_t base, phys_size_t size)
|
|
|
{
|
|
|
- long j;
|
|
|
+ long rgn;
|
|
|
|
|
|
/* Check if the requested address is in one of the memory regions */
|
|
|
- j = lmb_overlaps_region(&lmb->memory, base, size);
|
|
|
- if (j >= 0) {
|
|
|
+ rgn = lmb_overlaps_region(&lmb->memory, base, size);
|
|
|
+ if (rgn >= 0) {
|
|
|
/*
|
|
|
* Check if the requested end address is in the same memory
|
|
|
* region we found.
|
|
|
*/
|
|
|
- if (lmb_addrs_overlap(lmb->memory.region[j].base,
|
|
|
- lmb->memory.region[j].size, base + size -
|
|
|
- 1, 1)) {
|
|
|
+ if (lmb_addrs_overlap(lmb->memory.region[rgn].base,
|
|
|
+ lmb->memory.region[rgn].size,
|
|
|
+ base + size - 1, 1)) {
|
|
|
/* ok, reserve the memory */
|
|
|
if (lmb_reserve(lmb, base, size) >= 0)
|
|
|
return base;
|
|
@@ -353,14 +351,14 @@ phys_addr_t lmb_alloc_addr(struct lmb *lmb, phys_addr_t base, phys_size_t size)
|
|
|
}
|
|
|
|
|
|
/* Return number of bytes from a given address that are free */
|
|
|
-phys_size_t lmb_get_unreserved_size(struct lmb *lmb, phys_addr_t addr)
|
|
|
+phys_size_t lmb_get_free_size(struct lmb *lmb, phys_addr_t addr)
|
|
|
{
|
|
|
int i;
|
|
|
- long j;
|
|
|
+ long rgn;
|
|
|
|
|
|
/* check if the requested address is in the memory regions */
|
|
|
- j = lmb_overlaps_region(&lmb->memory, addr, 1);
|
|
|
- if (j >= 0) {
|
|
|
+ rgn = lmb_overlaps_region(&lmb->memory, addr, 1);
|
|
|
+ if (rgn >= 0) {
|
|
|
for (i = 0; i < lmb->reserved.cnt; i++) {
|
|
|
if (addr < lmb->reserved.region[i].base) {
|
|
|
/* first reserved range > requested address */
|