# Qualcomm Linux features

Qualcomm Linux features include:

- Metadata layers
- Recipes and configurations in the metadata layers
- Software features to enhance Qualcomm Linux
- Tools introduced by Qualcomm
- Instructions on how to build Qualcomm Linux images and metadata
layers

Note

Qualcomm Linux is based on the Yocto Kirkstone release.

For a comprehensive document on the Yocto Project Kirkstone release, see
[Yocto Project documentation](https://docs.yoctoproject.org/4.0.20/singleindex.html).

Note

When you read this document, the Yocto Project may have released additional Kirkstone LTS point releases.
This document refers to the version that was current at the time of this release.

If you are new to the Yocto Project, see the build instruction in the
[Yocto Project documentation](https://docs.yoctoproject.org/4.0.20/singleindex.html#document-brief-yoctoprojectqs/index).

The Qualcomm Linux environment consists of several community-maintained
metadata layers that deliver recipes, package groups, images, and
configurations. The Qualcomm Linux metadata layers are stacked on the
community layers to provide additional software components required for
Qualcomm reference devices.

## Qualcomm Linux metadata layers overview

The metadata layers introduce the layers that are included
in the [Qualcomm manifest](https://github.com/quic-yocto/qcom-manifest).
This manifest includes all the layers that are required to reproduce the
reference build. The layers maintained by the Yocto Project are
introduced in the subsequent sections. Qualcomm maintains the layers
specific to Qualcomm reference devices, which depend on the community
layers to realize full functionality.

The following figure shows the layers included in the Qualcomm Linux release:

![../../_images/qualcomm_linux_metadata_layers.png](data:image/png;base64,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)

**Qualcomm Linux metadata layers**

Qualcomm Linux metadata layers and descriptions

| Metadata layer | Description |
| --- | --- |
| `meta-qcom-hwe` | Contains recipes that build software components for Qualcomm device support and provides value-added software features applicable to Qualcomm SoCs. |
| `meta-qcom-distro` | Provides a reference distribution configuration for Qualcomm products. Image recipes and package groups are defined in this layer. |
| `meta-qcom-extras` | Optional metadata layer for registered users. This layer enables source compilation of select components, which are<br>otherwise present as binary in `meta-qcom-hwe`. |
| `meta-qcom-qim-product-sdk` | Provides Qualcomm^®^ Intelligent Multimedia SDK (IM SDK) and AI SDKs based on the GStreamer framework. This includes<br>a set of GStreamer plug-ins, sample applications for multimedia, and AI use cases. |
| `meta-qcom-realtime` | Provides patches and configurations for Linux Kernel to be enabled for real-time operations. |
| `meta-qcom` | Contains Qualcomm device support and upstream OSS software components. |
| `meta-virtualization`<br><br><br>For more information, see [meta-virtualization](https://git.yoctoproject.org/meta-virtualization). | Contains packages for constructing OpenEmbedded virtualized solutions and virtualization stacks, such as dockerd and Kubernetes. |
| `meta-selinux`<br><br><br>For more information, see [meta-selinux](https://git.yoctoproject.org/meta-selinux). | Enables SELinux support. The layer includes reference SEPolicies and<br>provides necessary tooling. To enable SELinux for Qualcomm Linux, set the<br>variable `DEFAULT_ENFORCING` to `enforcing` in `meta-qcom-distro/conf/distro/include/qcom-base.inc`. |
| `poky/meta`<br><br><br>For more information, see [poky/meta](https://git.yoctoproject.org/poky). | Provides build tools and recipe files that provide various software components needed for an embedded OS distribution. |
| `meta-openembedded`<br><br><br>For more information, see [meta-openembedded](https://git.openembedded.org/meta-openembedded). | Collection of layers for the OpenEmbedded build system. |

For information about robotics layers, see [QIRP layers](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-265/architecture.html#component-layers-of-the-qirp-sdk).

## Qualcomm Linux metadata layers

The following layers represent the Qualcomm BSP metadata:

- [meta-qcom](https://docs.qualcomm.com/doc/80-70015-27/topic/platform_software_features.html#meta-qcom-section)
- [meta-qcom-hwe](https://docs.qualcomm.com/doc/80-70015-27/topic/platform_software_features.html#meta-qcom-hwe-section)
- [meta-qcom-realtime](https://docs.qualcomm.com/doc/80-70015-27/topic/platform_software_features.html#meta-qcom-realtime-section)

The `qcom-wayland` reference distribution is defined in the following layer:

- [meta-qcom-distro](https://docs.qualcomm.com/doc/80-70015-27/topic/platform_software_features.html#meta-qcom-distro-section)

The following layer defines the QIM SDK:

- [meta-qcom-qim-product-sdk](https://docs.qualcomm.com/doc/80-70015-27/topic/platform_software_features.html#meta-qcom-qim-product-sdk-section)

The optional BSP is defined by the following metadata layer:

- [meta-qcom-extras](https://docs.qualcomm.com/doc/80-70015-27/topic/platform_software_features.html#meta-qcom-extras-section)

### Use of BitBake OVERRIDES in Qualcomm Linux metadata layers

The Qualcomm Linux metadata layers use the OVERRIDES mechanism of BitBake to implement two
distinct variants of BSP builds: `custom` and `base`.

When initiating Qualcomm Linux builds, set the `QCOM_SELECTED_BSP` variable to either
`custom` or `base`. This variable is defined in
`conf/machine/include/qcom-base.inc` and is set to `custom` by default as follows:

QCOM_SELECTED_BSP ??= "custom"
    Copy to clipboard

The value set for `QCOM_SELECTED_BSP` translates into two BitBake OVERRIDES.
The following is a mapping table of `QCOM_SELECTED_BSP` to the corresponding BitBake OVERRIDE:

| `QCOM_SELECTED_BSP` value | Corresponding BitBake OVERRIDE |
| --- | --- |
| `custom` | `qcom-custom-bsp` |
| `base` | `qcom-base-bsp` |

The effective value of the BitBake OVERRIDE sets variables selectively,
resulting in inclusion of packages in the image.

Note

To familiarize yourself with BitBake OVERRIDES, see
[Conditional syntax (Overrides)](https://docs.yoctoproject.org/bitbake/2.8/bitbake-user-manual/bitbake-user-manual-metadata.html#conditional-syntax-overrides)
and [Yocto Project documentation](https://docs.yoctoproject.org/singleindex.html#term-OVERRIDES).

To experiment with the `base` variant of the BSP and how to set `QCOM_SELECTED_BSP` at build time,
see [Build base image](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-254/github_workflow_unregistered_users.html#build-base-image).

Note

In this release, the `base` BSP is supported for building exclusively
with `qcs9100-ride-sx.conf`.

The final image composition depends on whether you choose custom or base for the QCOM\_SELECTED\_BSP variable, as described in the following table:

| `QCOM_SELECTED_BSP` variant | Description |
| --- | --- |
| `custom` | The image includes Qualcomm BSP software components such as the<br>Qualcomm Adreno^™^ graphics libraries. |
| `base` | The image incorporates upstream software components such as the<br>Mesa 3-D graphics library. |

To find examples of how these OVERRIDES select the software components
to be built, search the `meta-qcom-hwe` codebase using the `qcom-base-bsp` and `qcom-custom-bsp`
OVERRIDES.

### meta-qcom

The `meta-qcom` metadata layer is hosted at
[git.yoctoproject.org](http://git.yoctoproject.org) and provides
recipes to build the Qualcomm OSS. The software image is built using the
following recipes from the `meta-qcom` layer:

| `recipes-devtools/qdl/qdl_git.bb` | Qualcomm downloader (QDL) flashing tool. QDL communicates<br>with USB devices displaying ID 05c6:9008 to upload a flash<br>loader and uses this to flash the images. |
| --- | --- |
| `recipes-support/pd-mapper/pd-mapper_git.bb` | <ul class="simple"><br><li><p>The Qualcomm protection domain mapper (pd-mapper) application<br>is an implementation for the protection domain mapper service.</p></li><br><li><p>The protection domain mapper service allows user space applications<br>to access remote processors on Qualcomm hardware SoCs.</p></li><br></ul> |
| `recipes-support/qrtr/qrtr_git.bb` | Qualcomm QRTR applications and library. |
| `recipes-support/initrdscripts/initramfs-module-copy-modules_1.0.bb` | `initramfs-framework` module for copying kernel modules from<br>`initramfs` to `rootfs`. |

### meta-qcom-hwe

The `meta-qcom-hwe` BSP metadata layer is available on
[GitHub](https://github.com/quic-yocto/meta-qcom-hwe).
It provides additional software support for enabling the Qualcomm device.

> 
> 
> - **BitBake classes**
> 
> 
>     For an introduction to the BitBake classes,
> see [Classes](https://github.com/quic-yocto/meta-qcom-hwe/tree/kirkstone/classes).
> 
> 
> 
> 
> 
> 
>     | `classes/qimage_types.bbclass` | Implements `oe_mkvfatfs()` to generate a VFAT image<br>using the `mkfs.vfat` tool. |
>     | --- | --- |
>     | `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 to be packaged 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 may not be properly signed.<br>To avoid module loading issues, `qmodule.bbclass` inspects<br>all packages providing kernel modules and signs them if they are<br>not already signed. |
> - **Machine configurations**
> 
> 
>     The Qualcomm Linux machine configuration files are available on
> [GitHub](https://github.com/quic-yocto/meta-qcom-hwe/tree/kirkstone/conf/machine).
> 
> 
>     The files located in the `meta-qcom-hwe/conf/machine/include` directory define and
> set the required BitBake variables, which can be commonly used by machine
> configurations defined by the Qualcomm BSP. The following table provides an
> overview of these files:
> 
> 
> 
> 
> 
> 
>     | File | Description |
>     | --- | --- |
>     | `meta-qcom/conf/machine/include/qcom-common.inc` | This file uses the `qcom` OVERRIDE to set SOC\_FAMILY, allowing recipes to<br>implement changes specific to the Qualcomm BSP. |
>     | `meta-qcom-hwe/conf/machine/include/qcom-base.inc` | This include file sets the BitBake variables that are commonly<br>shared by all machine configurations defined in the Qualcomm BSP.<br>For example, `PREFERRED_PROVIDER` and `IMAGE_FSTYPES`. |
> 
> 
> 
>     **Machine configuration files for development kits based on QCS6490**
> 
> 
> Note
> 
> 
> For Qualcomm Linux 1.2 and future releases, you must use the new machine configuration
> files listed in the following table. The previous machine configuration file, `qcm6490.conf`,
> from Qualcomm Linux 1.1 has been replaced with the machine configuration files of Qualcomm Linux 1.2.
> 
> 
> 
> 
> 
> 
>     | Configuration file | Description |
>     | --- | --- |
>     | `conf/machine/qcm6490-idp.conf` | This file is for the<br>integrated development platform (IDP) with QCM6490. |
>     | `conf/machine/qcs6490-rb3gen2-core-kit.conf` | This file is for the QCS6490-based<br>Qualcomm^®^ RB3 Gen 2 development kit. |
>     | `conf/machine/qcs6490-rb3gen2-vision-kit.conf` | This file is for the QCS6490-based<br>Qualcomm RB3 Gen 2 development kit with low-/high-resolution<br>CSI cameras. |
>     | `conf/machine/include/qcom-qcs6490.inc` | This file defines configuration variables that are shared by<br>all Qualcomm reference devices based on QCS6490. |
> 
> 
> 
>     **Machine configuration files for development kits based on QCS9075**
> 
> 
> 
> 
> 
> 
>     | Configuration file | Description |
>     | --- | --- |
>     | `conf/machine/qcs9100-ride-sx.conf` | This file is for QCS9075-based<br>Qualcomm^®^ IQ-9100 Beta Evaluation Kit (EVK). |
>     | `conf/machine/include/qcom-qcs9100.inc` | This file defines configuration variables that are<br>shared by all development kits based on QCS9075. |
> 
> 
> 
>     **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`
> BSP layer. The configuration files and recipes use these OVERRIDE constructs
> to conditionally set variables and append tasks as needed.
> 
> 
>     The use of MACHINEOVERRIDES in recipes and configuration files determines
> whether the final image is composed of Qualcomm BSP software components
> or upstream 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 sets 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`.
> 
>     - **Kernel cmdline**
> 
> 
>         The `meta-qcom-hwe/conf/machine/include/qcom-qcs6490.inc` and `meta-qcom-hwe/conf/machine/include/qcom-qcs9100.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
> 
> The following snippet is from the `qcom-qcs6490.inc` file:
> 
> 
> DBG_CMDLINE = "${@oe.utils.conditional('DEBUG_BUILD','1','reboot=panic_warm page_owner=on qcom_scm.download_mode=1 slub_debug=FZP,zs_handle,zspage; FZPU','',d)}"
>             
>             # Additional Kernel cmdline parameters for performance optimizations
>             CONSOLE_CMDLINE = "${@oe.utils.conditional('PERFORMANCE_BUILD','1','console=','console=ttyMSM0,115200n8 earlycon',d)}"
>             
>             KERNEL_CMDLINE_EXTRA ?= "root=/dev/disk/by-partlabel/system rw rootwait ${CONSOLE_CMDLINE} 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"
>             Copy to clipboard
> 
> The following snippet is from the `qcom-qcs9100.inc` file:
> 
> 
> DBG_CMDLINE = "${@oe.utils.conditional('DEBUG_BUILD','1','reboot=panic_warm page_owner=on qcom_scm.download_mode=1 slub_debug=FZP,zs_handle,zspage; FZPU','',d)}"
>             
>             # Additional Kernel cmdline parameters for performance optimizations
>             CONSOLE_CMDLINE = "${@oe.utils.conditional('PERFORMANCE_BUILD','1','console=','console=ttyMSM0,115200n8 earlycon',d)}"
>             
>             KERNEL_CMDLINE_EXTRA ?= "root=/dev/disk/by-partlabel/system rw rootwait ${CONSOLE_CMDLINE} 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"
>             Copy to clipboard
>     - **Include DTB**
> 
> 
>         To ensure that the correct device tree binary (DTB) is included, the
> `KERNEL_DEVICETREE` variable is conditionally set using the
> OVERRIDES mechanism. This is managed within each individual
> machine configuration file in `meta-qcom-hwe/conf/machine`.
> 
> 
>         In the machine configuration file, `KERNEL_DEVICETREE` is set
> differently for custom vs. base variant. The following examples provide
> information on how the machine configuration file selects a DTB:
> 
> 
> Tab linux-qcom-base
> Tab linux-qcom-custom
> 
> The following code block shows how you can explicitly set
> KERNEL\_DEVICETREE for `linux-qcom-base`, which leads to the
> base variant using the upstream DTB:
> 
> 
> KERNEL_DEVICETREE:pn-linux-qcom-base = " \
>                                  qcom/qcs6490-rb3gen2.dtb \
>                                  "
>             Copy to clipboard
> 
> The following code block shows how `KERNEL_DEVICETREE` is
> set otherwise:
> 
> 
> KERNEL_DEVICETREE = " \
>                                  qcom/qcs6490-addons-rb3gen2.dtb \
>                                  qcom/qcs5430-fp1-addons-rb3gen2.dtb \
>                                  qcom/qcs5430-fp2-addons-rb3gen2.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
> 
> 
> The DTBO overlay is supported only for the `custom` variant.
> 
> 
>         The following example from `qcs6490-rb3gen2-core-kit.conf` shows
> how DTBOs are used.
> 
> 
> KERNEL_TECH_DTBOS[qcs6490-addons-rb3gen2] = " \
>                qcm6490-graphics.dtbo qcm6490-wlan-rb3.dtbo \
>                qcm6490-display-rb3.dtbo qcm6490-bt.dtbo \
>                qcm6490-video.dtbo \
>                "
>             KERNEL_TECH_DTBOS[qcs5430-fp1-addons-rb3gen2] = " \
>                qcs5430-graphics.dtbo qcm5430-camera-rb3.dtbo \
>                qcs5430-wlan-rb3.dtbo qcm6490-bt.dtbo \
>                qcm6490-display-rb3.dtbo qcm6490-video.dtbo \
>                "
>             KERNEL_TECH_DTBOS[qcs5430-fp2-addons-rb3gen2] = " \
>                qcs5430-graphics.dtbo qcm5430-camera-rb3.dtbo \
>                qcs5430-wlan-rb3.dtbo qcm6490-bt.dtbo \
>                qcm6490-display-rb3.dtbo qcm6490-video.dtbo \
>                "
>             
>             KERNEL_TECH_DTBO_PROVIDERS = "\
>                btdevicetree \
>                cameradtb \
>                displaydevicetree \
>                graphicsdevicetree \
>                videodtb \
>                wlan-devicetree \
>                "
>             Copy to clipboard
> - **Firmware recipes**
> 
> 
>     Qualcomm Linux firmware recipe files are available on
> [GitHub](https://github.com/quic-yocto/meta-qcom-hwe/tree/kirkstone/recipes-firmware).
> When the Qualcomm Linux source code is synced, the firmware recipes
> are available in the following directory:
> `<workspace>/layers/meta-qcom-hwe/recipes-firmware/firmware`.
> 
>     - **Critical boot binaries**
> 
> 
>         Critical boot firmware images are required to boot the kernel on the
> device. The following firmware recipes provide the hardware SoC-specific
> boot firmware:
> 
> 
> 
> 
> 
> 
>         | `firmware-qcom-bootbins_1.0.bb` | Handles fetch, unpack, and deploy for critical<br>boot firmware binaries for compatible targets.<br>The boot firmwares required for QCS6490 and QCS9075<br>based machines are provided by the `QCM6490_bootbinaries.zip`<br>and `QCS9100_bootbinaries.zip` files. |
>         | --- | --- |
> 
> 
> 
>         After the build is generated, 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 bootup, individual
> subsystems execute the firmware as they come out of reset:
> 
> 
> 
> 
> 
> 
>         | `firmware-qcom-hlosfw_1.0.bb` | Handles fetch, unpack, and install for subsystem<br>firmware binaries, such as aDSP, cDSP, modem, and WLAN.<br>The firmware files for QCM6490- and QCS9075-based machines<br>are packed in `QCM6490_MSL.zip` and `QCS9100_HSP.zip` files. |
>         | --- | --- |
> 
> 
> 
>         The `firmware-qcom-hlosfw_1.0.bb` 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 `rootfs`.
>     - **DSP libraries**
> 
> 
>         User space utilities refer to the DSP libraries, which must
> be available in the `rootfs` image.
> The following firmware recipes provide the hardware SoC-specific DSP libraries:
> 
> 
> 
> 
> 
> 
>         | `firmware-qcom-dspso_1.0.bb` | Handles fetch, unpack, and install for DSP libraries.<br>The libraries for QCS6490- and QCS9075-based machines are packed<br>in `QCM6490_dspso.zip` and `QCS9100_dspso.zip` files. |
>         | --- | --- |
> 
> 
> 
>         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, 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 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) 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
>         
>         COMPATIBLE_MACHINE = "(qcom)"
>         
>         SRC_URI = "git://git.codelinaro.org/clo/la/kernel/qcom.git;protocol=https;rev=350dfd604d2ffbe0cac99bf3459b49114aad11f4;branch=kernel.qclinux.1.0.r1-rel \
>                  ${@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
>         
>         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 \
>                  "
>         # 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"
>         
>         S = "${WORKDIR}/git"
>         Copy to clipboard
> 
> 
>     The machine configuration files use OVERRIDES to select the appropriate
> kernel recipe variant. For example, the `qcom-qcs9100.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 `custom` and `base` variants.
> 
> 
> 
> 
> 
> 
>     | Variant | Configuration and fragments files |
>     | --- | --- |
>     | `base` | `defconfig`, `qcom.cfg` |
>     | `custom` | `qcom_defconfig`, `qcom_addons.config`, `selinux.cfg`,<br>`qcom_debug.config`, `qcom_addons_debug.config`, `selinux_debug.cfg` |
> 
> 
> 
>     The description of `defconfig` and `fragments` used for the `custom`
> variant are provided in the following table:
> 
> 
> 
> 
> 
> 
>     | Kernel configuration fragments | Description |
>     | --- | --- |
>     | `<kernel_src>/arch/arm64/configs/qcom_defconfig` | Base configuration that is aligned to product/performance needs |
>     | `<kernel_src>/arch/arm64/configs/qcom_debug.config` | Debug configuration fragment |
>     | `<kernel_src>/arch/arm64/configs/qcom_addons.config` | Additional Qualcomm downstream additions on top of upstream aligned base |
>     | `<kernel_src>/arch/arm64/configs/qcom_addons_debug.config` | Qualcomm downstream debug enablement |
> 
> 
> 
>     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.
> 
> 
>     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 the class is inherited, you can rebuild the image with
> the BitBake command:
> 
> 
> bitbake qcom-multimedia-image
>         Copy to clipboard
> 
> 
>     The SPDX output can be found 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/deploy/images/MACHINE/<image-recipe>-<MACHINE>.spdx.json` directory.

### meta-qcom-distro

This layer provides a reference distribution configuration for Qualcomm
products. Image recipes and package groups are defined in this layer.

- **BitBake classes**

    The following table provides an introduction to the BitBake classes,
which are available at:
[Classes](https://github.com/quic-yocto/meta-qcom-distro/tree/kirkstone/classes).

    Qualcomm Linux supports both SSH and UART serial shell for device access.
You can choose either SSH or UART to access the device. You can also use
ADB to debug issues when IP interfaces are down or to transfer large files.

    | `image-adbd.bbclass` | The `image-adbd.bbclass` class in `meta-qti-distro` installs adbd<br>in the image. The adbd daemon remains disabled unless<br>`IMAGE_FEATURES` contains the `enable-adbd` feature.<br>You can disable adbd by manually removing `/var/usb-debugging-enabled`<br>from `rootfs`. |
    | --- | --- |
    | `image-qcom-deploy.bbclass` | Deploys the image files available in<br>`<workspace>/build-<distro>/tmp-glibc/deploy/images/<machine>/<image-name>`.<br>The generated images are deployed in the `<image-name>` subdirectory. |
- **Distro configuration**

    The following table provides an introduction to the distro configurations,
which are available on
[GitHub](https://github.com/quic-yocto/meta-qcom-distro/tree/kirkstone/conf/distro).

    | `conf/distro/qcom-wayland.conf` | This distro configuration file defines the `qcom-wayland` distro.<br>You can use this file in the following example command.<br><br><br><br>> <br>> <br>> MACHINE=qcs6490-rb3gen2-core-kit DISTRO=qcom-wayland QCOM_SELECTED_BSP=base source setup-environment<br>>         Copy to clipboard<br><br><br><br>The `meta-qcom-distro/conf/distro/include/qcom-base.inc` configuration<br>defines common DISTRO\_FEATURES and adds the following features:<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><code class="docutils literal notranslate"><span class="pre">wayland</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">vulkan</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">opengl</span></code></p></li><br>> </ul><br><br><br><br>The Yocto Project documentation defines these distro features at<br>[Distro features](https://docs.yoctoproject.org/4.0.20/singleindex.html#distro-features). |
    | --- | --- |
    | `conf/distro/include/qcom-base.inc` | The INIT\_MANAGER is set to `systemd`.<br>For Yocto Project documentation on INIT\_MANAGER,<br>see [INIT_MANAGER](https://docs.yoctoproject.org/4.0.20/singleindex.html#term-INIT_MANAGER).<br>Other DISTRO\_FEATURES enabled are:<br><br><br>DISTRO_FEATURES:append = ” pam overlayfs acl xattr selinux ptest security virtualization”<br>        Copy to clipboard<br><br><br>To understand the purpose of these DISTRO\_FEATURES, see<br>[Distro features](https://docs.yoctoproject.org/4.0.20/singleindex.html#distro-features).<br><br><br>This file selects `systemd` as INIT\_MANAGER and `udev` as the dev<br>manager. |
    | `conf/distro/include/qcom-security_flags.inc` | This file includes the security flags as defined in<br>[security flags](https://git.yoctoproject.org/poky/tree/meta/conf/distro/include/security_flags.inc?h=kirkstone). |
- **Package groups**

    Package groups are defined in `meta-qcom-hwe` and `meta-qcom-distro`.
These package groups help you understand the features
defined by the Qualcomm BSP.

    | `packagegroup-qcom.bb` | Package group that contains all the basic packages |
    | --- | --- |
    | `packagegroup-qcom-multimedia.bb` | Package group that contains packages to enable multimedia support:<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><code class="docutils literal notranslate"><span class="pre">packagegroup-container</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">packagegroup-qcom-audio</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">packagegroup-qcom-bluetooth</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">packagegroup-qcom-camera</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">packagegroup-qcom-display</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">packagegroup-qcom-fastcv</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">packagegroup-qcom-graphics</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">packagegroup-qcom-k8s</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">packagegroup-qcom-opencv</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">packagegroup-qcom-sensors</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">packagegroup-qcom-video</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">python3-docker-compose</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">camera-server</span></code></p></li><br>> </ul> |
    | `packagegroup-qcom-test-pkgs.bb` | Package group that contains test packages |
- **Image recipes**

    The `meta-qcom-distro` Qualcomm Linux metadata layer defines image
recipes, which are available on
[GitHub](https://github.com/quic-yocto/meta-qcom-distro/tree/kirkstone/recipes-products/images).
The following table lists various images, their `IMAGE_FEATURES`, and
the functions that the images serve:

    | Image recipe | Description of the image |
    | --- | --- |
    | `qcom-minimal-image.bb` | Defines a small `rootfs` to boot to the shell.<br><br><br>The `IMAGE_FEATURES` enabled are as follows:<br><br><br>IMAGE_FEATURES += "splash tools-debug debug-tweaks enable-adbd read-only-rootfs"<br>        Copy to clipboard<br><br><br>For more information on `IMAGE_FEATURES`, see<br>[Image features](https://docs.yoctoproject.org/4.0.20/singleindex.html#image-features). |
    | `qcom-console-image.bb` | Extends `qcom-minimal-image` by adding more packages<br>and enabling more `IMAGE_FEATURES`:<br><br><br>IMAGE_FEATURES += “package-management ssh-server-openssh”<br>        Copy to clipboard |
    | `qcom-multimedia-image.bb` | Requires DISTRO\_FEATURE Wayland and it includes<br>all the multimedia packages in `rootfs`. |
    | `qcom-multimedia-test-image.bb` | Includes test packages in `rootfs` to test `qcom-multimedia-image`. |
    | `qcom-multimedia-crossesdk-image.bb` | Generates eSDK for `qcom-multimedia-image`. |
    | `qcom-guestvm-image.bb` | A minimal kernel-based virtual machine (KVM) image with boot to shell support. |
- **QDL flashing tool**

    QDL is a flashing tool that communicates
with the USB devices of ID `05c6:9008` to upload a flash loader to the
device. The flash loader flashes the images to universal flash storage (UFS)
or embedded multimedia card (eMMC) built into the device.

    There are two ways to set up the QDL tool on a host machine:

    - **The QDL tool is built by default in your Qualcomm Linux workspace**

        For convenience, the QDL tool is integrated in the build workflow.
The QDL recipe is available in `<workspace>/meta-qcom/recipes-devtools/qdl/qdl_git.bb`.
This recipe fetches and compiles the QDL tool after which you can
BitBake the recipe.

        The `image-qcom-deploy.bbclass` integrates the QDL tool by default, use this class to ensure
that the QDL is generated while building the image:

DEPENDS:append = " \
                python3-native \
                qdl-native \
                "
            Copy to clipboard

        When the image is built, the QDL binary is generated in the
`<workspace>/build-<distro>/tmp-glibc/deploy/image/<MACHINE>/<IMAGE>` directory.
This QDL binary is for the host architecture.

    - **Build the QDL tool as a standalone project**

        Clone the source project, install dev dependencies, and compile
QDL.

        On the host machine, run the following command:

sudo apt-get install git libxml2-dev libusb-1.0-0-dev pkg-config
            git clone --depth 1 --branch master https://github.com/linux-msm/qdl
            cd qdl
            make
            Copy to clipboard

        The QDL compiled in this way can be copied and moved around on
your host machine as it links to the dynamic linker at
`/lib64/ld-linux-x86-64.so.2`, which is native to the host machine
you are using.

    **Prerequisites to run QDL**

    - A one-time prerequisite on the host machine is required to use the QDL
flasher.

        To ensure that the host machine properly enumerates the Qualcomm device for
QDL flashing, do the following:

        1. Change the directory to `/etc/udev/rules.d`.
        2. Create a file named `51-qcom-usb.rules` in this directory.
        3. Add the following line in the `51-qcom-usb.rules` file:

SUBSYSTEMS=="usb", ATTRS{idVendor}=="05c6", ATTRS{idProduct}=="9008", MODE="0666", GROUP="plugdev"
                Copy to clipboard
    - Verify if the host machine is running `ModemManager`.

Note

Verify this every time you use QDL.

        Some Linux distributions come with `ModemManager`, a tool for
configuring mobile broadband. When the Qualcomm hardware SoC-based device
is connected in the USB mode, it is identified as a Qualcomm modem and
`ModemManager` tries to configure the device.

        The `ModemManager` interferes with QDL flashing. Hence, if you
have `ModemManager` running, you must disable it before
connecting your test device. You can stop `ModemManager` on a Linux distribution
with `systemd` by using `systemctl`. To determine how to manage `ModemManager` with
QDL flashing, see [QDL and ModemManager](https://docs.qualcomm.com/doc/80-70015-27/topic/debug.html#qdl-and-modemmanager).

    **Flash using QDL**

    To run the QDL tool, use the following generic command:

qdl <flash-programmer-binary> [<rawprogram xml> <patch xml>]
        Copy to clipboard

    This sample generic input shows that the QDL tool expects three
types of input files. All these input files are generated under the
`<workspace>/build-<distro>/tmp-glibc/deploy/image/<MACHINE>/<IMAGE>` directory. When the
image recipe completes successfully, you must perform the steps to
flash the device.

    If you want to use the QDL generated as part of the
build, change the directory to
`<workspace>/build-qcom-wayland/tmp-glibc/deploy/image/<MACHINE>/<IMAGE>`, as the Qualcomm Linux
workflow generates and deploys QDL at this path. For example:

cd <workspace>/build-qcom-wayland/tmp-glibc/deploy/images/qcs6490-rb3gen2-core-kit/qcom-multimedia-image/
        Copy to clipboard

    Run the flash command as follows:

./qdl prog_firehose_ddr.elf rawprogram*.xml patch*.xml
        Copy to clipboard

    **Do not copy QDL to other locations**

    Do not copy or move the QDL binary at
`<workspace>/build-qcom-wayland/tmp-glibc/deploy/images/qcs6490-rb3gen2-core-kit/qcom-multimedia-image/`,
which is built as part of the Qualcomm Linux build workflow. Due to its dependencies, ensure that you use it from its current location.
To understand these dependencies, run the following command:

file qdl
        Copy to clipboard

    The output is as follows:

qdl: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV),
dynamically linked, interpreter
&lt;workspace&gt;/build-qcom-wayland/tmp-glibc/sysroots-uninative/x86\_64-linux/lib/ld\u0002linux-x86-64.so.2,
BuildID[sha1]=430c23d51190ef6c225586c5d63d2a7c9cd50430, for GNU/Linux
3.2.0, stripped

    This output shows that there is a dependency on
`<workspace>/build-test-distro/tmp-glibc/sysroots-uninative/x86_64-linux/lib/ld-linux-x86-64.so.2`,
which is due to the way Qualcomm Linux builds QDL. To run QDL independently, see [standalone QDL](https://docs.qualcomm.com/doc/80-70015-27/topic/platform_software_features.html#qdl-as-standalone).
- **QDL advanced options**

    QDL supports advanced options that are passed as optional flags to
QDL from the command line. These advanced options are described in
the following table:

    | Option | Description |
    | --- | --- |
    | `--debug` | Prints debug logs while flashing the image. |
    | `--storage <emmc|nand|ufs>` | Use this to define the storage type. If this option is not provided, QDL detects the storage type. |
    | `--finalize-provisioning` | Irreversible one-time provisioning (OTP) for UFS storage. Use the following safety mechanisms to prevent unintentional device locking:<br><ul class="simple"><br><li><p>Unless you intend to lock your device, set <code class="docutils literal notranslate"><span class="pre">bConfigDescrLock</span> <span class="pre">=</span> <span class="pre">0</span></code> in your XML and do not use the command-line parameter <code class="docutils literal notranslate"><span class="pre">--finalize-provisioning</span></code>.</p></li><br><li><p>If you want to perform OTP, ensure that your XML includes the <code class="docutils literal notranslate"><span class="pre">bConfigDescrLock</span> <span class="pre">=</span> <span class="pre">1</span></code> property and provide the command-line parameter <code class="docutils literal notranslate"><span class="pre">--finalize-provisioning</span></code>.</p></li><br></ul><br><br>Note<br><br><br>If there is a mismatch between the command-line parameter and XML, provisioning is not performed. |
    | `--include` | Points to the path where the images are present. By default, it is NULL, that is, images are present at the same location. This is useful<br>when QDL is built as a standalone, `--include` is used to point to the path where images are present. |

    Example usage with the flags:

<Path-to-QDL-dir>/qdl --storage ufs --include <AN IMAGES DIR>/qcm6490_images/qcom-multimedia-image  <AN IMAGES DIR>/qcm6490_images/qcom-multimedia-image/prog_firehose_ddr.elf  <AN IMAGES DIR>/qcm6490_images/qcom-multimedia-image/rawprogram*.xml  <AN IMAGES DIR>/qcm6490_images/qcom-multimedia-image/patch*.xml
        Copy to clipboard

### Build Qualcomm Linux

The `meta-qcom`, `meta-qcom-hwe`, and `meta-qcom-distro` sections described the
machine configurations, distro configurations, image recipes, and OVERRIDES.

The [table](https://docs.qualcomm.com/doc/80-70015-27/topic/platform_software_features.html#qcom-selected-bsp) lists the supported values that can be set for `MACHINE`, `DISTRO`, and `QCOM_SELECTED_BSP`.
To setup the environment, use these values and run the following command:

MACHINE=<machine configuration name> DISTRO=<Distro name> QCOM_SELECTED_BSP=<variant name> source setup-environment
    Copy to clipboard

The following table lists the possible image recipes to select and generate an image as per the selected
`MACHINE`, `DISTRO`, and `QCOM_SELECTED_BSP`, run the following command:

bitbake <image recipe name>
    Copy to clipboard

| `QCOM_SELECTED_BSP`<br><br>(selected by you) | Effective BitBake OVERRIDE<br><br>(derived from `QCOM_SELECTED_BSP`) | MACHINE configuration<br><br>(selected by you) | Reference DISTRO configuration<br><br>(selected by you) | Image recipe<br><br>(selected by you) |
| --- | --- | --- | --- | --- |
| `custom` | `qcom-custom-bsp` | <ul class="simple"><br><li><p><code class="docutils literal notranslate"><span class="pre">qcs6490-rb3gen2-core-kit.conf</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">qcs6490-rb3gen2-vision-kit.conf</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">qcs6490-rb3gen2-vision-kit.conf</span></code></p></li><br></ul> | <ul class="simple"><br><li><p><code class="docutils literal notranslate"><span class="pre">qcom-wayland</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">qcom-robotics-ros2-humble</span></code></p></li><br></ul> | <ul class="simple"><br><li><p><code class="docutils literal notranslate"><span class="pre">qcom-minimal-image</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">qcom-console-image</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">qcom-multimedia-image</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">qcom-multimedia-test-image</span></code></p></li><br></ul> |
| `base` | `qcom-base-bsp` | <ul class="simple"><br><li><p><code class="docutils literal notranslate"><span class="pre">qcs6490-rb3gen2-core-kit.conf</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">qcs6490-rb3gen2-vision-kit.conf</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">qcs6490-rb3gen2-vision-kit.conf</span></code></p></li><br></ul> | <ul class="simple"><br><li><p><code class="docutils literal notranslate"><span class="pre">qcom-wayland</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">qcom-robotics-ros2-humble</span></code></p></li><br></ul> | <ul class="simple"><br><li><p><code class="docutils literal notranslate"><span class="pre">qcom-minimal-image</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">qcom-console-image</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">qcom-multimedia-image</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">qcom-multimedia-test-image</span></code></p></li><br></ul> |
|  |  |  |  |  |

To learn more about the supported combinations for building Qualcomm Linux, see
[Qualcomm Linux Release Notes](https://docs.qualcomm.com/bundle/publicresource/topics/RNO-240929204440).

For detailed build instructions, see
[GitHub workflow for unregistered users](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-254/github_workflow_unregistered_users.html).

### meta-qcom-realtime

The `meta-qcom-realtime` metadata layer is available on
[GitHub](https://github.com/quic-yocto/meta-qcom-realtime). This layer provides
additional software support for building a real-time kernel for Qualcomm devices.

- **Kernel recipes**

    Qualcomm Linux supports the LTS Linux kernel v6.6.x and real-time extensions.
It is maintained through the `linux-qcom-custom-rt_6.6.bb` and `linux-qcom-base-rt_6.6.bb` Yocto recipes
at `recipes-kernel/linux` under the `meta-qcom-realtime` layer.
The pending pre-empt RT patches can be found at [realtime](https://wiki.linuxfoundation.org/realtime/start).
These patches are fetched and applied on top of the `linux-qcom-custom-rt_6.6.bb`,
which is publicly hosted at [Kernel](https://git.codelinaro.org/clo/la/kernel/qcom.git).

    To compile a real-time kernel for Qualcomm machines:

> 
> 
> - If you chose the `custom` OVERRIDE, `conf/layer.conf` selects `linux-qcom-custom-rt`.
>     - If you chose the `base` OVERRIDE, `conf/layer.conf` selects `linux-qcom-base-rt`.

    **Kernel configuration**

    Both recipes append the `qcom_rt.cfg` fragment as follows:

KERNEL_CONFIG_FRAGMENTS:append = " ${WORKDIR}/qcom_rt.cfg"
        Copy to clipboard
- **Enable** `meta-qcom-realtime` **in build**

    To include `meta-qcom-realtime` in the build, export the
`meta-qcom-realtime` layer to EXTRALAYERS in `bblayers.conf`, as
described in the following steps:

    1. Source the environment.

        The following is an example to source the environment for the QCS6490-based machine and the `qcom-wayland` distro:

MACHINE=qcs6490-rb3gen2-core-kit DISTRO=qcom-wayland source setup-environment
            Copy to clipboard
    2. Open the `build-qcom-wayland/conf/bblayers.conf` file and update
the EXTRALAYERS variable as follows:

EXTRALAYERS ?= " \
              ${WORKSPACE}/layers/meta-qcom-realtime \
             "
            Copy to clipboard
    3. Run the build command to rebuild with `meta-qcom-realtime` as
follows:

bitbake qcom-multimedia-image
            Copy to clipboard

### meta-qcom-extras

This layer is an optional metadata layer for registered users. This
layer enables source compilation of select components, which are
otherwise present as binary in `meta-qcom-hwe`. If you are entitled to
receive this metadata layer, you can use the clone steps shared in the
[Qualcomm Linux Build
Guide](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-254/build_addn_info.html).

- **Firmware recipes**

    Firmware recipes in the `meta-qcom-extras` layer integrate the firmware .zip file
that is generated on compiling other subsystems.

    | |<br>        ├── recipes-firmware<br>        |   └── firmware<br>        |        ├── firmware-qcom-bootbins_1.0.bbappend<br>        |        ├── firmware-qcom-dspso_1.0.bbappend<br>        |        └── firmware-qcom-hlosfw_1.0.bb<br>        └── packagegroups<br>           └── packagegroup-firmware-qcm6490.bb<br>        Copy to clipboard | The recipes in `meta-qcom-extras` override the recipes in `meta-qcom-hwe`.<br>The `meta-qcom-hwe` layer uses pre-built firmware binaries by default, while<br>the `meta-qcom-extras` layer builds the firmware from Qualcomm-proprietary repositories.<br><br><br>The `meta-qcom-extras` layer ignores the pre-built binaries from the<br>.zip files. These recipes instead search for user-provided .zip files set<br>in FWZIP\_PATH as follows:<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><code class="docutils literal notranslate"><span class="pre">firmware-qcom-bootbins_1.0.bbappend</span></code>: Searches the FWZIP_PATH variable for <code class="docutils literal notranslate"><span class="pre">QCM6490_bootbinaries.zip</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">firmware-qcom-hlosfw_1.0.bbappend</span></code>: Searches the FWZIP_PATH variable for <code class="docutils literal notranslate"><span class="pre">QCM6490_fw.zip</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">firmware-qcom-dspso_1.0.bbappend</span></code>: Searches the FWZIP_PATH variable for <code class="docutils literal notranslate"><span class="pre">QCM6490_dspso.zip</span></code></p></li><br>> </ul> |
    | --- | --- |

### meta-qcom-qim-product-sdk

- **BitBake classes**

    The following table lists the BitBake classes defined in the
`meta-qcom-qim-product-sdk` metadata layer:

    | BitBake class | Description |
    | --- | --- |
    | `qim-prod-sdk-pkg.bbclass` | <ul class="simple"><br><li><p>Provides a packaging task to pack the Qualcomm Intelligent Multimedia Product (QIMP) SDK artifacts<br>into an archive. It is invoked by the <code class="docutils literal notranslate"><span class="pre">qim-product-sdk</span></code> recipe.</p></li><br><li><p>The easy-to-install artifact archives are available in the<br><code class="docutils literal notranslate"><span class="pre">&lt;workspace&gt;/build-qcom-wayland/tmp-glibc/deploy/qim_prod_sdk_artifacts</span></code><br>directory after the recipe build is complete.</p></li><br></ul> |
    | `qimsdk-pkg.bbclass` | <ul class="simple"><br><li><p>Provides a task to package the Qualcomm Multimedia SDK packages into an<br>archive along with an easy-to-use install script. The archives are<br>generated with packages to develop, deploy, and debug separately.</p></li><br><li><p>The easy-to-install artifact archives are available in the<br><code class="docutils literal notranslate"><span class="pre">&lt;workspace&gt;/build-qcom-wayland/tmp-glibc/deploy/qimsdk_artifacts</span></code> directory.</p></li><br><li><p>Invoked by the <code class="docutils literal notranslate"><span class="pre">qim-sdk</span></code> recipe during the build.</p></li><br></ul> |
    | `tflitesdk-pkg.bbclass` | <ul class="simple"><br><li><p>Provides a packaging task to pack the TensorFlow Lite SDK artifacts into several<br>archives to develop, deploy, and debug. It is invoked by the<br><code class="docutils literal notranslate"><span class="pre">tflite-sdk</span></code> recipe during the build.</p></li><br><li><p>The easy-to-install artifact archives are available in the<br><code class="docutils literal notranslate"><span class="pre">&lt;workspace&gt;/build-qcom-wayland/tmp-glibc/deploy/qim_prod_sdk_artifacts</span></code><br>directory after the recipe build is complete.</p></li><br></ul> |
- **Distro configuration**

    | `layer.conf` | Configures the project layers with the following information:<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p>Recipe file path information</p></li><br>> <li><p>Supported Yocto version</p></li><br>> <li><p>Supported Qualcomm<sup>®</sup> Hexagon<sup>™</sup> Processor version</p></li><br>> <li><p>Supported Qualcomm<sup>®</sup> Neural Processing SDK version</p></li><br>> <li><p>Supported Qualcomm Neural Network (QNN) SDK version</p></li><br>> </ul> |
    | --- | --- |
- **Image recipes**

    | Recipe | Description |
    | --- | --- |
    | `recipes-gst` | Consists of the upstream GStreamer recipe changes (`.bbapend`) along with Qualcomm recipes:<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-good_1.20%.bbappend</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-base.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-batch.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-metamux.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mldemux.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlmeta.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlmuxer.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlqnn.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlsnpe.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mltflite.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlvclassification.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlvconverter.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlvdetection.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlvpose.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlvsegmentation.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-overlay.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-qmmfsrc.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-socket.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-tools.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-vcomposer.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-vsplit.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-vtransform.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-qcom-oss-sample-apps.bb</span></code></p></li><br>> </ul> |
    | `recipes-qcom-ml` | Consists of two recipes:<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><code class="docutils literal notranslate"><span class="pre">qnn.bb</span></code>: Used to package QNN SDK</p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">snpe.bb</span></code>: Used to package Qualcomm Neural Processing SDK</p></li><br>> </ul> |
    | `recipes-qim-product-sdk` | Recipe to install QIM product SDK that has QIM, Qualcomm Neural Processing, QNN, and TensorFlow Lite SDKs |
    | `recipes-tensorflow-lite` | TensorFlow Lite recipes build and install TensorFlow Lite for the following versions:<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p>2.12.1, 2.13.1, 2.14.1, and 2.15.0</p></li><br>> <li><p>Default version: 2.15.0</p></li><br>> </ul> |
- **Package groups**

    | Package group | Description |
    | --- | --- |
    | `packagegroup-qcom-gstrecipes-gst` | Package group to enable upstream basic GStreamer along with Qualcomm plug-ins:<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-base</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-tools</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-batch</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-metamux</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mldemux</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlmeta</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlvconverter</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlvclassification</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlvdetection</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlvpose</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlvsegmentation</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-overlay</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-qmmfsrc</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-socket</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-vcomposer</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-vsplit</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-vtransform</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-qcom-oss-sample-apps</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlsnpe</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlqnn</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mltflite</span></code></p></li><br>> </ul><br><br><br><br>It also packs the upstream GStreamer packages:<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><code class="docutils literal notranslate"><span class="pre">cairo</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gdk-pixbuf</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">liba52</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">libdaemon</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">libgudev</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">lame</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">libpsl</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">librsvg</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">libsoup-2.4</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">libtheora</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">libwebp</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">mpg123</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">orc</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">sbc</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">speex</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">taglib</span></code></p></li><br>> </ul> |
    | `packagegroup-qcom-gst-basic` | Package group to enable upstream GStreamer:<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-base</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-good</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-bad</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-rtsp-server</span></code></p></li><br>> </ul> |
    | `packagegroup-qcom-qim-product` | Package group to pack the following packages along with an install script:<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><code class="docutils literal notranslate"><span class="pre">packagegroup-qcom-gst</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">packagegroup-qcom-ml</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">install.sh</span></code></p></li><br>> </ul> |
    | `packagegroup-qcom-ml` | Package group to pack the Qualcomm ML framework:<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><code class="docutils literal notranslate"><span class="pre">tensorflow-lite</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">qnn</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">snpe</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">libgomp-dev</span></code></p></li><br>> </ul> |

## Qualcomm Linux software components

This section covers key software components like overlay file systems, initialization scripts, debugging tools,
systemd-boot for boot management, partitioning tools, and support for containerization and Kubernetes.
It also describes features, such as logging and secondary virtual machines.

## File system overlays

Qualcomm Linux uses an overlay file system to create overlays on specific
mount points. It is recommended to have a read-only rootfs, but many
applications may need read-write access to some parts of the
file system. This is achieved using `overlayfs` bbclass while keeping the base
rootfs read-only.

The `overlayfs-qcom-paths` recipe creates `/var`, `/etc`, and
`/opt` as overlay mount points and it inherits the `overlayfs`
bbclass. In the recipe, the `overlayfs_mount_point` variable is
defined as `mnt-overlay`, which implies that the `mnt-overlay.mount`
systemd unit is defined in the BSP and it is installed into the image.
At bootup, the `mnt-overlay.mount` systemd unit mounts the
`/dev/disk/by-partlabel/overlay` disk partition to all the mount
points.

The `overlayfs_writable_paths` variable specifies the writable paths
used at the runtime, that is, `/opt`, `/etc`, and `/var`.

To include `overlayfs` support, it must be added to the
DISTRO\_FEATURES.

- Overlay for `/var`

    To see the `/var` overlayfs mount point, run the following mount
command:

sh-5.1# mount | grep var
        overlay on /var type overlay (rw,relatime,seclabel,lowerdir=/var,upperdir=/mnt/overlay/upper/var,workdir=/mnt/overlay/workdir/var)
        Copy to clipboard
- Overlay for `/etc`

sh-5.1# mount | grep etc
        /dev/sda11 on /mnt/overlay type ext4 (rw,relatime,rootcontext=system_u:object_r:etc_t:s0,seclabel,stripe=128,inlinecrypt)
        overlay on /etc type overlay (rw,relatime,seclabel,lowerdir=/etc,upperdir=/mnt/overlay/upper/etc,workdir=/mnt/overlay/workdir/etc)
        Copy to clipboard
- Overlay for `/opt`

sh-5.1# mount | grep opt
        overlay on /opt type overlay (rw,relatime,seclabel,lowerdir=/opt,upperdir=/mnt/overlay/upper/opt,workdir=/mnt/overlay/workdir/opt)
        Copy to clipboard
- Overlay for `/home`

sh-5.1# mount | grep home
        overlay on /home type overlay (rw,relatime,seclabel,lowerdir=/home,upperdir=/mnt/overlay/upper/home,workdir=/mnt/overlay/workdir/home)
        Copy to clipboard
- To resize the overlay partition, use the
`resize-partitions.bb` class and `resize-partition.service.in` recipe file.
The resize-partition service runs at device bootup to create and set
the file system according to the size of the partition. In
the resize-partition service, running the command to resize the overlay
partition performs the following:

    - `/sbin/e2fsck -n /dev/disk/by-partlabel/%i` verifies the specified
file system based on its partition label for errors, without making
any changes.
    - `/sbin/mkfs.ext4 /dev/disk/by-partlabel/%i` invokes the
`mkfs.ext4` utility and formats a partition with the ext4
file system.
    - `/sbin/resize2fs /dev/disk/by-partlabel/%i` attempts to increase
the size of the partition.
    - `/sbin/tune2fs -O encrypt,stable_inodes /dev/disk/by-partlabel/overlay`
modifies various parameters. For example, `encrypt` allows you
to encrypt data stored on the file system and the `stable_inodes`
option ensures that inode numbers remain stable across file system
operations.

## System initscripts

System initscripts added to the image by `meta-qcom-hwe` are as follows:

| System initscripts | Description |
| --- | --- |
| `mnt-overlay.mount` | Mounts the `/dev/disk/by-partlabel/overlay` disk partitions to all<br>the mount points that user `overlayfs`. |
| `var-persist.mount` | Mounts the `/dev/disk/by-partlabel/persist` disk partition<br>to `/var/persist`. |
| `android-tools-adbd.service` | Provides the adbd daemon on the device. |
| `logrotate.service` | Archives old logs. For more information on this service, see<br>[Log shim for syslog()](https://docs.qualcomm.com/doc/80-70015-27/topic/platform_software_features.html#logging-shim-for-syslog).<br><br><br>The `logrotate.service` is an upstream system unit.<br>The `rsyslog.logrotate` configuration file is modified in Qualcomm<br>Linux to manage on-device logs. The modified `rsyslog.logrotate` file is<br>in the `meta-qcom-hwe/dynamic-layers/openembedded-layer/recipes-devtools/rsyslog/rsyslog/rsyslog.logrotate`<br>directory. This file overrides the<br>default configuration file provided by the upstream at<br>the `meta-openembedded/meta-oe/recipes-extended/rsyslog/rsyslog/rsyslog.logrotate`<br>directory. |
| `pd-mapper.service` | Configures and manages protection domains.<br>The `pd-mapper.service.in` file is updated to run the service as a system user instead of<br>as the root user by `pd-mapper_git.bbappend` in the Qualcomm Linux BSP layer.<br><br><br>do_install:prepend() {<br>        # convert the service from root user to system user<br>        sed -i "/ExecStart=/i\User=system\nGroup=system" pd-mapper.service.in<br>    }<br>    Copy to clipboard |
| `property-vault.service` | Provides the `property_get` and `property_set` functionalities.<br>For more information on this service,<br>see [Properties](https://docs.qualcomm.com/doc/80-70015-27/topic/platform_software_features.html#properties-section). |
| `persist-property-vault.service` | Runs `set-persist-prop.sh`, which sets the<br>`le.persistprop.enable` flag to true. Set this flag to use<br>the persist properties. |
| `resize-partition@.service` | Resizes the file system at bootup time according to<br>the size of the partition.<br><br><br>ExecStart=/bin/sh -c "/sbin/e2fsck -n /dev/disk/by-partlabel/%i; if [ $? -gt 1 ]; then /sbin/mkfs.ext4 /dev/disk/by-partlabel/%i; /sbin/resize2fs /dev/disk/by-partlabel/%i; #COMMAND# fi;"<br>    Copy to clipboard |
| `rsyslog.service` | Redirects logs according to a specified configuration.<br>For more information on this service, see [Log shim for syslog()](https://docs.qualcomm.com/doc/80-70015-27/topic/platform_software_features.html#logging-shim-for-syslog). |
| `sys-kernel-debug.mount` | Masks the `sys-kernel-debug.mount` point when `perf` is built. |

## Debug tools

The `packagegroup-core-tools-debug` defined in the `<workspace>/layers/poky/meta`
directory adds debug tools as part of `rootfs`.
This recipe is appended by
`<workspace>/layers/meta-qcom-hwe/recipes-devtools/` as
`packagegroup-core-tools-debug.bbappend`. This append file adds
`ltrace`, `perf`, `sysstat`, and `valgrind`.
For more information, see [Debug Linux user
space](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-12/using_open_source_debug_tools.html).

## systemd-boot

The systemd-boot unified extensible firmware interface (UEFI) boot manager provides options to control the boot flow and loads the user-selected boot loader.
The configuration files, kernels, initrds, and other EFI images must reside on the EFI partition.

To execute Linux kernels directly as EFI images, build them with `CONFIG_EFI_STUB`. The systemd-boot supports two configurations:

> 
> 
> - Type1:
> 
> 
>     The Type1 configuration uses boot loader specification (BLS) description files. You can find these files in the `/loader/entries/` directory on the EFI system partition (ESP).
> - Type2:
> 
> 
>     The Type2 configuration uses unified kernel images (UKI). These images combine the kernel, initrd, and kernel command-line into a single EFI executable.
> Type2 offers better security because the UKI contains all the necessary information for the device to boot. Signing a UKI image secures all included entities.
> If UEFI secure boot is enabled, the system only loads signed images, making signing a requirement.

For more details, see [systemd-boot](https://www.freedesktop.org/software/systemd/man/latest/systemd-boot.html).

Note

Signing is optional during the development phase.

- **UKI**

    UKI is a combination of a UEFI boot stub program, a Linux kernel
image, an initrd, and other resources in a single UEFI portable
executable (PE) file. The UEFI boot stub looks for various resources
for the kernel invocation inside the UEFI PE binary. This allows
combining various resources inside a single PE binary image,
which may then be signed using OpenSSL utilities.

    For more details on UKI, see
[unified_kernel_image](https://uapi-group.org/specifications/specs/unified_kernel_image/).
The `uki.efi` content is shown in the following table:

    | Components of uki.efi file | Contents |
    | --- | --- |
    | Initrd = Init ramdisk | `initramfs-qcom-image-qcm6490.cpio.gz` |
    | Linux = Kernel Image | Image |
    | Efi-arch = Architecture | `aa64` |
    | Stub = System-boot efi stub | `linuxx64.efi.stub` |
    | Cmdline = Command-line parameters | `root=/dev/disk/by-partlabel/system rw rootwait console=ttyMSM0,1150200n8 pcie_pme=nomsi earlycon kernel.sched_pelt_multiplier=4` |
    | OS-release = OS-release | <ul class="simple"><br><li><p><code class="docutils literal notranslate"><span class="pre">ID</span> <span class="pre">=</span> <span class="pre">qcom-wayland</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">Name</span> <span class="pre">=</span> <span class="pre">“QCOM</span> <span class="pre">Reference</span> <span class="pre">Distro</span> <span class="pre">with</span> <span class="pre">Wayland”</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">VERSION</span> <span class="pre">=</span> <span class="pre">“1.0”</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">VERSION_ID</span> <span class="pre">=</span> <span class="pre">1.0</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">PRETTY_NAME</span> <span class="pre">=</span> <span class="pre">“QCOM</span> <span class="pre">Reference</span> <span class="pre">Distro</span> <span class="pre">with</span> <span class="pre">Wayland</span> <span class="pre">1.0”</span></code></p></li><br></ul> |

    **Image recipes**

    `meta-qcom-hwe/recipes-kernel/images` contains the following recipes:

    - `linux-qcom-uki.bb` generates `uki.efi`.
    - `esp-qcom-image.bb` generates `efi.bin` using `uki.efi`.

    The `meta-qcom-distro/classes/image-qcom-deploy.bbclass` invokes the `esp-qcom-image`.

- **EFI image**

    The ESP image contains `efi.bin`, a vfat file. This
file contains all the details necessary for UEFI to enable
systemd-boot. UEFI mounts the ESP partition and executes systemd-boot
manager (`bootaa64.efi`). The systemd-boot manager parses the UKI
image, loads the kernel image, and then transfers the control to it.

    For more information on the structure of ESP, see [EFI system
partition](https://wiki.archlinux.org/title/EFI_system_partition).

    A sample structure of the ESP partition is shown in the following
figure. It contains systemd-boot (`bootaa64.efi`) and UKI
(`uki.efi`).

> 
> 
> ![../../_images/efi-bin.png](data:image/png;base64,UklGRm4OAABXRUJQVlA4TGIOAAAvj8FbAIUP/v+8bNu27YuDg2EYhmEYhmEYhmEYhmHY+T8MB8NOC8PBH459oVqWZV1fy7Yvs+7HnzWi/xPAf12/du++XX1L2y7v3bStdzF882v302B+lyOrWeUF1hy+bo4VkAq31T1W6+oZt67Oi+0B4rIIjxUYHyuQP7MAkxdrEOzkwQloHitRPDMCrRdLUfN8VOX2RXtZ7j7MJegunn/B1/ok/gRsU9eN24U1S4TSmNXRLbO8YBvawdzIvMhpnQ7S9N24eSJpcVkKyQG3CzdgeaaUFufKXhhgJelSjFICgB68kCuh22VuNXIh1zhSCKIo3bip59IUUd9nQPlUnSAdag3MPqhHYEhyC9CTpCToeH4F0DlSSmB5BmokuUXInP+xEVpetoiEpPsKNfAsMYpn9Mxzj9D6nxmBvVqhd5LyFTmvayTyRMXLGXrzPz1Cs563EXr7quKmQ7A90VwZ6NX/tHhUfZseWJ6or1bozQfpurkd5LsMwOyvOkSOj3+LDnr1VyOC4/s1SJ2/WhWG7xNtFxIjp79yOaL9ytoXTUlxXCFaTx0weyxuIeJ+Pfa5jeoX5cB0FSndDEOtkDmfRZMA0BpQw0WE9goPzKccrQlxzoQ35pSgusPqgyhjkSZpMey8bIvlwpbFflqK2p7GYuVRZ2kxOl4eZXmQZF/MV7YqDy90dvy+jt/T/7zfX/99Iuu7W3vf0jTja+dlmcb32OSj75zWZ6r+tTGQ9568LeWxduNrG2CkJ3f1M+ZFNTD4Mvvrv384kUt3IU5ExJEU5+uOPD0n+UFKkZ6TwtGkra8z0M25teQO1E3T1J3jiMzXrYh5fyDk7YT8h8D9vWr8QySP0W9U8zudjHtZ0J6Pi+Cw1lrxEyXerepfBnVeLqDPvR9D/bJYRMS6C1WejZ+ogbR+q719He8PhLz1FAP/hE+5f35iEBqzLIuRJ0Z/t2tcryd9NyPzddzmy0VIZxbeyrJ6Ox/4b68dq/tZsIkefhYMUPw4lL/++9dzU9s0dbe4O9NFQVTP7sZOeRDkw36a66Zp2rZpmnrxV6KRpKlGelxIDZ0VmUa2XywR4iKPEQwk+yRNEyBN02TwWodzR4PsokKxkdxLZI7kqvUopIwahnQi7ogicSLOawlJFwVCckQqPEuGnpQYMy8nRMKzRBH/Wn4kliRTbUnmMLw2yEiDgrcZzJ3zXkJy16kjjyCUGwlDyxrjXY/BF+T7e3UvMdu2FuFKckHM+xgrEyx3Iwpf8G4r91yAy9qRnB9KYB6bkPmpWJ7T6Maxz1V6+JKwyN9psfAVQpItatI84mK9McF8N6D2BSXfvGjYk9X64KFDubFB7FhjvGsxezYJsNOlar0ZUZMzqhuJ9eHP5LQiceSA3F3YSG2kDZW56lDTn+0idokwkZQMxebo5gQ9SU4IRkseNWLrzQLoIAi0HniWHCqMQuiel6NGEEUa+c6bIPBcnKqyLMvZ8tqtdZ7n7cHbY8jzvFx479qWnusv/7/scbv7YWiD2v0oSIzg+FGwEcJf//2DgtvkjyPbeviMVY/vwm2LsQ+IdS87UhXGTqbdVxgMb2JMNRDPN0Mcdy/LVGdGNyDxPFNovqhFOq1LM11tgULxKqsyklyS3vN0mL9mQen4aBF3KF91qOr0sJfYjNxZY44HDmPshbSYRNzpMMbeyGq2C5eGwkcXtUxP7Wa9kE2VIo4U5y/GNdeIpwtbxUBQ7BdbEQJRLaRJQkRJPJBzHgFR50gedaqg843kjoqPSpxwfMLkAZAZUvIIQRIv3JLZX6RBOQ8KE0mboprnGtFOcg3QznOOXLh3GcquWylJPK5Lho5kH7Rm7RBbckJHWTd31WLl8JhR0bTOsV7phhpJ1+40GD4B+6YwkFxU4sgWHUn2KEmXYSHJEgPJHgtJykaSNogduVuSbGDIGlWTQqXd6QhqPuESfZA8kJO0qib5IQTmeKe7u2t4TmBodSAnFypLozKeNxVfzKfb5HQ9Yz4FST+PIRqSVXA8s6qW51Id5KGqD+EIgeC9ZvZmvKgwckPJyworRwwXEgfy2GGWJbqSbTENllNNkkeoDs4YeKoeGJHV5xjrp/Fuzc1wMWGkQXVVw7C/S/TxyJqHSZKoxJHShXGShlf9iRVWlyQi4nqU4h7QgdZah/H+SXCKk/S9NnIzXtQYuT6ycrhxiRayu9qDYDpE4tiRFarNuuHUo72ose0I0iRJQwRpezNgdNf8KCjvltcG/UWsNh4qdCcXassF+cWmEpL9VYeZJJPY8VA5Sc6nFdVFiV26tmmaNkPcTDcTGj74Sbxrg9CQ3HTiyBLzaUZNSqT3U4uJ5ITp1GAleQQnVKf6ZHV4kNyDWHg9oiLJrbekhIF4lTho1znGTHLTetjWXsUHyRHRtK0tckfSIDOz4YJ03eYUiaNLMG5brU/sES/bHGLh7YDylKEnOSJdts3UjSeZhxDQI89LCgD5zvMQAdC1kKRrAPRkq4Gwz2NHrgmAYsBMkl0AIJl5P6E+5RhIcowAIJ5O8B2yCo952XktZp5X3tplnnferrNxJPd53mk3kpRlNuQmJ+7LbIQPympPh3En2mWejZCkW4+TrNZX/BX89d+v/37998/+xP0IuL6Vqz1K5SdAFOzVhtD+COg7bgd/GP6ifzKun0nOPY86zJaT9KM7zZ3QtsPpaGd/ZlVBstRDmBYBhlOQXBTY6XJMJCt8fvnxVuVLRJcka+jOcQuCg5Tw7iB3HQtnNPz4dPhW4/HrKgwk2WB+igMaiUP7+b3bUL6sVPY0vcKlulQLPzzJlA7eatjzGxyn+RVcFQp+epRtf68Hv1t6UV7NQCof3x/wa1yY8BEbZi06LyavYxRakrtWpworU7X5MLNt23a8pkYjXGKlD3JBRRqVOe8VAApAQUFOssDFhImkTRBGQV1i5xEGB8kSre/iXFdlWVYDXT2SnGo5bfVGkkeT5wtNLVyrmSRtPXivv/z/RsOQLT8LNkT6s7AHiH8Ywl92uO/hnD9bU3Mn9mVbnqQDxfqxGeNdpccXHbGqq96VevZiC6a7EsOLRvQkXY7Jt8nOF/cwJGl3+rbn3c2A7fT+P7ijmU/S9Q+s9UgujX1kbUKdzSS3KkVetcK5EV+1or4IQ3ezB+FK1tgemHVctzla0mQRkqwUljh81XYTRTdHHGwkG+x3h0osyRIr6XoY58hS+bJZ4nDjMz0MSe6qJDlgIz88neVvNMv7r+qyYOdTqZ6NMWYOYpI91s9u03i7xxdVOpYX4Db1Aa7UbzYo5Jn1mXlG7p7T82qMMevuA0hj1re68en9mYkV2hccfNADvH2L9DQivpEUywPHQbLH4NNchkGkC9UdNxXuNzaMDtJG4eJI229ejFsEHQRjrEnOGEmOSIQ1NnIDNpImVkEQBKEh2cGcCvgr7k3V7Jx6knu7keTYWprWkq4fHElKX5VVd5Dk2h6nuRN/9Rf113+//vu3Spz7Fs6jSdZ9hzWb/JlF8R1mNB5Nld9hQfuPAM494twj7jHnHnI+y4251uV8cQy50qW5kCHS+WauZEhV0NrT3HKJg9lfSY60rkK0jpRUlW0d6JmklEjqTBcXNkXZ1jreSdaqV2nc+qsGjSOPFBMp405yVSnJAYXQ9QodyQoTyRUlyQaqcyIf2fhHOILQkeSKlPdx7OgyHCTZoSVtmPNc6P1U88P8Ru3+Tjf7qhkNzxJruRArp0OlPJvTjMqcKyxkjf0zKwEd6HcaLy8a0V+4VB2k9HmaJCp13FFeLFf35oOr8HbLr8r0QUlRTYsJkxfU67X74PYszt5qWmwvWlBe2DBw7NGRZBI7WkTuoZYPfmx04t6q8IUXNtT2NKEha+wkXRQ7MsNG0mXoyCMIfcAf8IId8oPOhOFBDqjJo0TqyAnZ4fY0QEuyQ21Jt4yeCwVJVykVaBWtJCVDEIRlFDmSJZQOUoOapKuVDgId1CQrf+W6mWdTV1UvPLuhqkaa8cSpqgbHzvBs6qqqF0dyacVX+cN/G03sD4PNovVnYQban4UJaH4c2t81Ofct3JsQ8SEua77DlgzvwBZxXHkQUfl3WFC/AZeh7BofoovvYN7CjpJ/Wt+xovUtIo+IPODkMZFHnDzm5AGRx+Su9yoy5ErlozsdfQaVzxfSR0jNeiV9Ct3sp7nmHKvxgaONkPVCUvpMqXw6uXbklKhsIW2VIS7L3ZtIjqxpYlSOlFRXfRupkaSUSNtc5WhI2hRV34bhRrJBp7K0udsjlG2OkrQZsqaJUDuSYVqGVa3VTFumiIviU6iPt2pf06BxpOQYSJkOkruOSY4oHDmqixoTyQ05yQ6qd87d5ZhJLjVZoyVpU0wkE0QruajEkSt6/mnfmI7eajy84ghCR5IbYsfbNBQyx06S/cmGGc+V2sgWNR9dVcrrXUc8r0hJxsFOkhmOD+PdJu4FC2qeXarshbU2iYRWpe5kUJMG5XyuMJ+2hwYMNzPaC4m1kFHKc/1Z2DyI4ncapTNfMKG9YK52UrosSRKVCA8UfGDBrVqe6zDfjOgvXKqPT4XOynt1fE13d1AS1PO6xtEL6u3afYtM24/l3V8Y5BcSauGAjiTTSCg6lAcMaj74zIjuZkFxYYPQ+RyJ1HGa0ZAtNpIuioQsYEhKhoa0YeBesVqSm4ovNtpQ29OIlj6HA9LNyRKGOzmhFHeUSIRckGyyJaFqSA4oD+dk7h+aVeFIVqgP2YuE7JHvTuYgOrwNMpJsNLRS8UrSFVA6LJNQSNaA0umKiiRbDa1VUJNsbnokJ1sCSgUT6WoNrVSykaSOL6qTQetH3LCcuLVNMwovp6aZuE6OJJemGcnBnLi1Td0aklx7e3F0Ky+npuktz2vbNKPwPE4XphfS9psf+Wh//ffrv38HafN+7pmmGnx/VzxxzP/t+//n/0kS)
> 
> **efi.bin file**
- **Signing**

    The secure boot feature can be found in the UEFI standard and it
is not enabled on development devices. It adds a layer of protection
to the preboot process by maintaining a cryptographically signed list
of binaries that are authorized or forbidden to run at boot. It
ensures that the machine boot firmware and HLOS boot
components (boot manager, kernel, and initramfs) have not been
tampered with.

    UEFI secure boot uses a digital signature to validate the
authenticity and integrity of the code that it loads. All the keys
are stored in UEFI secure variables. UEFI secure boot is achieved by
using the PK, KEK, DB, and DBX keys.

    To use a secure boot, the keys PK, KEK, and DB are required. While
multiple KEK, DB, and DBX certificates can be added, only one
platform key is allowed.

    UEFI secure boot is enabled only when the PK is registered in the system.
It is advised to provision PK key in the last step of the secure boot
enabling process. For more information on how Qualcomm has implemented
the UEFI secure boot feature, see [Secure
boot](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-11/secure-boot.html).

    **Host tool to sign HLOS images**

    When UEFI secure boot is enabled, the EFI and DTB images must be
signed. To streamline this process, a host signing tool is used. This
command-line Python script runs on a Linux host machine (preferably
Ubuntu 18.04 or later versions). It automates the signing of EFI and
DTB images in two separate operations, invoked after the build
process completes. The tool also combines DTB files.

    The host signing tool is available for download on [GitHub](https://github.com/quic/host-signing-tool).

    **Host signing tool overview**

    The host signing tool runs on a Linux machine with Python3 installed.
It can sign either the EFI image or the DTB image in a single
operation. To sign both the EFI and DTB images, you must invoke
the tool twice with different inputs.

![../../_images/host_tool_design_wbg.png](data:image/png;base64,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)

    **Linux machine with OpenSSL and sbsign**

    The host tool expects unsigned EFI or DTB files, along with
certificates and keys, as input. After invoking, the tool unpacks the
unsigned image, signs the available items using the provided key and
certificate, and then repacks the images, replacing the unsigned
version with the signed one.

    To combine DTB files, you must follow a different process
than the signing process. Use the tool to either combine a new DTB file
with an older one (under `dtb.bin`) or create a new concatenated DTB file
from a list of available DTB files.

    **Working of host signing tool**

    - **Prerequisites to run the tool**

        To run this tool, install the following on the Linux host machine:

        - OpenSSL, sbsign, and mtools utilities
        - Python3
        - pip, subprocess, shlex, socket, glob, and shutil Python modules
    - **Host signing tool configuration**

        You must configure the host signing tool before starting the
operation.

        - `config.ini` **file**

            The host tool expects you to provide the necessary information in
a `config.ini` configuration file. Upon bootup, the script
reads this file and signs the image accordingly. The following
variables are listed in the configuration file:

![../../_images/config_file.png](data:image/png;base64,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)

            **config.ini file**

Variables in config.ini file

            | Variable in config.ini | Values | Description |
            | --- | --- | --- |
            | `operation` | `sign_image/combine_dtb` | Use this configuration to select either signing the image or combining DTB files. |
            | `image_type` | `efi/dtb` | If `operation == sign_image`, use this configuration to select `efi` or `dtb` to sign separately. |
            | `combine_dtb_type` | `combine_with_old_dtb/combine_without_old_dtb` | If `operation == combine_dtb`, use this configuration to select the type of combine DTB operation you want to perform.<br><ul class="simple"><br><li><p><code class="docutils literal notranslate"><span class="pre">combine_with_old_dtb</span></code>: combine with DTB from old <code class="docutils literal notranslate"><span class="pre">dtb.bin</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">combine_without_old_dtb</span></code>: combine a set of DTB files</p></li><br></ul> |
            | `file_path` | `local/remote` | <ul class="simple"><br><li><p>local: Keys and efi.bin/dtb.bin are present in the same path as the script.</p></li><br><li><p>remote: Copy efi.bin/dtb.bin and the keys from a remote Linux machine to the current path.</p></li><br></ul> |
            | `local_machine_private_key_path` | `<path of id_rsa file in local machine>` | This file establishes an SSH connection with a remote machine if `file_path = remote`. |
            | `loader_conf_timeout` | `<timeout in seconds>` | The systemd-boot wait time to let you choose to authenticate the binaries.<br>This option is required to sign `efi.bin`. |
            | `efi/keys/dtb/combine-dtb_remote_hostname` | `<ip or hostname of the remote Linux machine>` | If `file_path = remote`, then the host tool selects the host name of<br>the remote machine to copy the `efi/keys/dtb/combine-dtb` file from the remote machine using SCP. |
            | `efi/keys/dtb/combine-dtb_remote_username` | `<username_on_remote_machine>` | If `file_path = remote`, then the host tool selects the user<br>name of the remote machine to copy the `efi/keys/dtb/combine-dtb` file from<br>the remote machine using SCP, provided the username is created<br>on the local machine. |
            | `efi/keys/dtb/combine-dtb_remote_filepath` | `<full_path_of_file_on_remote_machine>` | If `file_path = remote`, then the host tool selects the path of<br>a `efi/key/dtb/combine-dtb` file on the remote machine to copy that file from<br>the remote machine using SCP. |
        - **Configure using config.ini file**

            1. Operation selection: Specify which operation must be performed by setting the `operation` variable. The options are either `sign_image` or `combine_dtb`.
            2. Image selection: If you select `operation == sign_image`, specify which image to sign by setting the `image_type` variable. The options are either `efi` or `dtb`.
            3. File location: Indicate the location of the unsigned EFI/DTB image, keys, and certificates using the `file_path` variable.

                If you select `local` in the configuration file, copy the EFI/DTB image, keys, and certificate files manually to the local working directory.

                1. Create an `unsigned_binaries` directory in the same path as the script, and then copy the `efi.bin`/`dtb.bin` image into that directory.
                2. Create a `keys` directory in the same path as the script and then copy the `db.auth`, `db.crt`, `db.key`, `KEK.auth`, and `PK.auth` files into that directory.

                If you want the script to copy the required files automatically from a remote Linux machine on the same network, select `remote` in the configuration file.

                In the configuration file, provide information for the following variables:

> 
> 
> - `local_machine_private_key_path` (mandatory)
>                 - `[efi_config]` section (if `operation` is `sign_image` and if `image_type` is `efi`)
>                 - `[keys_config]` section (if `operation` is `sign_image`)
>                 - `[dtb_config]` section (if `operation` is `sign_image` and if `image_type` is `dtb`)
>                 - `[combine_dtb_config]` section (if `operation` is `combine_dtb`)
> 
> 
> 
> Note
> 
> 
> The script supports copying from another Linux machine over SCP within the same network.
            4. Loader configuration timeout: If `image_type` is set to `efi` in the configuration file, update the `loader_conf_timeout` variable.
            5. Combining DTB selection: If you select `operation == combine_dtb`, specify which type of DTB combination operation must done by setting the `combine_dtb_type` variable. The options are either `combine_with_old_dtb` or `combine_without_old_dtb`.

                1. If you select `combine_dtb_type == combine_with_old_dtb`, create an `unsigned_binaries` directory in the same path as the script and copy the `dtb.bin` image to that directory.
                2. For both options, create a `dtb_files` directory in the same path as the script and copy all the DTB files that must be combined into that directory (either with old combined DTB from `dtb.bin` or with each other only).
            6. Handling missing configuration: If you missed any configuration information, the script runs and prompt you for the missing details through the command line.
        - **Run host signing tool**

            1. Launch the host tool: After completing the code build process and obtaining the unsigned `efi.bin` and `dtb.bin` images, launch the host signing tool.
            2. Prepare a host machine: Store the host signing tool files (`signing_tool.py` and `config.ini`) on a Linux machine. Ensure that both the files are in the same working directory.
            3. Configure the tool: Set up the host signing tool according to the configuration instructions.
            4. Run the tool: Run the following command to launch the host tool from the command line: `$python3 signing_tool.py`
            5. Interactive process: The host signing tool displays your selections and operational commands on the screen. It also displays errors in the command line.
            6. Signed images: After the tool completes its process, it creates a directory called `signed_binaries` in the same working directory. The signed `efi.bin` or `dtb.bin` image is stored in the directory. The tool deletes other user-created directories after signing.
            7. Repeat for both images: Follow this process twice, once for `efi.bin` and once for `dtb.bin`. After each signing operation, delete the `signed_binaries` directory before starting a new operation.
    - **Host signing tool workflow**

> 
> 
> The following figure shows the workflow of the host signing tool:
> 
> ![../../_images/host_tool_workflow.png](data:image/png;base64,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)
> 
> **Host signing tool workflow**
> 
>         - The host tool requires the `efi.bin` and `dtb.bin` paths (absolute path or network path).
> 
>             - `efi.bin` contains `uki.efi` (Linux kernel image) and `bootaa64.efi` (boot loader image).
>             - `dtb.bin` contains `combined-dtb.dtb`.
>         - The host tool requires the path of `certificate` and `key` (absolute path or network path) to sign the images.
>         - The host tool mounts `efi.bin`/`dtb.bin` on the FAT partition, which provides the following directory structure and follows its separate signing process:
> 
> 
> 
> > 
> > 
> > ![../../_images/1_efi_bin.png](data:image/png;base64,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)
> > ![../../_images/1_dtb_bin.png](data:image/png;base64,UklGRkAEAABXRUJQVlA4TDMEAAAvVkEoAAXdbNvq6NFbwlcCJRA6dEgJCh0qdKhwQ0qgBEpQSAmEG1ICHXBdv/gOGs942ONE9B+2JLlxm4Ffbu8C1AE5wQeMj7FRljH+1MAyxo9lxv2xgPHTxPexgNE+/vM/E0RQW1ICUJaUA9SW9eGP/3z85+M/f1WIiP88QEgyfQvloVSg3hBkMHiTDZvF028caOYKEB5KAcrDBOF2FgOCxdP7oBHSc5FAD4eQ3gZqPBcReDhA/KeHshNoKzPnRoA/2gyh9uhAe/uStwH+lIgO4GoJSZSJjZ8E9OgheRpMlIhN0IY5gmJQT9YGuDhTwaLM9J2uVL06GXPk6QyNiaDMXCaadfQ4C4qMwzO1fJEymW6WWSeqg6yuMRm7iCZIQzOoZncK7w1IqaqvTQF8HT2CvtiBo42eCagzQOx9Bwi+jOqBLuhpo3igMiSZIxPctPbdtFnVjZUvAGlcqmQUQcod3aCarDbaBpjugPLsvb80ntku/soFE12B/YKvTgf4Picrcz1cn0Zm5bg2/cQzGrANyVXzMoogBd2gUn+aHCUbVJmk/Mo0iKe6O9AFBTMHM4M+lLodPK/OJIfttD1PwbwJHlz8KaMIUtANSnRBjjchHHf2J+MhMbkXUmvqlRJQ5yxxhkYUXNrkzEAM2VWRUQQp2AzqwoOESdKLIq9/YWGJCfv1NBFvIbHD42+EJwmJ8bRUadGM8XbJQBHw8p326xkyd+68Kar8kg0kKHDjFuKhyt/BwcvsXPz5hVWQgm5QKUe8/5IOHC/9Y49jZ1/VTZtM4kWOd0Hmp2R3OOSySa4qXdwTlKYDjW7QlKwdDMKhflAEykuTgHC1IYRp0SHObYjrt0Hs4yRQv0MjUGxj1OTSXATKo6ttiE1QAfbRTpPBAM8WwNau/oYTriKejbchoycgvPhPk7vY2FbPRLg67iF0pjiHGbbsedcsyiDljlHQZD8YDUJO1nYwTrFpzphdtFf/xTcHgPY5jz2FK5GpD+WqdAKp13LafB2lqnIS11GlSzwIzNRo7NqLQ+X5tQq6TLmoGFS/I3vA55GxjfnmgXBtkXDT1uOOvqx/n/Dxn78y0PcFjG8WFjGWllWNj/98amHDppFAj5vVtzQEBI0IGAGiTAHCClGB+mAaIa0QBSiPQI1/ZLkx+U4Y8QIw6qSpM+7N6qsg9q/g/X1jnXxnIjNNnXFrVl8BMs0q3/jNOPnOdAf+HD0CG0ef1acAypPK/X3vym2T7yzwBb8BjWGe1SePcQlw7xvj5DsTnW9Imd3RZ/UpnPwIuwj3y523Gc45zGO6ZL3lX4Q0IN5/yQmcDH1W32pwa/JdBU71gwKoM/RZfYuCcfLdVcSeeRtSRttZ2SKo6bP6FgXj5LtDapoD0+TZTh9Fn9W3KFgn30UHuiQk7OO8NKXB6kzNPKtPvuxeQeP/7WIAAA==)
>         - After signing the images, the host tool copies the *Auth* files to the `/loader/keys/authkeys` directory for both `efi.bin` and `dtb.bin`. The *Auth* files must be available with keys and certificates on Target or Security team hosted path.
>         - The Host tool must configure the wait time in the `systemdboot` loader configuration. This wait time stops the Kernel loading and allows you to review and select the `systemdboot` menu options. The `loader.conf` file must be available in an updated `efi.bin` file.
> 
> 
> 
> > 
> > 
> > Note
> > 
> > 
> > The signing process is not followed for the `dtb.bin` file.
> 
> 
>             - The host tool configures `/loader/loader.conf`.
>             - The syntax for `loader.conf` is `timeout x`, where x = timeout in seconds.
>         - After the image is signed, the host tool must unmount the `efi.bin/dtb.bin` from the FAT partition. Store the signed `efi.bin/dtb.bin` on the host machine on the similar path as the host tool in the `signed_binaries` directory.
>         - Following is the directory structure for signed `efi.bin` and `dtb.bin`:
> 
> ![../../_images/efi-bin_and_dtb-bin.png](data:image/png;base64,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)
> 
>             **Directory structures of efi.bin and dtb.bin files**
> 
> 
> 
> `efi.bin` **signing process**
> 
> 
> 
> > 
> > 
> > - The host tool uses the `sbsign` utility to sign the `uki.efi` and `bootaa64.efi` images separately.
> >         - `sbsign` requires `certificate` and `key` for the signing process. Verify the following syntax where `dsk1.key` is key, `dsk1.crt` is certificate, and the output filename is the same as the input file:
> > 
> > 
> > sbsign --key <key file> --cert <cert file> <efi file> <o/p file name>
> >                 Copy to clipboard
> > 
> > 
> > 
> > - Examples:
> >     - - sbsign –key dsk1.key –cert dsk1.crt bootaa64.efi bootaa64.efi
> >                     Copy to clipboard
> >             - sbsign --key dsk1.key --cert dsk1.crt uki.efi uki.efi
> >                     Copy to clipboard
> 
> 
> 
> `dtb.bin` **signing process**
> 
> 
> 
> > 
> > 
> > - The host tool requires the path of the `dtb.bin` file.
> >         - The host tool requires the path of `key` and `certificate` (absolute path or network path) to sign the images.
> >         - UEFI secure boot requires PE format files for verification. Non-PE files, such as `dtb`, cannot be signed using `sbsign` as this signing tool requires PE format files as input.
> >         - The host tool uses the `openssl` utility to sign the `dtb` file. Verify the following syntax, where `dsk1.key` is key and `dsk1.crt` is certificate:
> > 
> > 
> > 
> > > 
> > > 
> > > openssl cms -sign -inkey <.key file> -signer <.crt file> -binary -in <dtb file> --out <O/P .dtb.sig file> -outform DER
> > >                 Copy to clipboard
> > 
> > 
> > 
> > 
> > - Example:
> >     - openssl cms -sign -inkey dsk1.key -signer dsk1.crt -binary -in <foo.dtb file> --out <foo.dtb.sig file > -outform DER
> >                 Copy to clipboard
> > 
> > 
> > 
> > 
> >             This command adds the signature for the DTB file in a separate
> > file (`foo.dtb.sig`) and does not modify the original file
> > (`foo.dtb`). Hence, the host tool must keep both the files
> > where the `*.dtb.sig` file is used during the UEFI secure boot
> > verification.
    - **Host signing tool workflow to combine DTB**

> 
> 
> To combine DTB files using the host tool, do the following:
> 
>         1. Prepare DTB files: Place the new DTB files to be combined in the `dtb_files` directory.
>         2. Select operation: Set `operation=combine_dtb` in `config.ini`.
>         3. Combine with old DTB:
> 
>             1. To combine the new DTB files with the existing `combined-dtb.dtb` in `dtb.bin`, set `combine_dtb_type=combine_with_old_dtb`.
>             2. Ensure that the old `dtb.bin` is in the `unsigned_binaries/` directory.
>             3. The host tool takes `combined-dtb.dtb` from the old `dtb.bin` and appends all DTB files from the `dtb_files` directory.
>             4. The host tool then creates a `dtb.bin` (vfat), copies all old files/directories from the old `dtb.bin`, and includes the newly created `combined-dtb.dtb` with the appended DTB files.
>             5. The host tool places the updated `dtb.bin` in the `unsigned_combined_dtb_bi` directory.
>         4. Combine without old DTB:
> 
>             1. To combine only the new DTB files in the `dtb_files` directory, set `combine_dtb_type=combine_without_old_dtb`.
>             2. The host tool takes all DTB files from the `dtb_files` directory and creates a `combined-dtb.dtb` file.
>             3. The host tool then creates a `dtb.bin` (vfat) and includes the newly created `combined-dtb.dtb`.
>             4. The host tool places the updated `dtb.bin` in the `unsigned_combined_dtb_bin` directory.
- **Multi-DTB support**

    Qualcomm supports multiple Qualcomm reference devices based on the same hardware SoC. For
example, the QCS6490 reference device variants include the RB3 Gen 2 development core kit and RB3
Gen 2 vision kit.

    Each Qualcomm reference device variant has its own DTB in the kernel.
During bootup, UEFI selects the appropriate DTB based on the specific
Qualcomm reference device variant. To facilitate this, all DTBs for Qualcomm reference devices sharing
the same hardware SoC are combined and stored in the DTB partition.

    **Generate combined DTB**

    To enable multi-DTB support, all supported DTBs are appended one
after the other and a combined DTB is generated.

![../../_images/combined_dtb.png](data:image/png;base64,UklGRhIEAABXRUJQVlA4TAYEAAAvz0IPAI/iqrZtVVlHnmsEf2gS+kISlxAMPr2Gq9q2VWUdea4RFCcBNCXQS4BDCAaf7qq2bVVZR55rAncgwYtAer69AgUYzH8A//+/NE1FUURViQhVZWZEhJlxd2VZUlVmRkSIiCAIiAhVJSJEhIiI49jz2WAEnKxZsAHcscbrdROGdyzBFEvABHDBDXCid/X9/jweX03TqetaXdfMjIhwd3Vdc/9gwABgdgfcJwPghjvgihtPHAGTDYI94MAIuNj9wR1wwoARbLcLmLF+OC6vmGJ/BUewB+sDO0CibdtpGz11sMzMTZkhndB4HCgFZ+b//yZ+evLTulpLg4novwO3kRQpfYyV6cWDDxi5bi4DrKvLEOv6MsiK2Zaa/HXxaTnA+jAZoOr02HKA9X48Yls6cZqf8x0TYI1fBqh6/dEEWEtnEdvSs7OR/4z8Z+Q/v6156BOvuc6XjGKfxFovCcEaqzWB+z2iZlkNlmvx+EdKRKs1NViuj0eWqxa4lpqXNAtVjji+kVCbpSyHTLMsB1kvcQ5T8gKU62sqxNQC5doSh1sHVEulma0ZidBaOcfCyxGszW4dEPkByrVFQiVKUF3bOnBaalGgGGQjW6vvpzRMYC+chCUVoz2MckBWlh7RW9cLUK6v9WxL4YkvpHVAubYamet9n7mqgGopXwM2diMQu4XUqObFytIsZ6xVTM8LSK529TyA6PqaqkFT7Q2TFCIQaRW7oUKaoDwB5CpQ8ACQq4MNowJMtZUFiEGkCOsl3co4MV4BcnWcbBgdeK7FZ7ZE14GjagdJTCQirG5zYVXjq/ELmqv9PokSGFdHkLWq0YGlWsiCRiSmp4W2Kn7BcXWeK8FxFWlsV5RAqb6mw3AxTdbe8BD9CixECDA9R5B2APBUPaYYxVfaxvrEbMPrFTjXArEtaC1442vuBkxXdQVJtWUliuKHSLF8PgTJVTyqQRtfOxq1VQ9BUi24vraMQApsismJtGzz+UJgri1+1IM0vt72FpbOkFQdNKrR+D0O0AmWaytlRw94HV+cEyTVVlyePB5pvww2j13vNwO5CtOhD5Bci/3VWmmYYo+UH04uncG1FOJmQbCRsJatVdhP1zZL3Lptv5L1Br4AUwXH8ducfDhXvj3xB0I6gFwdqtTWgeRa7BMvdl0FUEtRcH+hWmCtKva52WuaOVmvZMfwBJpqKGyWjJJG1bjY0AHk6mJDB6jrZkkHUEuRSUIkCRbxt+ydkjEOnMHYet/rCZRrwd8J1vg+730f8jP7IkkHjqqDdbArZYgrYKq/n//nNfKfkf+M/Oe3OCuXAdbn0wBVT95dBlhTOxHb0h0Ft8sh1sx8gKqLs0EO70yIrtMLIbZ0ajnEujR/U5cB)

    For the RB3 Gen 2 vision kit, the following DTBs are combined to generate
the `combined-dtb.dtb` combined DTB. The following code snippet is from
the `conf/machine/qcs6490-rb3gen2-vision-kit.conf` file:

KERNEL_DEVICETREE = " \
                        qcom/qcs6490-addons-rb3gen2-video-mezz.dtb \
                        qcom/qcs6490-addons-rb3gen2-vision-mezz.dtb \
                        qcom/qcs6490-addons-rb3gen2-ptz-mezz.dtb \
                        qcom/qcs6490-addons-rb3gen2-ia-mezz.dtb \
                        qcom/qcs5430-fp1-addons-rb3gen2-vision-mezz.dtb \
                        qcom/qcs5430-fp2-addons-rb3gen2-vision-mezz.dtb \
                        qcom/qcs5430-fp2p5-addons-rb3gen2-vision-mezz.dtb \
                        qcom/qcs5430-fp3-addons-rb3gen2-vision-mezz.dtb \
                        "
        Copy to clipboard

    **DTB partition**

    - A `vfat` image named `dtb.bin` is generated, which contains the
combined DTB image. A dedicated partition named `dtb` is created
and `dtb.bin` is flashed on this partition.
    - The UEFI parses the combined DTB present in the `dtb` partition
and selects a matching DTB for the hardware.

![../../_images/Create_sign_DTB.png](data:image/png;base64,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)

        **Create/sign DTB**

## Partitioning

This section describes how you can add, delete, modify, and rename partitions.

Qualcomm Linux release provides a pre-generated `partition.xml` file, which
you can use directly. The pre-generated file is delivered as part of the
`QCM6490_bootbinaries.zip` file. When a build is initiated,
the `partition.xml` file from `QCM6490_bootbinaries.zip` is used and steps
3 to 5 are run from [Ptool workflow](https://docs.qualcomm.com/doc/80-70015-27/topic/platform_software_features.html#ptool-workflow) figure.

To add, delete, modify, and rename partitions, change the partition layouts for the UFS disk.
Qualcomm Linux provides configuration files, which define partitions for the UFS devices.
The configuration files are in `meta-qcom-hwe/recipes-devtools/partition-utils/qcom-partition-confs/`.

By modifying these configuration files and integrating these in the build,
you can generate a partition layout. When a configuration file from
`meta-qcom-hwe/recipes-devtools/partition-utils/qcom-partition-confs/` is used in
Qualcomm Linux builds, the workflow spans all the steps from the [Ptool workflow](https://docs.qualcomm.com/doc/80-70015-27/topic/platform_software_features.html#ptool-workflow) figure.

The following table lists the files and tools used for partitioning:

| File or tool | Description |
| --- | --- |
| Partition layout file (optional) | Defines all partitions for storage in JSON format. |
| gen\_partition tool (optional) | Reads the partition layout file and generates an internal XML format handled by the Qualcomm Ptool. |
| Partition XML (mandatory) | Defines the Qualcomm internal XML format. |
| Ptool (mandatory) | Qualcomm Ptool that converts information in partition XML to GPT binaries. |

The partition definitions in JSON format (used by the .conf files),
existing partitions, and the tool that generates the GUID partition
table for Qualcomm reference devices are as follows:

Note

The following partition layout and examples are specific to UFS.

- **Partition layout file**

    The UFS on the device is partitioned to store various images of
the bootchain and the high-level OS. The configuration file contains details about the
partitions that are configured for a specific Qualcomm reference device. For the
RB3 Gen 2 Qualcomm reference device, the UFS flash partitions
are defined in the following configuration file in the workspace:
`meta-qcom-hwe/recipes-devtools/partition-utils/qcom-partition-confs/qcm6490-partitions.conf`.

    - **Partition layout file syntax**

        The following examples from the `qcm6490-partitions.conf` file show the syntax of the partition layout file.

        The first entry in the configuration file defines the disk type, disk size, LBA size (sector size),
and whether the last partition should grow till the last usable LBA.

# select disk type emmc | nand | ufs mandatory
            # disk size in bytes is mandatory
            
            --disk --type=ufs --size=137438953472 --write-protect-boundary=0 --sector-size-in-bytes=4096 --grow-last-partition
            Copy to clipboard

        The following examples of partitions are specified in the `qcm6490-partitions.conf` file.
A few partitions are defined in LUN0, with each line representing an individual partition.

Note

In the following examples, the `firmware-qcom-bootbins_1.0.bb` recipe downloads
the `partition.xml` file from [Qualcomm software center](https://softwarecenter.qualcomm.com/) and takes the GUIDs from it.

        - Example 1: The `ssd` partition of 8 KB is defined for LUN0. This
partition does not require a file flashed to be flashed.

--partition --lun=0 --name=ssd --size=8KB --type-guid=2C86E742-745E-4FDD-BFD8-B6A7AC638772
                Copy to clipboard
        - Example 2: The `misc` partition of 1024 KB is defined for LUN0.
This partition does not require a file to be flashed.

--partition --lun=0 --name=misc --size=1024KB --type-guid=82ACC91F-357C-4A68-9C8F-689E1B1A23A1
                Copy to clipboard

        A couple of partitions are defined in LUN1. Each line defines an
individual partition:

        - Example 3: The `xbl_a` partition of 3604 KB is defined for LUN1.
The `xbl.elf` file is flashed to this partition.

#This is LUN 1 - Boot LUN A
                --partition --lun=1 --name=xbl_a --size=3604KB --type-guid=DEA0BA2C-CBDD-4805-B4F9-F428251C3E98 --filename=xbl.elf
                Copy to clipboard
        - Example 4: The `xbl_config_a` partition of 300 KB is defined for
LUN1. The `xbl_config.elf` file is flashed to this partition.

#This is LUN 1 - Boot LUN A
                --partition --lun=1 --name=xbl_config_a --size=512KB --type-guid=5A325AE4-4276-B66D-0ADD-3494DF27706A --filename=xbl_config.elf
                Copy to clipboard

        A partition defined in LUN4:

        - Example 5: The `aop_a` partition of 512 KB is defined for LUN4.
The `=aop.mbn` file is flashed to this partition.

--partition --lun=4 --name=aop_a --size=512KB --type-guid=D69E90A5-4CAB-0071-F6DF-AB977F141A7F --filename=aop.mbn
                Copy to clipboard

        The options used for each partition entry are as follows:

        - Mandatory options:

--lun (mandatory for UFS, optional for emmc. Expressed as number)
                --name (name for the partition, a string)
                --size (size of the partition, generally expressed in KB)
                --type-guid (GUID for the partition)
                Copy to clipboard
        - Optional options:

--attributes  (Optional 64 bit attribute, e.g., 1000000000000004)
                --filename    (Name of the file that is flashed to the partition)
                --readonly    (whether the partition should be read-only, values true or false)
                --sparse      (whether the partition is for a sparsed image, values true or false)
                Copy to clipboard
- **Linux HLOS partitions**

    | Partitions | Description |
    | --- | --- |
    | EFI partition | The ESP contains `Esp.bin` and a `vfat` file. It contains all the<br>details necessary for UEFI to enable systemd-boot. For more information on this image, see<br>[EFI image](https://docs.qualcomm.com/doc/80-70015-27/topic/platform_software_features.html#efi-image-section). |
    | Rootfs partition | This partition is used to flash the `system.img` image file. This image consists of all the<br>user space libraries and binaries. |
    | Overlay partition | This partition is left empty. On bootup, a file system is seeded into this partition that is used as an<br>overlay on a few of the `/var` mount points. The image in this file system works as a writable<br>storage file system. The associated IMAGE\_FEATURES with this image is `overlay-etc`. |
- **Partition tool (Ptool)**

    To partition the storage on the device, use the `gen_partition` command to generate a `partitions.xml` file, and then process the
file with Ptool. Ptool generates a GUID partition table binary that the QDL tool uses to partition the flash.

    The Ptool workflow is shown in the following figure:

![../../_images/ptool.png](data:image/png;base64,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)

    **Ptool workflow**

    The `qcm6490-partitions.conf` file present in the `/layers/meta-qcom-hwe/recipes-devtools/partition-utils/qcom-partition-confs` directory
define all the partitions. The `gen_partition.py` tool processes and generates `partition.xml`, which is a mandatory input for
`ptool.py`. As a final step, Ptool generates the `rawprogram.xml`, `patch.xml`, `gpt_main*.bin`, and
`gpt_backup*.bin` files, which are required by the QDL tool to flash the device.

    To add a partition, make a partition entry in the configuration file; for example `qcm6490-partitions.conf` with a universal unique
identifier (UUID).

    After updating the conf file, to switch the preferred provider of virtual/partconf
to `qcom-partition-confs_1.0.bb`, add the following line to `local.conf`.

PREFERRED_PROVIDER_virtual/partconf = "qcom-partition-confs"
        Copy to clipboard

    After adding the entry, run the BitBake command to generate all necessary files:

bitbake <image-name>
        Copy to clipboard

    After the image build is complete, run the following command to flash the image:

cd <workspace>/build-qcom-wayland/tmp-glibc/deploy/images/qcs6490-rb3gen2-core-kit/qcom-console-image
        ./qdl prog_firehose_ddr.elf rawprogram*.xml patch*.xml
        Copy to clipboard

## Containerization

Docker containers are enabled in Qualcomm Linux. To use Docker, ensure
that the containerization features are enabled in Qualcomm BSP, which are
integrated and tested. To use containerization on Qualcomm Linux Embedded devices,
ensure that the `meta-virtualization` layer is added as part of the workspace.

- **Docker**

    Docker is enabled in `qcom-multimedia-image`:

    1. For the `qcom-multimedia-image` image recipe,
`packagegroup-container` is included using
`meta-qcom-distro/recipes-products/packagegroups/packagegroup-qcom-multimedia.bb`.
    2. After the image is built and flashed, Docker is available on the
device.
    3. To verify kernel compatibility, run the `check-config.sh` script
on the device. To verify the configuration, enable the required kernel
configurations and rebuild the image. For more
information, see [Kernel
compatibility](https://docs.docker.com/engine/install/troubleshoot/#:~:text=Kernel%20compatibility,check%2Dconfig.sh%20script.&amp;text=The%20script%20only%20works%20on%20Linux).
    4. To verify the status of the Docker daemon, run the following command and verify the output:

        | Command | Description | Output |
        | --- | --- | --- |
        | `systemctl status docker` | If Docker commands have been run at least once after boot-up | Active (running) |
        | `systemctl status docker` | If the device has not run any Docker commands after boot-up | Inactive (dead) |
        |  |  |  |

    The images pulled from the Docker repository for the `linux/arm64` platform and tested to run successfully on the device are as follows:

> 
> 
> - `busybox`
>     - `python`
>     - `alpine`
>     - `ubuntu`
>     - `postgres`
>     - `mongo`
>     - `nginx`
>     - `redis`

    The following use cases are verified with Docker enabled:

    - Load Docker images from tar files using the Docker load utility.
    - Build a Docker image from the Docker file.
    - Save Docker images that were pulled/built into a `.tar` file.
    - Load Docker images, which are saved as `.tar` files.
    - Run multiple container instances of multiple images pulled/built.
    - Verify the list of Docker images loaded on the device.
    - Verify the list of active and total containers on the device.
    - Inspect Docker images using the Docker inspect utility.
    - Obtain logs from a container using the Docker logs utility.
    - Stop and kill the container using the Docker stop and Docker kill utilities.
    - Remove containers and Docker images from the device.
- **Hardware node access from Docker**

    The applications running inside a Docker container need access to
device nodes and files from the device (target-host). Applications
running inside containers can access the device nodes. This is performed
by passing the respective device nodes as an option with the run command for Docker:

docker run -it --rm --device=<device-1> --device=<device-2> <docker-image-name>
        Copy to clipboard

    The device nodes to be passed are in the `/dev/`
directory on the device. Depending on the use case, for example, in a
graphics scenario, `/dev/kgsl-3d0` is one of the nodes to be passed
to the Docker using `--device=/dev/kgsl-3d0`.

    The storage partition access from Docker files/directories from the
device (target-host) can also be exposed to the inside of a
container. To expose files/directories as bind mounts, run the following command:

docker run -it --rm --mount type=bind,source=<source-path-on-device>,target=<destination-path-inside-container> <docker-image-name>
        Copy to clipboard

    Run a docker container exposing multiple directories, files, and
device nodes to the inside of the container using the following
command:

docker run -it --rm --device=<device-1> --device=<device-2> --mount type=bind,source=<source-path-on-device-1>,target=<destination-path-inside-container-1>  --mount type=bind,source=<source-path-on-device-2>,target=<destination-path-inside-container-2> <docker-image-name>
        Copy to clipboard
- **Docker-compose**

    Docker-compose is a tool for defining and running
multicontainer applications. It simplifies the management of the
entire application stack by allowing you to define services,
networks, and volumes in a single, comprehensible YAML configuration
file. By default, the Qualcomm Linux release includes Docker-compose in
the image.

    The `python3-docker-compose` package is added to the
`packagegroup-qcom-multimedia` package group in
the `meta-qcom-distro` metadata layer.

    **To run docker-compose on the device:**

    1. Create or copy the Docker-compose YAML files under the writable path on a
device such as `/var` (for example `/var/docker-compose-yaml`)
to be used with Docker-compose on the device.
    2. Ensure that the Docker images listed in your Docker-compose YAML
files are available on the device. The containers started by the
Docker-compose utility need these images.
    3. To run Docker-compose for multiple YAML files, run the following
command:

docker-compose -f <docker-compose-file-1>.yml -f <docker-compose\u0002file-2>.yml up
            Copy to clipboard

    Docker-compose runs and initiates Docker containers as configured
in the Docker-compose YAML file. After the Docker-compose command
returns, run `docker ps -a` and docker logs `<conatiner-id>` to
verify if the docker containers are running as expected.

    To know more about Docker-compose, see [Docker-compose overview](https://docs.docker.com/compose).

## Kubernetes overview

Kubernetes is an open-source platform used to automate the deployment,
scaling, and management of applications running in a container. It helps
organize containers across multiple devices, ensuring efficient
resource utilization, high availability, and scalability of
applications. For more information on Kubernetes, see
[https://kubernetes.io/](https://kubernetes.io/).

- **Enable Kubernetes**

    - The Qualcomm Linux release enables Kubernetes by default in
`qcom-multimedia-image`, through the following changes:

        - `packagegroup-qcom-k8s` is defined in `meta-qcom-hwe`.
        - `packagegroup-qcom-k8s` is included in
`recipes-products/packagegroups/packagegroup-qcom-multimedia.bb`.
    - The Qualcomm Linux kernel has the following kernel configurations
enabled in `arch/arm64/configs/qcom_defconfig` to support the
Kubernetes runtime:

        - CONFIG_CGROUP_FAVOR_DYNMODS=y
                Copy to clipboard
        - CONFIG_CFS_BANDWIDTH=y
                Copy to clipboard
        - CONFIG_CGROUP_HUGETLB=y
                Copy to clipboard
        - CONFIG_NETFILTER_XT_MATCH_COMMENT=m
                Copy to clipboard
        - CONFIG_IP_NF_TARGET_REDIRECT=m
                Copy to clipboard
        - CONFIG_HUGETLBFS=y
                Copy to clipboard
    - To verify the status of kubelet, run the following command and verify the output:

        | Command | Description | Output |
        | --- | --- | --- |
        | `systemctl status kubelet` | If the device has been set up at least once as a Kubernetes node using kubeadm after bootup | Active (running) |
        | `systemctl status kubelet` | If the device has not been set up as a Kubernetes node using kubeadm after bootup | Inactive (dead) |
        |  |  |  |

    Kubernetes operates with containers that run as pods, which allow
you to package an application along with its dependencies
(libraries and configuration files) into a single unit. This
simplifies deployment and ensures consistency across different
environments and nodes of a cluster. A node in the context of
Kubernetes refers to a device or a machine. The Kubernetes architecture
has two types of resources:

    - **Master node/control plane:** The master node is the device that
acts as the control plane for Kubernetes. It makes global
decisions about the cluster (such as scheduling), and detects and
responds to cluster events (such as starting up a new container when
a replica field of deployment is not met).
    - **Worker nodes:** These nodes are devices that contain the
necessary services to run containers, managed by the master node.
Each worker node runs `Kubelet`, a process responsible for
communication between the Kubernetes master node and the worker
node; it manages the pods running on a machine.

    A pod is the smallest unit of execution in Kubernetes. It represents a single
instance of a running process in a cluster acting as an abstraction to the
containers run by Kubernetes.
- **Kubernetes nodes example**

    The following is an example of two devices connected as nodes to a
common access point:

    - **Master node**: One of the devices is designated as the master
node.
    - **Worker node**: The other device serves as the worker node.
Deployments and pods created from the master node run on the
worker node.

    Deployments and pods are created using YAML files. These files define
the preferred state of deployments and pods at the time of creation.
Users can enter the shell of these pods/containers to debug,
monitor, and perform other tasks from both the master node and the worker node.

    - **Set up a device as a master node**

        To set up a device as a master node, do the following:

        1. Connect the device to Wi-Fi.
        2. To initialize the Kubernetes control plane, run the following command:

kubeadm init --ignore-preflight-errors=SystemVerification
                             --apiserver-advertise-address=<ip-address>
                Copy to clipboard

Note

`<ip-address>` is the IP address of the `wlan0` interface, which is the output of the `ifconfig` command after connecting the device to Wi-Fi.
        3. To start using the cluster, run the following commands as the root
user:

mount -o remount, rw /
                mkdir -p $HOME/.kube
                cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
                chown $(id -u):$(id -g) $HOME/.kube/config
                Copy to clipboard

        After initializing of the device as master
node/control plane using `kubeadm init`, `kubeadm` prints the
command that must be used for any device to join the cluster as a
worker node.
    - **Set up a device as a worker node**

        To set up the device as a worker node and join the cluster, run
the `kubeadm join` command, where `kubeadm` prints after
initializing the master node.

Note

To suppress an error that Kubernetes reports when running Docker with the vfs graph driver, run
the `--ignore-preflight-errors=SystemVerification flag` with the `kubeadm join` command.

Note

Each node in a cluster is expected to have a different hostname. To add multiple devices with the same hostname
to a cluster, use the `hostname <new-name>` command to change their hostnames if necessary.
    - **Create deployment and pods from a master node**

        To create deployments and pods on the master node, run the following
command:

kubectl apply -f <path-to-podnetwork-yaml-config-file>
            Copy to clipboard

        Create your own YAML file at a location such as `/var`. Example
for YAML files are as follows:

        - YAML file to create a deployment with the Ubuntu image:

            **ubuntu-deployment.yaml**

apiVersion: apps/v1
                kind: Deployment
                metadata:
                  labels:
                    app: ubuntu-deployment
                  name: ubuntu-deployment
                spec:
                  replicas: 2
                  selector:
                    matchLabels:
                      app: ubuntu-deployment
                  template:
                    metadata:
                      labels:
                        app: ubuntu-deployment
                    spec:
                      containers:
                        - name: ubuntu-depl-pod
                          image: ubuntu:latest
                          command: ["sleep", "3650d"]
                Copy to clipboard
        - YAML file to create a pod with the Ubuntu image:

            **ubuntu-pod.yaml**

apiVersion: v1
                kind: Pod
                metadata:
                  name: ubuntu-pod
                  labels:
                    app: ubuntu-pod
                spec:
                  containers:
                    - name: ubuntu
                      image: ubuntu:latest
                      command: ["sleep", "604800"]
                      imagePullPolicy: IfNotPresent
                  restartPolicy: Always
                Copy to clipboard
    - **Use Kubernetes pods with** `kubectl`

        - **Use** `kubectl` **get nodes in the cluster**

            To list the nodes in the cluster, run the following command on
the master node:

kubectl get nodes
                Copy to clipboard
        - **Use** `kubectl` **get deployments present in the cluster**

            To list the deployments present in the cluster, run the
following command on the master node:

kubectl get deployment
                Copy to clipboard
        - **Use** `kubectl` **get pods present in the cluster**

            To list the pods present in the cluster, run the following
command on the master node:

kubectl get pods
                Copy to clipboard
        - **Access the shell of a pod from the master node**

            To access the shell instance of a pod from the master node, run
the following command on the master node:

kubectl exec -it <pod-name> -- <command>
                Copy to clipboard
        - **Access shell of a pod from the worker node**

            To access the shell instance of a pod (container) using Docker,
run the following command on the worker node:

docker exec -it <container-id> <command>
                Copy to clipboard

Note

`<container-id>` is obtained by listing all the containers using the `docker ps -a` command.

**Changes made in Docker and Kubernetes in contrast to the upstreamsolution**

- The `meta-qcom-hwe`/`recipes-containers`/`docker`/`docker-ce_git.bbappend` recipe
changes `/lib/systemd/system/docker.service`. During this change,
`--exec-opt native.cgroupdriver=systemd` is passed to a `dockerd`
command that runs as part of `ExecStart` of the service. This is
performed to keep parity with `cgroupdriver` between Docker and
Kubernetes.
- The `meta-qcom-hwe`/`recipes-containers`/`kubernetes`/`kubernetes_git.bbappend` recipe
changes `/lib/systemd/system/kubelet.service.d/10-kubeadm.conf`.
During this change, `--fail-swap-on=false` is passed as part of
`KUBELET_EXTRA_ARGS`. This is performed because Kubernetes expected
the swap to be **OFF**. As the platform software of Qualcomm has zram
enabled, swap is set to **ON**.
- The upstream `kubelet.service` attempts to start automatically upon
device bootup, even if the device is not configured as a Kubernetes
node. However, this behavior consumes resources and impacts power
efficiency. To address this, `kubelet.service` is modified by
removing `WantedBy=multi-user.target` in the
`meta-qcom-hwe/recipes-containers/kubernetes/kubernetes_git.bbappend`
file. With `WantedBy=multi-user.target` deleted, the upstream `kubelet.service`
starts when the device is set up as a Kubernetes node
using `kubeadm`, rather than automatically in
`multi-user.target`.

## Properties

Properties (`property-vault`) provide functionality to store and share
key-value pairs stored as strings across the system. Any software
component can share any value for a particular key and any other process
can access the value by using the same key. `property-vault` allows you
to define persistent properties across reboot. Components can use
`property-vault` to share specific information, which might be
relevant to any other module on the device. These key-value pairs can be
accessed using the command-line interface (CLI).

Note

`property-vault` is compatible only with `qcom-custom-bsp`.

- **Configure properties using CLI**

    To set a property using the CLI, use the following command:

setprop "my-key" "my-value"
        Copy to clipboard

    To access a property using the CLI, use the following command:

getprop "my-key"
        Copy to clipboard

Result of `the getprop "my-key"` command: my-value

    To set a property using the CLI and persist it across reboots, use
the following command:

setprop "persist.my-key" "my-value"
        Copy to clipboard
- **Properties in C/C++ source files**

    To use the properties in C/C++ source files, do the following:

    1. To use properties such as `property-vault` in a recipe,
for example, `example-recipe.bb`, add a dependency on
`property-vault`:

DEPENDS = "glib-2.0 property-vault"
            RDEPENDS:${PN} = "property-vault"
            Copy to clipboard
    2. Change `make` files:

        1. If you are using `automake`:

            `configure.ac`

...
                
                PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.16, dummy=yes, AC_MSG_ERROR(GLib >= 2.16 is required))
                GLIB_CFLAGS="$GLIB_CFLAGS"
                GLIB_LIBS="$GLIB_LIBS"
                AC_SUBST(GLIB_CFLAGS)
                AC_SUBST(GLIB_LIBS)
                
                AC_CONFIG_FILES([Makefile])
                ...
                Copy to clipboard

            `Makefile.am`

root_sbindir       = "/sbin"
                root_sbin_PROGRAMS = property-test
                
                property_test_SOURCES  = source.c
                property_test_CFLAGS = @GLIB_CFLAGS@
                property_test_LDFLAGS = @GLIB_LIBS@ -lpropertyvault
                Copy to clipboard
        2. If you are using `cmake`:

            `CMakeList.txt`

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -lpthread -lrt -lm -lglib-2.0 -ldl -latomic")
                target_link_libraries (techteamlocalibname propertyvault)
                Copy to clipboard
    3. Modify the source files to `get` and `set` properties:

        `source.c`

#include "properties.h"
            
            int main() {
                // setting a property
                property_set("my-key", "my-value");
            
                // getting a property
                char paramstr[PROPERTY_VALUE_MAX];
                property_get("my-key", paramstr, ""); // value gets stored in paramstr
            
                // setting a property and persisting it across reboot
                property_set("persist.my-key", "my-value");
            
                return 0;
            }
            Copy to clipboard

## Log shim for syslog()

Logs from Qualcomm-proprietary and open-source projects are recorded into
`syslog`.

`syslog()` is used to write logs on the device. Use `rsyslog` as
the logging system to process logs according to specified rules.
`rsyslog` can accept inputs not only from the system and kernel messages,
but also from applications that use `syslog protocol` for
logging.

When an application makes a `syslog` call, `rsyslog` redirects these
logs based on its configuration. The `rsyslog` configuration is found in the
`/etc/rsyslog.conf` or `/etc/ryslog.d` directory.

Use the `logrotate` service for archiving old logs.

Note

Logging shim is compatible only with `custom` variant.

## Persist partition

The persist partition defined for the UFS is used to store persistent
data that the BSP software components require across reboots. User-requested
operations must not erase this data during the device lifecycle.

- **Persist mount point**

    The `/var/persist` directory serves as a mount point for a
file system, which is created on the partition named persist. The
`overlayfs-qcom-paths_1.0.bb` recipe is responsible for creating
the directory on the rootfs and installing the
`var-persist.mount` systemd unit to `local-fs.target`.

    At bootup, the `var-persist.mount` systemd unit mounts
`/dev/disk/by-partlabel/persist` on `/var/persist`. To display the persist
mount point, run the mount command as follows:

sh-5.1# mount | grep persist
        /dev/sda10 on /var/persist type ext4 (rw,relatime,rootcontext=system_u:object_r:qcom_persist_t:s0,seclabel,stripe=128)
        Copy to clipboard
- **Resize persist partition**

    Resize the overlay partition using the
`resize-partitions.bb` recipe and `resize-partition.service.in` files.
The resize-partition service runs when the device boots up to create and
set the file system according to the size of the partition.

## Secondary virtual machine

This section provides the steps for creating Qualcomm Linux
host and guest virtual machine (VM) images, including the
essential VM management tools such as `crosvm` and `qemu`,
along with the commands to launch the guest VM.

The following subsections explain how to enable VM support for an image.

1. **Set up the host.**

    To install clang on the host machine, run the following command:

sudo apt install clang-11
        Copy to clipboard
2. **Enable the meta-rust layer.**

    The meta-rust layer provides Rust compiler (rustc) and package
manager (cargo) to compile crosvm, which is implemented in the Rust
language.

    Add the meta-rust layer to EXTRALAYERS in the
`meta-qcom-distro/conf/bblayers.conf` directory.

    `vi conf/bblayers.conf`

EXTRALAYERS ?= " \
         ${WORKSPACE}/layers/meta-rust \
        "
        Copy to clipboard
3. **Upgrade the Rust version.**

    Create the
`meta-qcom-distro/conf/distro/include/rust_version.inc` file with the
following content:

    `vi meta-qcom-distro/conf/distro/include/rust_version.inc`

# include this in your distribution to easily switch between versions
        # just by changing RUST_VERSION variable
        
        RUST_VERSION ?= "1.73.0"
        
        PREFERRED_VERSION_cargo ?= "${RUST_VERSION}"
        PREFERRED_VERSION_cargo-native ?= "${RUST_VERSION}"
        PREFERRED_VERSION_libstd-rs ?= "${RUST_VERSION}"
        PREFERRED_VERSION_rust ?= "${RUST_VERSION}"
        PREFERRED_VERSION_rust-cross-${TARGET_ARCH} ?= "${RUST_VERSION}"
        PREFERRED_VERSION_rust-llvm ?= "${RUST_VERSION}"
        PREFERRED_VERSION_rust-llvm-native ?= "${RUST_VERSION}"
        PREFERRED_VERSION_rust-native ?= "${RUST_VERSION}"
        Copy to clipboard

    Include the `rust_version.inc` file in the
`meta-qcom-distro/conf/distro/qcom-wayland.conf` directory.

    `conf/distro/qcom-wayland.conf`

require conf/distro/include/rust_version.inc
        Copy to clipboard
4. **Add crosvm to the VM package.**

    To add crosvm to the host VM packagegroup, run the following command:

    `vi meta-qcom-distro/recipes-products/packagegroups/packagegroup-qcom-vm-host.bb`

RDEPENDS:packagegroup-qcom-vm-host:append:qcom-custom-bsp = "\
           crosvm \
           "
        Copy to clipboard
5. **Build the host VM and the guest VM images.**

    - To build a Host VM image, run the following command:

bitbake qcom-console-image
            Copy to clipboard
    - To build a Guest VM image, run the following command:

bitbake multiconfig:qcom-guestvm:qcom-guestvm-image
            Copy to clipboard

        **Guest VM artifacts**

> 
> 
> 1. The guest VM build command creates a folder named `tmp-qcom-guestvm-glibc` for the Guest VM image.
>         2. The Guest VM kernel and rootfs images are generated in the `tmp-qcom-guestvm-glibc/deploy/images/<machine-name>` directory.
>         3. Use the `tmp-qcom-guestvm-glibc/deploy/images/<machine-name>/Image` file as the Guest VM kernel image.
>         4. Use the `tmp-qcom-guestvm-glibc/deploy/images/<machine-name>/qcom-guestvm-image-<machine-name>.ext4` file as the rootfs.
>         5. After loading the host build, copy both these images to the disk.
6. **Launch Guest VM.**

    To launch Guest VM, use the crosvm virtual machine manager (VMM) and the Gunyah hypervisor.

    Ensure that the Guest VM kernel and the root file system are in the `/var/gunyah` directory on your device and run the following command:

crosvm --log-level=debug --no-syslog run --disable-sandbox --hypervisor gunyah --protected-vm-without-firmware \
        --serial=type=stdout,hardware=virtio-console,console,stdin,num=1 --serial=type=stdout,hardware=serial,earlycon,num=1 \
        --root /var/gunyah/qcom-guestvm-image-qcs9100-ride-sx.ext4 --no-balloon --no-rng --params \
        "earlyprintk=serial panic=0" /var/gunyah/Image
        Copy to clipboard

    - `--root /var/gunyah/qcom-guestvm-image-qcs9100-ride-sx.ext4` specifies the path to the root file system for the guest VM.
    - `/var/gunyah/Image` specifies the path to the kernel image.

    For more information, see [Virtualization](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-3/features.html#virtualization).

## Handle out-of-tree kernel modules and device tree using recipes

To build an out-of-tree kernel module, see [Add kernel
module](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-3/customize.html#add-kernel-module).

Note

The out-of-kernel device tree is supported only for the `custom` variant.

For device-tree/device-tree blob management, see [Platform
support](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-3/customize.html#platform-support_0).

Last Published: Oct 14, 2024

[Previous Topic
Overview](https://docs.qualcomm.com/bundle/publicresource/80-70015-27/topics/intro_yocto_linux_qualcomm.md) [Next Topic
User customizations](https://docs.qualcomm.com/bundle/publicresource/80-70015-27/topics/user_customizations.md)

Source: [https://docs.qualcomm.com/doc/80-70015-27/topic/platform_software_features.html](https://docs.qualcomm.com/doc/80-70015-27/topic/platform_software_features.html)