@@ -19,6 +19,9 @@ source scripts/common.bash
: "${EFI_UEFI:=/usr/share/qemu-efi-aarch64/QEMU_EFI.fd}"
: "${EFI_TEST:=efi-tests}"
: "${EFI_CASE:=$(basename $1 .efi)}"
+: "${EFI_VAR_GUID:=97ef3e03-7329-4a6a-b9ba-6c1fdcc5f823}"
+
+[ "$EFI_USE_ACPI" = "y" ] || EFI_USE_DTB=y
if [ ! -f "$EFI_UEFI" ]; then
echo "UEFI firmware not found: $EFI_UEFI"
@@ -53,6 +56,12 @@ mkdir -p "$EFI_CASE_DIR"
cp "$EFI_SRC/$EFI_CASE.efi" "$EFI_TEST/$EFI_CASE/"
echo "@echo -off" > "$EFI_TEST/$EFI_CASE/startup.nsh"
+if [ "$EFI_USE_DTB" = "y" ]; then
+ qemu_args+=(-machine acpi=off)
+ FDT_BASENAME="dtb"
+ $(EFI_RUN=y $TEST_DIR/run -machine dumpdtb="$EFI_TEST/$EFI_CASE/$FDT_BASENAME" "${qemu_args[@]}")
+ echo "setvar fdtfile -guid $EFI_VAR_GUID -rt =L\"$FDT_BASENAME\"" >> "$EFI_TEST/$EFI_CASE/startup.nsh"
+fi
echo "$EFI_CASE.efi" "${cmd_args[@]}" >> "$EFI_TEST/$EFI_CASE/startup.nsh"
EFI_RUN=y $TEST_DIR/run \
@@ -329,6 +329,8 @@ static efi_status_t efi_mem_init(efi_bootinfo_t *efi_bootinfo)
struct mem_region r;
uintptr_t text = (uintptr_t)&_text, etext = __ALIGN((uintptr_t)&_etext, 4096);
uintptr_t data = (uintptr_t)&_data, edata = __ALIGN((uintptr_t)&_edata, 4096);
+ const void *fdt = efi_bootinfo->fdt;
+ int fdt_size, ret;
/*
* Record the largest free EFI_CONVENTIONAL_MEMORY region
@@ -393,6 +395,17 @@ static efi_status_t efi_mem_init(efi_bootinfo_t *efi_bootinfo)
}
mem_region_add(&r);
}
+ if (fdt) {
+ /* Move the FDT to the base of free memory */
+ fdt_size = fdt_totalsize(fdt);
+ ret = fdt_move(fdt, (void *)free_mem_start, fdt_size);
+ assert(ret == 0);
+ ret = dt_init((void *)free_mem_start);
+ assert(ret == 0);
+ free_mem_start += ALIGN(fdt_size, EFI_PAGE_SIZE);
+ free_mem_pages -= ALIGN(fdt_size, EFI_PAGE_SIZE) >> EFI_PAGE_SHIFT;
+ }
+
__phys_end &= PHYS_MASK;
asm_mmu_disable();
@@ -440,10 +453,12 @@ efi_status_t setup_efi(efi_bootinfo_t *efi_bootinfo)
return status;
}
- status = setup_rsdp(efi_bootinfo);
- if (status != EFI_SUCCESS) {
- printf("Cannot find RSDP in EFI system table\n");
- return status;
+ if (!dt_available()) {
+ status = setup_rsdp(efi_bootinfo);
+ if (status != EFI_SUCCESS) {
+ printf("Cannot find RSDP in EFI system table\n");
+ return status;
+ }
}
psci_set_conduit();
This patch uses the fdt pointer provided through efi_bootinfo_t for tests that run as EFI apps. As in Linux, we give priority to the fdt. First, we check if the pointer to the fdt is set and only if it isn't we fallback to using the ACPI. In addition, this patches changes the efi run script to generate and use a fdt unless the user has set the enviroment variable EFI_USE_ACPI to 'y'. As a result: $> ./arm/efi/run ./arm/selftest.efi -append "setup smp=2 mem=256" -smp 2 -m 256 will use an fdt, where as $> EFI_USE_ACPI=y ./arm/efi/run ./arm/selftest.efi -append "setup smp=2 mem=256" -smp 2 -m 256 will run relying on ACPI. Signed-off-by: Nikos Nikoleris <nikos.nikoleris@arm.com> --- arm/efi/run | 9 +++++++++ lib/arm/setup.c | 23 +++++++++++++++++++---- 2 files changed, 28 insertions(+), 4 deletions(-)