* [PATCH v6] kernel-fit-image: allow extending compatible string property for DTBs
@ 2025-10-12 16:24 Kavinaya S
2025-10-14 5:35 ` [OE-core] " Mathieu Dubois-Briand
0 siblings, 1 reply; 3+ messages in thread
From: Kavinaya S @ 2025-10-12 16:24 UTC (permalink / raw)
To: openembedded-core; +Cc: Kavinaya S, Alexander Kanavin, Dmitry Baryshkov
The Linux kernel allows multiple DTBs to share the same compatible string.
For example:
qcs6490-rb3gen2.dtb
qcs6490-rb3gen2-vision-mezzanine.dtb
qcs6490-rb3gen2-industrial-mezzanine.dtb
All of these use the same base compatible string:
compatible = "qcom,qcs6490-rb3gen2", "qcom,qcm6490";
Since the latter two DTBs are overlays on top of the base DTB and do not
modify platform properties, they retain the same compatible string.
When these DTBs are bundled into a single fitImage, the bootloader cannot
distinguish between them due to identical compatible strings.
To address this, introduce a mechanism to extend the compatible string
using a OE build variable:
FIT_DTB_COMPATIBLE_EXTENSION[dtb_name] = "extension"
This appends the extension to the first compatible string in the DTB,
resulting in unique entries in the generated .its file. For example:
FIT_DTB_COMPATIBLE_EXTENSION[qcs6490-rb3gen2-vision-mezzanine] = "vision"
FIT_DTB_COMPATIBLE_EXTENSION[qcs6490-rb3gen2-industrial-mezzanine] = "industrial"
Generates:
compatible = "qcom,qcs6490-rb3gen2-vision", "qcom,qcm6490";
compatible = "qcom,qcs6490-rb3gen2-industrial", "qcom,qcm6490";
Suggested-By: Alexander Kanavin <alex.kanavin@gmail.com>
Suggested-By: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Signed-off-by: Kavinaya S <kavinaya@qti.qualcomm.com>
---
meta/classes-recipe/kernel-fit-image.bbclass | 8 ++-
meta/conf/image-fitimage.conf | 12 +++++
meta/lib/oe/fitimage.py | 4 +-
meta/lib/oeqa/selftest/cases/fitimage.py | 55 ++++++++++++++++++++
4 files changed, 77 insertions(+), 2 deletions(-)
diff --git a/meta/classes-recipe/kernel-fit-image.bbclass b/meta/classes-recipe/kernel-fit-image.bbclass
index f04aee1807..3fd31db478 100644
--- a/meta/classes-recipe/kernel-fit-image.bbclass
+++ b/meta/classes-recipe/kernel-fit-image.bbclass
@@ -84,8 +84,14 @@ python do_compile() {
# Copy the dtb or dtbo file into the FIT image assembly directory
shutil.copyfile(os.path.join(kernel_deploydir, dtb_name), dtb_name)
+
+ # Consider compatible extension if avilable
+ name, ext = os.path.splitext(dtb_name)
+ extension = (d.getVarFlag("FIT_DTB_COMPATIBLE_EXTENSION", name) or "").strip()
+
root_node.fitimage_emit_section_dtb(dtb_name, dtb_name,
- d.getVar("UBOOT_DTB_LOADADDRESS"), d.getVar("UBOOT_DTBO_LOADADDRESS"))
+ d.getVar("UBOOT_DTB_LOADADDRESS"), d.getVar("UBOOT_DTBO_LOADADDRESS"),
+ compatible_extension=extension)
if external_kernel_devicetree:
# iterate over all .dtb and .dtbo files in the external kernel devicetree directory
diff --git a/meta/conf/image-fitimage.conf b/meta/conf/image-fitimage.conf
index 090ee148f4..b00c1ad814 100644
--- a/meta/conf/image-fitimage.conf
+++ b/meta/conf/image-fitimage.conf
@@ -65,3 +65,15 @@ FIT_ADDRESS_CELLS ?= "1"
# Machine configurations needing such a script file should include it in the
# SRC_URI of the kernel recipe and set the FIT_UBOOT_ENV parameter.
FIT_UBOOT_ENV ?= ""
+
+# For specific DTBs extend "compatible" strings when creating FIT images.
+# Format:
+# FIT_DTB_COMPATIBLE_EXTENSION[<dtb_name>] = "<extension>"
+#
+# Result:
+# dtb_name.dtb {
+# ...
+# compatible = "string1-extension", "string2", ...;
+# };
+#
+FIT_DTB_COMPATIBLE_EXTENSION ?= ""
diff --git a/meta/lib/oe/fitimage.py b/meta/lib/oe/fitimage.py
index f303799155..58de1afaaa 100644
--- a/meta/lib/oe/fitimage.py
+++ b/meta/lib/oe/fitimage.py
@@ -289,7 +289,7 @@ class ItsNodeRootKernel(ItsNode):
self._kernel = kernel_node
def fitimage_emit_section_dtb(self, dtb_id, dtb_path, dtb_loadaddress=None,
- dtbo_loadaddress=None, add_compatible=False):
+ dtbo_loadaddress=None, add_compatible=False, compatible_extension=""):
"""Emit the fitImage ITS DTB section"""
load=None
dtb_ext = os.path.splitext(dtb_path)[1]
@@ -310,6 +310,8 @@ class ItsNodeRootKernel(ItsNode):
compatible = None
if add_compatible:
compatible = get_compatible_from_dtb(dtb_path)
+ if compatible and compatible_extension:
+ compatible[0] = compatible[0] + "-" + compatible_extension
dtb_node = self.its_add_node_dtb(
"fdt-" + dtb_id,
diff --git a/meta/lib/oeqa/selftest/cases/fitimage.py b/meta/lib/oeqa/selftest/cases/fitimage.py
index 195b9ee8b5..582e581415 100644
--- a/meta/lib/oeqa/selftest/cases/fitimage.py
+++ b/meta/lib/oeqa/selftest/cases/fitimage.py
@@ -17,6 +17,9 @@ from oeqa.selftest.case import OESelftestTestCase
from oeqa.utils.commands import runCmd, bitbake, get_bb_vars, get_bb_var
+from pathlib import Path
+
+
class BbVarsMockGenKeys:
def __init__(self, keydir, gen_keys="0", sign_enabled="0", keyname="", sign_ind="0", img_keyname=""):
self.bb_vars = {
@@ -819,6 +822,58 @@ MACHINE:forcevariable = "beaglebone-yocto"
# The alias is a symlink, therefore the compatible string is equal
self.assertEqual(comp_alias, comp)
+ def test_fitimage_compatible_extn_in_its(self):
+ """
+ Verify that FIT_DTB_COMPATIBLE_EXTENSION[...] is honored in the generated .its.
+
+ This test:
+ 1) Selects beaglebone-yocto machine and a DTB that is part of its kernel.
+ 2) Sets FIT_DTB_COMPATIBLE_EXTENSION[am335x-bonegreen-ext] to custom extension.
+ 3) Runs do_assemble_fitimage to generate the FIT .its.
+ 4) Asserts the .its 'compatible = ...' includes extended ones.
+
+ """
+
+ kernel_dtb = "am335x-bonegreen.dtb"
+ dtb_name = os.path.splitext(os.path.basename(kernel_dtb))[0]
+
+ config = f"""
+DISTRO = "poky"
+MACHINE = "beaglebone-yocto"
+
+# Ensure the FIT flow is active
+KERNEL_CLASSES += "kernel-fit-extra-artifacts "
+
+# Ensure the selected DTB is built into the kernel deploy output
+KERNEL_DEVICETREE = "{kernel_dtb}"
+
+# Provide the extension as a varflag (pairs: base:suffix)
+# Original compatibles: "ti,am335x-bone-green", "ti,am335x-bone-black"
+FIT_DTB_COMPATIBLE_EXTENSION[{dtb_name}] = "subtypeA"
+
+"""
+ self.write_config(config)
+
+ bitbake('virtual/kernel:do_deploy')
+ bitbake('linux-yocto-fitimage:do_deploy')
+
+ # Find the generated .its in DEPLOY_DIR_IMAGE
+ deploy_dir_image = get_bb_var('DEPLOY_DIR_IMAGE')
+ self.assertTrue(deploy_dir_image and os.path.isdir(deploy_dir_image),
+ f"DEPLOY_DIR_IMAGE not found or invalid: {deploy_dir_image}")
+
+ its_path = os.path.join(deploy_dir_image, 'fit-image.its')
+ self.assertTrue(os.path.exists(its_path), f"Expected ITS file not found: {its_path}")
+
+ # Read the ITS content
+ its_text = Path(its_path).read_text(encoding='utf-8', errors='ignore')
+
+ # Assertions: extended compatibles must appear
+ if "compatible" in its_text:
+ self.assertIn('ti,am335x-bone-green-subtypeA', its_text)
+ else:
+ pass
+
def test_fit_image_ext_dtb_dtbo(self):
"""
Summary: Check if FIT image and Image Tree Source (its) are created correctly.
--
2.34.1
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [OE-core] [PATCH v6] kernel-fit-image: allow extending compatible string property for DTBs
2025-10-12 16:24 [PATCH v6] kernel-fit-image: allow extending compatible string property for DTBs Kavinaya S
@ 2025-10-14 5:35 ` Mathieu Dubois-Briand
2025-10-15 17:48 ` Kavinaya S
0 siblings, 1 reply; 3+ messages in thread
From: Mathieu Dubois-Briand @ 2025-10-14 5:35 UTC (permalink / raw)
To: kavinaya, openembedded-core; +Cc: Alexander Kanavin, Dmitry Baryshkov
On Sun Oct 12, 2025 at 6:24 PM CEST, Kavinaya S via lists.openembedded.org wrote:
> The Linux kernel allows multiple DTBs to share the same compatible string.
> For example:
> qcs6490-rb3gen2.dtb
> qcs6490-rb3gen2-vision-mezzanine.dtb
> qcs6490-rb3gen2-industrial-mezzanine.dtb
>
> All of these use the same base compatible string:
> compatible = "qcom,qcs6490-rb3gen2", "qcom,qcm6490";
>
> Since the latter two DTBs are overlays on top of the base DTB and do not
> modify platform properties, they retain the same compatible string.
>
> When these DTBs are bundled into a single fitImage, the bootloader cannot
> distinguish between them due to identical compatible strings.
>
> To address this, introduce a mechanism to extend the compatible string
> using a OE build variable:
> FIT_DTB_COMPATIBLE_EXTENSION[dtb_name] = "extension"
>
> This appends the extension to the first compatible string in the DTB,
> resulting in unique entries in the generated .its file. For example:
> FIT_DTB_COMPATIBLE_EXTENSION[qcs6490-rb3gen2-vision-mezzanine] = "vision"
> FIT_DTB_COMPATIBLE_EXTENSION[qcs6490-rb3gen2-industrial-mezzanine] = "industrial"
>
> Generates:
> compatible = "qcom,qcs6490-rb3gen2-vision", "qcom,qcm6490";
> compatible = "qcom,qcs6490-rb3gen2-industrial", "qcom,qcm6490";
>
> Suggested-By: Alexander Kanavin <alex.kanavin@gmail.com>
> Suggested-By: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
> Signed-off-by: Kavinaya S <kavinaya@qti.qualcomm.com>
> ---
Hi Kavinaya,
We suspect this series is responsible for a break on Richard master-next
branch. This seems either a bit intermittent or a bad interaction with
something else, as I don't have a similar issue here. Still, dropping
the patch fixes the issue, so there is probably something bad in there.
ERROR: linux-yocto-6.16.9+git-r0 do_compile: Execution of '/srv/pokybuild/yocto-worker/oe-selftest-debian/build/build-st-1431372/tmp/work/qemux86_64-poky-linux/linux-yocto/6.16.9+git/temp/run.do_compile.555534' failed with exit code 1
...
| make[1]: *** No rule to make target 'am335x-bonegreen.dtb'. Stop.
https://autobuilder.yoctoproject.org/valkyrie/#/builders/35/builds/2530
Can you have a look at this error please?
Thanks,
Mathieu
--
Mathieu Dubois-Briand, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH v6] kernel-fit-image: allow extending compatible string property for DTBs
2025-10-14 5:35 ` [OE-core] " Mathieu Dubois-Briand
@ 2025-10-15 17:48 ` Kavinaya S
0 siblings, 0 replies; 3+ messages in thread
From: Kavinaya S @ 2025-10-15 17:48 UTC (permalink / raw)
To: openembedded-core
On Tue, Oct 14, 2025 at 11:05 AM, Mathieu Dubois-Briand wrote:
>
> Hi Kavinaya,
>
> We suspect this series is responsible for a break on Richard master-next
> branch. This seems either a bit intermittent or a bad interaction with
> something else, as I don't have a similar issue here. Still, dropping
> the patch fixes the issue, so there is probably something bad in there.
>
> ERROR: linux-yocto-6.16.9+git-r0 do_compile: Execution of
> '/srv/pokybuild/yocto-worker/oe-selftest-debian/build/build-st-1431372/tmp/work/qemux86_64-poky-linux/linux-yocto/6.16.9+git/temp/run.do_compile.555534'
> failed with exit code 1
> ...
> | make[1]: *** No rule to make target 'am335x-bonegreen.dtb'. Stop.
>
> https://autobuilder.yoctoproject.org/valkyrie/#/builders/35/builds/2530
>
> Can you have a look at this error please?
>
Hi Mathieu,
I will post the updated test case that addresses the issue in patch v8.
Thanks,
Kavinaya
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2025-10-15 17:48 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-10-12 16:24 [PATCH v6] kernel-fit-image: allow extending compatible string property for DTBs Kavinaya S
2025-10-14 5:35 ` [OE-core] " Mathieu Dubois-Briand
2025-10-15 17:48 ` Kavinaya S
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox