# Develop the kernel

Qualcomm Linux kernel can be developed using Yocto build workflow or standalone.

## Use Yocto to develop kernel

The Qualcomm Linux `meta-qcom-hwe` layer supports `linux-qcom-base_6.6.bb`
and `linux-qcom-custom_6.6.bb` recipes that fetch and build the Qualcomm
Linux kernel for supported machines.

To develop kernel using Yocto development workflow, refer following sections.
For more information about Yocto provisions, host patches, and how to apply
them, see [Yocto Project Linux Kernel
Development](https://docs.yoctoproject.org/1.5/kernel-dev/kernel-dev.html#applying-patches).

## Retrieve the kernel source

Fetch the kernel source from the CodeLinaro repository as a part of BitBake builds.

**Yocto kernel**

MACHINE=<SoC>-<board>-<variant> DISTRO=qcom-wayland source setup-environment
    bitbake qcom-console-image
    
    # kernel source is downloaded under following location
      ls build-qcom-wayland/tmp-glibc/work-shared/<SoC>-<board>-<variant>/kernel-source/
      arch     Documentation  ipc       MAINTAINERS  samples   virt
      block    drivers        Kbuild    Makefile     scripts
      certs    fs             Kconfig   mm           security
      COPYING  include        kernel    net          sound
      CREDITS  init           lib       README       tools
      crypto   io_uring       LICENSES  rust         usr
    Copy to clipboard

Note

Machine name for the previous commands is the same as the SoC-board-variant name. For example, for the QCS6490 SoC, `QCS6490` is the machine name, `rb3gen2` is the board, and `Visionkit` is the variant.

For more information about the setup and obtaining a source, see the
[Qualcomm Linux Build Guide](doc/80-70023-254).

## Retrieve the kernel recipe

Qualcomm Linux maintains the `meta-qcom-hwe` layer and hosts kernel recipe files at the following locations:

- Base BSP: `meta-qcom-hwe/recipes-kernel/linux//linux-qcom-base_6.6.bb` file.
- Custom BSP: `meta-qcom-hwe/recipes-kernel/linux//linux-qcom-custom_6.6.bb` file.

`PREFERRED_PROVIDER_virtual/kernel` is defined as
`linux-qcom-base` or `linux-qcom-custom` in the
`meta-qcom-hwe/conf/machine/include/qcom-base.inc` file.

For the kernel recipe, run the following commands:

# kernel recipe location
       ls -l meta-qcom-hwe/recipes-kernel/linux/
       linux-kernel-headers-install_6.6.bb
       linux-kernel-qcom-headers_6.6.bb
       linux-qcom-base-6.6
       linux-qcom-base_6.6.bb
       linux-qcom-custom
       linux-qcom-custom_6.6.bb
    Copy to clipboard

## Unpack the kernel source

Unpack the kernel source for development and customization after cloning the meta layer.

To unpack the source code, run the following commands:

# unpack kernel
    # checkout kernel source aligned to upstream LTS base with patches applied from recipe
    # Following would checkout kernel source in build-qcom-wayland/workspace/sources/linux-qcom-base/
    $  devtool modify linux-qcom-base
    Copy to clipboard

Note

For the custom BSP variant, use `linux-qcom-custom`.

## Make kernel changes

Kernel changes or customizations are done in the
`build-qcom-wayland/workspace/sources/linux-qcom-base` workspace.

To modify the kernel configuration, run the following commands:

# Modify sources in build-qcom-wayland/workspace/sources/linux-qcom-base, or update kernel configuration by running makemenufonfig
      devtool menuconfig linux-qcom-base
    
    # config fragment is updated in following location
      ls build-qcom-wayland/workspace/sources/linux-qcom-base/oe-local-files/devtool-fragment.cfg
    devtool-fragment.cfg
    
    # you may do other changes to kernel and commit
    Copy to clipboard

Note

For the custom BSP variant, use `linux-qcom-custom`.

## Commit kernel changes

To commit your changes, run the following Git commands:

cd build-qcom-wayland/workspace/sources/linux-qcom-base
    git add .
    git commit -s -m "my changes"
    Copy to clipboard

## Build the kernel image

After the changes are done, to build the kernel and the image, run the following commands:

> 
> 
> # to build kernel use
>       devtool build linux-qcom-base
>     Copy to clipboard

# and following to build the image
      devtool build-image qcom-console-image
    Copy to clipboard

# built images are produced in standard location
      ls build-qcom-wayland/tmp-glibc/deploy/images/<SoC>-<board>-<variant>/
    Copy to clipboard

Note

To compile the custom BSP, use `linux-qcom-custom`.

## Maintain kernel changes

Use Devtool to develop and export the patch and create an append file in
the `meta-mylayer` layer. To create your own layer, first add it to
the host kernel `bbappend` files and make changes.

To create and append kernel patches in the meta layer, run the following commands:

# create your own layer first and add it to host kernel bbappend and changes
      bitbake-layers create-layer ~/meta-mylayer
    # mkdir -p ~/meta-mylayer/recipes-kernel/linux/linux-qcom-base
      bitbake-layers add-layer ~/meta-mylayer
    
    # following would update the meta-mylayer recipe and the change
      devtool finish linux-qcom-base ~/meta-mylayer
    
    # devtool finish shall populate the meta-mylayer recipes along with patches,
    
      ls -R meta-mylayer/recipes-kernel/
    meta-mylayer/recipes-kernel/:
    linux
    
    meta-mylayer/recipes-kernel/linux:
    linux-qcom-base  linux-qcom-base_%.bbappend
    
    meta-mylayer/recipes-kernel/linux/linux-qcom-base:
    0001-my-patch.patch  devtool-fragment.cfg
    
      less meta-mylayer/recipes-kernel/linux/linux-qcom-base%.bbappend
    FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
    
    SRC_URI += "file://devtool-fragment.cfg \
                file://0001-my-patch.patch"
    Copy to clipboard

After running the `devtool finish` command, the `~/meta-mylayer`
layer is updated with the following:

- Corresponding kernel changes hosted as patches in
`meta-mylayer/recipes-kernel/linux/linux-qcom-base/*.patch`.
- Add and update
`meta-mylayer/recipes-kernel/linux/linux-qcom-base_%.bbappend SRC_URI`
with these patches.
- Remove `build-qcom-wayland/workspace` after the development is
completed.

Note

For the custom BSP variant, use `linux-qcom-custom`.

## Clean up the workspace

To clean up the workspace, use the following Devtool and BitBake commands:

# to remove layer
      bitbake-layers remove-layer ~/meta-mylayer
    
    # to clean complete workspace
      bitbake -c cleanall <recipe-name>
    
    # reset using Devtool
      devtool reset linux-qcom-base
    
    # manually delete the workspace directory
      rm -rf build-qcom-wayland/workspace/sources/linux-qcom-base
    Copy to clipboard

## Configure the kernel

The Yocto build system is used for modifying the kernel configuration, while
invoking `menuconfig`.

To modify the kernel configuration, run the following commands:

MACHINE=<SoC>-<board>-<variant> DISTRO=qcom-wayland source setup-environment
     bitbake linux-qcom-base -c menuconfig
    
    # Above would update .config in kernel build directory build-qcom-wayland/tmp-glibc/work/<SoC>-<board>-<variant>/linux-qcom-base/6.6-r0/build/
    # one can create a config fragment for modifications made by issuing following
    
      bitbake linux-qcom-base -c diffconfig
    
    # Above would create fragment.cfg in build directory build-qcom-wayland/tmp-glibc/work/<SoC>-<board>-<variant>/linux-qcom-base/6.6-r0/
    Copy to clipboard

Alternatively, use the Devtool to modify the kernel configuration:

devtool modify linux-qcom-base
     devtool menuconfig linux-qcom-base
     devtool finish linux-qcom-base ~/meta-mylayer
    
    # this would create a config fragment as a patch and update in your meta layer
    Copy to clipboard

Note

For the custom BSP variant, use `linux-qcom-custom`.

For more information about Yocto-related details on kernel configuration, see
[Configuring the
Kernel](https://docs.yoctoproject.org/4.3.1/kernel-dev/common.html#configuring-the-kernel).

The `linux-kernel-qcom-base_6.6.bb`, or `linux-qcom-custom_6.6.bb` kernel recipe file uses the following configuration fragments to build the images:

For example, `linux-qcom-custom_6.6.bb` uses the following fragments to append the kernel:

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 generate the debug build using debug configuration fragments, run the following commands:

# Set DEBUG_BUILD to 1 to compile debug-enabled build
    
      source setup-environment
      DEBUG_BUILD=1 bitbake linux-kernel-custom
    Copy to clipboard

For more information about different configuration fragments, see [Get started with Qualcomm Linux kernel](https://docs.qualcomm.com/doc/80-70023-3/topic/getting_started_chapter2.html).

## Create a debug build

To create a debug build, pass `DEBUG_BUILD=1` as an argument in the shell:

# setup the build environment
      export SHELL=/bin/bash
    
      MACHINE=<SoC>-<board>-<variant> DISTRO=qcom-wayland QCOM_SELECTED_BSP=base source setup-environment
    
    # build qcom linux console image
      DEBUG_BUILD=1 bitbake qcom-console-image
    Copy to clipboard

Note

For the custom BSP variant, use `QCOM_SELECTED_BSP=custom`.

## Update the kernel command-line parameters

To update the kernel command-line, modify the
Yocto configuration variable `KERNEL_CMDLINE_EXTRA` in the corresponding SoC-specific machine inclusion file. For example, `meta-qcom-hwe/conf/machine/include/qcom-<SoC>.inc`.

To update the kernel command-line, modify the following variable:

KERNEL_CMDLINE_EXTRA = "root=/dev/disk/by-partlabel/system rw rootwait console=ttyMSM0,115200n8 pcie_pme=nomsi earlycon"
    Copy to clipboard

### Update the ESP images

To compile the systemd-boot boot manager and kernel images into a packaged UKI type-2 image file, use the following methods:

Yocto build for hardware SoC generates all the required images and package
boot images as `efi.bin` that is flashed into the EFI partition. The `efi.bin` file consists of
systemd-boot boot manager and kernel images, which are packaged as UKI type-2 image format.

Rebuild the EFI image after updating the kernel source, configuration,
or DTS and flash the generated `efi.bin` to the EFI partition.

MACHINE=<SoC>-<board>-<variant> DISTRO=qcom-wayland source setup-environment
    
    # build qcom linux console image
      DEBUG_BUILD=1 bitbake qcom-console-image
    
    # build images are produced in following directory
      ls build-qcom-wayland/tmp-glibc/deploy/images/<SoC>-<qcom>-<variant>/efi.bin
    efi.bin
    
    # reboot into fastboot
      fastboot flash efi efi.bin
      fastboot flash dtb_a dtb.bin
    Copy to clipboard

For more information about the UKI type-2 image format, see  [Type #2 EFI Unified Kernel Images](https://uapi-group.org/specifications/specs/boot_loader_specification/#type-2-efi-unified-kernel-images).

For more information about ESP, see Boot and [Bring up the device](https://docs.qualcomm.com/doc/80-70023-3/topic/getting_started_chapter2.html#bring-up-the-device).

## Customize the initramfs package

To update the initramfs package, modify the `PACKAGE_INSTALL` list in
`meta-qcom-hwe/recipes-kernel/images/initramfs-qcom-image.bbappend` file:

less meta-qcom-hwe/recipes-kernel/images/initramfs-qcom-image.bbappend
    
    # Add additional packages needed as part of initrd
    PACKAGE_INSTALL += " \
        e2fsprogs \
        e2fsprogs-e2fsck \
        e2fsprogs-mke2fs \
        e2fsprogs-resize2fs \
        e2fsprogs-tune2fs \
        ${VIRTUAL-RUNTIME_dev_manager} \
        os-release-initrd \
        "
    Copy to clipboard

## Add a kernel module

To compile out-of-tree kernel modules using the Yocto build system, use the following procedure:

1. Create a `Makefile` for out-of-tree kernel driver.

> 
> 
> The following is the sample `Makefile` for out-of-tree kernel driver:

all: modules
    obj-m := hello.o
    
    SRC := $(shell pwd)
    
    modules:
      $(MAKE) -C $(KERNEL_SRC) M=$(SRC) modules $(KBUILD_OPTIONS)
    
    modules_install:
      $(MAKE) -C $(KERNEL_SRC) M=$(SRC) modules_install
    Copy to clipboard

2. Integrate the module into the Yocto build system.

> 
> 
> See the following example to integrate the kernel modules using Yocto module class.

DESCRIPTION = "${SUMMARY}"
    LICENSE = "GPL-2.0-only"
    LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/${LICENSE};md5=801f80980d171dd6425610833a22dbe6"
    
    inherit module
    
    SRC_URI += "file://Makefile \
                file://hello.c  \
                file://COPYING  \
                "
    S = "${WORKDIR}"
    
    EXTRA_OEMAKE += "MACHINE='${MACHINE}'"
    MAKE_TARGETS = "modules"
    MODULES_INSTALL_TARGET = "modules_install"
    
    # Kernel module to be autoloaded
        KERNEL_MODULE_AUTOLOAD += "hello"
    
    # The inherit of module.bbclass will automatically name module packages with
    # "kernel-module-" prefix as required by the oe-core build environment.
    
    RPROVIDES_${PN} += "kernel-module-hello"
    Copy to clipboard

For more information about the out-of-tree module, see [Working with
Out-of-Tree
Modules](https://docs.yoctoproject.org/kernel-dev/common.html#working-with-out-of-tree-modules).

## Configure the DTB support

Qualcomm Linux uses the following procedures to choose device tree
files, change kernel configuration, and build out-of-tree
kernel modules.

## Platform device tree

Qualcomm Linux supports a device tree overlay feature to maintain and merge out-of-device tree blobs with the baseline device tree blobs.
SoC device tree support is present in the kernel source in the `arch/arm64/boot/dts/qcom` directory.

Qualcomm device tree source lists the device tree and maintains a clear separation to contain downstream additions for provisioning the upstream-aligned base distinctly.

The downstream content is hosted outside the kernel source. The out-of-tree drivers maintain their device tree overlay
additions outside the kernel. During the build process, the
corresponding device tree overlay is merged with the base board DTB and
a unified DTB is generated, which is used with boot images.

The following figure shows the build process for device tree overlay, and DTB generation for custom BSP on QCS6490:

Note

- Base BSP follows the same build process without the **addons** downstream device-tree files.
- All supported Qualcomm hardware SoCs follow the same build process for DT overlay and DTB generation.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by Microsoft Visio, SVG Export device-tree.svg Page-1 -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="12.3611in" height="9.91319in" viewbox="0 0 890 713.75" xml:space="preserve" color-interpolation-filters="sRGB" class="st26" aria-label="Representation of device tree overlay on QCS6490."><v:documentproperties v:langid="1033" v:viewmarkup="false">	<v:userdefs>		<v:ud v:nameu="msvSubprocessMaster" v:prompt="" v:val="VT4(Rectangle)"></v:ud>		<v:ud v:nameu="msvNoAutoConnect" v:val="VT0(1):26"></v:ud>	</v:userdefs></v:documentproperties>
<style>.svg-1 .st1 { fill: #fafafa; stroke: #d2d7e1; stroke-width: 2 }
.svg-1 .st2 { stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2 }
.svg-1 .st3 { stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-1 .st4 { fill: #8d8df7; stroke: #fafafa; stroke-width: 1.5 }
.svg-1 .st5 { fill: #ffffff; font-family: Roboto Flex, Qualcomm-Next, sans-serif; font-size: 0.916672em }
.svg-1 .st6 { fill: #8d8df7; stroke: #000000; stroke-opacity: 0; stroke-width: 0.75 }
.svg-1 .st7 { fill: #6280cc; stroke: #000000; stroke-opacity: 0; stroke-width: 0.75 }
.svg-1 .st8 { fill: #ffffff; font-family: Roboto Flex, Qualcomm-Next, sans-serif; font-size: 1.00001em }
.svg-1 .st9 { font-size: 1em }
.svg-1 .st10 { fill: none; stroke: #7c8aa3; stroke-width: 1.25 }
.svg-1 .st11 { fill: #7c8aa3; stroke: #000000; stroke-opacity: 0; stroke-width: 2 }
.svg-1 .st12 { fill: #007884; stroke: #000000; stroke-opacity: 0; stroke-width: 0.75 }
.svg-1 .st13 { fill: #d2d7e1; stroke: none; stroke-width: 1.25 }
.svg-1 .st14 { fill: #000000; font-family: Roboto Flex, Qualcomm-Next, sans-serif; font-size: 0.916672em }
.svg-1 .st15 { marker-start: url("#mrkr4-106"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-1 .st16 { fill: #000000; fill-opacity: 1; stroke: #000000; stroke-opacity: 1; stroke-width: 0.45454545454545 }
.svg-1 .st17 { marker-start: url("#mrkr4-127"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-1 .st18 { fill: #000000; fill-opacity: 1; stroke: #000000; stroke-opacity: 1; stroke-width: 0.37313432835821 }
.svg-1 .st19 { marker-end: url("#mrkr4-161"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-1 .st20 { fill: #8d8df7; stroke: #8d8df7; stroke-opacity: 0; stroke-width: 2 }
.svg-1 .st21 { fill: none; stroke: none; stroke-width: 0.25 }
.svg-1 .st22 { fill: #000000; font-family: Roboto Flex, Qualcomm-Next, sans-serif; font-size: 1.00001em }
.svg-1 .st23 { fill: #007884; stroke: none; stroke-width: 2 }
.svg-1 .st24 { fill: #6280cc; stroke: none; stroke-width: 2 }
.svg-1 .st25 { fill: #7c8aa3; stroke: none; stroke-width: 2 }
.svg-1 .st26 { fill: none; fill-rule: evenodd; font-size: 12px; overflow: visible; stroke-linecap: square; stroke-miterlimit: 3 }</style>
<defs id="Markers">	<g id="lend4">		<path d="M 2 1 L 0 0 L 2 -1 L 2 1 " style="stroke:none"></path>	</g>	<marker id="mrkr4-106" class="st16" v:arrowtype="4" v:arrowsize="1" v:setback="4.16" refx="4.16" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(2.2) "></use>	</marker>	<marker id="mrkr4-127" class="st18" v:arrowtype="4" v:arrowsize="2" v:setback="5.12" refx="5.12" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(2.68) "></use>	</marker>	<marker id="mrkr4-161" class="st18" v:arrowtype="4" v:arrowsize="2" v:setback="5.36" refx="-5.36" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(-2.68,-2.68) "></use>	</marker></defs><g v:mid="0" v:index="1" v:groupcontext="foregroundPage">	<v:userdefs>		<v:ud v:nameu="msvThemeOrder" v:val="VT0(0):26"></v:ud>	</v:userdefs>	<title>Page-1</title>	<v:pageproperties v:drawingscale="1" v:pagescale="1" v:drawingunits="0" v:shadowoffsetx="9" v:shadowoffsety="-9"></v:pageproperties>	<v:layer v:name="Connector" v:index="0"></v:layer>	<g id="shape1070-1" v:mid="1070" v:groupcontext="shape" transform="translate(20,-20)">		<title>Sheet.1070</title>		<rect x="0" y="40" width="850" height="673.75" rx="4" ry="4" class="st1"></rect>	</g>	<g id="shape1030-3" v:mid="1030" v:groupcontext="shape" transform="translate(20.9091,-194.78)">		<title>Sheet.1030</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 713.75 L848.54 713.75" class="st2"></path>	</g>	<g id="shape1051-6" v:mid="1051" v:groupcontext="shape" transform="translate(675,1335) rotate(180)">		<title>Sheet.1051</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 713.75 L505.87 713.75" class="st3"></path>	</g>	<g id="shape1000-9" v:mid="1000" v:groupcontext="shape" transform="translate(46.1875,-641.094)">		<title>Rectangle.1000</title>		<desc>Kernel</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="188.156" cy="700.087" width="376.32" height="27.3253"></v:textrect>		<rect x="0" y="686.425" width="376.312" height="27.3253" rx="2" ry="2" class="st4"></rect>		<text x="172.65" y="703.39" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Kernel</text>		</g>	<g id="shape1001-12" v:mid="1001" v:groupcontext="shape" transform="translate(46.1875,-568.226)">		<title>Rectangle.1001</title>		<desc>sc7280.dtsi</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="188.156" cy="700.087" width="376.32" height="27.3253"></v:textrect>		<rect x="0" y="686.425" width="376.312" height="27.3253" rx="2" ry="2" class="st6"></rect>		<text x="159.57" y="703.39" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>sc7280.dtsi</text>		</g>	<g id="shape1002-15" v:mid="1002" v:groupcontext="shape" transform="translate(46.1875,-531.792)">		<title>Rectangle.1002</title>		<desc>qcm6490.dtsi</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="188.156" cy="700.087" width="376.32" height="27.3253"></v:textrect>		<rect x="0" y="686.425" width="376.312" height="27.3253" rx="2.88" ry="2.88" class="st7"></rect>		<text x="154.46" y="703.39" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcm6490.dtsi</text>		</g>	<g id="shape1004-18" v:mid="1004" v:groupcontext="shape" transform="translate(117,-481.696)">		<title>Rectangle.1004</title>		<desc>qcs6490-rb3gen2.dts</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="63" cy="700.087" width="126" height="27.3253"></v:textrect>		<rect x="0" y="686.425" width="126" height="27.3253" rx="2" ry="2" class="st6"></rect>		<text x="10.95" y="703.39" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-rb3gen2.dts</text>		</g>	<g id="shape1005-21" v:mid="1005" v:groupcontext="shape" transform="translate(258,-481.696)">		<title>Rectangle.1005</title>		<desc>qcm6490-addons.dtsi</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="82.25" cy="700.087" width="164.5" height="27.3253"></v:textrect>		<rect x="0" y="686.425" width="164.5" height="27.3253" rx="2.88" ry="2.88" class="st7"></rect>		<text x="23.98" y="703.69" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcm6490-addons.dtsi</text>		</g>	<g id="shape1007-24" v:mid="1007" v:groupcontext="shape" transform="translate(258,-418.271)">		<title>Rectangle.1007</title>		<desc>qcm6490-addons-rb3gen2.dtsi</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="82.25" cy="693.877" width="164.5" height="39.7459"></v:textrect>		<rect x="0" y="674.004" width="164.5" height="39.7459" rx="2.88" ry="2.88" class="st7"></rect>		<text x="33.8" y="690.28" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcm6490-addons-<tspan x="48.79" dy="1.2em" class="st9">rb3gen2.dtsi</tspan></text>		</g>	<g id="shape1008-28" v:mid="1008" v:groupcontext="shape" transform="translate(258.511,-363.884)">		<title>Rectangle.1008</title>		<desc>qcs6490-addons-rb3gen2.dts</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="81.9886" cy="698.451" width="163.98" height="30.5986"></v:textrect>		<rect x="0" y="683.151" width="163.977" height="30.5986" rx="2.88" ry="2.88" class="st7"></rect>		<text x="10.22" y="701.75" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-addons-rb3gen2.dts</text>		</g>	<g id="shape1009-31" v:mid="1009" v:groupcontext="shape" transform="translate(258.511,-325.288)">		<title>Rectangle.1009</title>		<desc>qcs6490-addons-rb3gen2-ia.mezz.dts</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="81.9886" cy="698.451" width="163.98" height="30.5986"></v:textrect>		<rect x="0" y="683.151" width="163.977" height="30.5986" rx="2.88" ry="2.88" class="st7"></rect>		<text x="17.88" y="695.15" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-addons-rb3gen2-<tspan x="53.85" dy="1.2em" class="st9">ia.mezz.dts</tspan></text>		</g>	<g id="shape1010-35" v:mid="1010" v:groupcontext="shape" transform="translate(258.511,-286.692)">		<title>Rectangle.1010</title>		<desc>qcs6490-addons-rb3gen2-ptz-mezz.dts</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="81.9886" cy="698.451" width="163.98" height="30.5986"></v:textrect>		<rect x="0" y="683.151" width="163.977" height="30.5986" rx="2.88" ry="2.88" class="st7"></rect>		<text x="8.76" y="695.15" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-addons-rb3gen2-ptz-<tspan x="59.62" dy="1.2em" class="st9">mezz.dts</tspan></text>		</g>	<g id="shape1011-39" v:mid="1011" v:groupcontext="shape" transform="translate(258.511,-248.096)">		<title>Rectangle.1011</title>		<desc>qcs6490-addons-rb3gen2-video-mezz.dts</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="81.9886" cy="698.451" width="163.98" height="30.5986"></v:textrect>		<rect x="0" y="683.151" width="163.977" height="30.5986" rx="2.88" ry="2.88" class="st7"></rect>		<text x="17.88" y="695.15" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-addons-rb3gen2-<tspan x="44.95" dy="1.2em" class="st9">video</tspan>-mezz.dts</text>		</g>	<g id="shape1012-43" v:mid="1012" v:groupcontext="shape" transform="translate(258.511,-209.5)">		<title>Rectangle.1012</title>		<desc>qcs6490-addons-rb3gen2-vision-mezz.dts</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="81.9886" cy="698.451" width="163.98" height="30.5986"></v:textrect>		<rect x="0" y="683.151" width="163.977" height="30.5986" rx="2.88" ry="2.88" class="st7"></rect>		<text x="17.88" y="695.15" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-addons-rb3gen2-<tspan x="43.76" dy="1.2em" class="st9">vision</tspan>-mezz.dts</text>		</g>	<g id="shape1013-47" v:mid="1013" v:groupcontext="shape" transform="translate(250,-202.199)">		<title>Rectangle.1013</title>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<rect x="0" y="514.859" width="180" height="198.891" rx="2" ry="2" class="st10"></rect>	</g>	<g id="shape1014-49" v:mid="1014" v:groupcontext="shape" transform="translate(478.187,-642.693)">		<title>Rectangle.1014</title>		<desc>Camera</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="81" cy="700.087" width="162" height="27.3253"></v:textrect>		<rect x="0" y="686.425" width="162" height="27.3253" rx="2" ry="2" class="st6"></rect>		<text x="61.84" y="703.39" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Camera</text>		</g>	<g id="shape1015-52" v:mid="1015" v:groupcontext="shape" transform="translate(476.687,-555.676)">		<title>Rectangle.1015</title>		<desc>qcm6490-camera.dtsi</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="82.5" cy="694.338" width="165" height="38.8235"></v:textrect>		<rect x="0" y="674.926" width="165" height="38.8235" rx="2.88" ry="2.88" class="st7"></rect>		<text x="28.83" y="697.64" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcm6490-camera.dtsi</text>		</g>	<g id="shape1017-55" v:mid="1017" v:groupcontext="shape" transform="translate(476.687,-484.5)">		<title>Rectangle.1017</title>		<desc>qcs6490-addons-camera-rb3gen2.dtso</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="82.5" cy="694.338" width="165" height="38.8235"></v:textrect>		<rect x="0" y="674.926" width="165" height="38.8235" rx="2.88" ry="2.88" class="st7"></rect>		<text x="20.09" y="691.04" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-addons-camera-<tspan x="50.02" dy="1.2em" class="st9">rb3gen2.dtso</tspan></text>		</g>	<g id="shape1019-59" v:mid="1019" v:groupcontext="shape" transform="translate(674.5,-642.693)">		<title>Rectangle.1019</title>		<desc>Component N</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="85.5" cy="700.087" width="171" height="27.3253"></v:textrect>		<rect x="0" y="686.425" width="171" height="27.3253" rx="2" ry="2" class="st6"></rect>		<text x="51.68" y="703.39" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Component N</text>		</g>	<g id="shape1020-62" v:mid="1020" v:groupcontext="shape" transform="translate(672.917,-555.676)">		<title>Rectangle.1020</title>		<desc>qcm6490-&#60;component&#62;.dtsi</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="87.0833" cy="694.338" width="174.17" height="38.8235"></v:textrect>		<rect x="0" y="674.926" width="174.167" height="38.8235" rx="2.88" ry="2.88" class="st7"></rect>		<text x="18.36" y="697.64" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcm6490-&#60;component&#62;.dtsi</text>		</g>	<g id="shape1021-65" v:mid="1021" v:groupcontext="shape" transform="translate(672.917,-484.5)">		<title>Rectangle.1021</title>		<desc>qcm6490-addons-&#60;component&#62;.dtso</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="87.0833" cy="694.338" width="174.17" height="38.8235"></v:textrect>		<rect x="0" y="674.926" width="174.167" height="38.8235" rx="2.88" ry="2.88" class="st7"></rect>		<text x="42.67" y="691.04" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcm6490-addons-<tspan x="41.26" dy="1.2em" class="st9">&#60;component&#62;.dtso</tspan></text>		</g>	<g id="shape1023-69" v:mid="1023" v:groupcontext="shape" transform="translate(117,-143.753)">		<title>Rectangle.1023</title>		<desc>qcs6490-rb3gen2.dtb</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="63" cy="693.877" width="126" height="39.7459"></v:textrect>		<rect x="0" y="674.004" width="126" height="39.7459" rx="2" ry="2" class="st11"></rect>		<text x="10.7" y="697.18" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-rb3gen2.dtb</text>		</g>	<g id="shape1026-72" v:mid="1026" v:groupcontext="shape" transform="translate(475.344,-143.753)">		<title>Rectangle.1026</title>		<desc>qcs6490-addons-camera-rb3gen2.dtbo</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="84.6562" cy="693.877" width="169.32" height="39.7459"></v:textrect>		<rect x="0" y="674.004" width="169.312" height="39.7459" rx="2" ry="2" class="st11"></rect>		<text x="22.25" y="690.58" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-addons-camera-<tspan x="51.93" dy="1.2em" class="st9">rb3gen2.dtbo</tspan></text>		</g>	<g id="shape1028-76" v:mid="1028" v:groupcontext="shape" transform="translate(675,-82.4013)">		<title>Rectangle.1028</title>		<desc>qcm6490-addons-&#60;component&#62;.dtbo</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="85" cy="698.451" width="170" height="30.5986"></v:textrect>		<rect x="0" y="683.151" width="170" height="30.5986" rx="2" ry="2" class="st11"></rect>		<text x="40.58" y="695.15" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcm6490-addons-<tspan x="38.92" dy="1.2em" class="st9">&#60;component&#62;.dtbo</tspan></text>		</g>	<g id="shape1052-80" v:mid="1052" v:groupcontext="shape" transform="translate(674.805,1325) rotate(180)">		<title>Sheet.1052</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 713.75 L482.76 713.75" class="st3"></path>	</g>	<g id="shape1029-83" v:mid="1029" v:groupcontext="shape" transform="translate(370.187,-84.038)">		<title>Rectangle.1029</title>		<desc>Build time fdt overlay</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="76.5" cy="700.087" width="153" height="27.3253"></v:textrect>		<rect x="0" y="686.425" width="153" height="27.3253" rx="2.88" ry="2.88" class="st12"></rect>		<text x="25.01" y="703.39" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Build time fdt overlay</text>		</g>	<g id="shape1031-86" v:mid="1031" v:groupcontext="shape" transform="translate(45.7576,-605.907)">		<title>Sheet.1031</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 713.75 L799.24 713.75" class="st2"></path>	</g>	<g id="shape1032-89" v:mid="1032" v:groupcontext="shape" transform="translate(-271.562,518.97) rotate(-90)">		<title>Sheet.1032</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 713.75 L482.75 713.75" class="st2"></path>	</g>	<g id="shape1033-92" v:mid="1033" v:groupcontext="shape" transform="translate(-55.5625,518.97) rotate(-90)">		<title>Sheet.1033</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 713.75 L482.75 713.75" class="st2"></path>	</g>	<g id="shape1035-95" v:mid="1035" v:groupcontext="shape" transform="translate(478.687,-614)">		<title>Sheet.1035</title>		<desc>(Board dependent)</desc>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="80.5" cy="702" width="161" height="23.5"></v:textrect>		<rect x="0" y="690.25" width="161" height="23.5" rx="2" ry="2" class="st13"></rect>		<text x="34.93" y="705.3" class="st14" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>(Board dependent)</text>		</g>	<g id="shape1036-98" v:mid="1036" v:groupcontext="shape" transform="translate(674.5,-614)">		<title>Sheet.1036</title>		<desc>(Board independent)</desc>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="85.5" cy="702" width="171" height="23.5"></v:textrect>		<rect x="0" y="690.25" width="171" height="23.5" rx="2" ry="2" class="st13"></rect>		<text x="35.56" y="705.3" class="st14" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>(Board independent)</text>		</g>	<g id="shape1037-101" v:mid="1037" v:groupcontext="shape" transform="translate(-533.75,204.729) rotate(-90)">		<title>Sheet.1037</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M6.24 713.75 L6.6 713.75 L22.77 713.75" class="st15"></path>	</g>	<g id="shape1040-107" v:mid="1040" v:groupcontext="shape" transform="translate(-373.25,255.733) rotate(-90)">		<title>Sheet.1040</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M6.24 713.75 L6.6 713.75 L23.33 713.75" class="st15"></path>	</g>	<g id="shape1041-112" v:mid="1041" v:groupcontext="shape" transform="translate(-373.25,312.66) rotate(-90)">		<title>Sheet.1041</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M6.24 713.75 L6.6 713.75 L17.18 713.75" class="st15"></path>	</g>	<g id="shape1043-117" v:mid="1043" v:groupcontext="shape" transform="translate(-533.837,530.042) rotate(-89.9832)">		<title>Sheet.1043</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M6.24 713.75 L6.6 713.75 L298.2 713.75" class="st15"></path>	</g>	<g id="shape1045-122" v:mid="1045" v:groupcontext="shape" transform="translate(-153.747,532.178) rotate(-90.1547)">		<title>Sheet.1045</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M7.68 713.75 L8.04 713.75 L301 713.75" class="st17"></path>	</g>	<g id="shape1046-128" v:mid="1046" v:groupcontext="shape" transform="translate(46.25,600.75) rotate(-90)">		<title>Sheet.1046</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M7.68 713.75 L8.04 713.75 L371.5 713.75" class="st17"></path>	</g>	<g id="shape1047-133" v:mid="1047" v:groupcontext="shape" transform="translate(46.25,190.426) rotate(-90)">		<title>Sheet.1047</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M7.68 713.75 L8.04 713.75 L32.35 713.75" class="st17"></path>	</g>	<g id="shape1048-138" v:mid="1048" v:groupcontext="shape" transform="translate(-154.562,190.426) rotate(-90)">		<title>Sheet.1048</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M7.68 713.75 L8.04 713.75 L32.35 713.75" class="st17"></path>	</g>	<g id="shape1050-143" v:mid="1050" v:groupcontext="shape" transform="translate(882.873,572.059) rotate(90.1406)">		<title>Sheet.1050</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M7.68 713.75 L8.04 713.75 L50.94 713.75" class="st17"></path>	</g>	<g id="shape1054-148" v:mid="1054" v:groupcontext="shape" transform="translate(904.625,570.014) rotate(90)">		<title>Sheet.1054</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M7.68 713.75 L8.04 713.75 L41.29 713.75" class="st17"></path>	</g>	<g id="shape1060-153" v:mid="1060" v:groupcontext="shape" transform="translate(933.75,232.054) rotate(90)">		<title>Sheet.1060</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 713.75 L173.06 713.75" class="st3"></path>	</g>	<g id="shape1061-156" v:mid="1061" v:groupcontext="shape" v:layermember="0" transform="translate(220,-317.64)">		<title>Dynamic connector.1061</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 722.75 L0 729.75 L21.96 729.75" class="st19"></path>	</g>	<g id="shape1062-162" v:mid="1062" v:groupcontext="shape" transform="translate(258.523,-143.753)">		<title>Rectangle.1062</title>		<desc>qcs6490-addons-rb3gen2.dtb</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="81.9886" cy="693.877" width="163.98" height="39.7459"></v:textrect>		<rect x="0" y="674.004" width="163.977" height="39.7459" rx="2" ry="2" class="st11"></rect>		<text x="9.97" y="697.18" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-addons-rb3gen2.dtb</text>		</g>	<g id="shape1063-165" v:mid="1063" v:groupcontext="shape" transform="translate(-372.972,549.762) rotate(-91.5664)">		<title>Sheet.1063</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M6.24 713.75 L6.6 713.75 L18.71 713.75" class="st15"></path>	</g>	<g id="shape1057-170" v:mid="1057" v:groupcontext="shape" transform="translate(463,-36.5)">		<title>Sheet.1057</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<rect x="0" y="696.662" width="17.8" height="17.0878" rx="2" ry="2" class="st20"></rect>	</g>	<g id="shape1073-172" v:mid="1073" v:groupcontext="shape" transform="translate(-153.751,608.741) rotate(-89.9985)">		<title>Sheet.1073</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M6.24 713.75 L6.6 713.75 L38.76 713.75" class="st15"></path>	</g>	<g id="shape1074-177" v:mid="1074" v:groupcontext="shape" transform="translate(1054.26,569.997) rotate(90)">		<title>Sheet.1074</title>		<path d="M0 713.75 L31.21 713.75" class="st19"></path>	</g>	<g id="shape1079-182" v:mid="1079" v:groupcontext="shape" transform="translate(480.5,-38.1439)">		<title>Sheet.1079</title>		<desc>Upstream</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="30.75" cy="706.85" width="61.5" height="13.8"></v:textrect>		<rect x="0" y="699.95" width="61.5" height="13.8" class="st21"></rect>		<text x="4.71" y="710.45" class="st22" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Upstream</text>		</g>	<g id="shape1080-185" v:mid="1080" v:groupcontext="shape" transform="translate(553,-36.5)">		<title>Sheet.1080</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<rect x="0" y="696.662" width="17.8" height="17.0878" rx="2" ry="2" class="st23"></rect>	</g>	<g id="shape1081-187" v:mid="1081" v:groupcontext="shape" transform="translate(570.5,-38.1439)">		<title>Sheet.1081</title>		<desc>Open source</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="38.25" cy="706.85" width="76.5" height="13.8"></v:textrect>		<rect x="0" y="699.95" width="76.5" height="13.8" class="st21"></rect>		<text x="4.61" y="710.45" class="st22" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Open source</text>		</g>	<g id="shape1082-190" v:mid="1082" v:groupcontext="shape" transform="translate(654.852,-36.5)">		<title>Sheet.1082</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<rect x="0" y="696.662" width="17.8" height="17.0878" rx="2" ry="2" class="st24"></rect>	</g>	<g id="shape1083-192" v:mid="1083" v:groupcontext="shape" transform="translate(672.352,-38.1439)">		<title>Sheet.1083</title>		<desc>Downstream</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="38.25" cy="706.85" width="76.5" height="13.8"></v:textrect>		<rect x="0" y="699.95" width="76.5" height="13.8" class="st21"></rect>		<text x="4.29" y="710.45" class="st22" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Downstream</text>		</g>	<g id="shape1084-195" v:mid="1084" v:groupcontext="shape" transform="translate(760.602,-36.5)">		<title>Sheet.1084</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<rect x="0" y="696.662" width="17.8" height="17.0878" rx="2" ry="2" class="st25"></rect>	</g>	<g id="shape1085-197" v:mid="1085" v:groupcontext="shape" transform="translate(778.102,-38.1439)">		<title>Sheet.1085</title>		<desc>Build blobs</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="34.5" cy="706.85" width="69" height="13.8"></v:textrect>		<rect x="0" y="699.95" width="69" height="13.8" class="st21"></rect>		<text x="4.97" y="710.45" class="st22" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Build blobs</text>		</g></g>
</svg>

**Figure: Device tree overlay on QCS6490**

The build system uses an `fdt_overlay` tool to provision the
out-of-tree device tree overlay handling during the build.

The DTBO merge process supports merging the DTBO files listed in the
`meta-qcom-hwe/conf/machine/<SoC>-<board>-<variant>.conf` file.

The following is an example of how device tree variables are enumerated on QCS6490.
See the board-specific machine configuration file for platform-specific information.

# List of dtbs for corresponding supported qcs6490 platforms
    KERNEL_DEVICETREE = " \
                         qcom/<SoC>-addons-<Variant>.dtb \
                         "
    # Additional list of dtbos to be overlaid on top of base kernel devicetree files
    # Format - KERNEL_TECH_DTBOS[<base-dtb-name>] = "<dtbo1 <dtbo2> ..."
    # For example:
    
    KERNEL_TECH_DTBOS[qcs6490-addons-rb3gen2] = " \
    qcm6490-graphics.dtbo qcm6490-wlan-rb3.dtbo \
    qcm6490-display-rb3.dtbo qcm6490-bt.dtbo \
    qcm6490-video.dtbo qcm6490-wlan-upstream.dtbo \
    "
    Copy to clipboard

To update the DTB support in the kernel and select a DTB on boot, use the following procedure:

**DTB build support in kernel**

To integrate the device tree of a new platform into the kernel build, update the `Makefile`.

The following example shows customizing DTB for the QCS6490 SoC.
Replicate the following method to add new DTBs.

diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile
    index 183aeba47193..a7815c774f7c 100644
    --- a/arch/arm64/boot/dts/qcom/Makefile
    +++ b/arch/arm64/boot/dts/qcom/Makefile
    dtb-$(CONFIG_ARCH_QCOM)        += qcs6490-addons-rb3gen2.dtb
    +dtb-$(CONFIG_ARCH_QCOM)        += qcs6490-my-board.dtb
    dtb-$(CONFIG_ARCH_QCOM)        += qcs6490-rb3gen2.dtb
    dtb-$(CONFIG_ARCH_QCOM)        += qcs404-evb-1000.dtb
    Copy to clipboard

**DTB inclusion in machine configuration**

The Yocto machine configuration is also updated to include the corresponding device tree blob. For example, to add the device tree for QCS6490 machine support, use the following file:

`meta-qcom-hwe/conf/machine/qcs6490-rb3gen2-core-kit.conf`:

OUT_OF_KERNEL_DTSO - qcs6490-rb3gen2-core-kit.conf
    # List of dtbs for corresponding supported qcs6490 platforms
    KERNEL_DEVICETREE = " \
                         qcom/qcs6490-my-board.dtb   \
                         qcom/qcs6490-addons-rb3gen2.dtb \
                         qcom/qcs6490-my-board.dtb   \
                         "

    # Additional list of DTBOs to be overlaid on top of base kernel devicetree
    # See how existing boards are managing it in the following example:
    # Format - KERNEL_TECH_DTBOS[<base-dtb-name>] = "<dtbo1 <dtbo2> ..."
    
    KERNEL_TECH_DTBOS[qcs6490-addons-rb3gen2] = " \
    qcm6490-graphics.dtbo qcm6490-wlan-rb3.dtbo \
    qcm6490-display-rb3.dtbo qcm6490-bt.dtbo \
    qcm6490-video.dtbo qcm6490-wlan-upstream.dtbo \
    Copy to clipboard

Note

See machine configuration files in the `meta-qcom-hwe/conf/machine/*.conf` directory for different SoCs.
The DTB filename for the custom BSP variant contains `addons`.

**DTB selection on boot**

The custom DTB is packaged as a part of the UKI image that is updated in EFI to boot with the selected DTB.

Generate a UKI image using the ukify tool. The ukify tool is available as part of the Yocto build system in the
`tmp-glibc/sysroots-components/x86_64/systemd-boot-native/usr/bin/ukify` build directory.

To generate the UKI image, run the following:

# Note - ukify tool need python 3.10 version or above
    
       ukify build --efi-arch=aa64  \
                --stub=<build-path>/tmp-glibc/deploy/images/<SoC>/linuxaa64.efi.stub \
                --linux=<build-path>/tmp-glibc/deploy/images/<SoC>/Image \
                --initrd=<build-path>/tmp-glibc/deploy/images/<SoC>/initramfs-qcom-image-<SoC>.cpio.gz \
                --cmdline="console=ttyMSM0,115200n8 earlycon qcom_geni_serial.con_enabled=1 kernel.sched_pelt_multiplier=4 mem_sleep_default=s2idle" \
                --devicetree=<build-path>/tmp-glibc/deploy/images/<SoC>/<SoC>-my-board.dtb \
                --output=./uki.efi
    Copy to clipboard

The ukify build command generates the `uki.efi` image with a custom
board DTB.

To update the `uki.efi` image in the ESP partition, do the following:

# Following may need sudo privilege
    
    # Take the yocto build generated efi.bin and mount it locally
      mount <build-path>/tmp-glibc/deploy/images/<SoC>/efi.bin  /mnt --options rw
    
    # Overwrite the uki.efi with one packaged above
      cp uki.efi /mnt/EFI/Linux/uki.efi
      umount /mnt
    
    # now efi.bin carries packaged uki.efi which can be flashed to the target and booted
    # UEFI shall now pick the <SoC>-my-board.dtb that is part of uki.efi image
    
    # reboot into fastboot and flash efi.bin
      fastboot flash efi <build-path>/tmp-glibc/deploy/images/<SoC>/efi.bin
    Copy to clipboard

For more information about the device tree specification, see [The Devicetree Specification](https://www.devicetree.org/specifications/).

For the Linux kernel documentation for device tree, see [Linux and the Devicetree](https://docs.kernel.org/devicetree/usage-model.html).

**DTBO merge sequence**

The `merge_dtbos()` task in the `image-qcom-deploy.bbclass` class
merges DTBOs using the `fdt_overlay` tool.

The `merge_dtbos()` task iteration occurs in the following sequence:

1. DTBO filenames get listed in the configuration file.
2. DTBO filenames are iterated through the `KERNEL_DEVICETREE` variable.
3. For each base DTB, the DTBO merge task overlays the DTBOs listed in the
`KERNEL_TECH_DTBOS` variable.
4. After the overlay process is completed, the final DTB output is
generated.

## Compile the kernel independent of Yocto

Qualcomm Linux kernel can also be compiled without Yocto build system support.

**Prerequisites**

Provision the following dependencies to setup the kernel compilation process:

> 
> 
> - aarch64 toolchain
> - systemd-boot EFI stub to include it as a part of the UKI image
> - systemd ukify tool to package the kernel image, initramfs, and DTB into the UKI image
> - initramfs with UKI image
> - ESP image that carries the updated UKI and must be flashed to boot the device

These dependencies along with necessary tools have been provisioned with a
[docker](https://git.codelinaro.org/clo/la/kernel/qcom).  that can be used to develop kernel standalone.

**Setup docker**

git clone git@github.com:qualcomm-linux/kmake-image.git
    cd kmake-image
    docker build -t kmake-image .
    cd ..
    Copy to clipboard

**Setup aliases**

alias kmake-image-run='docker run -it --rm --user $(id -u):$(id -g) --workdir="$PWD" -v "$(dirname $PWD)":"$(dirname $PWD)" kmake-image'
    alias kmake='kmake-image-run make'
    Copy to clipboard

**Get the Linux kernel source**

Clone the Linux kernel source from the git repository hosted at
[CodeLinaro](https://git.codelinaro.org/clo/la/kernel/qcom).

To clone the repository and get the source code, run the following commands:

git clone https://git.codelinaro.org/clo/la/kernel/qcom kernel
    cd kernel
    git checkout <released sha>
    # e.g.
    git checkout origin/kernel.qclinux.1.0.r2-rel
    cd ..
    Copy to clipboard

**Get ramdisk**

You can use the custom initramfs. As a reference, you can get the initramfs for
arm64 hosted at [Linaro Snapshots site](https://snapshots.linaro.org/member-builds/qcomlt/testimages/arm64/latest/), using the following command:

mkdir artifacts
    wget https://snapshots.linaro.org/member-builds/qcomlt/testimages/arm64/latest/initramfs-test-image-qemuarm64-*.rootfs.cpio.gz -O artifacts/ramdisk.gz
    Copy to clipboard

**Get systemd-boot binaries**

wget -O artifacts/systemd-boot-efi.deb http://ports.ubuntu.com/pool/universe/s/systemd/systemd-boot-efi_255.4-1ubuntu8_arm64.deb
    dpkg-deb -xv artifacts/systemd-boot-efi.deb artifacts/systemd
    Copy to clipboard

**Build kernel**

One can use `arch/arm64/configs/qcom_defconfig` to configure kernel and build using below instructions:

cd kernel
    kmake O=../kobj qcom_defconfig
    kmake O=../kobj -j$(nproc)
    kmake O=../kobj -j$(nproc) dir-pkg INSTALL_MOD_STRIP=1
    Copy to clipboard

**Package DLKMs into ramdisk**

(cd ../kobj/tar-install ; find lib/modules | cpio -o -H newc -R +0:+0 | gzip -9 >> ../../artifacts/ramdisk.gz)
    Copy to clipboard

**Generate efi.bin for boot/ESP partition**

cd ..
    kmake-image-run generate_boot_bins.sh efi --ramdisk artifacts/ramdisk.gz \
       --systemd-boot artifacts/systemd/usr/lib/systemd/boot/efi/systemd-bootaa64.efi \
       --stub artifacts/systemd/usr/lib/systemd/boot/efi/linuxaa64.efi.stub \
       --linux kobj/arch/arm64/boot/Image \
       --cmdline "${CMDLINE}" \
       --output images
    Copy to clipboard

**Generate dtb.bin for targets supporting devicetree**

kmake-image-run generate_boot_bins.sh dtb --input kobj/arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dtb \
    --output images
    Copy to clipboard

The resulting **efi.bin** and **dtb.bin** are gathered in images directory and are ready to be booted on a QCS6490 RB3Gen2.

**Flash the binaries and Boot**

fastboot flash efi images/efi.bin
    fastboot flash dtb_a images/dtb.bin
    fastboot reboot
    Copy to clipboard

For more information about how to flash the EFI image and reboot, see [Bring up the device](https://docs.qualcomm.com/doc/80-70023-3/topic/getting_started_chapter2.html#flash-images-and-boot).

Note

To build additional out-of-tree kernel modules, rely on the full Yocto build mechanism.

## Next steps

- To debug the kernel issues, see [Configure debug methods](https://docs.qualcomm.com/doc/80-70023-3/topic/debug.html#debug).

Last Published: Dec 26, 2025

[Previous Topic
Configure the postboot settings](https://docs.qualcomm.com/bundle/publicresource/80-70023-3/topics/post-boot-settings.md) [Next Topic
Configure the remoteprocessor (remoteproc) subsystems](https://docs.qualcomm.com/bundle/publicresource/80-70023-3/topics/remoteproc-overview.md)