# `meta-qcom-hwe` The `meta-qcom-hwe` metadata layer is available on [GitHub](https://github.com/qualcomm-linux/meta-qcom-hwe/tree/scarthgap). It provides additional software support for enabling Qualcomm devices. Note This guide uses the QCM6490 and QCS6490 hardware SoCs interchangeably. The `qcs6490-rb3gen2-core-kit.conf` and `qcs6490-rb3gen2-vision-kit.conf` machine configuration files defined in the `meta-qcom-hwe/conf/machine/` directory support the QCM6490, QCS6490, and QCS5430 hardware SoCs. ## BitBake classes > > > For an introduction to the BitBake classes, > see [Classes](https://github.com/qualcomm-linux/meta-qcom-hwe/tree/scarthgap/classes). > > > > > > > | File | Description | > | --- | --- | > | `classes/qprebuilt.bbclass` | Implements logic to use a prebuilt package instead of fetching and
compiling the source. For any recipe inheriting `qprebuilt`,
this class unpacks the binary packed in a tar.gz archive
and provides these binaries for packaging using a BitBake task. | > | `classes/qmodule.bbclass` | By default, the Qualcomm BSP enforces signing the kernel module by
enabling `CONFIG_MODULE_SIG_FORCE` in the kernel.
However, some out-of-tree modules might not be signed.
To avoid module loading issues, `qmodule.bbclass` inspects
all packages providing kernel modules and signs them if they’re
not already signed. | > | `classes/image_types_ota_sdboot.bbclass` | This BitBake class implements image creation according to requirements
of the OSTree over-the-air upgrade system. | ## Machine configurations The Qualcomm Linux machine configuration files are available on [GitHub](https://github.com/qualcomm-linux/meta-qcom-hwe/tree/scarthgap/conf/machine). The files located in the `meta-qcom-hwe/conf/machine/include` directory define and set the required BitBake variables, which are commonly used by machine configurations defined by the Qualcomm BSP. The following table provides an overview of these files. | File | Description | | --- | --- | | `meta-qcom-hwe/conf/machine/include/qcom-base.inc` | This file sets the BitBake variables that are commonly
shared by all machine configurations defined in the Qualcomm BSP.
For example, `SOC_ARCH`, `PREFERRED_PROVIDER` and `IMAGE_FSTYPES`. | | `meta-qcom-hwe/conf/machine/include/qcom-qcs6490.inc` | This file sets the `SOC_FAMILY` variable to `qcm6490`.
This allows Qualcomm Linux recipes to use the `qcm6490` OVERRIDE to
implement changes specific to the Qualcomm BSP. This file also defines
configuration variables that are shared by
all Qualcomm development kits based on QCS6490. | | `meta-qcom-hwe/conf/machine/include/qcom-qcs9100.inc` | This file sets the `SOC_FAMILY` variable to `qcs9100`.
This allows Qualcomm Linux recipes to use the `qcs9100` OVERRIDE to
implement changes specific to the Qualcomm BSP. This file also defines
configuration variables that are shared by
all Qualcomm development kits based on QCS9100. | | `meta-qcom-hwe/conf/machine/include/qcom-qcs8300.inc` | This file sets the `SOC_FAMILY` variable to `qcs8300`.
This allows Qualcomm Linux recipes to use the `qcs8300` OVERRIDE to
implement changes specific to the Qualcomm BSP. This file also defines
configuration variables that are shared by
all Qualcomm development kits based on QCS8300. | | `meta-qcom-hwe/conf/machine/include/qcom-qcs615.inc` | This file sets the `SOC_FAMILY` variable to `qcs615`.
This allows Qualcomm Linux recipes to use the `qcs615` OVERRIDE to
implement changes specific to the Qualcomm BSP. This file also defines
configuration variables that are shared by
all Qualcomm development kits based on QCS615. | ### Machine configuration files for development kits based on QCS6490 Note For Qualcomm Linux 1.2 and subsequent releases, you must use the new machine configuration files listed in the following table. Qualcomm Linux 1.2 has replaced the previous machine configuration file, `qcm6490.conf`, from Qualcomm Linux 1.1. | Configuration file | Description | | --- | --- | | `conf/machine/qcm6490-idp.conf` | This file is for the integrated development platform (IDP) with QCM6490. | | `conf/machine/qcs6490-rb3gen2-core-kit.conf` | This file is for the Qualcomm Dragonwing^™^ RB3 Gen 2 Core development kit with the QCS6490 SoC. | | `conf/machine/qcs6490-rb3gen2-vision-kit.conf` | This file is for the Qualcomm Dragonwing^™^ RB3 Gen 2 Vision development kit with the QCS6490 SoC, which includes low-resolution and high-resolution CSI cameras. | | `conf/machine/qcs6490-rb3gen2-industrial-kit.conf` | This file is for the Qualcomm Dragonwing^™^ RB3 Gen 2 Industrial development kit with the QCS6490 SoC. | ### Machine configuration files for development kits based on IQ-9075 and IQ-9100 | Configuration file | Description | | --- | --- | | `conf/machine/qcs9100-ride-sx.conf` | This file is for the Qualcomm^®^ IQ-9 Beta Evaluation Kit (EVK) with the IQ-9100 SoC. | | `conf/machine/qcs9075-ride-sx.conf` | This file is for the Qualcomm IQ-9 Beta EVK with the IQ-9075 SoC. | | `conf/machine/qcs9075-iq-9075-evk.conf` | This file is for the Qualcomm Dragonwing^™^ IQ-9075 EVK with the IQ-9075 SoC. | | `conf/machine/qcs9075-iq-9075-evk-ifp.conf` | This file is for the Dragonwing IQ-9075 EVK with the IQ-9075 SoC. | ### Machine configuration files for development kits based on IQ-8275 | Configuration file | Description | | --- | --- | | `conf/machine/qcs8300-ride-sx.conf` | This file is for the Qualcomm^®^ IQ-8 Beta EVK with the IQ-8300 SoC. | | `qcs8275-iq-8275-evk.conf` | This file is for the Qualcomm Dragonwing^™^ IQ-8275 EVK with the IQ-8275 SoC. | | `qcs8275-iq-8275-evk-ifp.conf` | This file is for the Dragonwing^™^ IQ-8275 EVK with the IQ-8275 SoC. | ### Machine configuration files for development kits based on IQ-615 | Configuration file | Description | | --- | --- | | `conf/machine/qcs615-adp-air.conf` | This file is for the Qualcomm Dragonwing^™^ IQ-615 EVK with the IQ-615 SoC. | ### Use of OVERRIDES in `meta-qcom-hwe` The Qualcomm BSP uses BitBake OVERRIDES to define two different methods for building the BSP. The metadata layer derives `MACHINEOVERRIDES` from `QCOM_SELECTED_BSP` in the `meta-qcom-hwe/conf/machine/include/qcom-base.inc` file as follows: MACHINEOVERRIDES =. "qcom-${QCOM_SELECTED_BSP}-bsp:" Copy to clipboard The two MACHINEOVERRIDES in `meta-qcom-hwe` are `qcom-custom-bsp` and `qcom-base-bsp`. These OVERRIDES are used by machine configuration files, recipes, and other configuration files within the `meta-qcom-hwe` metadata layer. The configuration files and recipes use these OVERRIDE constructs to conditionally set variables and append tasks as needed. Recipes and configuration files use MACHINEOVERRIDES to determine whether the final image is composed of Qualcomm custom BSP software components or upstream software components, based on the effective OVERRIDE at build time. For example, PREFERRED\_PROVIDER for `egl`, `libgl`, `libgles1`, and `libgles2` is set as follows: | Effective OVERRIDE | PREFERRED\_PROVIDER for `egl`, `libgl`, `libgles1`, `libgles2` | | --- | --- | | `qcom-custom-bsp` | `adreno` | | `qcom-base-bsp` | `mesa` | In the BitBake code snippet, the OVERRIDES conditionally set the variables as follows: # Provider for Graphics Library. # qcom-base-bsp uses 'mesa' as GL provider GL_PROVIDER ?= "adreno" GL_PROVIDER:qcom-base-bsp ?= "mesa" PREFERRED_PROVIDER_virtual/egl = "${GL_PROVIDER}" PREFERRED_PROVIDER_virtual/libgl = "${GL_PROVIDER}" PREFERRED_PROVIDER_virtual/libgles1 = "${GL_PROVIDER}" PREFERRED_PROVIDER_virtual/libgles2 = "${GL_PROVIDER}" PREFERRED_PROVIDER_virtual/egl-native = "mesa-native" PREFERRED_PROVIDER_virtual/libgl-native = "mesa-native" PREFERRED_PROVIDER_virtual/libgles1-native = "mesa-native" PREFERRED_PROVIDER_virtual/libgles2-native = "mesa-native" Copy to clipboard Note In this release, the `qcom-base-bsp` OVERRIDE is built only for `qcs9100-ride-sx.conf` and `qcs8300-ride-sx.conf`. ### Kernel command-line > > > The `meta-qcom-hwe/conf/machine/include/qcom-qcs6490.inc`, `meta-qcom-hwe/conf/machine/include/qcom-qcs9100.inc` > and `meta-qcom-hwe/conf/machine/include/qcom-qcs8300.inc` include files > use the `KERNEL_CMDLINE_EXTRA` variable to set the kernel command-line parameters as follows: > > > Tab qcom-qcs6490.inc > Tab qcom-qcs9100.inc > Tab qcom-qcs8300.inc > > The following snippet is from the `qcom-qcs6490.inc` file: > > > # Additional Kernel cmdline parameters for debug builds > DBG_CMDLINE = "${@oe.utils.conditional('DEBUG_BUILD','1','earlycon page_owner=on qcom_scm.download_mode=1 slub_debug=FZP,zs_handle,zspage;FZPU','',d)}" > > KERNEL_CMDLINE_EXTRA ?= "pcie_pme=nomsi kernel.sched_pelt_multiplier=4 rcupdate.rcu_expedited=1 rcu_nocbs=0-7 kpti=off kasan=off kasan.stacktrace=off no-steal-acc ${DBG_CMDLINE} swiotlb=128 mitigations=auto net.ifnames=0" > Copy to clipboard > > The following snippet is from the `qcom-qcs9100.inc` file: > > > # Additional Kernel cmdline parameters for debug builds > DBG_CMDLINE = "${@oe.utils.conditional('DEBUG_BUILD','1','earlycon reboot=panic_warm page_owner=on qcom_scm.download_mode=1 slub_debug=FZP,zs_handle,zspage;FZPU','',d)}" > > KERNEL_CMDLINE_EXTRA ?= "pcie_pme=nomsi net.ifnames=0 pci=noaer kpti=off kasan=off kasan.stacktrace=off swiotlb=128 ${DBG_CMDLINE} mitigations=auto kernel.sched_pelt_multiplier=4 rcupdate.rcu_expedited=1 rcu_nocbs=0-7 no-steal-acc vfio_iommu_type1.allow_unsafe_interrupts=1 fw_devlink.strict=1" > Copy to clipboard > > The following snippet is from the `qcom-qcs8300.inc` file: > > > # Additional Kernel cmdline parameters for debug builds > DBG_CMDLINE = "${@oe.utils.conditional('DEBUG_BUILD','1','earlycon reboot=panic_warm page_owner=on qcom_scm.download_mode=1 slub_debug=FZP,zs_handle,zspage;FZPU','',d)}" > > KERNEL_CMDLINE_EXTRA ?= "pcie_pme=nomsi net.ifnames=0 pci=noaer kpti=off kasan=off kasan.stacktrace=off swiotlb=128 ${DBG_CMDLINE} mitigations=auto kernel.sched_pelt_multiplier=4 rcupdate.rcu_expedited=1 rcu_nocbs=0-7 no-steal-acc arm64.nopauth fw_devlink.strict=1" > Copy to clipboard ### Include DTB The KERNEL\_DEVICETREE variable is set conditionally using the OVERRIDES mechanism to ensure that the correct device tree binary (DTB) is included. Each individual machine configuration file in meta-qcom-hwe/conf/machine manages this setting. For example, the `conf/machine/qcs9100-ride-sx.conf` file sets the `KERNEL_DEVICETREE` variable differently for custom and base variants, thereby selecting the appropriate DTB: Tab linux-qcom-base Tab linux-qcom-custom The following code block shows how `KERNEL_DEVICETREE` is set for `linux-qcom-base`, resulting in the `base` variant using the upstream DTB. KERNEL_DEVICETREE:pn-linux-qcom-base = " \ qcom/qcs9100-ride.dtb \ qcom/qcs9100-ride-r3.dtb \ qcom/sa8775p-ride.dtb \ qcom/sa8775p-ride-r3.dtb \ " Copy to clipboard The following code block shows how `KERNEL_DEVICETREE` is set for `linux-qcom-custom`, resulting in the `custom` variant using the upstream DTB. KERNEL_DEVICETREE:pn-linux-qcom-custom = " \ qcom/qcs9100-addons-ride.dtb \ qcom/qcs9100-addons-ride-r3.dtb \ qcom/sa8775p-addons-ride.dtb \ qcom/sa8775p-addons-ride-r3.dtb \ " Copy to clipboard ### Include additional DTBOs To include an additional device-tree overlay (DTBO) to be overlaid on the kernel device-tree, use the `KERNEL_TECH_DTBOS` variable to list the DTBO names. Note Qualcomm Linux supports device tree binary overlay only for `custom` variant. The following example from `qcs9100-ride-sx.conf` shows how DTBOs are used. KERNEL_TECH_DTBOS[sa8775p-addons-ride] = " \ sa8775p-video.dtbo qcs9100-graphics.dtbo \ qcs9100-ride-sx-camera.dtbo \ " KERNEL_TECH_DTBOS[sa8775p-addons-ride-r3] = " \ sa8775p-video.dtbo qcs9100-graphics.dtbo \ qcs9100-ride-sx-camera.dtbo \ " KERNEL_TECH_DTBOS[qcs9100-addons-ride] = " \ sa8775p-video.dtbo qcs9100-graphics.dtbo \ qcs9100-ride-sx-camera.dtbo \ " KERNEL_TECH_DTBOS[qcs9100-addons-ride-r3] = " \ sa8775p-video.dtbo qcs9100-graphics.dtbo \ qcs9100-ride-sx-camera.dtbo \ " KERNEL_TECH_DTBO_PROVIDERS = "\ qcom-graphicsdevicetree \ qcom-videodtb \ cameradtb \ " Copy to clipboard ## Firmware recipes Qualcomm Linux firmware recipe files are available on [GitHub](https://github.com/qualcomm-linux/meta-qcom-hwe/tree/scarthgap/recipes-firmware). When the Qualcomm Linux source code is synced, the firmware recipes are available in the `/layers/meta-qcom-hwe/recipes-firmware/firmware` directory. ### Critical boot binaries Critical boot firmware images are required to boot the kernel on the device. The following firmware recipe provides the hardware SoC-specific boot firmware. | Firmware recipe | Description | | --- | --- | | `firmware-qcom-bootbins_1.0.bb` | Handles fetch, unpack, and deploy for critical
boot firmware binaries for compatible targets.
The `QCM6490_bootbinaries.zip`, `QCS9100_bootbinaries.zip`,
and `QCS8300_bootbinaries.zip` files provide the boot firmware
required for QCS6490, QCS9075, and QCS8300 based machines. | After generating the build, the firmware binaries in these zip files are available for flashing in the following directory: `/build-qcom-wayland/tmp-glibc/deploy/images///` ### Subsystem firmware binaries Qualcomm Linux includes firmware binaries that are loaded and run on the corresponding subsystems. As the Qualcomm hardware SoC boots up, individual subsystems run the firmware as they come out of reset. The `linux-firmware_%.bb` recipe provides upstream firmware packages and installs them in the `/lib/firmware` directory. Firmware that requires updates or is not yet upstreamed is installed in the `/lib/firmware/updates` directory through the `linux-firmware_%.bbappend` recipe. | Firmware recipe | Description | | --- | --- | | `linux-firmware_%.bbappend` | Handles fetch, unpack, and install for subsystem
firmware binaries, such as aDSP, cDSP, modem, VPU, GPU, and WLAN.
The `QCM6490_fw.zip`, `QCS9100_fw.zip`, and `QCS8300_fw.zip` files
pack the firmware files for QCM6490, QCS9075, and QCS8300 based machines. | The `linux-firmware_%.bbappend` recipe does the following: > > > 1. Fetches the subsystem firmware binaries from the remote server based on `SRC_URI`. > 2. Unpacks the zip file. > 3. Installs the firmware in `/lib/firmware/updates`. ### DSP libraries User space utilities refer to the digital signal processor (DSP) libraries, which must be available in the `rootfs` image. The following firmware recipes provide the hardware SoC-specific DSP libraries: | Firmware recipe | Description | | --- | --- | | `firmware-qcom-dspso_1.0.bb` | Handles fetch, unpack, and install for DSP libraries.
The `QCM6490_dspso.zip`, `QCS9100_dspso.zip`, and `QCS8300_dspso.zip` zip files
pack the libraries for QCM6490, QCS9075, and QCS8300 based machines. | The `firmware-qcom-dspso_1.0.bb` recipe does the following: > > > 1. Fetches the DSP libraries from the remote server based on `SRC_URI`. > 2. Unpacks the zip file. > 3. Installs the DSP libraries in `rootfs`. ### Installation of boot, subsystem, and dspso When Qualcomm Linux is built, the build system uses the firmware recipes to deploy the prebuilt firmware based on the `MACHINE_EXTRA_RDEPENDS` configuration variable, which is set in the machine configuration file. For example, in `qcom-qcs6490.inc`, see the inclusion of `packagegroup-firmware-qcm6490` in the `MACHINE_EXTRA_RDEPENDS` variable: MACHINE_EXTRA_RDEPENDS += " \ packagegroup-firmware-qcm6490 \ " Copy to clipboard Note The `packagegroup-firmware-qcm6490` recipe is present in the `/layers/meta-qcom-hwe/recipes-firmware/packagegroups/` directory. It groups the firmware recipes to generate the image. When Qualcomm Linux is built, based on the configuration in the machine configuration and the package group recipe file, the respective firmware recipes from the `/layers/meta-qcom-hwe/recipes-firmware/firmware` directory are built. ## Kernel recipes The Qualcomm Linux kernel recipes used by Qualcomm Linux are in `/layers/meta-qcom-hwe/recipes-kernel/linux`. Qualcomm Linux supports the long-term support (LTS) Qualcomm Linux kernel v6.6.x. In the `meta-qcom-hwe` layer, there are two distinct kernel recipes: - The `linux-qcom-custom_6.6.bb` recipe supports the `custom` BSP and fetches the kernel sources from `qcom.git` hosted at `git.codelinaro.org`. - The `linux-qcom-base_6.6.bb` recipe supports the `base` BSP and retrieves kernel sources from `linux.git` hosted at `git.kernel.org`. Tab linux-qcom-custom\_6.6.bb Tab linux-qcom-base\_6.6.bb inherit kernel sota COMPATIBLE_MACHINE = "(qcom)" SRCPROJECT = "git://git.codelinaro.org/clo/la/kernel/qcom.git;protocol=https" SRCBRANCH = "kernel.qclinux.1.0.r1-rel" SRCREV = "d3ed32bf7ee64db22653833d4c3d9a80dd76896d" SRC_URI = "${SRCPROJECT};branch=${SRCBRANCH};destsuffix=kernel \ ${@bb.utils.contains('DISTRO_FEATURES', 'selinux', ' file://selinux.cfg', '', d)} \ ${@bb.utils.contains('DISTRO_FEATURES', 'selinux', ' file://selinux_debug.cfg', '', d)} \ " S = "${WORKDIR}/kernel" KERNEL_CONFIG ??= "qcom_defconfig" Copy to clipboard inherit kernel sota COMPATIBLE_MACHINE = "(qcom)" SRC_URI = " git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git;protocol=https;branch=linux-6.6.y \ file://qcom.cfg \ file://vm-configs/qcom_vm.cfg \ file://qcom_debug.cfg \ " # Apply qcom patches require ${BPN}-${PV}/configs.inc require ${BPN}-${PV}/devicetree.inc require ${BPN}-${PV}/drivers.inc require ${BPN}-${PV}/dt-bindings.inc require ${BPN}-${PV}/tools.inc KERNEL_CONFIG_FRAGMENTS:append = " ${WORKDIR}/qcom.cfg" KERNEL_CONFIG_FRAGMENTS:append = " ${@oe.utils.vartrue('DEBUG_BUILD', '${WORKDIR}/qcom_debug.cfg', '', d)}" S = "${WORKDIR}/git" Copy to clipboard The machine configuration files use OVERRIDES to select the appropriate kernel recipe variant. The `qcom-base.inc` file chooses `linux-qcom-base` when you select the `base` variant. If you select the `custom` variant, the kernel is built using the `linux-qcom-custom` recipe as shown in the following snippet. PREFERRED_PROVIDER_virtual/kernel ?= "linux-qcom-custom" PREFERRED_PROVIDER_virtual/kernel:qcom-base-bsp ?= "linux-qcom-base" Copy to clipboard **Kernel configuration** The Qualcomm Linux kernel recipe uses a different set of kernel configuration and fragments for the `base` and `custom` variants. | Variant | Configuration and fragments files | | --- | --- | | `base` | `defconfig`, `qcom.cfg`, `qcom_vm.cfg`, `qcom_debug.cfg` | | `custom` | `qcom_defconfig`, `qcom_addons.config`, `selinux.cfg`,
`qcom_debug.config`, `qcom_addons_debug.config`, `selinux_debug.cfg` | The following table provides the description of `defconfig` and `fragments` used for the `custom` variant: | Kernel configuration fragments | Description | | --- | --- | | `/arch/arm64/configs/qcom_defconfig` | Default configuration that’s aligned to product and performance needs | | `/arch/arm64/configs/qcom_debug.config` | Debug configuration fragment | | `/arch/arm64/configs/qcom_addons.config` | Additional Qualcomm enhancements on top of upstream aligned base | | `/arch/arm64/configs/qcom_addons_debug.config` | Enables debug | The Qualcomm Linux `custom` variant recipe `linux-qcom-custom_6.6.bb` further supports the `perf` and `debug` variations. The default method to build the kernel using `linux-qcom-custom_6.6.bb` is `perf`. | Build variant | Defconfig/config fragments | | --- | --- | | `Perf` |

  • arch/arm64/configs/qcom_defconfig


  • arch/arm64/configs/qcom_addons.config


| | `Debug` |

  • arch/arm64/configs/qcom_defconfig


  • arch/arm64/configs/qcom_debug.config


  • arch/arm64/configs/qcom_addons.config


  • arch/arm64/configs/qcom_addons_debug.config


| To build the debug kernel image with `linux-qcom-custom_6.6.bb`, set `DEBUG_BUILD` to `1` in the shell where you are using BitBake comamnds to build the image. This selection is effective in the following code: KERNEL_CONFIG ??= "qcom_defconfig" KERNEL_CONFIG_FRAGMENTS:append = " ${S}/arch/arm64/configs/qcom_addons.config" KERNEL_CONFIG_FRAGMENTS:append = " ${@oe.utils.vartrue('DEBUG_BUILD', '${S}/arch/arm64/configs/qcom_debug.config', '', d)}" KERNEL_CONFIG_FRAGMENTS:append = " ${@oe.utils.vartrue('DEBUG_BUILD', '${S}/arch/arm64/configs/qcom_addons_debug.config', '', d)}" # Enable selinux support SELINUX_CFG = "${@oe.utils.vartrue('DEBUG_BUILD', 'selinux_debug.cfg', 'selinux.cfg', d)}" KERNEL_CONFIG_FRAGMENTS:append = " ${@bb.utils.contains('DISTRO_FEATURES', 'selinux', '${WORKDIR}/${SELINUX_CFG}', '', d)}" Copy to clipboard To autoload kernel modules for Qualcomm platforms, update the `KERNEL_MODULE_AUTOLOAD` variable in the Qualcomm Linux kernel recipe. For example, the CoreSight and STM modules are autoloaded as follows: KERNEL_MODULE_AUTOLOAD += "coresight coresight-tmc coresight-funnel" KERNEL_MODULE_AUTOLOAD += "coresight-replicator coresight-etm4x coresight-stm" KERNEL_MODULE_AUTOLOAD += "coresight-cti coresight-tpdm coresight-tpda coresight-dummy" KERNEL_MODULE_AUTOLOAD += "coresight-remote-etm coresight-tgu" KERNEL_MODULE_AUTOLOAD += "stm_core stm_p_ost stm_console stm_heartbeat stm_ftrace " Copy to clipboard ## Licenses The licenses for recipes in `meta-qcom-hwe` are listed at `/meta-qcom-hwe/files/common-licenses`. common-licenses/ ├── BSD-3-Clause-Clear ├── GPLv2.0-with-linux-syscall-note └── Qualcomm-Technologies-Inc.-Proprietary Copy to clipboard Yocto can automatically create SPDX SBOM documents based on image creation. To enable this feature, inherit the `create-spdx` class in `local.conf` as follows: INHERIT += "create-spdx" Copy to clipboard After you inherit the class, rebuild the image with the BitBake command: bitbake qcom-multimedia-image Copy to clipboard You can find the SPDX output in the following directories: - For each recipe, the generated files are available in the `tmp/deploy/spdx/` directory. - The top-level SPDX output file is in the `tmp-glibc/deploy/images//` directory. Last Published: Mar 16, 2026 [Previous Topic meta-qcom](https://docs.qualcomm.com/bundle/publicresource/80-70029-27/topics/meta_qcom.md) [Next Topic meta-qcom-distro](https://docs.qualcomm.com/bundle/publicresource/80-70029-27/topics/meta_qcom_distro.md)