Hi Caleb,

On Wed, 9 Apr 2025 at 11:17, Caleb Connolly <caleb.conno...@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.conno...@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.

Same for the EFI_STUB thing which I just noticed, actually

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?

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

Regards,
Simon

Reply via email to