mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-14 00:47:26 +00:00
arm: apple: Fix mem layout
The current approach for setting the environment variables that describe the memory layout runs the risk of overlapping with reserved memory regions. Use the lmb code to derive the addresses for these variables instead. Signed-off-by: Mark Kettenis <kettenis@openbsd.org>
This commit is contained in:
parent
64cabe2491
commit
96eb1413e8
1 changed files with 14 additions and 18 deletions
|
@ -7,6 +7,7 @@
|
|||
#include <dm.h>
|
||||
#include <dm/uclass-internal.h>
|
||||
#include <efi_loader.h>
|
||||
#include <lmb.h>
|
||||
|
||||
#include <asm/armv8/mmu.h>
|
||||
#include <asm/global_data.h>
|
||||
|
@ -267,32 +268,27 @@ u64 get_page_table_size(void)
|
|||
return SZ_256K;
|
||||
}
|
||||
|
||||
#define KERNEL_COMP_SIZE SZ_128M
|
||||
|
||||
int board_late_init(void)
|
||||
{
|
||||
unsigned long base;
|
||||
unsigned long top;
|
||||
struct lmb lmb;
|
||||
u32 status = 0;
|
||||
|
||||
/* Reserve 4M each for scriptaddr and pxefile_addr_r at the top of RAM
|
||||
* at least 1M below the stack.
|
||||
*/
|
||||
top = gd->start_addr_sp - CONFIG_STACK_SIZE - SZ_8M - SZ_1M;
|
||||
top = ALIGN_DOWN(top, SZ_8M);
|
||||
|
||||
status |= env_set_hex("scriptaddr", top + SZ_4M);
|
||||
status |= env_set_hex("pxefile_addr_r", top);
|
||||
lmb_init_and_reserve(&lmb, gd->bd, (void *)gd->fdt_blob);
|
||||
|
||||
/* somewhat based on the Linux Kernel boot requirements:
|
||||
* align by 2M and maximal FDT size 2M
|
||||
*/
|
||||
base = ALIGN(gd->ram_base, SZ_2M);
|
||||
|
||||
status |= env_set_hex("fdt_addr_r", base);
|
||||
status |= env_set_hex("kernel_addr_r", base + SZ_2M);
|
||||
status |= env_set_hex("ramdisk_addr_r", base + SZ_128M);
|
||||
status |= env_set_hex("loadaddr", base + SZ_2G);
|
||||
status |= env_set_hex("kernel_comp_addr_r", base + SZ_2G - SZ_128M);
|
||||
status |= env_set_hex("kernel_comp_size", SZ_128M);
|
||||
status |= env_set_hex("loadaddr", lmb_alloc(&lmb, SZ_1G, SZ_2M));
|
||||
status |= env_set_hex("fdt_addr_r", lmb_alloc(&lmb, SZ_2M, SZ_2M));
|
||||
status |= env_set_hex("kernel_addr_r", lmb_alloc(&lmb, SZ_128M, SZ_2M));
|
||||
status |= env_set_hex("ramdisk_addr_r", lmb_alloc(&lmb, SZ_1G, SZ_2M));
|
||||
status |= env_set_hex("kernel_comp_addr_r",
|
||||
lmb_alloc(&lmb, KERNEL_COMP_SIZE, SZ_2M));
|
||||
status |= env_set_hex("kernel_comp_size", KERNEL_COMP_SIZE);
|
||||
status |= env_set_hex("scriptaddr", lmb_alloc(&lmb, SZ_4M, SZ_2M));
|
||||
status |= env_set_hex("pxefile_addr_r", lmb_alloc(&lmb, SZ_4M, SZ_2M));
|
||||
|
||||
if (status)
|
||||
log_warning("late_init: Failed to set run time variables\n");
|
||||
|
|
Loading…
Reference in a new issue