]> git.sur5r.net Git - u-boot/blobdiff - lib_generic/lmb.c
TWL4030 Add usb PHY support
[u-boot] / lib_generic / lmb.c
index 3240f66bf98906c890f42b37e071352c9a98f935..1c6cf7ce000257b1d91729f95f36b51ccdd5020e 100644 (file)
@@ -25,19 +25,21 @@ void lmb_dump_all(struct lmb *lmb)
        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 */
 }
@@ -181,11 +183,11 @@ long lmb_add(struct lmb *lmb, phys_addr_t base, phys_size_t size)
        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 */
@@ -266,7 +268,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",
-                     size, max_addr);
+                     (ulong)size, (ulong)max_addr);
 
        return alloc;
 }
@@ -285,11 +287,14 @@ phys_addr_t __lmb_alloc_base(struct lmb *lmb, phys_size_t size, ulong align, phy
 {
        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) {
@@ -298,22 +303,23 @@ phys_addr_t __lmb_alloc_base(struct lmb *lmb, phys_size_t size, ulong align, phy
                } 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)