[PATCH] kbuild: dtc: Allow adding device tree fragments via config
Ahmad Fatoum
a.fatoum at pengutronix.de
Wed Sep 22 01:54:25 PDT 2021
Hi,
On 20.09.21 22:43, Trent Piepho wrote:
> On Mon, Sep 20, 2021 at 2:02 AM Ahmad Fatoum <a.fatoum at pengutronix.de> wrote:
>>
>>>>> Preprocessing the dts file gains another layer, where a generated dts
>>>>> source consisting of an include directive for the original dts source is
>>>>> followed by more includes for each fragment. This is piped to the
>>>>> existing preprocessor call on stdin to avoid another temporary file.
>>>>> cpp/dtc will correctly identify errors in the source files they occur
>>>>> in. The -MT option is used so the cpp auto-dependencies reference the
>>>>> original dts source and not the generated code passed on stdin.
>>>>
>>>> If you go this route wouldn't you want to apply device tree overlays?
>>>
>>> Can the Barebox apply overlays to the *Barebox dtb* when it starts?
>>
>> I meant overlay application at compile time. I have no experience with
>> that and was interested to hear your opinion on it.
>
> This could be done, but I think overall it is worse. Additional
> fragments can be made into dtbo files and then fdtoverlay from dtc
> package can apply them to the main dtb at compile time. But there are
> drawbacks:
> dtb must be compiled with symbols, which makes it larger. And
> non-fragment users get a different dtb than before for no reason.
> One can not use the preprocessor to control overlays per board. Such
> as changing a node name from <&nand> to <&emmc> based on board or
> enabling/disable the entire fragment.
> The overlay can not delete nodes or properties, i.e. /delete-property/
> and /delete-node/ are not useful.
>
> A possible benefit of overlays is if an overlay is used in many
> different images, then it could be compiled only once. But dtc is not
> any slower to compile a dts fragment append to the main dts than
> fdoverlay is to apply an already compiled dtbo to the main dtb, so
> there is not even a build time improvement here.
>
> So, I can see only disadvantages and not advantages for compile time overlays.
>
> Maybe one could ship a firmware update with a pool of overlays, then
> firmware update installation could construct a final dtb from hardware
> variant appropriate overlays. That would be a way to make use of
> non-dynamic overlays. Otherwise I think there is no advantage to
> non-runtime applied overlays over appended dts fragments.
Thanks for the clarification. Doesn't sound appropriate indeed.
>> There is an easy way out, define the (sanitized) board name as a macro
>> and let users worry about it.
>
> Ok, I can add that. I think the same identifier as constructed for
> the C symbol of the compiled in dtb bytes will work.
Ye, that would be nice.
>>> That is the use case here. So I can use rauc with just the standard
>>> Barebox source without needing to patch it.
>>
>> I see the utility when using e.g. evaluation kits barebox already
>> supports. Could be useful for DistroKit if RAUC support were to
>> be added.
>
> I used this originally for a devkit. But it is Variscite's DART-6UL,
> which is not supported in Barebox. So I added support. But not just
> support for the one thing my FW does, support as a proper Barebox
> devkit target.
>
> Now I want to change the flash partitions for my specific FW design
> and also want RAUC and barebox-state. Should I include this in my
> Barebox devkit support? No one else wants it, at least not as I have
> implemented it. Should other users submit patches to Barebox to
> change the partitions to what they want? Of course not.
>
> My answer is I should not have to patch Barebox to do this. I do not
> patch Barebox to change the defconfig I'm building with. I do not
> patch RAUC to configure it. I do not patch wic to change my SD card
> partitions.
>
> Now we have made a custom board for the next phase and I have added a
> new board to Barebox for this. But still I use external dts fragments
> despite having my FW specific Barebox git repo. Because I do not want
> FW system configuration to be done inside the bootloader codebase. It
> is much better if it is part of my FW git repo that configures
> everything else in the system too.
If all you need to change is config/DT/environment, I guess this works.
We often do need customer-specific board code (detect optional USB stick,
apply device tree fixups, address some hardware quirk...), which is why
this approach here was a bit new to me.
> In the old days, we had to patch a header in U-Boot to change *any*
> bootloader configuration. Yuck! Then we had Barebox and it used the
> kernel config system and we could have an external defconfig. So much
> better! And Linux had board code with compiled in driver
> configuration data, but then we got OF device trees and it was much
> better.
>
> So I want external dts files with Barebox. Complete external dts is
> really hard to do with the way Barebox images work. But really, I
> never write a complete dts from scatch. It is always a modification of
> a base dts. This patch to Barebox is not very complex and it lets me
> do anything I have ever wanted to do with external Linux dts files in
> Barebox.
I see.
>>> If I was building two different
>>> boards under yocto, I would have a machine specific override in my
>>> barebox bbappend to add the only dts fragment for board I was building
>>> for. Yocto builds a different copy of barebox for each
>>> target/machine. I do not need barebox to use the preprocessor to turn
>>> off the fragment I am not using. I would not have yocto give it the
>>> unused fragment in the first place.
>>
>> I usually avoid Yocto MACHINEs for board variants. Build same rootfs
>> for both variants, ship two device trees and reference them either
>> from FIT configurations or bootloader specs and let the bootloader worry
>> about selecting the correct DT to boot.
>
> When I have done one FW for multiple boards, I've always been able to
> use the same bootloader and have it, or a preloader, determine board,
> usually by resistor strapping on a GPIO or ADC, so it is easy to use
> without drivers and to keep consistent on each board variant. But if
> one simply could not do that, then I see that multiple images from a
> single Barebox machine target would be useful. Also useful for
> Buildroot, which is not as sophisticated as Yocto when it comes to
> building a package in different ways. One gets one target or one
> host. Not target-arm, target-arm-machineA, target-arm-machineB, etc.
> like Yocto.
Thanks,
Ahmad
--
Pengutronix e.K. | |
Steuerwalder Str. 21 | http://www.pengutronix.de/ |
31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
More information about the barebox
mailing list