From 6fb4f7387e17664e2e6cea1217fe9e95cc0a1170 Mon Sep 17 00:00:00 2001 From: Janne Grunau Date: Sat, 19 Feb 2022 14:05:19 +0100 Subject: [PATCH] arm: apple: Switch to fully dynamic mem layout Support for Apple M1 Pro and Max will allow using a single binary for all M1 SoCs. The M1 Pro/Max have a different memory layout. The RAM start address is 0x100_0000_0000 instead of 0x8_0000_0000. Replace the hardcoded memory layout with dynamic initialized environment variables in board_late_init(). Tested on Mac Mini (2020) and Macbook Pro 14-inch (2021). Signed-off-by: Janne Grunau Reviewed-by: Mark Kettenis --- arch/arm/mach-apple/board.c | 33 +++++++++++++++++++++++++++++++++ configs/apple_m1_defconfig | 3 ++- include/configs/apple.h | 5 ----- 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/arch/arm/mach-apple/board.c b/arch/arm/mach-apple/board.c index f9f8a2f278..54005f3adf 100644 --- a/arch/arm/mach-apple/board.c +++ b/arch/arm/mach-apple/board.c @@ -265,3 +265,36 @@ u64 get_page_table_size(void) { return SZ_256K; } + +int board_late_init(void) +{ + unsigned long base; + unsigned long top; + 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); + + /* 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); + + if (status) + log_warning("late_init: Failed to set run time variables\n"); + + return 0; +} diff --git a/configs/apple_m1_defconfig b/configs/apple_m1_defconfig index 9254e24699..360ec3f5e0 100644 --- a/configs/apple_m1_defconfig +++ b/configs/apple_m1_defconfig @@ -3,10 +3,11 @@ CONFIG_ARCH_APPLE=y CONFIG_DEFAULT_DEVICE_TREE="t8103-j274" CONFIG_DEBUG_UART_BASE=0x235200000 CONFIG_DEBUG_UART_CLOCK=24000000 -CONFIG_SYS_LOAD_ADDR=0x880000000 +CONFIG_SYS_LOAD_ADDR=0x0 CONFIG_USE_PREBOOT=y # CONFIG_DISPLAY_CPUINFO is not set CONFIG_DISPLAY_BOARDINFO_LATE=y +CONFIG_BOARD_LATE_INIT=y # CONFIG_NET is not set CONFIG_APPLE_SPI_KEYB=y # CONFIG_MMC is not set diff --git a/include/configs/apple.h b/include/configs/apple.h index f12e9bdef5..b06660add4 100644 --- a/include/configs/apple.h +++ b/include/configs/apple.h @@ -9,10 +9,6 @@ "stdout=serial,vidconsole\0" \ "stderr=serial,vidconsole\0" -#define ENV_MEM_LAYOUT_SETTINGS \ - "fdt_addr_r=0x960100000\0" \ - "kernel_addr_r=0x960200000\0" - #if CONFIG_IS_ENABLED(CMD_NVME) #define BOOT_TARGET_NVME(func) func(NVME, nvme, 0) #else @@ -33,7 +29,6 @@ #define CONFIG_EXTRA_ENV_SETTINGS \ ENV_DEVICE_SETTINGS \ - ENV_MEM_LAYOUT_SETTINGS \ BOOTENV #endif -- 2.39.5