# Kernel features

The Qualcomm^®^ Linux^®^ kernel offers the following key features and advancements related to the mainline
Linux kernel on Qualcomm platforms:

- The Qualcomm Linux BSP is tailored to support devices using Qualcomm platforms.
- The device tree corresponds to the Qualcomm Linux development kits.
- Multiple customized build configurations are available to suit your requirements.
- The Qualcomm Linux kernel integrates into the Yocto build system.
- The Qualcomm Linux kernel aligns with the upstream LTS kernel.
Qualcomm-specific additions are maintained separately.
- Support to configure, customize, and build kernel images that’s flashed and booted on devices using Qualcomm hardware SoCs.
- Virtualization support for untrusted virtual machines using the
Gunyah™ Hypervisor Software.
- Periodic LTS merges from the corresponding LTS kernel branch to
get the latest security and stability fixes.

## UEFI boot manager

Qualcomm Linux supports systemd-boot as the Universal extensible firmware interface (UEFI) boot manager to load and boot the Linux kernel. The Qualcomm Linux kernel, in this case, is built as an EFI stub.

### Boot flow and architecture overview

A cold boot refers to the process of starting the system from a power-off state. The cold boot process involves the following steps:

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

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

### Systemd-boot

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

- Boot entries: The type 1 boot loader specification entries are in the
`loader/entries/` directory on the ESP. These files describe Qualcomm Linux
kernel images with the associated initrd images, and other EFI
executables.
- UKI: The type 2 boot loader
specification EFI unified kernel images are executable EFI binaries located in the `/EFI/Linux/` directory on the ESP.

    For more information about 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 of the meta
Yocto layer. The Yocto recipe uses the
`systemd-boot_254.4.bb` recipe file to build systemd-boot, and the `uki.bbclass` recipe
file to handle the ESP image generation.

For more information about systemd-boot, see
[Configure and secure boot with systemd-boot and UKI](https://docs.qualcomm.com/bundle/publicresource/topics/80-70018-27/qualcomm_linux_software_components.html#configure-and-secure-boot-with-systemd-boot-and-uki).

### Qualcomm Linux kernel as EFI stub

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

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

For Arm^®^ (Arm64), where compressed kernel support isn’t available, the
kernel image functions 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 about 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 or boot partition

The ESP or boot partition serves as a storage location for the `efi.bin` image that packages
systemd-boot and UKI. 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 about the
UKI image format and the corresponding support in base Qualcomm Linux meta layers, see
[systemd-boot](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-27/platform_software_features.html#systemd-boot).

### DTB selection

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

To understand the boot time DTB selection, see [Platform device tree and kernel configuration](https://docs.qualcomm.com/doc/80-70018-3/topic/customize.html#platform-support-0).

## 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.

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

**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

**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.

### Kernel configurations

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 [Getting started with Qualcomm Linux kernel](https://docs.qualcomm.com/doc/80-70018-3/topic/getting_started_chapter2.html).

## Remoteproc subsystem

The 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:

- Core framework: The core framework contains a common logic. It loads the firmware and starts or stops the remote processor.
- Remoteproc drivers: 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.

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

For more information about 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

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

The Remoteproc driver in 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 supported co-processors on QCS6490-based boards and RB3 Gen 2 Development Kit are aDSP, cDSP, and WPSS.

Note

List of supported remote processor subsystems depends upon the SoC in use.

**User interface:** The remoteproc framework tracks registered
remoteproc devices and provides a user interface to boot and shutdown
the devices. The 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/state
    Copy to clipboard

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

**Figure : Remoteproc support**

### Remoteproc recovery and subsystem restart

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 boots or shuts 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:

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

**Figure: Remoteproc crash sequence**

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

mount -t debugfs nodev /sys/kernel/debug
    echo disabled > /sys/kernel/debug/remoteproc/remoteprocN/recovery
    Copy to clipboard

### Coredump

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

When a subsystem crash occurs, devcoredump exposes a snapshot of
the memory of the 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, the sysfs
provides the segments in an ELF container, and a write operation 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/coredump
    
    # Enable coredumps:
      echo enabled > /sys/kernel/debug/remoteproc/remoteprocN/coredump
    #
    # N represents the index number of the remote processor.
    Copy to clipboard

Note

To collect the full RAM dump for crash analysis, Qualcomm SoCs implement kernel panic on remoteproc crash (fatal error on remote processor).
The kernel panic mode is enabled only when the coredump is disabled.

The devcoredump `/sys/class/devcoredump/devcdN/data` node is created on a subsystem crash only if coredump is enabled for the subsystem. To enable the coredump, run the  `echo enabled > /sys/kernel/debug/remoteproc/remoteprocN/coredump` command.
The `devcdN/data` node is temporary and is removed
after a timeout. To debug the issues, use the `copy` command to copy the `devcdN/data` node to your local device for secure usage. The delete timeout is defined in
`base/devcoredump.c`.

The following is an example command to copy the coredumps:

# Copy Coredump to a local device
      cp /sys/class/devcoredump/devcdN/data > /var/spool/crash/dump_file.elf
    #
    # N represents the index of coredump. It is incremented each time a new coredump is generated.
    Copy to clipboard

To transfer the coredump file to a host device and debug the issues, use the Qualcomm Crash Analysis Portal (QCAP).

Note

For more information about QCAP, see [Parse RAM dumps using QCAP](https://docs.qualcomm.com/bundle/resource/topics/80-70014-12A/debugging_linux_kernel.html#parse_ram_dumps_using_qcap).

### Remoteproc configuration and firmware

The remoteproc devices are configured in the respective device tree
files using the 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 QCS6490 aDSP remoteproc device tree
configuration in the `arch/arm64/boot/dts/qcom/qcs6490.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

Check the QCS9075 device tree configuration file in the `arch/arm64/boot/dts/qcom/sa8775p.dtsi` path.

Note

To get the device tree configuration file for all the Qualcomm SoCs, see the respective platform DTSI file.

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. For other Qualcomm hardware SoCs, see `arch/arm64/boot/dts/qcom/<SoC>-<board>.dts` files.

The following example shows the remoteproc DT configuration:

&remoteproc_adsp {
    firmware-name = "qcom/qcs6490/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/qcs6490/modem.mdt failed with error -2"
    
    # Caused by: error loading firmware.
    # Solution: ensure that the modem firmware is copied to /lib/firmware/qcom/qcs6490 in rootfs.
    Copy to clipboard

## Memory management and configuration

The 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 about Linux kernel memory management, see [Memory
management](https://www.kernel.org/doc/html/next/core-api/index.html#memory-management).

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.

Configurable carved-out regions are defined in the `arch/arm64/boot/dts/qcom/qcs6490.dtsi` file under 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

Note

For Qualcomm SoCs, see the SoC-specific Qualcomm DTSI files to get this information.

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@86100000
    Copy to clipboard

Qualcomm Linux distribution supports contiguous memory allocator (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 change the size of the default CMA region, run
`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.c
    Copy 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-heap
    Copy to clipboard

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 that are supported by default on the Qualcomm
Linux distribution:

Table: Default supported heaps

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

### Use DMA-BUF heaps

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

include <stdio.h>
    include <stdlib.h>
    include <fcntl.h>
    include <errno.h>
    include <unistd.h>
    include <sys/ioctl.h>
    include <linux/dma-buf.h>
    #include <linux/dma-heap.h>
    
    define DMA_HEAP_NAME "system"
    define SZ_4 0x00000004  // to allocate a 4K buffer
    
    int main()
    {
    int fd, dma_buf_fd;
    
    struct dma_heap_allocation_data dma_alloc_data = {
       .len = SZ_4,
       .fd_flags = O_RDWR | O_CLOEXEC,
    };
    
    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, &dma_alloc_data);
    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;
    }
    
    if (close(dma_buf_fd)) {
       perror("close");
       return errno;
    }
    
    if (close(fd)) {
       perror("close");
       return errno;
    }
    
    return 0;
    }
    Copy to clipboard

## Scheduler

The scheduler decides the order in which the processes must run. The scheduler runs the processes from 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 completely fair scheduler (CFS) task wake-up balancing code. It uses the energy model (EM) of the CPUs 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

The Qualcomm SoCs have a heterogeneous CPU topology that’s 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 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_capacity<br>    Copy to clipboard | To get the capacity associated with each CPU in the system. |
> | cat /sys/devices/system/cpu/cpufreq/policy*/related_cpus<br>    Copy to clipboard | To get a list of the CPUs associated with each cluster in the system. |

For more information about 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

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

The PELT clock multiplier is 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 power and performance.

With lower half-life time, the CPU utilization of tasks is accumulated
faster. The tasks are placed on performance CPUs, thereby 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 time also affects how the task utilization ramps down. The UTIL EST feature provides faster ramp down.

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

### SchedUtil governor

The SchedUtil CPU frequency governor is the default governor in the Qualcomm
Linux kernel. 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 next to estimate
their energy consumption.

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

### Utilization clamping (UCLAMP)

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

UCLAMP allows the placement of tasks or task groups and allows 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, see [UCLAMP](https://www.kernel.org/doc/html/next/scheduler/sched-util-clamp.html).

## Dynamic voltage and frequency scaling (DVFS)

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

### CPU DVFS governors

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

Table: CPU DVFS variables

| Variable | Description | Path |
| --- | --- | --- |
| scaling_governor<br>    Copy to clipboard | Set the governor to performance. | echo performance > /sys/devices/system/cpu/cpufreq/policy*/scaling_governor<br>    Copy to clipboard |
| scaling_max_freq<br>    Copy to clipboard | Set the maximum frequency of the CPU cluster. | /sys/devices/system/cpu/cpufreq/policy*/scaling_max_freq<br>    Copy to clipboard |
| scaling_min_freq<br>    Copy to clipboard | Set the minimum frequency of the CPU cluster. | /sys/devices/system/cpu/cpufreq/policy*/scaling_min_freq<br>    Copy to clipboard |

For more information about `CPUfreq`, see [CPU frequency and voltage scaling code in the Linux(TM) kernel](https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt).

### Cache and memory DVFS governors

The static map DVFS governors align the CPU operating frequencies with the following:

- Level 3 cache (L3)
- Last level cache controller (LLCC)
- DDR RAM

If the CPU frequency is at the maximum level, 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 their maximum frequencies.

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.

Note

For Qualcomm SoCs, see the platform-specific DTSI files to get this information.

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

Last Published: Apr 10, 2025

[Previous Topic
Getting started with Qualcomm Linux kernel](https://docs.qualcomm.com/bundle/publicresource/80-70018-3/topics/getting_started_chapter2.md) [Next Topic
Enable virtualization](https://docs.qualcomm.com/bundle/publicresource/80-70018-3/topics/virtualization.md)