X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=lib%2Flmb.c;h=07b9308adf29ff4d5773b8a663ec6e0bdaedd6a9;hb=9aa886cc0b4424b49b24486f804fd18aafad00b2;hp=3407705fa7030029baf97d03cf5beec1eb9187c5;hpb=e964df1e2ae7b2c041a9d767f03ad2b72a3f2ac7;p=oweals%2Fu-boot.git diff --git a/lib/lmb.c b/lib/lmb.c index 3407705fa7..07b9308adf 100644 --- a/lib/lmb.c +++ b/lib/lmb.c @@ -8,6 +8,7 @@ #include #include +#include #define LMB_ALLOC_ANYWHERE 0 @@ -20,28 +21,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 +51,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 +61,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 +84,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); @@ -98,12 +99,8 @@ void lmb_init(struct lmb *lmb) lmb->reserved.size = 0; } -/* Initialize the struct, add memory and call arch/board reserve functions */ -void lmb_init_and_reserve(struct lmb *lmb, phys_addr_t base, phys_size_t size, - void *fdt_blob) +static void lmb_reserve_common(struct lmb *lmb, void *fdt_blob) { - lmb_init(lmb); - lmb_add(lmb, base, size); arch_lmb_reserve(lmb); board_lmb_reserve(lmb); @@ -111,6 +108,37 @@ void lmb_init_and_reserve(struct lmb *lmb, phys_addr_t base, phys_size_t size, boot_fdt_add_mem_rsv_regions(lmb, fdt_blob); } +/* Initialize the struct, add memory and call arch/board reserve functions */ +void lmb_init_and_reserve(struct lmb *lmb, bd_t *bd, void *fdt_blob) +{ +#ifdef CONFIG_NR_DRAM_BANKS + int i; +#endif + + lmb_init(lmb); +#ifdef CONFIG_NR_DRAM_BANKS + for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) { + if (bd->bi_dram[i].size) { + lmb_add(lmb, bd->bi_dram[i].start, + bd->bi_dram[i].size); + } + } +#else + if (bd->bi_memsize) + lmb_add(lmb, bd->bi_memstart, bd->bi_memsize); +#endif + lmb_reserve_common(lmb, fdt_blob); +} + +/* Initialize the struct, add memory and call arch/board reserve functions */ +void lmb_init_and_reserve_range(struct lmb *lmb, phys_addr_t base, + phys_size_t size, void *fdt_blob) +{ + lmb_init(lmb); + lmb_add(lmb, base, size); + lmb_reserve_common(lmb, fdt_blob); +} + /* This routine called with relocation disabled. */ static long lmb_add_region(struct lmb_region *rgn, phys_addr_t base, phys_size_t size) { @@ -125,7 +153,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 +161,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 +177,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 +190,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 +227,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 +278,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 +301,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 +313,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 +335,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 +358,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 +379,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 */