# Features

Source: [https://docs.qualcomm.com/doc/80-70014-3/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3/topic/features.html)

The Qualcomm Linux kernel offers various features to run an upstream Linux kernel on
        Qualcomm devices.

Here are some key features and advancements related to running the mainline Linux kernel
            on the Qualcomm platforms:

- Qualcomm Linux BSP tailored to support devices using Qualcomm chipsets.
- Device tree corresponds to Qualcomm development kits.
- Multiple different build configurations to facilitate the use of Qualcomm
                chipsets.
- The Linux kernel integrated to the Yocto build system.
- The Qualcomm Linux kernel is aligned to kernel community standards. Qualcomm
                specific additions are maintained separately.
- Support to configure, customize, and kernel build images that can be flashed and
                booted on devices using Qualcomm chipsets.
- The Qualcomm Linux kernel is part of an EFI image, using the Qualcomm unified
                extensible firmware interface (UEFI) and standard systemd-boot boot manager.
- Downstream Qualcomm infrastructure supports are maintained to provision custom use
                cases like RAM dump and secure use cases.
- Compatible with standard Linux kernel debug methods using tracing and Ram dump.
- Virtualization support for untrusted virtual machines using the Gunyah™ Hypervisor
                Software.
- Periodic long-term support (LTS) merges from the corresponding LTS kernel branch to
                get the latest security and stability fixes.

## Boot

Source: [https://docs.qualcomm.com/doc/80-70014-3/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3/topic/features.html)

Qualcomm Linux supports systemd-boot as the UEFI boot manager to load and boot the
        Linux kernel. The Linux kernel in this case is built as an EFI stub.

### Boot flow and architecture

Cold boot begins the execution from the primary boot loader (PBL) that sets up the
                initial system for the eXtensible boot loader (XBL). The XBL performs wider system
                initialization including DDR initialization and loads a UEFI image. UEFI provides a
                rich firmware interface that loads system-boot as a boot manager on Qualcomm Linux
                to manage the OS images.

For more information on complete cold boot flow, see [Cold boot architecture](https://docs.qualcomm.com/bundle/publicresource/topics/80-70014-4/bootloader-architecture.html) in the [Qualcomm Linux Boot Guide](bundle/publicresource/topics/80-70014-4).

### Systemd-boot

Systemd-boot is a UEFI boot manager that executes EFI images, provides boot entries,
                and supports unified kernel images. Systemd-boot supports the following:

- Boot entries: The type 1 boot loader specification entries are in the
                        `loader/entries/` directory on the ESP. These files describe
                    Linux kernel images with the associated initrd images, and other EFI
                    executables.
- Unified kernel images (UKI): The type 2 type 2 boot loader specification EFI
                    unified kernel images are executable EFI binaries in the
                        `/EFI/Linux/` directory on the ESP.
    For information on the
                        boot entries and unified kernel images, see [BootLoader Specification](https://uapi-group.org/specifications/specs/boot_loader_specification).

Systemd-boot is a part of the systemd package that is a part of the meta Yocto layer.
                The Yocto recipe builds systemd-boot using the
                    `systemd-boot_254.4.bb` recipe file, and the
                    `uki.bbclass` recipe file handles the ESP image generation.

For more information on systemd-boot, see [systemd-boot](https://docs.qualcomm.com/bundle/publicresource/topics/80-70014-27/platform_software_features.html#sub$systemd_boot).

### Linux kernel as EFI stub

The EFI boot stub enables booting the Linux kernel directly without a conventional
                EFI boot loader.

The boot firmware can load the EFI image as an executable file when the Linux kernel
                is compiled with the `CONFIG_EFI_STUB` kernel configuration option.
                In this case, the firmware loader jumps to the `EFI boot stub`
                location in the EFI image `drivers/firmware/efi/libstub/`, which then
                boots the kernel.

For Arm® (Arm64), where there is no compressed kernel support, the kernel image acts
                as a portable executable (PE) file format or common object file format (COFF) image
                and the EFI stub is linked into the kernel.

For more information on booting the Linux kernel as an EFI image, see [The EFI Boot Stub](https://docs.kernel.org/admin-guide/efi-stub.html).

### Boot images and ESP/boot partition

The ESP serves as a storage location for `efi.bin` image that packages
                systemd-boot, UKI, and DTBs. The UKI includes kernel image, initramfs, and kernel
                command line arguments.

The UEFI firmware launches the UEFI boot loader and loads the kernel boot images. The
                ESP is formatted with the file allocation table (FAT) file system supported in the
                UEFI specification. For more information on UKI image format and corresponding
                support in base meta layers, see [systemd-boot](https://docs.qualcomm.com/bundle/publicresource/topics/80-70014-27/platform_software_features.html#sub$systemd_boot).

### DTB selection

All the device tree blobs are packaged as part of `efi.bin`. UEFI
                selects and loads the right DTB for the Linux kernel.

To pack the DTB for boot time selection, see [Platform support](https://docs.qualcomm.com/doc/80-70014-3/topic/customize.html#platform-support_0).

## Platform support

Source: [https://docs.qualcomm.com/doc/80-70014-3/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3/topic/features.html)

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

### QCM6490 device tree

Source: [https://docs.qualcomm.com/doc/80-70014-3/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3/topic/features.html)

Qualcomm Linux supports a device tree overlay feature that supports the maintenance
        and merging of out-of-device tree blobs with the baseline device tree blobs.

QCM6490 system-on-chip (SoC) device tree support is in the kernel source in the
                `arch/arm64/boot/dts/qcom` directory.

[Table :  4. Qualcomm device tree source](https://docs.qualcomm.com/doc/80-70014-3/topic/getting_started_chapter2.html#platform_device_tree__table_g34_hmd_l1c_barnchak_02-15-24-1354-23-238) lists how the device tree maintains a clear separation to contain downstream
            additions provisioning the upstream aligned base distinctly:

There is downstream content that is hosted outside the kernel source. The out-of-tree
            drivers also 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 the boot images.

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

Figure : Device tree overlay
                
                ![](data:image/png;base64,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)

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

The DTBO merge supports merging the DTBO files listed in the
                `meta-qcom-hwe/conf/machine/qcm6490.conf` file.

The device tree variables are enumerated as
            follows:

    # List of dtbs for corresponding supported qcm6490 platforms
    KERNEL_DEVICETREE = " \ 
                          qcom/qcs6490-addons-rb3gen2.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-rb3gen2.dtbo qcm6490-display-rb3gen2.dtbo qcm6490-bt.dtbo"Copy to clipboard

**DTBO merge sequence**

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

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

1. The task starts with the DTBO filenames listed in the configuration file.
2. It then iterates through the `KERNEL_DEVICETREE` variable.
3. For each base DTB, it overlays the DTBOs listed in the
                    `KERNEL_TECH_DTBOS` variable.
4. After the overlay process is completed, the final DTB output is generated.

### Kernel configurations

Source: [https://docs.qualcomm.com/doc/80-70014-3/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3/topic/features.html)

The kernel recipe `linux-kernel-qcom_6.6.bb` uses the following
        configuration fragments to build the images.

    KERNEL_DEFCONFIG = "${S}/arch/arm64/configs/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)}"Copy to clipboard

Use the following commands to generate the debug build using debug configuration
            fragments:

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

For more information on different configuration fragments, see [Getting Started](https://docs.qualcomm.com/doc/80-70014-3/topic/getting_started_chapter2.html).

## Remoteproc subsystem

Source: [https://docs.qualcomm.com/doc/80-70014-3/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3/topic/features.html)

Remoteproc framework is used to load firmware into other subsystems such as the audio
    digital signal processor (aDSP) and compute digital signal processor (cDSP) on Qualcomm
    platforms.

The remoteproc framework is divided into two parts– a core framework and remoteproc drivers.
      The core framework contains common logic and the drivers contain platform-specific operations
      to manage the corresponding cores. A remoteproc driver registers a remoteproc instance and a
      set of operations with the core framework. The core framework loads the firmware and starts or
      stops the remote processor.

There are several heterogeneous remote processors present on an SoC in an asymmetric
      multiprocessing (ASMP) configuration. The remote processors run different instances of
      firmware (or OS).

For more information on the standard framework that Qualcomm Linux uses to manage other
      cores, see [Remote Processor Framework](https://www.kernel.org/doc/html/next/staging/remoteproc.html).

###  Qualcomm remoteproc support

Source: [https://docs.qualcomm.com/doc/80-70014-3/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3/topic/features.html)

Qualcomm has enhanced the remoteproc framework for peripheral firmware authentication
        using the upstream peripheral authentication service (PAS) driver.

Remoteproc driver in the Qualcomm Linux implements a peripheral authentication service
            (PAS) driver, which is a TrustZone based peripheral image loader for remote processors
            on Qualcomm SoC devices.

For more information, see[qcom_q6v5_pas.c](https://github.com/torvalds/linux/blob/master/drivers/remoteproc/qcom_q6v5_pas.c).

The remote processors are used to manage the lifecycle of various co-processors, such as
            aDSP, cDSP, modem peripheral subsystem (MPSS), and wireless processor subsystem (WPSS).
            The following is the list of supported co-processors on QCM6490-based boards:

- RB3 Gen 2: aDSP, cDSP, and WPSS

**User interface:** The remoteproc framework tracks registered remoteproc devices and
            provides a user interface to boot and shutdown the devices. User space can query and
            change the current state of a remoteproc using the following `sysfs`
            interface:

    remoteproc user space interface
    # start remoteproc:
    $ echo "start" > /sys/class/remoteproc/remoteprocN/state
     
    # stop remoteproc:
    $ echo "stop" > /sys/class/remoteproc/remoteprocN/stateCopy to clipboard

Figure : Remoteproc support
            
            ![](data:image/png;base64,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)

### Remoteproc recovery and subsystem restart

Source: [https://docs.qualcomm.com/doc/80-70014-3/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3/topic/features.html)

The remoteproc subdevices manage communication contexts for remote processor
        subsystem crash and recovery scenarios.

Entities such as communication contexts must determine when a remote processor is started
            or shut down. Each subdevice has two operations,
- `probe()` called after the remoteproc
                    `start()`
- `remove()` called before `stop()`

When a fatal error occurs on a remote processor, the remoteproc driver handles it
            and invokes `rproc_report_crash()`, which triggers recovery of the faulty
            remote processor.

The recovery handler does the following:

Figure : Remoteproc crash sequence
            
            ![](data:image/png;base64,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)

To enable and disable recovery using the recovery `debugfs` node from the
            user space:

    # remoteproc user space interface
    # Disable SSR:
    # echo disabled > /sys/kernel/debug/remoteproc/remoteprocN/recoveryCopy to clipboard

### Coredump

Source: [https://docs.qualcomm.com/doc/80-70014-3/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3/topic/features.html)

Remote processor coredumps are supported for debugging the subsystem crash issues
        using the Linux kernel devcoredump feature.

When a subsystem crash happens, the devcoredump exposes a snapshot of the memory of
            recovering remoteproc in the `/sys/class/devcoredump/devcdN/data` node,
            and an associated crash `uevent` is sent to the user space. When the
            sysfs node is read, it provides the segments in an ELF container, and a write frees up
            the resources and destroys the devcoredump instance.

A debugfs node is exposed to enable and disable coredump from the user space.

    # Disable coredumps:
    $ echo disabled > /sys/kernel/debug/remoteproc/remoteprocN/coredumpCopy to clipboard

Note: QCM6490 platform implements kernel panic on remoteproc crash
                (fatal error on remote processor) to collect the full RAM dump for crash analysis
                and further debug. The kernel panic is enabled only when the coredump is
                disabled.

###  Remoteproc configuration and firmware

Source: [https://docs.qualcomm.com/doc/80-70014-3/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3/topic/features.html)

The remoteproc devices are configured in the respective device tree files using DT
            bindings. The configuration includes compatible device names, memory regions, interrupt
            settings, and clock references according to the DT bindings in the
                `Documentation/devicetree/bindings/remoteproc/` directory.

The following example shows the QCM6490 aDSP remoteproc device tree configuration in the
                `arch/arm64/boot/dts/qcom/qcm6490.dtsi`
            file:

          remoteproc_adsp: remoteproc@3000000 {
                    compatible = "qcom,sc7280-adsp-pas";
                    reg = <0x0 0x03000000 0x0 0x100>;
     
                    interrupts-extended = <&pdc 6 IRQ_TYPE_EDGE_RISING>,
                                            <&adsp_smp2p_in 0 IRQ_TYPE_EDGE_RISING>,
                                            <&adsp_smp2p_in 1 IRQ_TYPE_EDGE_RISING>,
                                            <&adsp_smp2p_in 2 IRQ_TYPE_EDGE_RISING>,
                                            <&adsp_smp2p_in 3 IRQ_TYPE_EDGE_RISING>,
                                            <&adsp_smp2p_in 7 IRQ_TYPE_EDGE_RISING>;
                    interrupt-names = "wdog", "fatal", "ready", "handover",
                                    "stop-ack", "shutdown-ack";
     
                    clocks = <&rpmhcc RPMH_CXO_CLK>;
                    clock-names = "xo";
                    <snip>
           };Copy to clipboard

All firmware files are present in the `/lib/firmware` directory in
                `rootfs` and the related configurations are done in the corresponding
            board device tree `arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts` file.

The following example shows the remoteproc DT
            configuration:

          &remoteproc_adsp {
            firmware-name = "qcom/qcm6490/adsp.mdt";
            status = "okay";
           };Copy to clipboard

### Sample logs

The following log is displayed when a remoteproc boots
                successfully:

    # remoteproc success
    "remoteproc remoteproc1: remote processor 4080000.remoteproc is now up"Copy to clipboard

The following log is displayed when a remoteproc firmware load fails:

    # remoteproc failure
    Error log: "remoteproc remoteproc0: Direct firmware load for qcom/qcm6490/modem.mdt failed with error -2"
     
    # Caused by: error loading firmware.
    # Solution: ensure that the modem firmware is copied to /lib/firmware/qcom/qcm6490 in rootfs.Copy to clipboard

## Memory

Source: [https://docs.qualcomm.com/doc/80-70014-3/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3/topic/features.html)

Qualcomm Linux kernel baseline supports all memory management features and
        allocators. The following information outlines customizing the memory map and performing
        heap management.

For more information on Linux kernel memory management, see [Memory management](https://www.kernel.org/doc/html/next/core-api/index.html#memory-management).

### Platform memory map

Platform memory map describes the areas that are reserved for subsystems, such as
                modem, camera, aDSP, and cDSP during kernel boot.

The memory map sets `no-map` for the carved out regions in the DTSI
                making them inaccessible to the kernel.

Carved out regions are configurable and are defined in the
                    `arch/arm64/boot/dts/qcom/qcm6490.dtsi` DTSI file in the
                    `reserved-memory` node.

    reserved-memory {
                    cdsp_secure_heap_mem: cdsp-secure-heap@81800000 {
                            reg = <0x0 0x81800000 0x0 0x1e00000>;
                            no-map;
                    };
     
                    camera_mem: camera@84300000 {
                            reg = <0x0 0x84300000 0x0 0x500000>;
                            no-map;
                    };
     
                    wpss_mem: wpss@0x84800000 {
                            reg = <0x0 0x84800000 0x0 0x1900000>;
                            no-map;
                    };
     
                    adsp_mem: adsp@86100000 {
                            reg = <0x0 0x86100000 0x0 0x2800000>;
                            no-map;
                    };
    };Copy to clipboard

The following early boot log shows carved out region creation for different
                subsystems:

    [    0.000000] OF: reserved mem: 0x0000000081800000..0x00000000835fffff (30720 KiB) nomap non-reusable cdsp-secure-heap@81800000
    [    0.000000] OF: reserved mem: 0x0000000084300000..0x00000000847fffff (5120 KiB) nomap non-reusable camera@84300000
    [    0.000000] OF: reserved mem: 0x0000000084800000..0x00000000860fffff (25600 KiB) nomap non-reusable wpss@0x84800000
    [    0.000000] OF: reserved mem: 0x0000000086100000..0x00000000888fffff (40960 KiB) nomap non-reusable adsp@86100000Copy to clipboard

### Contiguous memory allocator (CMA)

Qualcomm Linux distribution supports CMA to allocate large physically contiguous
                memory. CMA reserves a large physically contiguous memory area at boot time and
                provides physically continuous memory to CMA allocation. When not in use, CMA memory
                is available to the kernel buddy allocator for movable allocations.

To modify the size of the default CMA region, you can pass
                    `cma=size_in_MB` in the kernel command line arguments. For more
                information on how to use the kernel parameter, see the following
                example:

    cma=nn[MG]@[start[MG][-end[MG]]]
                            [KNL,CMA]
                            Sets the size of kernel global memory area for
                            contiguous memory allocations and optionally the
                            placement constraint by the physical address range of
                            memory allocations. A value of 0 disables CMA
                            altogether. For more information, see
                            kernel/dma/contiguous.cCopy to clipboard

The custom CMA regions are defined under the `reserved-memory` node
                with a `shared-dma-pool` compatible tag indicating the CMA region:

    adsp_heap_mem: adsp-heap {
                            compatible = "shared-dma-pool";
                            alloc-ranges = <0x0 0x00000000 0x0 0xffffffff>;
                            reusable;
                            alignment = <0x0 0x400000>;
                            size = <0x0 0xc00000>;
                    };Copy to clipboard

The following is the sample log for an aDSP CMA memory region reserved on
                boot:

    [    0.000000] OF: reserved mem: initialized node adsp-heap, compatible id shared-dma-pool
    [    0.000000] OF: reserved mem: 0x00000000ff000000..0x00000000ffbfffff (12288 KiB) map reusable adsp-heapCopy to clipboard

### DMA-BUF heaps

DMA-BUF heaps are supported on the Qualcomm Linux distribution to allocate custom CMA
                heaps. With DMA-BUF heaps, a device file is present for each heap in the
                    `/dev/dma_heap` file system. Apart from the system heap and the
                common CMA reserved heap, you can create your own CMA-type DMA-BUF heaps.

### Supported heaps

The following table lists the heaps supported by default on the Qualcomm Linux
                distribution:

| Heap name | Dev node | Description | Usage |
| --- | --- | --- | --- |
| System | /dev/dma_heap/systemCopy to clipboard | The kernel creates the default DMA-BUF heap. | All generic use cases should follow the system heap that uses the<br>                                    common Linux memory management buddy allocator underneath. |
| Reserved | /dev/dma_heap/reservedCopy to clipboard | The default CMA-type heap created in the system, uses the default<br>                                    **reserved** CMA region. | If you need contiguous memory due to any constraints, use the CMA<br>                                heap. |
| Custom CMA heaps | /dev/dma_heap/my_cma_heapCopy to clipboard | User-defined CMA-type heaps. | If you want to create your own CMA-type heap for specific use<br>                                cases. |

### To use DMA-BUF heaps

Here is a sample program that demonstrates how to use the DMA-BUF system heap created
                by the Linux kernel in
                `/dev/dma_heap/system:`

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <fcntl.h> 
    #include <sys/ioctl.h> 
    #include <linux/dma-buf.h>
     
    #define DMA_HEAP_NAME "system" int main()
    {
    int fd, dma_buf_fd;
    struct dma_heap_export_info exp_info = {
    .heap_name = DMA_HEAP_NAME,
    .flags = 0,
    };
    struct dma_buf_sync sync_start = {
    .flags = DMA_BUF_SYNC_START,
    };
    struct dma_buf_sync sync_end = {
    .flags = DMA_BUF_SYNC_END,
    };
    
    fd = open("/dev/dma_heap/system", O_RDWR); if (fd < 0) {
    perror("open");return -errno;
    }
    
    dma_buf_fd = ioctl(fd, DMA_HEAP_IOCTL_ALLOC, &exp_info); if (dma_buf_fd < 0) {
    perror("ioctl");return -errno;
    }
    printf("Allocated DMA buffer with fd %d\n", dma_buf_fd); if (ioctl(dma_buf_fd, DMA_BUF_IOCTL_SYNC, &sync_start)) {
    perror("ioctl DMA_BUF_IOCTL_SYNC start"); return -errno;
    }
    
    // Do something with the buffer here
    
    if (ioctl(dma_buf_fd, DMA_BUF_IOCTL_SYNC, &sync_end)) { perror("ioctl DMA_BUF_IOCTL_SYNC end");
    return -errno;}
    re
    if (close(dma_buf_fd)) { perror("close"); return -errno;
    }
    
    if (close(fd)) {

    perror("close"); return -errno;
    }
    
    return 0;
    }
    Copy to clipboard

## Scheduler

Source: [https://docs.qualcomm.com/doc/80-70014-3/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3/topic/features.html)

The scheduler decides the order in which the processes must run. The scheduler runs
        the processes available in the runqueue of each CPU.

The kernel baseline supports the standard Linux scheduler solution. The kernel uses [Energy Aware Scheduling (EAS)](https://www.kernel.org/doc/html/next/scheduler/sched-energy.html) to choose the
            right CPU for task placement based on the CPU energy consumption.

EAS overrides the CFS task wake-up balancing code. It uses the energy model (EM) of the
            platform and the per entity load tracking (PELT) signals to choose an energy-efficient
            target CPU during wake-up balance in a system with asymmetric CPU topology.

For basic scheduler documentation, see [Scheduler](https://www.kernel.org/doc/html/next/scheduler/index.html).

### CPU topology and EAS

Source: [https://docs.qualcomm.com/doc/80-70014-3/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3/topic/features.html)

The Qualcomm SoC platforms have a heterogeneous CPU topology that is differentiated
        in terms of CPU capacity metrics used in EAS.

EAS uses the concept of 'capacity' to differentiate CPUs with different computing
            capabilities. The capacity of a CPU represents the amount of work that it finishes when
            running at its highest frequency compared to the most capable CPU of the system.
            Capacity values are normalized in a 1024 range (the most powerful CPU/cluster is
            configured at 1024).

EAS builds the capacity of a cluster based on the dhrystone million instructions per
            second (DMIPS) value specified in the CPU node and the maximum frequency supported by
            the cluster.

The following are the `sysfs` nodes for CPU topology and capacity:

Table : CPU topology and capacity

| Commands | Purpose |
| --- | --- |
| cat /sys/devices/system/cpu/cpu*/cpu_capacityCopy to clipboard | To get the capacity associated with each CPU in the system. |
| cat /sys/devices/system/cpu/cpufreq/policy*/related_cpusCopy to clipboard | To get a list of the CPUs associated with each cluster in the<br>                            system. |

For more information on how a scheduler uses CPU capacity, see [Capacity Aware Scheduling](https://www.kernel.org/doc/html/next/scheduler/sched-capacity.html).

### Per entity load tracking

Source: [https://docs.qualcomm.com/doc/80-70014-3/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3/topic/features.html)

Per entity load tracking (PELT) is the load tracking mechanism to track load
        accounting for `sched_entities/groups/runqueues`.

PELT clock multiplier can be tuned to meet power and performance requirements.

The command line parameter `sched_pelt_multiplier` allows you to set a
            clock multiplier. The clock multiplier tunes the PELT ramp up/down speed to tune the
            system for the power and performance.

With lower half-life time, the CPU utilization of tasks is accumulated faster, and the
            tasks are placed on performance CPUs, leading to better performance with high power
            consumption. The CPU utilization also gets accumulated to select the higher CPU
            frequency within less time.

Note: The half-life also affects how the task utilization ramps
                down. UTIL EST feature provides faster ramp down.

For more information on PELT, see [Per-entity load tracking](https://lwn.net/Articles/531853/).

### SchedUtil governor

Source: [https://docs.qualcomm.com/doc/80-70014-3/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3/topic/features.html)

The SchedUtil CPU frequency governor is the default governor in Qualcomm platforms.
        SchedUtil predicts optimal operating points (OPPs) based on the CPU utilization, maintaining
        coherence between frequency requests and energy predictions.

The SchedUtil CPU frequency governor is tied to EAS and it tries to predict at which OPP
            all the CPUs run in the near future to estimate their energy consumption.

For more information on SchedUtil, see [Schedutil](https://www.kernel.org/doc/html/next/scheduler/schedutil.html).

### Utilization clamping (UCLAMP)

Source: [https://docs.qualcomm.com/doc/80-70014-3/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3/topic/features.html)

The UCLAMP allows performance management of tasks/task groups from the user
        space.

UCLAMP allows task or task group placement and performance hints or constraints. This
            mechanism is used to influence the scheduler placement decisions or to influence the
            frequency guidance of the cluster.

For more information on UCLAMP, see [UCLAMP](https://www.kernel.org/doc/html/next/scheduler/sched-util-clamp.html).

## Dynamic voltage and frequency scaling (DVFS)

Qualcomm kernel baseline supports several DVFS implementations to manage frequency
        scaling in a dynamic way corresponding to the system requirement.

### CPU DVFS

Source: [https://docs.qualcomm.com/doc/80-70014-3/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3/topic/features.html)

You can select a governor to tune the system for power or performance while changing the
                `CPUfreq` governor (`powersave/performace/schedutil`).
            By default, CPU frequency governor is set to `performance` on Qualcomm
            Linux platforms.

Table : CPU DVFS variables

| Variable | Description | Path |
| --- | --- | --- |
| scaling_governorCopy to clipboard | Set the governor to performance. | echo performance > /sys/devices/system/cpu/cpufreq/policy*/scaling_governorCopy to clipboard |
| scaling_max_freqCopy to clipboard | Set the maximum frequency of the CPU cluster. | /sys/devices/system/cpu/cpufreq/policy*/scaling_min_freq or scaling_max_freq tunableCopy to clipboard |
| scaling_min_freqCopy to clipboard | Set the minimum frequency of the CPU cluster. | /sys/devices/system/cpu/cpufreq/policy*/scaling_min_freq or scaling_min_freq tunableCopy to clipboard |

For more information on the `CPUfreq`, see [https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt](https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt).

### Cache and memory DVFS

Source: [https://docs.qualcomm.com/doc/80-70014-3/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3/topic/features.html)

The static map DVFS governors aligns the CPU operating frequencies with cache or
        memory frequencies for level 3 cache (L3), last level cache controller (LLCC), and DDR RAM.

If CPU frequency is at maximum, either by setting the CPU frequency governor to
            performance, or due to load in the system, then the L3, LLCC, and DDR also run at
            maximum frequency.

The driver for this governor is present in the
                `drivers/cpufreq/qcom-cpufreq-hw.c` file, and static mapping is
            present in the `arch/arm64/boot/dts/qcom/sc7280.dtsi` file.

The other bandwidth monitor (BWMON) governor is used to vote for LLCC and DDR
            frequencies, based on measured traffic between CPU to LLCC and CPU to DDR. The driver
            for this governor is in the `drivers/soc/qcom/icc-bwmon.c` file.

## Virtualization

Source: [https://docs.qualcomm.com/doc/80-70014-3/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3/topic/features.html)

Virtualization uses software to create an abstraction layer over computer
        hardware.

The abstraction layer allows the hardware elements of a single computer, such as
            processor, memory, and storage to be divided into multiple virtual computers, called as
            virtual machines (VMs). Each VM runs its own operating system (OS) and behaves like an
            independent computer, though it is running on the same underlying computer hardware.

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

### Qualcomm virtualization solution

Source: [https://docs.qualcomm.com/doc/80-70014-3/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3/topic/features.html)

Qualcomm uses Gunyah, a type-1 hypervisor designed for strong security, high
        performance, OS independence, and higher CPU privilege level.

Gunyah does not depend on any lower-privileged OS kernel or code for its core
            functionality to offer increased security. Gunyah is designed for isolated virtual
            machine use cases, and to support launching isolated virtual machines from a relatively
            less trusted host virtual machine.

The following image shows the Qualcomm virtualization solution architecture:

Figure : Qualcomm virtualization solution architecture
                
                ![](data:image/png;base64,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)

Gunyah provides the following features:

Table : Features of Gunyah

| Features | Description |
| --- | --- |
| Threads and scheduling | Scheduler schedules virtual CPUs (VCPUs) on physical CPUs and enables<br>                            time-sharing of the CPUs. |
| Memory management | Gunyah tracks memory ownership and memory usage under its control.<br>                            Gunyah provides low-level dynamic memory management APIs on top of which<br>                            the higher-level donation, lending, and sharing is built. |
| Interrupt virtualization | Gunyah manages interrupts that are routed directly to the assigned<br>                            VM. |
| Inter-VM communication | There are several different mechanisms, such as message queue and<br>                            doorbell, provided for communication between the VMs. |
| Device virtualization | Para-virtualization of devices is supported using inter-VM<br>                            communication and virtio primitives. The hardware virtualization and<br>                            emulation support low-level architecture features and devices, such as<br>                            CPU timers and interrupt controllers. |
| Resource manager | Gunyah supports a root VM that initially owns all the VM memory and<br>                            input/output resources. The Gunyah resource manager is the<br>                            default-bundled root VM and provides high-level services including<br>                            dynamic VM management, secure memory donation, lending, and<br>                            sharing. |

The Gunyah hypervisor support is added to the [crosvm](https://chromium.googlesource.com/chromiumos/platform/crosvm) virtual memory monitor (VMM). The crosvm interacts
            with the Gunyah VM manager in the kernel through ` /dev/gunyah` interface
            and creates a VM.

The following image shows the blocks in the Qualcomm virtualization solution:

Figure : Qualcomm virtualization solution
                
                ![](data:image/png;base64,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)

For more information on type 1 hypervisor, see [gunyah-hypervisor](https://github.com/quic/gunyah-hypervisor).

### Guest VM build support

Source: [https://docs.qualcomm.com/doc/80-70014-3/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3/topic/features.html)

Use the following procedure to compile the guest VM kernel and initrd
        images.

During the guest VM kernel compilation, both the guest kernel and the minimal
                        `rootfs` are built. The `qcom_vm_defconfig`
                    serves as the base configuration for compiling the guest kernel. The `
                        qcom_vm_debug.config` build debug variants of the guest
                    VM.

The `crosvm` serves as the VMM and interacts with the
                    Gunyah VM manager in the kernel through the `/dev/gunyah`
                    interface to create the virtual machines (VMs).

**Build a guest                    VM**
For more information on `crosvm` support, see [Secondary virtual machine](https://docs.qualcomm.com/bundle/publicresource/topics/80-70014-27/platform_software_features.html#sub$secondary_virtual_machine).

After
                    the build process completes, certain images are generated. These images get
                    stored in the
                        `<workspace>/build-qcom-wayland/tmp-glibc/deploy/images/qcm6490/qcom-console-image`
                    directory.

Use the following command to compile the guest
                        VM:

    $ export SHELL=/bin/bash && MACHINE=qcm6490 DISTRO=qcom-wayland source setup-environment
    
    $ bitbake qcom-console-imageCopy to clipboard

**Guest VM initrd                    image**

- The `svm-initramfs-qcom-image-qcm6490.cpio.gz` file is
                        created for the guest VM. This image contains an initrd image, used during
                        the boot process.
- The `svm-initramfs-qcom-image-qcm6490.cpio.gz` file is
                        generated in the
                            `build-qcom-wayland/tmp-glibc/deploy/images/qcm6490/svm-initramfs-qcom-image`
                        directory.
- On the booted device, the image is stored in the
                                `/var/gunyah/initrd.img` file within the system
                            rootfs.

**Guest VM kernel image**

- `svm-initramfs-qcom-image-qcm6490.cpio.gz` image is generated
                        for the secondary virtual machine (SVM), which is the Guest kernel image.
- The SVM kernel image is generated in the `
                            build-qcom-wayland/tmp-glibc/deploy/images/qcm6490/linux-svm-kernel-qcom`
                        directory.
- On the booted device, the image is in a `/var/gunyah/Image`
                        file within the system rootfs.

Both the `initrd.img` and the SVM kernel images are packed in
                    the `system.img` file. The final `system.img` file
                    is found in the same directory as the other images
                        `<workspace>/build-qcom-wayland/tmp-glibc/deploy/images/qcm6490/qcom-console-image`.

### Launch guest virtual machine

Source: [https://docs.qualcomm.com/doc/80-70014-3/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3/topic/features.html)

Use `crosvm` VMM and the Gunyah hypervisor to launch the guest virtual
        machines.

Use the following command to launch the VM:

    # /usr/bin/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 \
                                                --initrd /var/gunyah/initrd.img --no-balloon --no-rng \
                                                --params "rw root=/dev/ram earlyprintk=serial panic=0" \
                                                /var/gunyah/ImageCopy to clipboard

The following are the supported parameters for the `crosvm` command to
            launch guest VMs.

Table : Supported parameters

| Parameters | Description |
| --- | --- |
| /usr/bin/crosvmCopy to clipboard | Shows the path of the `crosvm` binary. |
| --log-level=debugCopy to clipboard | Sets the logging level to debug while running `<br>                                crosvm`. |
| --no-syslogCopy to clipboard | Disables syslog. |
| --disable-sandboxCopy to clipboard | Disables sandboxing. |
| --hypervisor gunyahCopy to clipboard | Specifies the hypervisor to be used (in this case,<br>                                `gunyah`). |
| --protected-vm-without-firmwareCopy to clipboard | Indicates that the VM is protected and does not require<br>                            firmware. |
| --serial=...Copy to clipboard | Configures serial devices for input/output. |
| --initrd /var/gunyah/initrd.imgCopy to clipboard | Specifies the initial RAM disk (initrd) image. |
| --no-balloonCopy to clipboard | Disables memory ballooning. |
| --no-rngCopy to clipboard | Disables the entropy source used to seed the guest OS entropy<br>                            pool. |
| --params "..."Copy to clipboard | Specifies the kernel command line options. |
| /var/gunyah/ImageCopy to clipboard | Specifies the path to the kernel image. |

**Run VM and view boot logs**

The following code snippet shows the VM
            logs:

    bash-5.1# cat /proc/cpuinfo
    processor       : 0
    BogoMIPS        : 38.40
    Features        : fp asimd evtstrm aes pmull sha1 crc32 atomics cpuid asimdrdm dcpop asimddp
    CPU implementer : 0x00
    CPU architecture: 8
    CPU variant     : 0x0
    CPU part        : 0x048
    CPU revision    : 0
     
    bash-5.1# cat /proc/meminfo
    MemTotal:         161656 kB
    MemFree:          124940 kB
    MemAvailable:     124032 kB
    Buffers:               0 kB
    Cached:            19816 kB
    SwapCached:            0 kB
    Active:               12 kBCopy to clipboard

The following code snippet shows the boot
            logs:

    [2022-04-28T17:43:03.290477745+00:00 DEBUG crosvm::crosvm::sys::linux] creating hypervisor: Gunyah { device: None }
    [    0.000000] Booting Linux on physical CPU 0x0000000000 [0x000f0480]
    [    0.000000] Linux version 6.6.0 (oe-user@oe-host) (aarch64-qcom-linux-gcc (GCC) 11.4.0, GNU ld (GNU Binutils) 2.38.20220708) #1 SMP PREEMPT Wed Feb  7 04:56:59 UTC 2024
    [    0.000000] KASLR enabled
    [    0.000000] random: crng init done
    [    0.000000] Machine model: linux,dummy-virt
    [    0.000000] earlycon: uart8250 at MMIO 0x00000000000003f8 (options '')
    [    0.000000] printk: bootconsole [uart8250] enabled
    [    0.000000] efi: UEFI not found.
    [    0.000000] software IO TLB: Reserved memory: created restricted DMA pool at 0x0000000090000000, size 64 MiB
    [    0.000000] OF: reserved mem: initialized node restricted_dma_reserved@90000000, compatible id restricted-dma-pool
    [    0.000000] OF: reserved mem: 0x0000000090000000..0x0000000093ffffff (65536 KiB) map non-reusable restricted_dma_reserved@90000000
    [    0.000000] NUMA: No NUMA configuration found
    [    0.000000] NUMA: Faking a node at [mem 0x0000000080000000-0x0000000093ffffff]
    [    0.000000] NUMA: NODE_DATA [mem 0x8ff509c0-0x8ff52fff]
    [    0.000000] Zone ranges:
    [    0.000000]   DMA      [mem 0x0000000080000000-0x0000000093ffffff]
    [    0.000000]   DMA32    empty
    [    0.000000]   Normal   empty
    [    0.000000] Movable zone start for each node
    [    0.000000] Early memory node ranges
    [    0.000000]   node   0: [mem 0x0000000080000000-0x0000000093ffffff]
    [    0.000000] Initmem setup node 0 [mem 0x0000000080000000-0x0000000093ffffff]
    [    0.000000] On node 0, zone DMA: 16384 pages in unavailable ranges
    [    0.000000] cma: Reserved 32 MiB at 0x000000008d600000 on node -1
    [    0.000000] psci: probing for conduit method from DT.
    [    0.000000] psci: PSCIv1.1 detected in firmware.
    [    0.000000] psci: Using standard PSCI v0.2 function IDs
    [    0.000000] psci: MIGRATE_INFO_TYPE not supported.
    [    0.000000] psci: SMC Calling Convention v1.3
    [    0.000000] percpu: Embedded 31 pages/cpu s86568 r8192 d32216 u126976
    [    0.000000] Detected PIPT I-cache on CPU0
    [    0.000000] CPU features: detected: GIC system register CPU interface
    [    0.000000] CPU features: detected: Spectre-v4
    [    0.000000] CPU features: kernel page table isolation forced ON by KASLR
    [    0.000000] CPU features: detected: Kernel page table isolation (KPTI)
    [    0.000000] alternatives: applying boot alternatives
    [    0.000000] Kernel command line: panic=-1 console=hvc0 earlycon=uart8250,mmio,0x3f8 rw root=/dev/ram earlyprintk=serial panic=0
    [    0.000000] Unknown kernel command line parameters "earlyprintk=serial", will be passed to user space.
    [    0.000000] Dentry cache hash table entries: 65536 (order: 7, 524288 bytes, linear)
    [    0.000000] Inode-cache hash table entries: 32768 (order: 6, 262144 bytes, linear)
    [    0.000000] Fallback order for Node 0: 0
    [    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 80640
    [    0.000000] Policy zone: DMA
    [    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
    [    0.000000] software IO TLB: area num 1.
    [    0.000000] software IO TLB: mapped [mem 0x0000000089600000-0x000000008d600000] (64MB)
    [    0.000000] Memory: 116344K/327680K available (14528K kernel code, 3938K rwdata, 7112K rodata, 6080K init, 571K bss, 178568K reserved, 32768K cma-reserved)
    [    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
    [    0.000000] trace event string verifier disabled
    [    0.000000] rcu: Preemptible hierarchical RCU implementation.
    [    0.000000] rcu:     RCU event tracing is enabled.
    [    0.000000] rcu:     RCU restricting CPUs from NR_CPUS=256 to nr_cpu_ids=1.
    [    0.000000]  Trampoline variant of Tasks RCU enabled.
    [    0.000000]  Tracing variant of Tasks RCU enabled.
    [    0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
    [    0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=1
    [    0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
    [    0.000000] GICv3: 988 SPIs implemented
    [    0.000000] GICv3: 0 Extended SPIs implemented
    [    0.000000] Root IRQ handler: gic_handle_irq
    [    0.000000] GICv3: GICv3 features: 16 PPIs
    [    0.000000] GICv3: CPU0: found redistributor 0 region 0:0x000000003ffd0000
    [    0.000000] rcu: srcu_init: Setting srcu_struct sizes based on contention.
    [    0.000000] arch_timer: cp15 timer(s) running at 19.20MHz (virt).
    [    0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x46d987e47, max_idle_ns: 440795202767 ns
    [    0.000000] sched_clock: 56 bits at 19MHz, resolution 52ns, wraps every 4398046511078ns
    [    0.002616] arm-pv: using stolen time PV
    [    0.003945] Console: colour dummy device 80x25
    [    0.005300] Calibrating delay loop (skipped), value calculated using timer frequency.. 38.40 BogoMIPS (lpj=76800)
    [    0.008475] pid_max: default: 32768 minimum: 301
    [    0.009923] LSM: initializing lsm=capability,selinux,integrity
    [    0.011702] SELinux:  Initializing.
    [    0.012884] Mount-cache hash table entries: 1024 (order: 1, 8192 bytes, linear)
    [    0.015180] Mountpoint-cache hash table entries: 1024 (order: 1, 8192 bytes, linear)
    [    0.017809] cacheinfo: Unable to detect cache hierarchy for CPU 0
    [    0.019820] RCU Tasks: Setting shift to 0 and lim to 1 rcu_task_cb_adjust=1.
    [    0.022107] RCU Tasks Trace: Setting shift to 0 and lim to 1 rcu_task_cb_adjust=1.
    [    0.024472] rcu: Hierarchical SRCU implementation.
    [    0.025891] rcu:     Max phase no-delay instances is 1000.
    [    0.027767] EFI services will not be available.
    [    0.029190] smp: Bringing up secondary CPUs ...
    [    0.030713] smp: Brought up 1 node, 1 CPU
    [    0.032002] SMP: Total of 1 processors activated.
    [    0.033471] CPU features: detected: 32-bit EL0 Support
    [    0.035048] CPU features: detected: Data cache clean to the PoU not required for I/D coherence
    [    0.037742] CPU features: detected: Common not Private translations
    [    0.039678] CPU features: detected: CRC32 instructions
    [    0.041275] CPU features: detected: LSE atomic instructions
    [    0.043105] CPU features: detected: Privileged Access Never
    [    0.044891] CPU: All CPU(s) started at EL1
    [    0.046161] alternatives: applying system-wide alternatives
    [    0.050071] devtmpfs: initialized
    [    0.051500] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
    [    0.054767] futex hash table entries: 256 (order: 2, 16384 bytes, linear)
    [    0.057122] pinctrl core: initialized pinctrl subsystem
    [    0.058872] DMI not present or invalid.
    [    0.060334] NET: Registered PF_NETLINK/PF_ROUTE protocol family
    [    0.062534] DMA: preallocated 128 KiB GFP_KERNEL pool for atomic allocations
    [    0.064964] DMA: preallocated 128 KiB GFP_KERNEL|GFP_DMA pool for atomic allocations
    [    0.067353] DMA: preallocated 128 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations
    [    0.069943] audit: initializing netlink subsys (disabled)
    [    0.071632] audit: type=2000 audit(0.056:1): state=initialized audit_enabled=0 res=1
    [    0.074141] thermal_sys: Registered thermal governor 'step_wise'
    [    0.074143] thermal_sys: Registered thermal governor 'power_allocator'
    [    0.076118] cpuidle: using governor menu
    [    0.079536] hw-breakpoint: found 6 breakpoint and 4 watchpoint registers.
    [    0.081693] ASID allocator initialised with 32768 entries
    [    0.083662] Serial: AMBA PL011 UART driver
    [    0.085582] Modules: 2G module region forced by RANDOMIZE_MODULE_REGION_FULL
    [    0.087812] Modules: 0 pages in range for non-PLT usage
    [    0.087813] Modules: 516176 pages in range for PLT usage
    [    0.091914] HugeTLB: registered 1.00 GiB page size, pre-allocated 0 pages
    [    0.099837] HugeTLB: 0 KiB vmemmap can be freed for a 1.00 GiB page
    [    0.101815] HugeTLB: registered 32.0 MiB page size, pre-allocated 0 pages
    [    0.107895] HugeTLB: 0 KiB vmemmap can be freed for a 32.0 MiB page
    [    0.109875] HugeTLB: registered 2.00 MiB page size, pre-allocated 0 pages
    [    0.116064] HugeTLB: 0 KiB vmemmap can be freed for a 2.00 MiB page
    [    0.118084] HugeTLB: registered 64.0 KiB page size, pre-allocated 0 pages
    [    0.124190] HugeTLB: 0 KiB vmemmap can be freed for a 64.0 KiB page
    [    0.128423] ACPI: Interpreter disabled.
    [    0.132206] iommu: Default domain type: Translated
    [    0.133734] iommu: DMA domain TLB invalidation policy: strict mode
    [    0.135749] SCSI subsystem initialized
    [    0.140957] usbcore: registered new interface driver usbfs
    [    0.142744] usbcore: registered new interface driver hub
    [    0.144353] usbcore: registered new device driver usb
    [    0.149976] pps_core: LinuxPPS API ver. 1 registered
    [    0.151488] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
    [    0.162194] PTP clock support registered
    [    0.163436] EDAC MC: Ver: 3.0.0
    [    0.164532] scmi_core: SCMI protocol bus registered
    [    0.166176] FPGA manager framework
    [    0.171350] Advanced Linux Sound Architecture Driver Initialized.
    [    0.173213] vgaarb: loaded
    [    0.174176] clocksource: Switched to clocksource arch_sys_counter
    [    0.235827] VFS: Disk quotas dquot_6.6.0
    [    0.237108] VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
    [    0.239428] pnp: PnP ACPI: disabled
    [    0.241483] NET: Registered PF_INET protocol family
    [    0.243293] IP idents hash table entries: 8192 (order: 4, 65536 bytes, linear)
    [    0.245817] tcp_listen_portaddr_hash hash table entries: 256 (order: 0, 4096 bytes, linear)
    [    0.248604] Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear)
    [    0.251034] TCP established hash table entries: 4096 (order: 3, 32768 bytes, linear)
    [    0.253323] TCP bind hash table entries: 4096 (order: 5, 131072 bytes, linear)
    [    0.255664] TCP: Hash tables configured (established 4096 bind 4096)
    [    0.257584] UDP hash table entries: 256 (order: 1, 8192 bytes, linear)
    [    0.259650] UDP-Lite hash table entries: 256 (order: 1, 8192 bytes, linear)
    [    0.261768] NET: Registered PF_UNIX/PF_LOCAL protocol family
    [    0.263829] RPC: Registered named UNIX socket transport module.
    [    0.265673] RPC: Registered udp transport module.
    [    0.267186] RPC: Registered tcp transport module.
    [    0.268641] RPC: Registered tcp-with-tls transport module.
    [    0.270380] RPC: Registered tcp NFSv4.1 backchannel transport module.
    [    0.272421] PCI: CLS 0 bytes, default 64
    [    0.273680] Unpacking initramfs...
    [    0.278241] kvm [1]: HYP mode not available
    [    0.279783] Initialise system trusted keyrings
    [    0.286209] workingset: timestamp_bits=42 max_order=16 bucket_order=0
    [    0.288474] squashfs: version 4.0 (2009/01/31) Phillip Lougher
    [    0.294313] NFS: Registering the id_resolver key type
    [    0.295881] Key type id_resolver registered
    [    0.297197] Key type id_legacy registered
    [    0.302225] nfs4filelayout_init: NFSv4 File Layout Driver Registering...
    [    0.304407] nfs4flexfilelayout_init: NFSv4 Flexfile Layout Driver Registering...
    [    0.310289] 9p: Installing v9fs 9p2000 file system support
    [    0.320607] NET: Registered PF_ALG protocol family
    [    0.322022] Key type asymmetric registered
    [    0.330205] Asymmetric key parser 'x509' registered
    [    0.331833] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 245)
    [    0.334140] io scheduler mq-deadline registered
    [    0.342201] io scheduler kyber registered
    [    0.343459] io scheduler bfq registered
    [    0.353648] pci-host-generic 10000.pci: assigned reserved memory node restricted_dma_reserved@90000000
    [    0.362220] pci-host-generic 10000.pci: host bridge /pci ranges:
    [    0.364055] pci-host-generic 10000.pci:      MEM 0x0002000000..0x0003ffffff -> 0x0002000000
    [    0.370193] pci-host-generic 10000.pci:      MEM 0x0094800000..0xffffffffff -> 0x0094800000
    [    0.372927] pci-host-generic 10000.pci: Memory resource size exceeds max for 32 bits
    [    0.382221] PCI: OF: PROBE_ONLY enabled
    [    0.383535] pci-host-generic 10000.pci: ECAM at [mem 0x00010000-0x0100ffff] for [bus 00]
    [    0.386134] pci-host-generic 10000.pci: PCI host bridge to bus 0000:00
    [    0.394279] pci_bus 0000:00: root bus resource [bus 00]
    [    0.395912] pci_bus 0000:00: root bus resource [mem 0x02000000-0x03ffffff]
    [    0.397972] pci_bus 0000:00: root bus resource [mem 0x94800000-0xffffffffff]
    [    0.406329] pci 0000:00:00.0: [8086:1237] type 00 class 0x060000
    [    0.409065] pci 0000:00:01.0: [1af4:1043] type 00 class 0x00ff00
    [    0.419597] pci 0000:00:01.0: reg 0x10: [mem 0x02000000-0x02007fff]
    [    0.425686] Freeing initrd memory: 6464K
    [    0.428105] pci 0000:00:01.0: PME# supported from D0 D3hot D3cold
    [    0.430575] pci 0000:00:02.0: [1b36:0011] type 00 class 0xffff00
    [    0.432661] pci 0000:00:02.0: reg 0x10: [mem 0x02008000-0x0200800f]
    [    0.436076] pci 0000:00:00.0: Limiting direct PCI/PCI transfers
    [    0.438471] virtio-pci 0000:00:01.0: assigned reserved memory node restricted_dma_reserved@90000000
    [    0.443123] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
    [    0.445534] 2e8.U6_16550A: ttyS0 at MMIO 0x2e8 (irq = 14, base_baud = 115200) is a 16550A
    [    0.448422] 2f8.U6_16550A: ttyS1 at MMIO 0x2f8 (irq = 14, base_baud = 115200) is a 16550A
    [    0.451159] 3e8.U6_16550A: ttyS2 at MMIO 0x3e8 (irq = 15, base_baud = 115200) is a 16550A
    [    0.453983] 3f8.U6_16550A: ttyS3 at MMIO 0x3f8 (irq = 15, base_baud = 115200) is a 16550A
    [    0.456935] msm_serial: driver initialized
    [    0.460508] printk: console [hvc0] enabled
    [    0.461772] printk: bootconsole [uart8250] disabled
    [    0.475305] loop: module loaded
    [    0.475957] megasas: 07.725.01.00-rc1
    [    0.476374] tun: Universal TUN/TAP device driver, 1.6
    [    0.477187] VFIO - User Level meta-driver version: 0.3
    [    0.477691] usbcore: registered new interface driver usb-storage
    [    0.478075] i2c_dev: i2c /dev entries driver
    [    0.478575] sdhci: Secure Digital Host Controller Interface driver
    [    0.479311] sdhci: Copyright(c) Pierre Ossman
    [    0.479612] sdhci-pltfm: SDHCI platform and OF driver helper
    [    0.479932] ledtrig-cpu: registered to indicate activity on CPUs
    [    0.480343] SMCCC: SOC_ID: ARCH_SOC_ID not implemented, skipping ....
    [    0.480864] usbcore: registered new interface driver usbhid
    [    0.481329] usbhid: USB HID core driver
    [    0.482042] NET: Registered PF_PACKET protocol family
    [    0.482342] 9pnet: Installing 9P2000 support
    [    0.482635] Key type dns_resolver registered
    [    0.484383] registered taskstats version 1
    [    0.484775] Loading compiled-in X.509 certificates
    [    0.486896] page_owner is disabled
    [    0.487629] Key type .fscrypt registered
    [    0.487943] Key type fscrypt-provisioning registered
    [    0.488391] clk: Disabling unused clocks
    [    0.488759] ALSA device list:
    [    0.489050]   No soundcards found.
    [    0.490311] Freeing unused kernel memory: 6080K
    [    0.498264] Run /init as init process
    Starting version 250.5+
    bash: cannot set terminal process group (-1): Inappropriate ioctl for device
    bash: no job control in this shell
    bash-5.1#Copy to clipboard

**Launch a VM with 2 CPUs and default RAM**

Launch VM: To launch guest VM with two CPU, use the  `--cpus num-cores=2`
            parameter:

    #/usr/bin/crosvm --log-level=debug --no-syslog run --disable-sandbox --hypervisor \
                                               gunyah --protected-vm-without-firmware \
                                               --cpus num-cores=2 \
                                               --serial=type=stdout,hardware=virtio-console,console,stdin,num=1 \
                                               --serial=type=stdout,hardware=serial,earlycon,num=1 \
                                               --initrd /var/gunyah/initrd.img --no-balloon --no-rng \
                                               --params "rw root=/dev/ram earlyprintk=serial panic=0" \
                                               /var/gunyah/ImageCopy to clipboard

The following code snippet shows the VM
            logs:

    bash-5.1# cat /proc/cpuinfo
    processor       : 0
    BogoMIPS        : 38.40
    Features        : fp asimd evtstrm aes pmull sha1 crc32 atomics cpuid asimdrdm dcpop asimddp
    CPU implementer : 0x00
    CPU architecture: 8
    CPU variant     : 0x0
    CPU part        : 0x048
    CPU revision    : 0
     
    processor       : 1
    BogoMIPS        : 38.40
    Features        : fp asimd evtstrm aes pmull sha1 crc32 atomics cpuid asimdrdm dcpop asimddp
    CPU implementer : 0x00
    CPU architecture: 8
    CPU variant     : 0x0
    CPU part        : 0x048
    CPU revision    : 0
     
    bash-5.1# cat /proc/meminfo
    MemTotal:         161656 kB
    MemFree:          124940 kB
    MemAvailable:     124032 kB
    Buffers:               0 kB
    Cached:            19816 kB
    SwapCached:            0 kB
    Active:               12 kBCopy to clipboard

**Launch VM with 2 CPUs and 512MB RAM**

Launch VM: To launch guest VM with one CPU and 512 MB RAM, use the `--cpus
                num-cores=1 --mem size=512`
            parameters.

    #/usr/bin/crosvm --log-level=debug --no-syslog run --disable-sandbox --hypervisor \
                                               gunyah --protected-vm-without-firmware \
                                               --cpus num-cores=2 --mem size=512      \
                                               --serial=type=stdout,hardware=virtio-console,console,stdin,num=1 \
                                               --serial=type=stdout,hardware=serial,earlycon,num=1              \
                                               --initrd /var/gunyah/initrd.img --no-balloon --no-rng            \
                                               --params "rw root=/dev/ram earlyprintk=serial panic=0"           \
                                               /var/gunyah/ImageCopy to clipboard

The following code snippet shows the VM
            logs:

    bash-5.1# cat /proc/cpuinfo
    processor       : 0
    BogoMIPS        : 38.40
    Features        : fp asimd evtstrm aes pmull sha1 crc32 atomics cpuid asimdrdm dcpop asimddp
    CPU implementer : 0x00
    CPU architecture: 8
    CPU variant     : 0x0
    CPU part        : 0x048
    CPU revision    : 0
     
    processor       : 1
    BogoMIPS        : 38.40
    Features        : fp asimd evtstrm aes pmull sha1 crc32 atomics cpuid asimdrdm dcpop asimddp
    CPU implementer : 0x00
    CPU architecture: 8
    CPU variant     : 0x0
    CPU part        : 0x048
    CPU revision    : 0
     
    bash-5.1# cat /proc/meminfo
    MemTotal:         418304 kB
    MemFree:          378356 kB
    MemAvailable:     376048 kB
    Buffers:               0 kB
    Cached:            20308 kB
    SwapCached:            0 kB
    Active:                0 kBCopy to clipboard

**Launch VM with block device**

Use the following command to launch the
            VM:

    #/usr/bin/crosvm --log-level=debug --no-syslog run --disable-sandbox --hypervisor \
                                               gunyah --protected-vm-without-firmware \
                                               --block disk.img \ 
                                               --cpus num-cores=2 --mem size=256      \
                                               --serial=type=stdout,hardware=virtio-console,console,stdin,num=1 \
                                               --serial=type=stdout,hardware=serial,earlycon,num=1              \
                                               --initrd /var/gunyah/initrd.img --no-balloon --no-rng            \
                                               --params "rw root=/dev/ram earlyprintk=serial panic=0"           \
                                               /var/gunyah/ImageCopy to clipboard

- Use `--block` flag to specify the block device name (in this
                    case, disk.img).
- This creates ` /dev/vda, /dev/vdb`, and so on, in the guest
                    VM.

    bash-5.1# ls -al /dev/block/
    total 0
    drwxr-xr-x    2 root     root           220 Jan  1 00:00 .
    drwxr-xr-x    9 root     root          2980 Jan  1 00:00 ..
    lrwxrwxrwx    1 root     root             6 Jan  1 00:00 254:0 -> ../vda
    lrwxrwxrwx    1 root     root             8 Jan  1 00:00 7:0 -> ../loop0
    lrwxrwxrwx    1 root     root             8 Jan  1 00:00 7:1 -> ../loop1Copy to clipboard

This device can be mounted in the guest VM with the mount command, `mount -t ext4
                /dev/vda /mount-point`.

    bash-5.1# mkdir /data
    bash-5.1# mount -t ext4 /dev/vda /data
    [  112.311376] EXT4-fs (vda): mounted filesystem 4b577765-65ad-4fd8-910c-0eac437d8afb r/w with ordered data mode. Quota mode: none.Copy to clipboard

## Real-time (RT) kernel overview

Source: [https://docs.qualcomm.com/doc/80-70014-3/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3/topic/features.html)

A real-time system is a deterministic system, where response to an event is expected
        in a set time.

A system is classified as compatible with RT if:

- It is devoid of unbounded latency.
- The maximum response time is calculated with precision.
- It meets the set criteria for scheduling of tasks (latency and deadline).

Linux can be considered as a real-time operating system (RTOS) in which real-time tasks
            have well-defined periodic execution cycles (cycle time), and meets execution criteria
            within specified limits (jitter).

When considering Linux as RTOS, apply `PREEMPT_RT` patches and enable
            configurations for a fully preemptible kernel.

The RT kernel maintainers maintain out-of-tree `PREEMPT_RT` patches for
            every kernel version released.

To install the patches, see [Versions of PREEMPT_RT patches](https://wiki.linuxfoundation.org/realtime/start).

Note: The real-time support is for kernel space process and not for
            user space.

Figure : Build sequence
                    
                    ![](data:image/png;base64,UklGRjQKAABXRUJQVlA4TCcKAAAv+8IcABfkKpIkS6nlCx/cfZ0BMIH7NyjZme2y4aq2bVVZaBGXAjQg8PuiAQVccjDY5969XUWSJCu5R6DkvS8U4AABSMArCm5wwnvT8x+giVLEm1KM0VSKZNMKmErFlFYju1JXCtiVwgylgF0VpCNMxRiVUuimKgyE07jMCjLo6ArDGJcW6ThqxqhZrcRButXL6k16iRsNhAmNoEnAEVgFIYnVMJCohoGEgRAaexAkqjDRwhBHOoYYHXGsRhzzH4YuICBu8z/4gS8O7KzgbNsCP/BzWcESFsCCL7Dgw3k44AqccIDrERfg7gocgQsuHKzuPza+OPN/8+NpX8GJ3/eODy9uGHhsOR5XoCgAdNo2curS0CuNeVnGzLyMGTryZWAP0lC75Lb4Mogv1/t0671n+VlSWo8i+g8JkiSpTbWDwMjHqHe0jGAn7Hfuh4DWFEnl2bXG4dbyrJEje8coFdh15gq37rjs2px1sd42mdYf+Y0RA2eLcrqYZ9V25msFWSJLpsfkNFlg1V6FrxU8GGLCKZLak+fWWodbKxeTPLSNpodLmMifGKO0s8Ct41e4dctl134u9hQpncuza9zh1pLFJAWjeTdW5OLBujFCUwV2XbrCrYcut56tzLpYZjTzjq/9ZYBzU1k+xTGjsXNPlk8h/8d/zMbTkYyGI+v7Aq5tNC6NZ/lccf74z8/bOFd+XWX9kayG6eEsHzf3cxI3V2XqmLXD58CmLJ/ja/+4Tl9l4FmWz5KHZuPO8iyfh0sUoly3LKtZI+l6JqRnQbWrEnQaHnbUi2Fm3gIqIbMtYPhCjZn5Zg0FEKA0Jgc7jAY3JpYS20vA04yu5YkUbvnkMzcjxM/jJUBOw/hmfSU3xbF+uEGjF/ML7PjXmBHpBWjW6I9gjxeElOtBfALQmWs+4n9eCOqQTkNUMMgC+HWd2a9RMCVDUa6/qVuWh+svT/C6gQoqD5lJeIxj1p2Z+fgqkR77VwnmPJbKUafDvWYNvpyIsS3PfbOa7+ueyNzmf4FwMaAIrfgIccagcPT8BH+E0Vd1GiX4zONoWJ44qZqKlg8ss3sB9o4yEJtpmE3XKpHlLevMzFI5qkjS03q35ZMJ266KwQbHu81aZI1HEEb+xERIZAyR8Rpig9mhhoZbWCUBStqwXTXRl5Qiu+D4l+d8EQDhEjCQMJNCjL7mdBoedEG2SmFnZj7QEfSE4dxHJmzJxqA6xceAqSEuQpwxVMarB9tpu+WLmQN4IAE1tRhmE2sOnHwt0qUIwky6OvFsnSHnrn9qkVG4yHhTh5ZZoFqBk0rrW+sdchVWJzXpylFL4KwGRpROWAJx+hcOIz4Jt2IiJDKGDFxNmKrG72gGl2PW14M1Z9JF5GPzSwO71JkFYDOJLO00Alt1WN/ZdS2RoAFRdpAZ26xFURHA6kS+ctQTYAd4CI9tDOD80SvZiNbXyBYiwjiIcNQl+cWYbusbfklpxxKCtcdTBTrYaUhsYrIdVvmaU66XKCPQLIzLDgT2rkcAo5WuHJWEbewr8wGZj3GU597N+YTVIlGoCGNp+fp+G0Sc4iUo0ZV7T9XDB88uVwOYil2LfFcUEY2ihMe9lm8IwJjKVCmUiXaXANqrQOW4c49adMVZBOSpHDPzn9pVAjyjyECEo+e3tatgEkYXadDkh98FRiMraPkKf5vjumeXqwAaVKtEuCSiIcykAGWL7p+QAOdkCCVRoHIs5FWCeFURCRvzIoIXUwlA9UhEGENM4FqupQBJGaIr0z2rXSVCelP30JV6T9n7CtOu2OHHgiKyEtjW8qORgy6R0Vj0bX+YDGb4kq71mn0jWzlqCjmAxNjS0E7gQjEgIoyBClz1L0n5zUiKnN7tYA3IcNt1wY5AO2n/gyr4cDwotjCiJAJFSFeO2sLg7+dUavP+w6jLpLM7DM7wUAr31GbmWz7xbRiJb3sLy100hctXjqYiLNm64NomY+Q5E0/PnjQayx4k42l+iHUtRbkO11Lg+woSwGKy+b1Zg+UuQr5yVIWlitFptKsaYTRd3egk0n24lx9ae9zc5C4I31RbQ4euorIqdbbfnjBm34BpOzsT/vFwuJfLGZ0N0DuAMmd4uKhIK4Zd9/bEQpuVrjst5mrz8TjZv8Q5gc+Z6my68JaBXuRuRNbdcBbW7J/eFF10MiDHuN4r5a+brW9g11EHa0iGs8C6y05fBpzcdWRNdLkVo7xh5bqXIvsS8peLdPm20Rh85ibTC+zd6rSAPZI8g9sFFw36J8mkF2ocHnIktM3Fc3XRbJsnTDw7/CjNvGUd/0UVCS1DeznTUTjqJNI1uLd/2LmSHp7JIC5Ig1VBcE0f3b0mCMFSHMuyiB5Jog8RXdgO0C8omQHWZjylOQX3ADpMHMp+yW24l7yBA2cfeVsEDDDokQSNL7jrwS/HtT3A7IXduB/qXnzcto0SPvnNzUQbnoUsoRWIpbv4jibqXosIgSnADw/3SBJ9iOK4iA4vYDcCvM14CjPwTOwZn2HXfSr2GEDZRyQtGmDqJYbuhlOAu95E9qJIPIm4iYRXF7gUq/d/u9qZ9emV67injbiXQ61Cxn2IUVqQ6dFt1kwAbzPee3VZHhnbB9gEbopDkhsk2/aAQV0PFDBUnL0YibYJIpPVBZhQnvv6sRY9Q+EOtovqaSvX4XMXUaFVi+C8CM0kQuk0PBPA24z3RuFPciSqF4wqMzGUy3FA5lt80hKg1a8U0CyUvQQScYOEVx27V+p8/jDn9wJbgO3CPW24H4PsE8N9iHCxCrWA3QQwN+Ppgg4Fo/Z/cA1lH5G0EoSS4G7WGGLixQmvNmH738DuvZz3JKaMEmpGgadKAhBepxGzETLBYeZmvLIW3F2hfsGoMspvUPYm2RAJrzSdj/9FU9vfsz5VKmKwocADokcS9SGShz3zgAdTBhCORjxYpn7BqDZpHY4H5m5I9D8jUPbKHCbA2aEy4PwNmySJlesE4tpANLzoNAPiI/sQw5Z4nQbEAnb9fxB3M947TVC+YDQBOPsk2h4kvm2GbnsgslekibBSpm0CJ7zKgPQEl0aJlesUwIQuaJ8keiSpPsSY+wrNmmqbDYdSgLsZr6wJ6heM6pPCfQUJiK4Hm2p7iMneHn1fgTQYJzw7mvbKMGKQf+dUC1QuGHVC966HxRxGKxgPbNKETsOD70YW4ehQMBrwD+904YV3s2Pb9kKIhcwfnfrlheHpDB/jdXbeW5rl83DJj15W3czyGSv+7o6J81k+a48bjdHpLJ9lD/74z49Ano5kNBxZ3xdw7R+WnFmT5XPF+X0cz66w6kCBVZNjrBrM5Mgtd1i1Kc+qi0VWPXPl9GAoa8K0+o0R++9d4daBAre2jLFrMENjwGHXpjy3DhYjpXfJYD/bGror3LpUYNfUGLdW9CMWL1ricGs8z65zRW7dpf+lpiVMrJm+wqFDBW5tTeFkn4CMSw6LNuS5tT+Nk72szuV+BCgHAA==)

### Set up workspace

Qualcomm kernel supports the v6.6 LTS RT kernel, which is maintained through the
                Yocto recipe in the `meta-qcom-realtime` layer in the
                    `recipes-kernel/linux/linux-kernel-qcom-rt_6.6.bb` file.

The Linux RT kernel recipe in Qualcomm Linux is referred as
                    `linux-kernel-qcom-rt`.

For more information on cloning the workspace and get all meta layers to use Qualcomm
                RT Linux, see [How to sync and build with real-time
                    Linux?](https://docs.qualcomm.com/bundle/publicresource/topics/80-70014-254/how_to.html#how-to-sync-and-build-with-real-time-linux-)

### Enable real-time kernel

Qualcomm Linux `meta-qcom-realtime` layer supports a
                    `linux-kernel-qcom-rt` recipe that fetches and builds the Linux
                kernel for the supported machines by default.

The `meta-qcom-realtime` layer applies the changes on top of the
                existing layer. During the kernel build, `meta-qcom-hwe`,
                    `meta-qcom-realtime` layer appends the upstream
                    `PREEMPT_RT` patches based on the kernel version, and enables the
                real-time configurations.

    require recipes-kernel/linux/linux-kernel-qcom_6.6.bb
     
    SECTION = "RT kernel"
    SUMMARY = "Linux Real time kernel for QCOM devices"
    DESCRIPTION = "Recipe to build real time Linux kernel"
     
    SRC_URI:append = "https://cdn.kernel.org/pub/linux/kernel/projects/rt/6.6/older/patch-6.6.14-rt21.patch.gz;md5sum=91969a704a73aa918c89d3027bdd3634 \
                     file://qcom_rt.cfg \
                     file://0001-arch-Kconfig-Add-RT-kernel-support.patch \
                     
    S = "${WORKDIR}/kernel"
    KERNEL_CONFIG_FRAGMENTS:append = " ${WORKDIR}/qcom_rt.cfg"Copy to clipboard

For more information on supported machines, see [Identify supported Qualcomm machines](https://docs.qualcomm.com/doc/80-70014-3/topic/getting_started_chapter2.html#supported_machines).

Note: RT kernel is not supported on QCS5430.

### Configure real-time Kernel

Use the following procedure to configure the RT kernel.

SRC_URI:append = "https://cdn.kernel.org/pub/linux/kernel/projects/rt/6.6/older/patch-6.6.14-rt21.patch.gz;md5sum=91969a704a73aa918c89d3027bdd3634 \
                     file://qcom_rt.cfg \
                     file://0001-arch-Kconfig-Add-RT-kernel-support.patch \Copy to clipboard

- To apply the external configurations on the RT kernel:
    - Maintain the configuration file in the
                                `meta-qcom-realtime/recipes-kernel/linux/linux-kernel-qcom-rt`
                            recipe.
    - Append the configuration file to
                                `KERNEL_CONFIG_FRAGMENTS` in
                                `meta-qcom-realtime/recipes-kernel/linux/linux-kernel-qcom_6.6.bb`
                            file.
- To add a configuration fragment to the RT
                    kernel:

        KERNEL_CONFIG_FRAGMENTS:append = " ${WORKDIR}/qcom_rt.cfg"
        Copy to clipboard
- To modify the kernel command line, add a kernel command line in the
                        `conf/layer.conf` file.
- The following example shows how to modify a command
                    line:

        KERNEL_CMDLINE_EXTRA = "root=/dev/disk/by-partlabel/system rw rootwait console=ttyMSM0,115200n8 pcie_pme=nomsi earlycon idle=poll skew_tick=1 rcu_nocbs=1-3 rcu_nocb_poll nohz_full=1-3 irqaffinity=4-7 isolcpus=1-3"
        Copy to clipboard

### Kernel configurations

Optional and mandatory kernel configurations are used in the RT kernel.

Use `CONFIG_PREEMPT_RT` to enable full preemption in the RT kernel.

The `CONFIG_PREEMPT_RT` is enabled by default as part of the
                    `linux-kernel-qcom-rt_6.6.bb` recipe.

The following example shows the kernel
                configuration:

    # CONFIG_PREEMPT_RT
    $ zcat proc/config.gz | grep CONFIG_PREEMPT
    # CONFIG_PREEMPT_NONE is not set
    # CONFIG_PREEMPT_VOLUNTARY is not set
    # CONFIG_PREEMPT is not set
    CONFIG_PREEMPT_RT=yCopy to clipboard

Use the following configurations to optimize the RT kernel
                response:

    # CONFIG_NO_HZ
    $ zcat proc/config.gz | grep NO_HZ
    CONFIG_NO_HZ_COMMON=y
    # CONFIG_NO_HZ_IDLE is not set
    CONFIG_NO_HZ_FULL=y
    # CONFIG_NO_HZ is not set
      
    #CONFIG_CPUSETS
    $ zcat proc/config.gz | grep CPUSETS
    CONFIG_CPUSETS=yCopy to clipboard

Set the following kernel configuration options when affininig the RT task:

- `CONFIG_NO_HZ_FULL` - When enabled, it configures the kernel to
                    avoid sending scheduling-clock interrupts to CPUs with a single runnable
                    task.
- `CONFIG_CPUSETS` - Use the `CONFIG_CPUSETS`
                    configuration option to enable `cpuset`, where the CPU is grouped
                    to form a set.

Use the `CONFIG_CPUSETS` configuration option when affining the RT
                task to a set of CPUs.

Figure : RT kernel verification
                
                ![](data:image/png;base64,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)

### Build a real-time kernel

Use the following commands to compile the RT kernel:

$ MACHINE=qcm6490 DISTRO=qcom-wayland source setup-environment
     
    #verify realtime layer is present
     
    $ bitbake-layers show-layers | grep realtime
        meta-qcom-realtime    /layers/meta-qcom-realtime  12
     
    # compile
    $ bitbake qcom-console-imageCopy to clipboard

### Testing real-time kernel

The suite of tests are available in the Linux foundation RT test suite.

The cyclic test determines the best and worst case latencies for an RT
                application.

Access the RT test suite source code at [rt-tests/rt-tests.git](https://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git/).

To include the RT test suites as a part of the image, change the
                    `layer.conf` file in the standard Yocto
                build:

    IMAGE_INSTALL:append = "rt-tests numactl"Copy to clipboard

Run the following cyclic
                test:

    $ cgexec -g cpuset:core1-3 cyclictest -a 1-3 -t 3 -m -l 100000000 -i 1000 -p 99 -h 800Copy to clipboard

For more information on the RT test, see [RT-Tests](https://wiki.linuxfoundation.org/realtime/documentation/howto/tools/rt-tests).

### Debug RT kernel

The following are the methods for troubleshooting issues in the RT kernel:

- How to verify that the underlying kernel is real-time?
After the boot is
                        complete, run the following commands to verify the kernel
                        type:

        $ uname -r
        6.6-rt15
        $ uname -v
        SMP PREMPT_RTCopy to clipboard
- How to make drivers RT compliant?
    Ensure that synchronization primitives do
                        not break RT assumptions.

The following are examples of the scenarios
                        that can break RT assumptions and cause unexpected system
                        behavior:

         /* Acquiring a preemptible lock in non preemptible context */
        
        preempt_disable( ) 
        ……
        spin_lock( )
        
         /* Acquiring a preemptible lock in non preemptible context /
        
        raw_spin_lock( )
          ……
        spin_lock( )
        
         /* Acquiring a non preemptible lock in preemptible context /
        
        local_lock_irq( )
           …..
        raw_spin_lock( )Copy to clipboard
- Debug RT kernel configurations
The following are the debug configurations for
                        the RT kernel:
    - `CONFIG_DEBUG_ATOMIC_SLEEP` - Checks for sleep inside
                                an atomic section.
    - `CONFIG_PROVE_RAW_LOCK_NESTING` - Enables the
                                    `raw_spinlock` vs. spinlock nesting checks to
                                ensure that the lock nesting rules for `PREEMPT_RT`
                                enabled kernels are not violated.
        While debugging, you can switch
                                    from an RT kernel to a non-RT kernel. To switch, make changes to
                                    the `layer.conf` file to change virtual/kernel
                                    settings to the `linux-kernel-qcom` and compile
                                    again.

Run the following commands to make the
                                    changes:

            - PREFERRED_PROVIDER_virtual/kernel = "linux-kernel-qcom-rt"
            + PREFERRED_PROVIDER_virtual/kernel = "linux-kernel-qcom"Copy to clipboard

For more information on locking primitives with the RT kernel, see [Lock types and their rules — The Linux Kernel
                    documentation](https://www.kernel.org/doc/html/latest/locking/locktypes.html).

### Tuning RT kernel

Tune the RT kernel to achieve a deterministic latency to RT tasks in the device.

The CPU cores that run RT tasks must be set to run at maximum operating frequency
                while preventing thermal mitigation of CPU frequency. For example, in an idle sleep
                scenario, RT tasks face scheduling latency due to CPU wake time delay.

Use the following system configuration for a system with eight CPU cores.
- RT tasks as outlined in the following example are affined to cores 1-3.
- CPU cores 1-3 run in isolated mode with all read-copy-update (RCU) affined
                        to cores 4-7.
- IRQs are affined to cores 4-7 in the kernel command line arguments.
- System sleep is disabled for CPU cores 1-3 and is set to run at maximum
                        frequency.

        # Disable low power mode and sleep for CPU 1-3
        $ echo 1 > /sys/devices/system/cpu/cpu1/cpuidle/state2/disable
        $ echo 1 > /sys/devices/system/cpu/cpu1/cpuidle/state1/disable
        $ echo 1 > /sys/devices/system/cpu/cpu1/cpuidle/state0/disable
        $ echo 1 > /sys/devices/system/cpu/cpu2/cpuidle/state0/disable
        $ echo 1 > /sys/devices/system/cpu/cpu2/cpuidle/state1/disable
        $ echo 1 > /sys/devices/system/cpu/cpu2/cpuidle/state2/disable
        $ echo 1 > /sys/devices/system/cpu/cpu3/cpuidle/state2/disable
        $ echo 1 > /sys/devices/system/cpu/cpu3/cpuidle/state1/disable
        $ echo 1 > /sys/devices/system/cpu/cpu3/cpuidle/state0/disable
         
        # Enable max freq for cpu group 0-3
        $ echo 1958400 > /sys/devices/system/cpu/cpufreq/policy0/scaling_min_freq
         
        $ echo performance > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor
         
        # form cgroup for core 0-3
        $ mkdir /sys/fs/cgroup/cpuset/core0/
        $ mkdir /sys/fs/cgroup/cpuset/core1/
        $ mkdir /sys/fs/cgroup/cpuset/core2/
        $ mkdir /sys/fs/cgroup/cpuset/core3/
         
        $ echo 0 > /sys/fs/cgroup/cpuset/core0/cpuset.mems
        $ echo 0 > /sys/fs/cgroup/cpuset/core1/cpuset.mems
        $ echo 0 > /sys/fs/cgroup/cpuset/core2/cpuset.mems
        $ echo 0 > /sys/fs/cgroup/cpuset/core3/cpuset.mems
         
        $ echo 0 > /sys/fs/cgroup/cpuset/core0/cpuset.cpus
        $ echo 1 > /sys/fs/cgroup/cpuset/core1/cpuset.cpus
        $ echo 2 > /sys/fs/cgroup/cpuset/core2/cpuset.cpus
        $ echo 3 > /sys/fs/cgroup/cpuset/core3/cpuset.cpus
         
        $ mkdir /sys/fs/cgroup/cpuset/core1-3/
        $ echo 0 > /sys/fs/cgroup/cpuset/core1-3/cpuset.mems
        $ echo 1-3 > /sys/fs/cgroup/cpuset/core1-3/cpuset.cpusCopy to clipboard

The following example shows how to add a kernel command line parameter to have no RCU
                callbacks in `layer.conf`:
- CPU cores 1-3
- IRQ affine to core 4-7
- Isolate CPU 1-3

    KERNEL_CMDLINE_EXTRA = "root=/dev/disk/by-partlabel/system rw rootwait console=ttyMSM0,115200n8 pcie_pme=nomsi earlycon skew_tick=1 rcu_nocbs=1-3 rcu_nocb_poll nohz_full=1-3 irqaffinity=4-7 isolcpus=1-3"
    Copy to clipboard

Last Published: Jul 15, 2024

[Previous Topic
Getting started](https://docs.qualcomm.com/bundle/publicresource/80-70014-3/topics/getting_started_chapter2.md) [Next Topic
Yocto support](https://docs.qualcomm.com/bundle/publicresource/80-70014-3/topics/yocto-kernel-support.md)