From 8cc1d79ed0c3e523e080b9ae9bab35bb6d70d62e Mon Sep 17 00:00:00 2001 From: Alper Nebi Yasak Date: Mon, 5 Feb 2024 20:22:12 +0300 Subject: mainboard/qemu-aarch64: Get top of memory from device-tree blob Trying to probe RAM space to figure out top of memory causes an exception on AArch64 virtual machines with recent versions of QEMU, but we temporarily enable exception handlers for that and use it to help detect if a RAM address is usable or not. However, QEMU docs recommend reading device information from the device-tree blob it provides us at the start of RAM. A previous commit adds a library function to parse device-tree blob that QEMU provides us. Use it to determine top of memory in AArch64 QEMU virtual machines, but still fall back to the RAM probing approach as a last-ditch effort. Change-Id: I4cc888b57cf98e0797ce7f9ddfa2eb34d14cd9c1 Signed-off-by: Alper Nebi Yasak Reviewed-on: https://review.coreboot.org/c/coreboot/+/80364 Reviewed-by: Maximilian Brune Tested-by: build bot (Jenkins) Reviewed-by: Julius Werner Reviewed-by: Nico Huber --- src/mainboard/emulation/qemu-aarch64/Kconfig | 1 + src/mainboard/emulation/qemu-aarch64/cbmem.c | 8 ++++++++ src/mainboard/emulation/qemu-aarch64/memlayout.ld | 1 + 3 files changed, 10 insertions(+) (limited to 'src/mainboard/emulation') diff --git a/src/mainboard/emulation/qemu-aarch64/Kconfig b/src/mainboard/emulation/qemu-aarch64/Kconfig index af689baac3..42f9110df4 100644 --- a/src/mainboard/emulation/qemu-aarch64/Kconfig +++ b/src/mainboard/emulation/qemu-aarch64/Kconfig @@ -11,6 +11,7 @@ config BOARD_SPECIFIC_OPTIONS select ARCH_VERSTAGE_ARMV8_64 select ARCH_ROMSTAGE_ARMV8_64 select ARCH_RAMSTAGE_ARMV8_64 + select FLATTENED_DEVICE_TREE select ARM64_USE_ARCH_TIMER select BOARD_ROMSIZE_KB_16384 select BOOTBLOCK_CUSTOM diff --git a/src/mainboard/emulation/qemu-aarch64/cbmem.c b/src/mainboard/emulation/qemu-aarch64/cbmem.c index 389ff4ead0..4cdd44f993 100644 --- a/src/mainboard/emulation/qemu-aarch64/cbmem.c +++ b/src/mainboard/emulation/qemu-aarch64/cbmem.c @@ -3,8 +3,16 @@ #include #include #include +#include +DECLARE_REGION(fdt) uintptr_t cbmem_top_chipset(void) { + uint64_t top; + + top = fdt_get_memory_top((void *)_fdt); + if (top) + return MIN(top, (uint64_t)4 * GiB - 1); + return (uintptr_t)_dram + (probe_ramsize((uintptr_t)_dram, CONFIG_DRAM_SIZE_MB) * MiB); } diff --git a/src/mainboard/emulation/qemu-aarch64/memlayout.ld b/src/mainboard/emulation/qemu-aarch64/memlayout.ld index 9c1bb197ce..d27c0158cf 100644 --- a/src/mainboard/emulation/qemu-aarch64/memlayout.ld +++ b/src/mainboard/emulation/qemu-aarch64/memlayout.ld @@ -18,6 +18,7 @@ SECTIONS BL31(0xe000000, 0x1000000) DRAM_START(0x40000000) + REGION(fdt, 0x40000000, 1M, 8) BOOTBLOCK(0x60010000, 64K) STACK(0x60020000, 54K) CBFS_MCACHE(0x6002D800, 8K) -- cgit v1.2.3