[PATCH 1/6] event: signal when livetree has been built

Caleb Connolly caleb.connolly at linaro.org
Thu Apr 10 16:04:40 CEST 2025



On 4/10/25 15:07, Simon Glass wrote:
> Hi Caleb,
> 
> On Thu, 10 Apr 2025 at 07:00, Caleb Connolly <caleb.connolly at linaro.org> wrote:
>>
>> Hi Simon,
>>
>> On 4/10/25 13:27, Simon Glass wrote:
>>> Hi Caleb,
>>>
>>> On Wed, 9 Apr 2025 at 11:17, Caleb Connolly <caleb.connolly at linaro.org> wrote:
>>>>
>>>> OF_LIVE offers a variety of benefits, one of them being that the live
>>>> tree can be modified without caring about the underlying FDT. This is
>>>> particularly valuable for working around U-Boot limitations like lacking
>>>> USB superspeed support on Qualcomm platforms, no runtime OTG, or
>>>> peripherals like the sdcard being broken (and displaying potentially
>>>> worrying error messages).
>>>>
>>>> Add an event to signal when the live tree has been built so that we can
>>>> apply fixups to it directly before devices are bound.
>>>>
>>>> Signed-off-by: Caleb Connolly <caleb.connolly at linaro.org>
>>>> ---
>>>>    common/event.c  | 3 +++
>>>>    include/event.h | 9 +++++++++
>>>>    lib/of_live.c   | 3 +++
>>>>    3 files changed, 15 insertions(+)
>>>>
>>>> diff --git a/common/event.c b/common/event.c
>>>> index dda569d447851f559a83f98fb7b1f3543156eab5..8d7513eb10b61919e1e784481dfdcc076be14986 100644
>>>> --- a/common/event.c
>>>> +++ b/common/event.c
>>>> @@ -47,8 +47,11 @@ const char *const type_name[] = {
>>>>           "ft_fixup",
>>>>
>>>>           /* main loop events */
>>>>           "main_loop",
>>>> +
>>>> +       /* livetree has been built */
>>>> +       "of_live_init",
>>>>    };
>>>>
>>>>    _Static_assert(ARRAY_SIZE(type_name) == EVT_COUNT, "event type_name size");
>>>>    #endif
>>>> diff --git a/include/event.h b/include/event.h
>>>> index 75141a192a48b0931667632f41be8ff4d6139f7c..3fc673ba635ed45467aae8587705d37bef1c2a3f 100644
>>>> --- a/include/event.h
>>>> +++ b/include/event.h
>>>> @@ -152,8 +152,17 @@ enum event_t {
>>>>            * A non-zero return value causes the boot to fail.
>>>>            */
>>>>           EVT_MAIN_LOOP,
>>>>
>>>> +       /**
>>>> +        * @EVT_OF_LIVE_INIT:
>>>> +        * This event is triggered immediately after the live device tree has been
>>>> +        * built. This allows for machine specific fixups to be done to the live tree
>>>> +        * (like disabling known-unsupported devices) before DM init happens. This
>>>> +        * event is only available if OF_LIVE is enabled and is only used after relocation.
>>>> +        */
>>>> +       EVT_OF_LIVE_INIT,
>>>> +
>>>>           /**
>>>>            * @EVT_COUNT:
>>>>            * This constants holds the maximum event number + 1 and is used when
>>>>            * looping over all event classes.
>>>> diff --git a/lib/of_live.c b/lib/of_live.c
>>>> index 90b9459ede313e492e28c8556c730f3bd8aaa9df..e1962b8f1fb9d8c2c87d04ca4e238a1e4d00376a 100644
>>>> --- a/lib/of_live.c
>>>> +++ b/lib/of_live.c
>>>> @@ -10,8 +10,9 @@
>>>>
>>>>    #define LOG_CATEGORY   LOGC_DT
>>>>
>>>>    #include <abuf.h>
>>>> +#include <event.h>
>>>>    #include <log.h>
>>>>    #include <linux/libfdt.h>
>>>>    #include <of_live.h>
>>>>    #include <malloc.h>
>>>> @@ -334,8 +335,10 @@ int of_live_build(const void *fdt_blob, struct device_node **rootp)
>>>>                   return ret;
>>>>           }
>>>>           debug("%s: stop\n", __func__);
>>>>
>>>> +       event_notify_null(EVT_OF_LIVE_INIT);
>>>> +
>>>
>>> This should go in initr_of_live() since the function you are dealing
>>> with here is supposed to just do the live build.
>>
>> Well, we only every call this function from one place right now, but if
>> it was called multiple times for some reason then I would want to be
>> able to re-apply fixups to the new live tree.... I guess it should
>> probably pass in *rootp to the event handler, let me rework that.>
> 
> There's no need to change the root, so what you have is find here.
> 
>>> Same for the EFI_STUB thing which I just noticed, actually
>>
>> what EFI_STUB thing?>
> 
> Oh, it's your EFI stub patch which isn't in Tom's tree yet. Just for
> when you get to it, then.
> 
>>> Also please check for error
>>>
>>> Otherwise this seems OK to me. I do wonder why we can't use
>>> EVT_FT_FIXUP though. Could you add mention of that to your comment in
>>> event.h?
>>
>> Because FT_FIXUP is for fixing up the flat tree before starting the OS?
>> these are obviously different things imo, im not sure how i could
>> clarify this.>
> 
> Well, what is the purpose of your code? Are you saying that it is used
> within U-Boot, but not passed to the OS?

Yes, please read the cover letter and commit messages. FT_FIXUP allows 
for the FDT that is about to be passed to the OS to be fixed up, 
OF_LIVE_INIT signifies that U-Boot has finished building it's livetree. 
The livetree is obviously not used outside of U-Boot, being a totally 
custom in-memory representation of the DT.

> 
>>>>           return ret;
>>>>    }
>>>>
>>>>    void of_live_free(struct device_node *root)
>>>>
>>>> --
>>>> 2.49.0
>>>>
> 
> Regards,
> Simon

-- 
Caleb (they/them)



More information about the U-Boot mailing list