]> git.ipfire.org Git - people/ms/u-boot.git/blobdiff - common/image.c
[new uImage] Use lmb for bootm allocations
[people/ms/u-boot.git] / common / image.c
index 4f2ff9c97719328b86603fa4c2fa02afedb68a77..0b718119f4d07466bcb1c38cb7cdd8e649e96ac3 100644 (file)
@@ -704,10 +704,9 @@ int get_ramdisk (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
 #if defined(CONFIG_PPC) || defined(CONFIG_M68K)
 /**
  * ramdisk_high - relocate init ramdisk
+ * @lmb: pointer to lmb handle, will be used for memory mgmt
  * @rd_data: ramdisk data start address
  * @rd_len: ramdisk data length
- * @sp_limit: stack pointer limit (including BOOTMAPSZ)
- * @sp: current stack pointer
  * @initrd_start: pointer to a ulong variable, will hold final init ramdisk
  *      start address (after possible relocation)
  * @initrd_end: pointer to a ulong variable, will hold final init ramdisk
@@ -720,16 +719,16 @@ int get_ramdisk (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
  *     - initrd_start and initrd_end are set to final (after relocation) ramdisk
  *     start/end addresses if ramdisk image start and len were provided
  *     otherwise set initrd_start and initrd_end set to zeros
- *     - returns new allc_current, next free address below BOOTMAPSZ
+ *     - returns:
+ *        0 - success
+ *       -1 - failure
  */
-ulong ramdisk_high (ulong alloc_current, ulong rd_data, ulong rd_len,
-               ulong sp_limit, ulong sp,
-               ulong *initrd_start, ulong *initrd_end)
+int ramdisk_high (struct lmb *lmb, ulong rd_data, ulong rd_len,
+                 ulong *initrd_start, ulong *initrd_end)
 {
        char    *s;
        ulong   initrd_high;
        int     initrd_copy_to_ram = 1;
-       ulong   new_alloc_current = alloc_current;
 
        if ((s = getenv ("initrd_high")) != NULL) {
                /* a value of "no" or a similar string will act like 0,
@@ -743,12 +742,6 @@ ulong ramdisk_high (ulong alloc_current, ulong rd_data, ulong rd_len,
                initrd_high = ~0;
        }
 
-#ifdef CONFIG_LOGBUFFER
-       /* Prevent initrd from overwriting logbuffer */
-       if (initrd_high < (gd->bd->bi_memsize - LOGBUFF_LEN - LOGBUFF_OVERHEAD))
-           initrd_high = gd->bd->bi_memsize - LOGBUFF_LEN - LOGBUFF_OVERHEAD;
-       debug ("## Logbuffer at 0x%08lx ", gd->bd->bi_memsize - LOGBUFF_LEN);
-#endif
        debug ("## initrd_high = 0x%08lx, copy_to_ram = %d\n",
                        initrd_high, initrd_copy_to_ram);
 
@@ -757,40 +750,17 @@ ulong ramdisk_high (ulong alloc_current, ulong rd_data, ulong rd_len,
                        debug ("   in-place initrd\n");
                        *initrd_start = rd_data;
                        *initrd_end = rd_data + rd_len;
+                       lmb_reserve(lmb, rd_data, rd_len);
                } else {
-                       new_alloc_current = alloc_current - rd_len;
-                       *initrd_start  = new_alloc_current;
-                       *initrd_start &= ~(4096 - 1);   /* align on page */
-
-                       if (initrd_high) {
-                               ulong nsp;
-
-                               /*
-                                * the inital ramdisk does not need to be within
-                                * CFG_BOOTMAPSZ as it is not accessed until after
-                                * the mm system is initialised.
-                                *
-                                * do the stack bottom calculation again and see if
-                                * the initrd will fit just below the monitor stack
-                                * bottom without overwriting the area allocated
-                                * for command line args and board info.
-                                */
-                               nsp = sp;
-                               nsp -= 2048;            /* just to be sure */
-                               nsp &= ~0xF;
-
-                               if (nsp > initrd_high)  /* limit as specified */
-                                       nsp = initrd_high;
-
-                               nsp -= rd_len;
-                               nsp &= ~(4096 - 1);     /* align on page */
-
-                               if (nsp >= sp_limit) {
-                                       *initrd_start = nsp;
-                                       new_alloc_current = alloc_current;
-                               }
+                       if (initrd_high)
+                               *initrd_start = lmb_alloc_base(lmb, rd_len, 0x1000, initrd_high);
+                       else
+                               *initrd_start = lmb_alloc(lmb, rd_len, 0x1000);
+
+                       if (*initrd_start == 0) {
+                               puts("ramdisk - allocation error\n");
+                               goto error;
                        }
-
                        show_boot_progress (12);
 
                        *initrd_end = *initrd_start + rd_len;
@@ -808,56 +778,40 @@ ulong ramdisk_high (ulong alloc_current, ulong rd_data, ulong rd_len,
        }
        debug ("   ramdisk load start = 0x%08lx, ramdisk load end = 0x%08lx\n",
                        *initrd_start, *initrd_end);
+       return 0;
 
-       return new_alloc_current;
-}
-
-/**
- * get_boot_sp_limit - calculate stack pointer limit
- * @sp: current stack pointer
- *
- * get_boot_sp_limit() takes current stack pointer adrress and calculates
- * stack pointer limit, below which kernel boot data (cmdline, board info,
- * etc.) will be allocated.
- *
- * returns:
- *     stack pointer limit
- */
-ulong get_boot_sp_limit(ulong sp)
-{
-       ulong sp_limit = sp;
-
-       sp_limit -= 2048;       /* just to be sure */
-
-       /* make sure sp_limit is within kernel mapped space */
-       if (sp_limit > CFG_BOOTMAPSZ)
-               sp_limit = CFG_BOOTMAPSZ;
-       sp_limit &= ~0xF;
-
-       return sp_limit;
+error:
+       return -1;
 }
 
 /**
  * get_boot_cmdline - allocate and initialize kernel cmdline
- * @alloc_current: current boot allocation address (counting down
- *      from sp_limit)
+ * @lmb: pointer to lmb handle, will be used for memory mgmt
  * @cmd_start: pointer to a ulong variable, will hold cmdline start
  * @cmd_end: pointer to a ulong variable, will hold cmdline end
+ * @bootmap_base: ulong variable, holds offset in physical memory to
+ * base of bootmap
  *
  * get_boot_cmdline() allocates space for kernel command line below
- * provided alloc_current address. If "bootargs" U-boot environemnt
+ * BOOTMAPSZ + bootmap_base address. If "bootargs" U-boot environemnt
  * variable is present its contents is copied to allocated kernel
  * command line.
  *
  * returns:
- *     alloc_current after cmdline allocation
+ *      0 - success
+ *     -1 - failure
  */
-ulong get_boot_cmdline (ulong alloc_current, ulong *cmd_start, ulong *cmd_end)
+int get_boot_cmdline (struct lmb *lmb, ulong *cmd_start, ulong *cmd_end,
+                       ulong bootmap_base)
 {
        char *cmdline;
        char *s;
 
-       cmdline = (char *)((alloc_current - CFG_BARGSIZE) & ~0xF);
+       cmdline = (char *)lmb_alloc_base(lmb, CFG_BARGSIZE, 0xf,
+                                        CFG_BOOTMAPSZ + bootmap_base);
+
+       if (cmdline == NULL)
+               return -1;
 
        if ((s = getenv("bootargs")) == NULL)
                s = "";
@@ -869,25 +823,31 @@ ulong get_boot_cmdline (ulong alloc_current, ulong *cmd_start, ulong *cmd_end)
 
        debug ("## cmdline at 0x%08lx ... 0x%08lx\n", *cmd_start, *cmd_end);
 
-       return (ulong)cmdline;
+       return 0;
 }
 
 /**
  * get_boot_kbd - allocate and initialize kernel copy of board info
- * @alloc_current: current boot allocation address (counting down
- *      from sp_limit)
+ * @lmb: pointer to lmb handle, will be used for memory mgmt
  * @kbd: double pointer to board info data
+ * @bootmap_base: ulong variable, holds offset in physical memory to
+ * base of bootmap
  *
- * get_boot_kbd() - allocates space for kernel copy of board info data.
- * Space is allocated below provided alloc_current address and kernel
- * board info is initialized with the current u-boot board info data.
+ * get_boot_kbd() allocates space for kernel copy of board info data below
+ * BOOTMAPSZ + bootmap_base address and kernel board info is initialized with
+ * the current u-boot board info data.
  *
  * returns:
- *     alloc_current after kbd allocation
+ *      0 - success
+ *     -1 - failure
  */
-ulong get_boot_kbd (ulong alloc_current, bd_t **kbd)
+int get_boot_kbd (struct lmb *lmb, bd_t **kbd, ulong bootmap_base)
 {
-       *kbd = (bd_t *) (((ulong)alloc_current - sizeof(bd_t)) & ~0xF);
+       *kbd = (bd_t *)lmb_alloc_base(lmb, sizeof(bd_t), 0xf,
+                                     CFG_BOOTMAPSZ + bootmap_base);
+       if (*kbd == NULL)
+               return -1;
+
        **kbd = *(gd->bd);
 
        debug ("## kernel board info at 0x%08lx\n", (ulong)*kbd);
@@ -896,7 +856,7 @@ ulong get_boot_kbd (ulong alloc_current, bd_t **kbd)
        do_bdinfo(NULL, 0, 0, NULL);
 #endif
 
-       return (ulong)*kbd;
+       return 0;
 }
 #endif /* CONFIG_PPC || CONFIG_M68K */