Each architecture has different ways of determine what regions of memory
might not be valid to get overwritten when we boot.  This provides a
hook to allow them to reserve any regions they care about.  Currently
only ppc, m68k and sparc need/use this.

Signed-off-by: Kumar Gala <[EMAIL PROTECTED]>
---
Updated against latest next tree.

- k

 common/cmd_bootm.c |    7 +++++++
 lib_m68k/bootm.c   |   29 ++++++++++++++++-------------
 lib_ppc/bootm.c    |   50 ++++++++++++++++++++++++++++----------------------
 lib_sparc/bootm.c  |   16 +++++++++-------
 4 files changed, 60 insertions(+), 42 deletions(-)

diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c
index 2a9c59f..b02da3e 100644
--- a/common/cmd_bootm.c
+++ b/common/cmd_bootm.c
@@ -128,6 +128,12 @@ void __board_lmb_reserve(struct lmb *lmb)
 }
 void board_lmb_reserve(struct lmb *lmb) __attribute__((weak, 
alias("__board_lmb_reserve")));
 
+void __arch_lmb_reserve(struct lmb *lmb)
+{
+       /* please define platform specific arch_lmb_reserve() */
+}
+void arch_lmb_reserve(struct lmb *lmb) __attribute__((weak, 
alias("__arch_lmb_reserve")));
+
 #if defined(__ARM__)
   #define IH_INITRD_ARCH IH_ARCH_ARM
 #elif defined(__avr32__)
@@ -173,6 +179,7 @@ static int bootm_start(cmd_tbl_t *cmdtp, int flag, int 
argc, char *argv[])
 
        lmb_add(&images.lmb, (phys_addr_t)mem_start, mem_size);
 
+       arch_lmb_reserve(&images.lmb);
        board_lmb_reserve(&images.lmb);
 
        /* get kernel image header, start address and length */
diff --git a/lib_m68k/bootm.c b/lib_m68k/bootm.c
index a73f6eb..c52dd2f 100644
--- a/lib_m68k/bootm.c
+++ b/lib_m68k/bootm.c
@@ -43,22 +43,10 @@ DECLARE_GLOBAL_DATA_PTR;
 static ulong get_sp (void);
 static void set_clocks_in_mhz (bd_t *kbd);
 
-int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
+void arch_lmb_reserve(struct lmb *lmb)
 {
        ulong sp;
 
-       ulong rd_len;
-       ulong initrd_start, initrd_end;
-       int ret;
-
-       ulong cmd_start, cmd_end;
-       ulong bootmap_base;
-       bd_t  *kbd;
-       void  (*kernel) (bd_t *, ulong, ulong, ulong, ulong);
-       struct lmb *lmb = &images->lmb;
-
-       bootmap_base = getenv_bootm_low();
-
        /*
         * Booting a (Linux) kernel image
         *
@@ -74,6 +62,21 @@ int do_bootm_linux(int flag, int argc, char *argv[], 
bootm_headers_t *images)
        /* adjust sp by 1K to be safe */
        sp -= 1024;
        lmb_reserve(lmb, sp, (CONFIG_SYS_SDRAM_BASE + gd->ram_size - sp));
+}
+
+int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
+{
+       ulong rd_len;
+       ulong initrd_start, initrd_end;
+       int ret;
+
+       ulong cmd_start, cmd_end;
+       ulong bootmap_base;
+       bd_t  *kbd;
+       void  (*kernel) (bd_t *, ulong, ulong, ulong, ulong);
+       struct lmb *lmb = &images->lmb;
+
+       bootmap_base = getenv_bootm_low();
 
        /* allocate space and init command line */
        ret = boot_get_cmdline (lmb, &cmd_start, &cmd_end, bootmap_base);
diff --git a/lib_ppc/bootm.c b/lib_ppc/bootm.c
index d498818..1f3501a 100644
--- a/lib_ppc/bootm.c
+++ b/lib_ppc/bootm.c
@@ -55,30 +55,10 @@ static void set_clocks_in_mhz (bd_t *kbd);
 #define CONFIG_SYS_LINUX_LOWMEM_MAX_SIZE       (768*1024*1024)
 #endif
 
-__attribute__((noinline))
-int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
+void arch_lmb_reserve(struct lmb *lmb)
 {
-       ulong   sp;
-
-       ulong   initrd_start, initrd_end;
-       ulong   rd_len;
-       ulong   size;
        phys_size_t bootm_size;
-
-       ulong   cmd_start, cmd_end, bootmap_base;
-       bd_t    *kbd;
-       void    (*kernel)(bd_t *, ulong r4, ulong r5, ulong r6,
-                         ulong r7, ulong r8, ulong r9);
-       int     ret;
-       ulong   of_size = images->ft_len;
-       struct lmb *lmb = &images->lmb;
-
-#if defined(CONFIG_OF_LIBFDT)
-       char    *of_flat_tree = images->ft_addr;
-#endif
-
-       kernel = (void (*)(bd_t *, ulong, ulong, ulong,
-                          ulong, ulong, ulong))images->ep;
+       ulong size, sp, bootmap_base;
 
        bootmap_base = getenv_bootm_low();
        bootm_size = getenv_bootm_size();
@@ -116,6 +96,32 @@ int do_bootm_linux(int flag, int argc, char *argv[], 
bootm_headers_t *images)
        sp -= 1024;
        lmb_reserve(lmb, sp, (CONFIG_SYS_SDRAM_BASE + get_effective_memsize() - 
sp));
 
+       return ;
+}
+
+__attribute__((noinline))
+int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
+{
+       ulong   initrd_start, initrd_end;
+       ulong   rd_len;
+
+       ulong   cmd_start, cmd_end, bootmap_base;
+       bd_t    *kbd;
+       void    (*kernel)(bd_t *, ulong r4, ulong r5, ulong r6,
+                         ulong r7, ulong r8, ulong r9);
+       int     ret;
+       ulong   of_size = images->ft_len;
+       struct lmb *lmb = &images->lmb;
+
+#if defined(CONFIG_OF_LIBFDT)
+       char    *of_flat_tree = images->ft_addr;
+#endif
+
+       kernel = (void (*)(bd_t *, ulong, ulong, ulong,
+                          ulong, ulong, ulong))images->ep;
+
+       bootmap_base = getenv_bootm_low();
+
        if (!of_size) {
                /* allocate space and init command line */
                ret = boot_get_cmdline (lmb, &cmd_start, &cmd_end, 
bootmap_base);
diff --git a/lib_sparc/bootm.c b/lib_sparc/bootm.c
index 2baafcc..565b41c 100644
--- a/lib_sparc/bootm.c
+++ b/lib_sparc/bootm.c
@@ -81,6 +81,15 @@ struct __attribute__ ((packed)) {
 /* temporary initrd image holder */
 image_header_t ihdr;
 
+void arch_lmb_reserve(struct lmb *lmb)
+{
+       /* Reserve the space used by PROM and stack. This is done
+        * to avoid that the RAM image is copied over stack or
+        * PROM.
+        */
+       lmb_reserve(lmb, CONFIG_SYS_RELOC_MONITOR_BASE, CONFIG_SYS_RAM_END);
+}
+
 /* boot the linux kernel */
 int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t * images)
 {
@@ -124,13 +133,6 @@ int do_bootm_linux(int flag, int argc, char *argv[], 
bootm_headers_t * images)
        rd_len = images->rd_end - images->rd_start;
 
        if (rd_len) {
-
-               /* Reserve the space used by PROM and stack. This is done
-                * to avoid that the RAM image is copied over stack or
-                * PROM.
-                */
-               lmb_reserve(lmb, CONFIG_SYS_RELOC_MONITOR_BASE, 
CONFIG_SYS_RAM_END);
-
                ret = boot_ramdisk_high(lmb, images->rd_start, rd_len,
                                        &initrd_start, &initrd_end);
                if (ret) {
-- 
1.5.5.1

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to