On 03/09/2025 23:24, Simon Glass wrote:
Hi,
On Tue, 2 Sept 2025 at 16:48, Casey Connolly casey.connolly@linaro.org wrote:
On 01/09/2025 19:56, Heinrich Schuchardt wrote:
Casey Connolly <casey.connolly@linaro.org mailto:casey.connolly@linaro.org> schrieb am Mo., 1. Sept. 2025, 18:25:
Hi all, Sorry for the inactivity on this one, I'm hoping we can find some agreeable solution. We had some discussion on the GitHub PR [1] where Krzysztof suggested that this property is duplicating the compatible property, while I wish this were the case it is not true that the DT file names follow any kind of scheme that can be reliably derived from the root compatible property. ## Problem description I guess before trying to decide on solutions we should be able to agree on the problem, for which we need to agree on some facts: Fact 1: The kernel and devicetree are not always forwards/backwards compatible with each other Fact 2: Not all ARM platforms ship with a usable firmware-provided devicetree Fact 3: Users expect to be able to install their favourite Linux distro with minimal effort Given (2) and (3) we need to provide a mechanism to load the correct devicetree and overlays with minimal/trivial user intervention. Given (1) we should always try to load the DT and overlays that were shipped with the kernel even if the platform provides its own (while there may be a case where this is undesirable for some reason I would argue that this would be an exception and not the rule and is not directly relevant here). ## Potential solutions Assuming that we can agree on the above, there is clearly the need for a distro-agnostic mechanism to handle loading the right DT and overlays for the device and kernel version that will be booted. Since there is no standard path for the DTB files on the ESP, and the EFI firmware doesn't know which kernel version will be booted this task can't be handled by the firmware itself (and even then, it would be difficult to drive adoption particularly for boards already in production). This leaves us with the following high level options: Option 1: Create some kind of EFI driver/shim to load the DTB and rely on the user to keep it up to date. Option 2: Engage with systemd-boot/GRUB developers and improve the DTB loading experience, e.g. by retrieving the (relative) DTB path (qcom/qcs6490-rb3gen2.dtb) and appending it to the distro-specific dtb dir (typically tied to the kernel version being selected) Option 1 has been attempted already with dtbloader[2] which has seen some very minor adoption, it also causes problems with secureboot and other potential compatibility issues. ## My proposal Thus I propose Option 2, specifically introducing a devicetree-directory config option to the UAPI group BLS (Boot Loader Specification) that would specify the dtbs directory which the dtb path would be appended to, hopefully with a similar option added to GRUB. This still leaves the issue of identifying the path to the DTB file (and potentially overlays). If there is a firmware provided DTB the root compatible property SOMETIMES is enough to derive the path, but often is not. So what it all boils down to is that we still need a way for the user to manually enter the DTB path, but at least it should only be necessary to do it once. Ideally we can get this
It is unclear here if you mean the directory path to all device-trees for a given kernel or a specific dtb file.
I mean the specific DTB for the device, at a high level ignoring implementation details this is the fundamental problem.>
The directory is known when the kernel is installed. And the bootloader (e.g. GRUB) could identify the individual dtb file in that directory via the compatible property of the DT provided by the firmware.
I assume you mean by scanning all the dtbs? This can be pretty slow, there are thousands of them... I guess it could be optimised somewhat but then what if two DTBs have the same compatible? At the end of the day the user should be able to dictate which dtb is used with minimal intervention -- that is what I propose in this mail. Methods to /avoid/ the user having to do this are great, but it's just bikeshedding if we can't agree with the fundamental issue and a universal solution (even if that solution is not optimal in many situations).>
In a secureboot environment a bootloader like GRUB should never load an unsigned device-tree.
Yes, but I would like to avoid bikeshedding on that too, we can get around to solving that independently.>
The best solution I have seen to date is packing all device-trees and the kernel into one signed EFI binary and let the EFI stub choose the right device-tree based on the compatibe string or on SMBIOS information where the firmware does not provide a device-tree.
See for instance https://github.com/ubuntu/stubble https://github.com/ ubuntu/stubble.
See also: systemd ukify with .dtbauto sections (I have no clue why Ubuntu reinvented the wheel on this one...).>
This solution works without any modification of firmware, shim, GRUB, or the kernel and does not need any new EFI variables.
But consider what happens when next gen laptops come out and start to get support, even if the dtb is available in the kernel version you want to boot you have to either jump through all these hoops to build a new UKI with your dtb in (and figure out the correct hwid's to use) or you're stuck waiting for your distro to "gain support".
This is totally unnecessary if we just provided a way for users (who disable secureboot!) to specify the DTB for their laptop.
As an aside, I would also argue that the one-big-image solution with a hwid table completely fails to scale up, the image will become huge and the work to add new devices will never end.
See also this:
Hi Simon,
https://lists.u-boot.org/archives/list/concept@u-boot.org/thread/GS4ELHIF726...
Basically it provides a way for U-Boot to get a compatible string from SMBIOS tables. That is enough to boot the kernel with the right
Isn't this just the same idea as systemd-stub (and ubuntu stubble) but where the logic lives in u-boot (in this case as an EFI app itself)?
devicetree. We should try to avoid worrying about filenames.
The fundamental issue I'm trying to point out here has nothing to do with filenames. I want a way for users of some newly supported laptop (to describe the most common example) to be able to boot a distro (that just packaged the dtb for their new laptop) with minimal intervention, by either creating/modifying some text file to some specify the dtb that should be used, or better: being prompted for it without having to modify their bootable usb drive at all.
Kind regards,>
Presumably it could be expanded to provide a stringlist, if needed?
- Simon
Kind regards,
Best regards
Heinrich
implemented in systemd-boot and GRUB so that the file can be specified once and is then stored in an EFI variable, so if the user boots another distro or something then the variable is used. ## The devicetree-path chosen property Lastly, and the motivation for my DT schema PR, is further optimising this process so that the requirement for user intervention is minimised where possible. My proposal would allow bootloader like U-Boot to embed the DTB path into the DT itself at build time, then at runtime it would be able to set the EFI variable so that no user intervention is required. This is done rather than embedding the path into the U-Boot binary itself since some U-Boot targets are generic across multiple boards. The only viable alternative to adding a property like this would be to actually enforce that the DTB path and compatible property encode the same information so that the path can be derived at runtime, this would require huge changes on the kernel side which I don't feel is justified since it wouldn't even fully solve the underlying issue. I hope this email clarifies the issue at hand and my stance on this topic, it definitely makes me realise there's no reason not to push forwards with my suggest OS loader changes. [1]: https://github.com/devicetree-org/dt-schema/pull/167 <https:// github.com/devicetree-org/dt-schema/pull/167> Kind regards, -- // Casey (she/her) _______________________________________________ boot-architecture mailing list -- boot-architecture@lists.linaro.org <mailto:boot-architecture@lists.linaro.org> To unsubscribe send an email to boot-architecture- leave@lists.linaro.org <mailto:boot-architecture-leave@lists.linaro.org>
-- // Casey (she/her)
boot-architecture mailing list -- boot-architecture@lists.linaro.org To unsubscribe send an email to boot-architecture-leave@lists.linaro.org