From: Caleb Connolly Date: Fri, 11 Apr 2025 12:47:38 +0000 (+0200) Subject: event: signal when livetree has been built X-Git-Tag: v2025.07-rc2~44^2~7 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=993a9db918af451c68851522c8770e582b717629;p=thirdparty%2Fu-boot.git event: signal when livetree has been built 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 --- diff --git a/common/event.c b/common/event.c index dda569d4478..8d7513eb10b 100644 --- a/common/event.c +++ b/common/event.c @@ -48,6 +48,9 @@ const char *const type_name[] = { /* main loop events */ "main_loop", + + /* livetree has been built */ + "of_live_init", }; _Static_assert(ARRAY_SIZE(type_name) == EVT_COUNT, "event type_name size"); diff --git a/include/event.h b/include/event.h index 75141a192a4..1d267f1d105 100644 --- a/include/event.h +++ b/include/event.h @@ -153,6 +153,15 @@ enum event_t { */ 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. + */ + EVT_OF_LIVE_BUILT, + /** * @EVT_COUNT: * This constants holds the maximum event number + 1 and is used when @@ -203,6 +212,15 @@ union event_data { 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; }; /** diff --git a/lib/of_live.c b/lib/of_live.c index 90b9459ede3..c1620616513 100644 --- a/lib/of_live.c +++ b/lib/of_live.c @@ -11,6 +11,7 @@ #define LOG_CATEGORY LOGC_DT #include +#include #include #include #include @@ -321,6 +322,7 @@ 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); @@ -335,6 +337,15 @@ int of_live_build(const void *fdt_blob, struct device_node **rootp) } 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; + } + } + return ret; }