Hi Caleb, On Fri, 11 Apr 2025 at 06:47, 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 | 18 ++++++++++++++++++ > lib/of_live.c | 11 +++++++++++ > 3 files changed, 32 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..1d267f1d10547642d381fa287ab4981a2bf03543 > 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_BUILT: > + * 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 it is used. This > + * event is only available if OF_LIVE is enabled and is only used > after relocation.
Add a bit more detail, e.g.: before it is used by U-Boot post-relocation. This means it is possible to affect the devices bound by driver model. You should also note that the flattree is inactive when livetree is used and any changes may eventually be passed onto the OS, if it doesn't have its own devicetree. This is the point we were discussing on the other thread. > + */ > + EVT_OF_LIVE_BUILT, > + > /** > * @EVT_COUNT: > * This constants holds the maximum event number + 1 and is used when > * looping over all event classes. > @@ -202,8 +211,17 @@ union event_data { > struct event_ft_fixup { > oftree tree; > struct bootm_headers *images; > } ft_fixup; > + > + /** > + * struct event_of_live_built - livetree has been built > + * > + * @root: The root node of the live device tree > + */ > + struct event_of_live_built { > + struct device_node *root; > + } of_live_built; > }; > > /** > * struct event - an event that can be sent and received > diff --git a/lib/of_live.c b/lib/of_live.c > index > 90b9459ede313e492e28c8556c730f3bd8aaa9df..c1620616513c2e32448b4a6d156a9162d97c76b7 > 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> > @@ -320,8 +321,9 @@ int unflatten_device_tree(const void *blob, struct > device_node **mynodes) > > int of_live_build(const void *fdt_blob, struct device_node **rootp) > { > int ret; > + union event_data evt; > > debug("%s: start\n", __func__); > ret = unflatten_device_tree(fdt_blob, rootp); > if (ret) { > @@ -334,8 +336,17 @@ int of_live_build(const void *fdt_blob, struct > device_node **rootp) > return ret; > } > debug("%s: stop\n", __func__); > > + if (CONFIG_IS_ENABLED(EVENT)) { > + evt.of_live_built.root = *rootp; > + ret = event_notify(EVT_OF_LIVE_BUILT, &evt, sizeof(evt)); > + if (ret) { > + log_debug("Failed to notify livetree build event: > err=%d\n", ret); > + return ret; > + } > + } > + This should move to the caller of this function. We should also have a sandbox test for this feature, e.g. catch the event and add a node/prop and check in a test in test-fdt.c (or similar) that it is present. I'm not sure if you need to update test_event_dump.py but since CI presumably passes, I guess not. > return ret; > } > > void of_live_free(struct device_node *root) > > -- > 2.49.0 > Regards, Simon