mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-19 19:34:35 +00:00
lmb: do away with arch_lmb_reserve()
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>
This commit is contained in:
parent
17f695dd1b
commit
6534d26ee9
13 changed files with 42 additions and 197 deletions
|
@ -10,7 +10,6 @@
|
||||||
#include <linux/compiler.h>
|
#include <linux/compiler.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/log2.h>
|
#include <linux/log2.h>
|
||||||
#include <lmb.h>
|
|
||||||
#include <asm/arcregs.h>
|
#include <asm/arcregs.h>
|
||||||
#include <asm/arc-bcr.h>
|
#include <asm/arc-bcr.h>
|
||||||
#include <asm/cache.h>
|
#include <asm/cache.h>
|
||||||
|
@ -820,16 +819,3 @@ void sync_n_cleanup_cache_all(void)
|
||||||
|
|
||||||
__ic_entire_invalidate();
|
__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);
|
|
||||||
}
|
|
||||||
|
|
|
@ -11,7 +11,6 @@
|
||||||
* Marius Groeger <mgroeger@sysgo.de>
|
* Marius Groeger <mgroeger@sysgo.de>
|
||||||
*/
|
*/
|
||||||
#include <init.h>
|
#include <init.h>
|
||||||
#include <lmb.h>
|
|
||||||
#include <asm/global_data.h>
|
#include <asm/global_data.h>
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
@ -33,16 +32,3 @@ int arch_reserve_stacks(void)
|
||||||
|
|
||||||
return 0;
|
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);
|
|
||||||
}
|
|
||||||
|
|
|
@ -9,7 +9,6 @@
|
||||||
#include <command.h>
|
#include <command.h>
|
||||||
#include <env.h>
|
#include <env.h>
|
||||||
#include <image.h>
|
#include <image.h>
|
||||||
#include <lmb.h>
|
|
||||||
#include <log.h>
|
#include <log.h>
|
||||||
#include <asm/global_data.h>
|
#include <asm/global_data.h>
|
||||||
#include <u-boot/zlib.h>
|
#include <u-boot/zlib.h>
|
||||||
|
@ -27,14 +26,8 @@ DECLARE_GLOBAL_DATA_PTR;
|
||||||
#define LINUX_MAX_ENVS 256
|
#define LINUX_MAX_ENVS 256
|
||||||
#define LINUX_MAX_ARGS 256
|
#define LINUX_MAX_ARGS 256
|
||||||
|
|
||||||
static ulong get_sp (void);
|
|
||||||
static void set_clocks_in_mhz (struct bd_info *kbd);
|
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)
|
int do_bootm_linux(int flag, struct bootm_info *bmi)
|
||||||
{
|
{
|
||||||
struct bootm_headers *images = bmi->images;
|
struct bootm_headers *images = bmi->images;
|
||||||
|
@ -88,16 +81,6 @@ error:
|
||||||
return 1;
|
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)
|
static void set_clocks_in_mhz (struct bd_info *kbd)
|
||||||
{
|
{
|
||||||
char *s;
|
char *s;
|
||||||
|
|
|
@ -15,7 +15,6 @@
|
||||||
#include <fdt_support.h>
|
#include <fdt_support.h>
|
||||||
#include <hang.h>
|
#include <hang.h>
|
||||||
#include <image.h>
|
#include <image.h>
|
||||||
#include <lmb.h>
|
|
||||||
#include <log.h>
|
#include <log.h>
|
||||||
#include <asm/cache.h>
|
#include <asm/cache.h>
|
||||||
#include <asm/global_data.h>
|
#include <asm/global_data.h>
|
||||||
|
@ -24,19 +23,6 @@
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
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)
|
static void boot_jump_linux(struct bootm_headers *images, int flag)
|
||||||
{
|
{
|
||||||
void (*thekernel)(char *cmdline, ulong rd, ulong dt);
|
void (*thekernel)(char *cmdline, ulong rd, ulong dt);
|
||||||
|
|
|
@ -9,7 +9,6 @@
|
||||||
#include <env.h>
|
#include <env.h>
|
||||||
#include <image.h>
|
#include <image.h>
|
||||||
#include <fdt_support.h>
|
#include <fdt_support.h>
|
||||||
#include <lmb.h>
|
|
||||||
#include <log.h>
|
#include <log.h>
|
||||||
#include <asm/addrspace.h>
|
#include <asm/addrspace.h>
|
||||||
#include <asm/global_data.h>
|
#include <asm/global_data.h>
|
||||||
|
@ -28,20 +27,6 @@ static char **linux_env;
|
||||||
static char *linux_env_p;
|
static char *linux_env_p;
|
||||||
static int linux_env_idx;
|
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)
|
static void linux_cmdline_init(void)
|
||||||
{
|
{
|
||||||
linux_argc = 1;
|
linux_argc = 1;
|
||||||
|
|
|
@ -64,16 +64,3 @@ int do_bootm_linux(int flag, struct bootm_info *bmi)
|
||||||
|
|
||||||
return 1;
|
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);
|
|
||||||
}
|
|
||||||
|
|
|
@ -36,7 +36,6 @@
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
static ulong get_sp (void);
|
|
||||||
extern void ft_fixup_num_cores(void *blob);
|
extern void ft_fixup_num_cores(void *blob);
|
||||||
static void set_clocks_in_mhz (struct bd_info *kbd);
|
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;
|
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)
|
static void set_clocks_in_mhz (struct bd_info *kbd)
|
||||||
{
|
{
|
||||||
char *s;
|
char *s;
|
||||||
|
|
|
@ -133,16 +133,3 @@ int do_bootm_vxworks(int flag, struct bootm_info *bmi)
|
||||||
{
|
{
|
||||||
return do_bootm_linux(flag, 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);
|
|
||||||
}
|
|
||||||
|
|
|
@ -101,16 +101,3 @@ int do_bootm_linux(int flag, struct bootm_info *bmi)
|
||||||
/* does not return */
|
/* does not return */
|
||||||
return 1;
|
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);
|
|
||||||
}
|
|
||||||
|
|
|
@ -253,21 +253,3 @@ int do_bootm_linux(int flag, struct bootm_info *bmi)
|
||||||
|
|
||||||
return boot_jump_linux(images);
|
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);
|
|
||||||
}
|
|
||||||
|
|
|
@ -197,16 +197,3 @@ int do_bootm_linux(int flag, struct bootm_info *bmi)
|
||||||
|
|
||||||
return 1;
|
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);
|
|
||||||
}
|
|
||||||
|
|
|
@ -108,8 +108,6 @@ void lmb_dump_all(void);
|
||||||
void lmb_dump_all_force(void);
|
void lmb_dump_all_force(void);
|
||||||
|
|
||||||
void board_lmb_reserve(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);
|
struct lmb *lmb_get(void);
|
||||||
int lmb_push(struct lmb *store);
|
int lmb_push(struct lmb *store);
|
||||||
|
|
84
lib/lmb.c
84
lib/lmb.c
|
@ -18,6 +18,7 @@
|
||||||
#include <asm/global_data.h>
|
#include <asm/global_data.h>
|
||||||
#include <asm/sections.h>
|
#include <asm/sections.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/sizes.h>
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
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);
|
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
|
* efi_lmb_reserve() - add reservations for EFI memory
|
||||||
*
|
*
|
||||||
|
@ -215,10 +180,50 @@ static __maybe_unused int efi_lmb_reserve(void)
|
||||||
return 0;
|
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)
|
static void lmb_reserve_common(void *fdt_blob)
|
||||||
{
|
{
|
||||||
arch_lmb_reserve();
|
|
||||||
board_lmb_reserve();
|
board_lmb_reserve();
|
||||||
|
lmb_reserve_uboot_region();
|
||||||
|
|
||||||
if (CONFIG_IS_ENABLED(OF_LIBFDT) && fdt_blob)
|
if (CONFIG_IS_ENABLED(OF_LIBFDT) && fdt_blob)
|
||||||
boot_fdt_add_mem_rsv_regions(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() */
|
/* 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)
|
static int lmb_setup(void)
|
||||||
{
|
{
|
||||||
bool ret;
|
bool ret;
|
||||||
|
|
Loading…
Add table
Reference in a new issue