diff mbox series

uki.bbclass: add merge logic in dtb section

Message ID 20260624023506.1474514-1-shoudil@qti.qualcomm.com
State New
Headers show
Series uki.bbclass: add merge logic in dtb section | expand

Commit Message

Shoudi Li June 24, 2026, 2:35 a.m. UTC
For machine with multiple dtbs specified, we need to merge dtb overlays
to base and pass the merged dtb to ukify to create UKI.
Walks UKI_DEVICETREE, splits entries into base_dtbs (.dtb) and overlays,
and validates all paths exist. For each base DTB, finds matching overlays
by checking whether the overlay filename starts with the base DTB name.

If matches exist, runs fdtoverlay -i <base> <overlays…> -o <B>/<base>-merged.dtb
and passes the merged file to ukify.
If no overlays match, passes the base DTB directly — no change in behaviour for
DTB-only boards.

Signed-off-by: Shoudi Li <shoudil@qti.qualcomm.com>
---
 meta/classes-recipe/uki.bbclass | 28 ++++++++++++++++++++++++++--
 1 file changed, 26 insertions(+), 2 deletions(-)
diff mbox series

Patch

diff --git a/meta/classes-recipe/uki.bbclass b/meta/classes-recipe/uki.bbclass
index fa1c95603b..03eb9eafbd 100644
--- a/meta/classes-recipe/uki.bbclass
+++ b/meta/classes-recipe/uki.bbclass
@@ -61,6 +61,7 @@ 
 #
 
 DEPENDS += "\
+    dtc-native \
     os-release \
     systemd-boot \
     systemd-boot-native \
@@ -150,16 +151,39 @@  python do_uki() {
     if cmdline:
         ukify_cmd += " --cmdline='%s'" % (cmdline)
 
-    # dtb
+    # dtb: separate base DTBs from overlays, merge each base with its matching overlays
     uki_devicetree = d.getVar('UKI_DEVICETREE')
     if uki_devicetree:
+        base_dtbs = []
+        overlays = []
         for dtb in uki_devicetree.split():
             # DTBs are without sub-directories in deploy_dir
             dtb_name = os.path.basename(dtb)
             dtb_path = "%s/%s" % (deploy_dir_image, dtb_name)
             if not os.path.exists(dtb_path):
                 bb.fatal(f"ERROR: cannot find {dtb_path}.")
-            ukify_cmd += " --devicetree %s" % (dtb_path)
+            if dtb_name.endswith('.dtbo'):
+                overlays.append(dtb_path)
+            else:
+                base_dtbs.append(dtb_path)
+
+        fdtoverlay_bin = os.path.join(d.getVar('STAGING_BINDIR_NATIVE'), 'fdtoverlay')
+        build_dir = d.getVar('B')
+        for base_dtb in base_dtbs:
+            base_name = os.path.splitext(os.path.basename(base_dtb))[0]
+            # Overlays whose filename starts with the base DTB name
+            matching_overlays = [o for o in overlays
+                                  if os.path.basename(o).startswith(base_name)]
+            if matching_overlays:
+                merged_dtb = os.path.join(build_dir, "%s-merged.dtb" % base_name)
+                fdtoverlay_cmd = "%s -i %s %s -o %s" % (
+                    fdtoverlay_bin, base_dtb, " ".join(matching_overlays), merged_dtb)
+                bb.debug(2, "uki: merging DTBs: %s" % fdtoverlay_cmd)
+                out, err = bb.process.run(fdtoverlay_cmd, shell=True)
+                bb.debug(2, "%s\n%s" % (out, err))
+                ukify_cmd += " --devicetree %s" % merged_dtb
+            else:
+                ukify_cmd += " --devicetree %s" % base_dtb
 
     # custom config for ukify
     if os.path.exists(d.getVar('UKI_CONFIG_FILE')):