# `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<br>compiling the source. For any recipe inheriting `qprebuilt`,<br>this class unpacks the binary packed in a <cite>tar.gz</cite> archive<br>and provides these binaries for packaging using a BitBake task. |
> | `classes/qmodule.bbclass` | By default, the Qualcomm BSP enforces signing the kernel module by<br>enabling `CONFIG_MODULE_SIG_FORCE` in the kernel.<br>However, some out-of-tree modules might not be signed.<br>To avoid module loading issues, `qmodule.bbclass` inspects<br>all packages providing kernel modules and signs them if they’re<br>not already signed. |
> | `classes/image_types_ota_sdboot.bbclass` | This BitBake class implements image creation according to requirements<br>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<br>shared by all machine configurations defined in the Qualcomm BSP.<br>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`.<br>This allows Qualcomm Linux recipes to use the `qcm6490` OVERRIDE to<br>implement changes specific to the Qualcomm BSP. This file also defines<br>configuration variables that are shared by<br>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`.<br>This allows Qualcomm Linux recipes to use the `qcs9100` OVERRIDE to<br>implement changes specific to the Qualcomm BSP. This file also defines<br>configuration variables that are shared by<br>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`.<br>This allows Qualcomm Linux recipes to use the `qcs8300` OVERRIDE to<br>implement changes specific to the Qualcomm BSP. This file also defines<br>configuration variables that are shared by<br>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`.<br>This allows Qualcomm Linux recipes to use the `qcs615` OVERRIDE to<br>implement changes specific to the Qualcomm BSP. This file also defines<br>configuration variables that are shared by<br>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 `<workspace>/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<br>boot firmware binaries for compatible targets.<br>The `QCM6490_bootbinaries.zip`, `QCS9100_bootbinaries.zip`,<br>and `QCS8300_bootbinaries.zip` files provide the boot firmware<br>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:

`<workspace>/build-qcom-wayland/tmp-glibc/deploy/images/<machine-name>/<image-name>/`

### 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<br>firmware binaries, such as aDSP, cDSP, modem, VPU, GPU, and WLAN.<br>The `QCM6490_fw.zip`, `QCS9100_fw.zip`, and `QCS8300_fw.zip` files<br>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.<br>The `QCM6490_dspso.zip`, `QCS9100_dspso.zip`, and `QCS8300_dspso.zip` zip files<br>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 `<workspace>/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 `<workspace>/layers/meta-qcom-hwe/recipes-firmware/firmware`
directory are built.

## Kernel recipes

The Qualcomm Linux kernel recipes used by Qualcomm Linux are in
`<workspace>/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`,<br>`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 |
| --- | --- |
| `<kernel_src>/arch/arm64/configs/qcom_defconfig` | Default configuration that’s aligned to product and performance needs |
| `<kernel_src>/arch/arm64/configs/qcom_debug.config` | Debug configuration fragment |
| `<kernel_src>/arch/arm64/configs/qcom_addons.config` | Additional Qualcomm enhancements on top of upstream aligned base |
| `<kernel_src>/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` | <ul class="simple"><br><li><p><code class="docutils literal notranslate"><span class="pre">arch/arm64/configs/qcom_defconfig</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">arch/arm64/configs/qcom_addons.config</span></code></p></li><br></ul> |
| `Debug` | <ul class="simple"><br><li><p><code class="docutils literal notranslate"><span class="pre">arch/arm64/configs/qcom_defconfig</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">arch/arm64/configs/qcom_debug.config</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">arch/arm64/configs/qcom_addons.config</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">arch/arm64/configs/qcom_addons_debug.config</span></code></p></li><br></ul> |

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
`<workspace>/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/<machine>` directory.
- The top-level SPDX output file is in the `tmp-glibc/deploy/images/<machine>/` directory.

Last Published: Dec 21, 2025

[Previous Topic
meta-qcom](https://docs.qualcomm.com/bundle/publicresource/80-70023-27/topics/meta_qcom.md) [Next Topic
meta-qcom-distro](https://docs.qualcomm.com/bundle/publicresource/80-70023-27/topics/meta_qcom_distro.md)