[PATCH] efi_loader: Ignore DT when ACPI is on

Alexander Graf agraf at csgraf.de
Sun Feb 27 17:49:04 CET 2022


Hey Heinrich,

On 27.02.22 16:33, Heinrich Schuchardt wrote:
> On 2/27/22 15:13, Alexander Graf wrote:
>>
>> On 27.02.22 14:07, Mark Kettenis wrote:
>>>> From: Alexander Graf <agraf at csgraf.de>
>>>> Date: Sun, 27 Feb 2022 13:18:56 +0100
>>>>
>>>> For targets that enable ACPI, we should not pass Device Trees into
>>>> the payload. However, our distro boot logic always passes the builtin
>>>> DT as an argument.
>
> Hello Alex,
>
> nice to see you back at U-Boot.


Thanks :)


> If CONFIG_GENERATE_ACPI_TABLE=n, no ACPI table is generated. In this
> case U-Boot may fall back to the built in devicetree.
>
> If CONFIG_GENERATE_ACPI_TABLE=y, copy_fdt() does not exist and a
> device-tree cannot be supplied to the EFI binary. If you still try
> supply a device tree, the bootefi command writes an error an refuses to
> boot.


This is the case I fell into (and that this patch touches), yes :).


> With which defconfig does this lead to a boot failure?


This is with the qemu_arm64_defconfig and this on top:

echo -e 
'CONFIG_ACPIGEN=y\nCONFIG_GENERATE_ACPI_TABLE=y\nCONFIG_CMD_ACPI=y' >> 
.config

I haven't fully made up my mind whether this is something we'll want a 
separate defconfig for eventually. I just wanted to play a bit with 
loading Windows 10/11 via U-Boot :).


> Which board supplies ${fdt_addr_r} and has CONFIG_GENERATE_ACPI_TABLE=y?


I don't see fdt_addr_r supplied at all in the QEMU env - there's only 
$fdtcontroladdr which gets passed from QEMU. QEMU passes both to the 
VM's firmware - DT via memory and location in register as well as ACPI 
via fw_cfg.

I'm also not running the bootmgr code path. Since I have no env with 
explicit boot entries, I run into the fallback case which always passes 
a DT to the payload (line 147 in config_distro_bootcmd.h).


Alex


>
> See include/config_distro_bootcmd.h line 127ff.
>
> Best regards
>
> Heinrich
>
>>>>
>>>> To make it easy to use ACPI with distro boot, let's just ignore the DT
>>>> argument to bootefi when ACPI is enabled. That way, we can 
>>>> successfully
>>>> distro boot payloads on ACPI enabled targets.
>>> I've never understood why it is bad to provide both the DT and ACPI
>>> tables.  Several TianoCore EDK2 based firmwares do this or at least
>>> give you the option to do this.  And it works fine.  If both are
>>> provided, you just leave it up to the OS to decide what it wants to
>>> use.  Which makes me think the text was put there in the standard by
>>> people with an agenda...
>>
>>
>> It's much more profane :). Upstream Linux went with "DT first, ACPI
>> last" while RHEL had a downstream patch that went "ACPI first, DT last".
>> And then people were confused why RHEL and upstream kernels had such
>> vastly different behavior on their systems.
>>
>> Long story short, the best way to avoid this ambiguity is to only
>> provide one of the 2 to the OS. And that's what the BBRs dictate now.
>> They don't dictate what firmware does internally though, so we're free
>> to do whatever we like - and I think "if someone went through the effort
>> to enable ACPI on this system, they probably want to use it" is a fair
>> assumption with U-Boot. So we should prefer ACPI if available.
>>
>>
>> Alex
>>
>>
>>>
>>> I think it would be good for U-Boot to give users a choice here, with
>>> all possible combinations (only DT, only ACPI, both DT and ACPI).  But
>>> this is a step in the right direction.
>>>
>>> Reviewed-by: Mark Kettenis <kettenis at openbsd.org>
>>>
>>>> Signed-off-by: Alexander Graf <agraf at csgraf.de>
>>>> ---
>>>>   cmd/bootefi.c | 4 ++--
>>>>   1 file changed, 2 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/cmd/bootefi.c b/cmd/bootefi.c
>>>> index 94d18ca73f..2c9bc0dcd2 100644
>>>> --- a/cmd/bootefi.c
>>>> +++ b/cmd/bootefi.c
>>>> @@ -265,8 +265,8 @@ efi_status_t efi_install_fdt(void *fdt)
>>>>        */
>>>>   #if CONFIG_IS_ENABLED(GENERATE_ACPI_TABLE)
>>>>       if (fdt) {
>>>> -        log_err("ERROR: can't have ACPI table and device tree.\n");
>>>> -        return EFI_LOAD_ERROR;
>>>> +        log_warning("WARNING: Can't have ACPI table and device tree
>>>> - ignoring DT.\n");
>>>> +        return EFI_SUCCESS;
>>>>       }
>>>>   #else
>>>>       bootm_headers_t img = { 0 };
>>>> -- 
>>>> 2.32.0
>>>>
>>>>
>


More information about the U-Boot mailing list