]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
lmb: do away with arch_lmb_reserve()
authorSughosh Ganu <sughosh.ganu@linaro.org>
Mon, 26 Aug 2024 11:59:30 +0000 (17:29 +0530)
committerTom Rini <trini@konsulko.com>
Tue, 3 Sep 2024 20:08:50 +0000 (14:08 -0600)
All of the current definitions of arch_lmb_reserve() are doing the
same thing -- reserve the region of memory occupied by U-Boot,
starting from the current stack address to the ram_top. Introduce a
function lmb_reserve_uboot_region() which does this, and do away with
the arch_lmb_reserve() function.

Instead of using the current value of stack pointer for starting the
reserved region, have a fixed value, considering the stack size config
value.

Signed-off-by: Sughosh Ganu <sughosh.ganu@linaro.org>
Reviewed-by: Simon Glass <sjg@chromium.org>
Acked-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
13 files changed:
arch/arc/lib/cache.c
arch/arm/lib/stack.c
arch/m68k/lib/bootm.c
arch/microblaze/lib/bootm.c
arch/mips/lib/bootm.c
arch/nios2/lib/bootm.c
arch/powerpc/lib/bootm.c
arch/riscv/lib/bootm.c
arch/sh/lib/bootm.c
arch/x86/lib/bootm.c
arch/xtensa/lib/bootm.c
include/lmb.h
lib/lmb.c

index 5151af917a3cf40bece7a80c4ba70818d9f909fc..5169fc627fa5f49c8ae4b8e9ddf62a631dd9b442 100644 (file)
@@ -10,7 +10,6 @@
 #include <linux/compiler.h>
 #include <linux/kernel.h>
 #include <linux/log2.h>
-#include <lmb.h>
 #include <asm/arcregs.h>
 #include <asm/arc-bcr.h>
 #include <asm/cache.h>
@@ -820,16 +819,3 @@ void sync_n_cleanup_cache_all(void)
 
        __ic_entire_invalidate();
 }
-
-static ulong get_sp(void)
-{
-       ulong ret;
-
-       asm("mov %0, sp" : "=r"(ret) : );
-       return ret;
-}
-
-void arch_lmb_reserve(void)
-{
-       arch_lmb_reserve_generic(get_sp(), gd->ram_top, 4096);
-}
index 87d5c962d7fe419efa8ebbfbabf82ab74df61517..2b21ec0734ef961cc28d0fbcda543b7642a00290 100644 (file)
@@ -11,7 +11,6 @@
  * Marius Groeger <mgroeger@sysgo.de>
  */
 #include <init.h>
-#include <lmb.h>
 #include <asm/global_data.h>
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -33,16 +32,3 @@ int arch_reserve_stacks(void)
 
        return 0;
 }
-
-static ulong get_sp(void)
-{
-       ulong ret;
-
-       asm("mov %0, sp" : "=r"(ret) : );
-       return ret;
-}
-
-void arch_lmb_reserve(void)
-{
-       arch_lmb_reserve_generic(get_sp(), gd->ram_top, 16384);
-}
index aee95f1e180a0ef51a6d5f48b13ce25fca60e169..3dcff8076e3cbb1e422afa94f66c3ea2cc8ee8ca 100644 (file)
@@ -9,7 +9,6 @@
 #include <command.h>
 #include <env.h>
 #include <image.h>
-#include <lmb.h>
 #include <log.h>
 #include <asm/global_data.h>
 #include <u-boot/zlib.h>
@@ -27,14 +26,8 @@ DECLARE_GLOBAL_DATA_PTR;
 #define LINUX_MAX_ENVS         256
 #define LINUX_MAX_ARGS         256
 
-static ulong get_sp (void);
 static void set_clocks_in_mhz (struct bd_info *kbd);
 
-void arch_lmb_reserve(void)
-{
-       arch_lmb_reserve_generic(get_sp(), gd->ram_top, 1024);
-}
-
 int do_bootm_linux(int flag, struct bootm_info *bmi)
 {
        struct bootm_headers *images = bmi->images;
@@ -88,16 +81,6 @@ error:
        return 1;
 }
 
-static ulong get_sp (void)
-{
-       ulong sp;
-
-       asm("movel %%a7, %%d0\n"
-           "movel %%d0, %0\n": "=d"(sp): :"%d0");
-
-       return sp;
-}
-
 static void set_clocks_in_mhz (struct bd_info *kbd)
 {
        char *s;
index ce96bca28ff8305abb7fcf38979b52973f5a425b..4879a41aab3bb141a6e6b5d532484c1fb7221b80 100644 (file)
@@ -15,7 +15,6 @@
 #include <fdt_support.h>
 #include <hang.h>
 #include <image.h>
-#include <lmb.h>
 #include <log.h>
 #include <asm/cache.h>
 #include <asm/global_data.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
-static ulong get_sp(void)
-{
-       ulong ret;
-
-       asm("addik %0, r1, 0" : "=r"(ret) : );
-       return ret;
-}
-
-void arch_lmb_reserve(void)
-{
-       arch_lmb_reserve_generic(get_sp(), gd->ram_top, 4096);
-}
-
 static void boot_jump_linux(struct bootm_headers *images, int flag)
 {
        void (*thekernel)(char *cmdline, ulong rd, ulong dt);
index 8fb3a3923fd70bdf5e1ffa0bbf681870c699bd13..8719510002399a5cb1e5ccaed3332b7410edb6bb 100644 (file)
@@ -9,7 +9,6 @@
 #include <env.h>
 #include <image.h>
 #include <fdt_support.h>
-#include <lmb.h>
 #include <log.h>
 #include <asm/addrspace.h>
 #include <asm/global_data.h>
@@ -28,20 +27,6 @@ static char **linux_env;
 static char *linux_env_p;
 static int linux_env_idx;
 
-static ulong arch_get_sp(void)
-{
-       ulong ret;
-
-       __asm__ __volatile__("move %0, $sp" : "=r"(ret) : );
-
-       return ret;
-}
-
-void arch_lmb_reserve(void)
-{
-       arch_lmb_reserve_generic(arch_get_sp(), gd->ram_top, 4096);
-}
-
 static void linux_cmdline_init(void)
 {
        linux_argc = 1;
index d33d45d28f79cf99a009fe4d0d765ebe012debcd..71319839ba21b68b714ffa59e044ea486b58847d 100644 (file)
@@ -64,16 +64,3 @@ int do_bootm_linux(int flag, struct bootm_info *bmi)
 
        return 1;
 }
-
-static ulong get_sp(void)
-{
-       ulong ret;
-
-       asm("mov %0, sp" : "=r"(ret) : );
-       return ret;
-}
-
-void arch_lmb_reserve(void)
-{
-       arch_lmb_reserve_generic(get_sp(), gd->ram_top, 4096);
-}
index 8f21cdb0a5bcd222cd85eab8bc009ed43f237611..dc44bf3ab3ad753b9db7a314676a218ee627ac8d 100644 (file)
@@ -36,7 +36,6 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
-static ulong get_sp (void);
 extern void ft_fixup_num_cores(void *blob);
 static void set_clocks_in_mhz (struct bd_info *kbd);
 
@@ -210,14 +209,6 @@ int do_bootm_linux(int flag, struct bootm_info *bmi)
        return 0;
 }
 
-static ulong get_sp (void)
-{
-       ulong sp;
-
-       asm( "mr %0,1": "=r"(sp) : );
-       return sp;
-}
-
 static void set_clocks_in_mhz (struct bd_info *kbd)
 {
        char    *s;
index bbf62f9e05860b2f26e479757e04513aacb2b271..82502972eec5148b8a36b45eef412a3ec2adb48c 100644 (file)
@@ -133,16 +133,3 @@ int do_bootm_vxworks(int flag, struct bootm_info *bmi)
 {
        return do_bootm_linux(flag, bmi);
 }
-
-static ulong get_sp(void)
-{
-       ulong ret;
-
-       asm("mv %0, sp" : "=r"(ret) : );
-       return ret;
-}
-
-void arch_lmb_reserve(void)
-{
-       arch_lmb_reserve_generic(get_sp(), gd->ram_top, 4096);
-}
index 44ac05988cba0253ca4388d9257978992f182ffb..bb0f59e0aa23d1172244c51d55df310c63be6816 100644 (file)
@@ -101,16 +101,3 @@ int do_bootm_linux(int flag, struct bootm_info *bmi)
        /* does not return */
        return 1;
 }
-
-static ulong get_sp(void)
-{
-       ulong ret;
-
-       asm("mov r15, %0" : "=r"(ret) : );
-       return ret;
-}
-
-void arch_lmb_reserve(void)
-{
-       arch_lmb_reserve_generic(get_sp(), gd->ram_top, 4096);
-}
index 114b31012e85d0ba59d0ca4af1d2eed388195028..55f581836dfa6ea76f2b6ba63709544757d3bd52 100644 (file)
@@ -253,21 +253,3 @@ int do_bootm_linux(int flag, struct bootm_info *bmi)
 
        return boot_jump_linux(images);
 }
-
-static ulong get_sp(void)
-{
-       ulong ret;
-
-#if CONFIG_IS_ENABLED(X86_64)
-       asm("mov %%rsp, %0" : "=r"(ret) : );
-#else
-       asm("mov %%esp, %0" : "=r"(ret) : );
-#endif
-
-       return ret;
-}
-
-void arch_lmb_reserve(void)
-{
-       arch_lmb_reserve_generic(get_sp(), gd->ram_top, 4096);
-}
index bdbd6d4692c22b9d4ae5c64ef95ed540110bf175..2958f2073979f75c2727ad3f1c3b973416d264c4 100644 (file)
@@ -197,16 +197,3 @@ int do_bootm_linux(int flag, struct bootm_info *bmi)
 
        return 1;
 }
-
-static ulong get_sp(void)
-{
-       ulong ret;
-
-       asm("mov %0, a1" : "=r"(ret) : );
-       return ret;
-}
-
-void arch_lmb_reserve(void)
-{
-       arch_lmb_reserve_generic(get_sp(), gd->ram_top, 4096);
-}
index 2f155d706ed8f9b4ed5f1abceb279182bc714dea..fb1a6db8e2b7540f7496b57d11c652b1f4cce509 100644 (file)
@@ -108,8 +108,6 @@ void lmb_dump_all(void);
 void lmb_dump_all_force(void);
 
 void board_lmb_reserve(void);
-void arch_lmb_reserve(void);
-void arch_lmb_reserve_generic(ulong sp, ulong end, ulong align);
 
 struct lmb *lmb_get(void);
 int lmb_push(struct lmb *store);
index 686988e34f9ddb72da6420342929f3acec6ed60c..dbbc19ede927a1c850d6a2cdce14915dda1e50eb 100644 (file)
--- a/lib/lmb.c
+++ b/lib/lmb.c
@@ -18,6 +18,7 @@
 #include <asm/global_data.h>
 #include <asm/sections.h>
 #include <linux/kernel.h>
+#include <linux/sizes.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -147,42 +148,6 @@ static void lmb_fix_over_lap_regions(struct alist *lmb_rgn_lst,
        lmb_remove_region(lmb_rgn_lst, r2);
 }
 
-void arch_lmb_reserve_generic(ulong sp, ulong end, ulong align)
-{
-       ulong bank_end;
-       int bank;
-
-       /*
-        * Reserve memory from aligned address below the bottom of U-Boot stack
-        * until end of U-Boot area using LMB to prevent U-Boot from overwriting
-        * that memory.
-        */
-       debug("## Current stack ends at 0x%08lx ", sp);
-
-       /* adjust sp by 4K to be safe */
-       sp -= align;
-       for (bank = 0; bank < CONFIG_NR_DRAM_BANKS; bank++) {
-               if (!gd->bd->bi_dram[bank].size ||
-                   sp < gd->bd->bi_dram[bank].start)
-                       continue;
-               /* Watch out for RAM at end of address space! */
-               bank_end = gd->bd->bi_dram[bank].start +
-                       gd->bd->bi_dram[bank].size - 1;
-               if (sp > bank_end)
-                       continue;
-               if (bank_end > end)
-                       bank_end = end - 1;
-
-               lmb_reserve_flags(sp, bank_end - sp + 1, LMB_NOOVERWRITE);
-
-               if (gd->flags & GD_FLG_SKIP_RELOC)
-                       lmb_reserve_flags((phys_addr_t)(uintptr_t)_start,
-                                         gd->mon_len, LMB_NOOVERWRITE);
-
-               break;
-       }
-}
-
 /**
  * efi_lmb_reserve() - add reservations for EFI memory
  *
@@ -215,10 +180,50 @@ static __maybe_unused int efi_lmb_reserve(void)
        return 0;
 }
 
+static void lmb_reserve_uboot_region(void)
+{
+       int bank;
+       ulong end, bank_end;
+       phys_addr_t rsv_start;
+
+       rsv_start = gd->start_addr_sp - CONFIG_STACK_SIZE;
+       end = gd->ram_top;
+
+       /*
+        * Reserve memory from aligned address below the bottom of U-Boot stack
+        * until end of RAM area to prevent LMB from overwriting that memory.
+        */
+       debug("## Current stack ends at 0x%08lx ", (ulong)rsv_start);
+
+       /* adjust sp by 16K to be safe */
+       rsv_start -= SZ_16K;
+       for (bank = 0; bank < CONFIG_NR_DRAM_BANKS; bank++) {
+               if (!gd->bd->bi_dram[bank].size ||
+                   rsv_start < gd->bd->bi_dram[bank].start)
+                       continue;
+               /* Watch out for RAM at end of address space! */
+               bank_end = gd->bd->bi_dram[bank].start +
+                       gd->bd->bi_dram[bank].size - 1;
+               if (rsv_start > bank_end)
+                       continue;
+               if (bank_end > end)
+                       bank_end = end - 1;
+
+               lmb_reserve_flags(rsv_start, bank_end - rsv_start + 1,
+                                 LMB_NOOVERWRITE);
+
+               if (gd->flags & GD_FLG_SKIP_RELOC)
+                       lmb_reserve_flags((phys_addr_t)(uintptr_t)_start,
+                                         gd->mon_len, LMB_NOOVERWRITE);
+
+               break;
+       }
+}
+
 static void lmb_reserve_common(void *fdt_blob)
 {
-       arch_lmb_reserve();
        board_lmb_reserve();
+       lmb_reserve_uboot_region();
 
        if (CONFIG_IS_ENABLED(OF_LIBFDT) && fdt_blob)
                boot_fdt_add_mem_rsv_regions(fdt_blob);
@@ -690,11 +695,6 @@ __weak void board_lmb_reserve(void)
        /* please define platform specific board_lmb_reserve() */
 }
 
-__weak void arch_lmb_reserve(void)
-{
-       /* please define platform specific arch_lmb_reserve() */
-}
-
 static int lmb_setup(void)
 {
        bool ret;