# 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/--.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/-addons-.dtb \ " # Additional list of dtbos to be overlaid on top of base kernel devicetree files # Format - KERNEL_TECH_DTBOS[] = " ..." # 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"; }; 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/-.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
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
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
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 include include include include include include #include 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
Copy to clipboard | To get the capacity associated with each CPU in the system. | > | cat /sys/devices/system/cpu/cpufreq/policy*/related_cpus
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
Copy to clipboard | Set the governor to performance. | echo performance > /sys/devices/system/cpu/cpufreq/policy*/scaling_governor
Copy to clipboard | | scaling_max_freq
Copy to clipboard | Set the maximum frequency of the CPU cluster. | /sys/devices/system/cpu/cpufreq/policy*/scaling_max_freq
Copy to clipboard | | scaling_min_freq
Copy to clipboard | Set the minimum frequency of the CPU cluster. | /sys/devices/system/cpu/cpufreq/policy*/scaling_min_freq
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)