Skip to main content
Qualcomm® Linux kernel boot time spans from the first kernel log message to the first responsive user-space process. Reducing it requires profiling initcall overhead, enabling asynchronous driver probe, and eliminating unused compiled-in subsystems.

Measure boot time

Establish a baseline measurement before optimizing.

Add initcall_debug

Add initcall_debug to the kernel command line. The kernel prints a timestamped entry for every initcall and its duration:
[    1.243718] calling  clk_init+0x0/0x48 @ 1
[    1.243851] initcall clk_init+0x0/0x48 returned 0 after 127 usecs
Sort the slowest initcalls:
dmesg | grep "initcall.*after" \
      | sed 's/.*initcall \(.*\) returned.* after \([0-9]*\) usecs/\2 \1/' \
      | sort -rn | head -20
Generate a boot timeline SVG using scripts/bootgraph.pl from the kernel source tree:
dmesg | perl scripts/bootgraph.pl > boot.svg

Configure printk.time

Add printk.time=1 loglevel=4 to the kernel command line. This attaches microsecond timestamps to every printk message while suppressing informational output. On slow UARTs, this can reduce serial console overhead by 200–500 ms.

Run systemd-analyze

On systems running systemd, run after boot to see time spent in kernel, initrd, and user-space phases:
systemd-analyze
systemd-analyze blame
systemd-analyze critical-chain

Enable asynchronous probe

By default, the kernel probes platform devices sequentially. On Qualcomm SoCs, the probe chain for a single subsystem such as camera or display may involve dozens of dependent drivers running in series. Asynchronous probe allows independent drivers to probe in parallel across kernel threads.

Enable Kconfig

CONFIG_ASYNC_PROBE=y

Enable per driver

Drivers enable this feature by setting probe_type in the driver structure:
static struct platform_driver my_driver = {
    .driver = {
        .name           = "my-device",
        .of_match_table = my_dt_match,
        .probe_type     = PROBE_PREFER_ASYNCHRONOUS,
    },
    .probe  = my_probe,
    .remove = my_remove,
}

Enable via kernel command line

Force any driver to use asynchronous probing without modifying the source code by using the driver_async_probe parameter. Separate multiple driver names with commas.
driver_async_probe=qcom-smmu,qcom-cpufreq-hw,qcom-icc-bwmon

Configure deferred probe timeout

When a driver returns -EPROBE_DEFER because a dependency is not yet available, the kernel retries the probe. Set deferred_probe_timeout (in seconds) to emit a warning and continue booting if the device never resolves.
deferred_probe_timeout=10
To inspect pending deferred devices at runtime, use the following command:
cat /sys/kernel/debug/devices_deferred
Do not set deferred_probe_timeout to a value lower than the time required for slow firmware loads (such as modem, DSP, and WPSS subsystems). Setting it too low can cause the platform to boot with missing peripherals.

Disable unused subsystems

Unused compiled-in drivers add initcall overhead, even when the hardware is not present. Review the following Kconfig symbols for your target board and disable any drivers not listed in the bill of materials (BOM). Table: Kconfig symbols to review for boot time
SymbolNotes
CONFIG_USB_XHCI_HCDDisable if no USB 3.0 host controller is present on the BOM.
CONFIG_SOUNDDisable the entire ALSA (Advanced Linux Sound Architecture) tree if audio is handled by DSP firmware only.
CONFIG_DRM_*Disable display subsystems not populated such as HDMI (High-Definition Multimedia Interface), eDP (Embedded DisplayPort), DSI (Display Serial Interface).
CONFIG_CRYPTO_*Disable unused cipher suites; retain hardware crypto engine drivers.
CONFIG_NETFILTERDisable if no iptables or nftables support is required.
CONFIG_BTDisable if Bluetooth® is fully handled inside the WLAN co-processor firmware.
CONFIG_NFS_FSDisable if network file systems are not used.
CONFIG_DEBUG_*Disable all debug Kconfig symbols in production builds.
CONFIG_KALLSYMSConsider disabling for shipping images to reduce image size and boot time.
CONFIG_KPROBESDisable in production; adds a per-function trampoline overhead.
Use a board-specific configuration fragment rather than editing defconfig directly. In the Yocto workflow, add a .cfg fragment to the kernel bbappend:
# <layer>/recipes-kernel/linux/linux-qcom-base_%.bbappend
FILESEXTRAPATHS:prepend := "${THISDIR}/files:"
SRC_URI += "file://disable-unused.cfg"
Example contents of disable-unused.cfg:
# CONFIG_SOUND is not set
# CONFIG_USB_XHCI_HCD is not set

Optimize initramfs

The initramfs is decompressed and executed before the root file system mounts. A large initramfs adds both decompression time and storage I/O overhead.

Select a fast compression algorithm

On Cortex-A55 and Cortex-A78 cores, LZ4 decompresses much faster than gzip, but it produces a slightly larger image size:
CONFIG_RD_LZ4=y
# CONFIG_RD_GZIP is not set
# CONFIG_RD_XZ is not set

Reduce the package set

Edit meta-qcom/recipes-kernel/images/initramfs-qcom-image.bb to remove packages not required during early boot. Remove initramfs-module-copy-modules if all required drivers are compiled in (set to =y rather than =m). Ensure all initramfs binaries are stripped by setting the following in the Yocto configuration:
INHIBIT_PACKAGE_STRIP = "0"

Optimize Qualcomm remoteproc firmware loading

On QCS6490, IQ-9075, and related SoCs, the aDSP, cDSP, and WPSS subsystems load their firmware during device_initcall via the qcom_q6v5_pas driver. Each image is authenticated by TrustZone before the subsystem starts. The combined load time for all subsystems can exceed two seconds. If any firmware file is missing from /lib/firmware, the request_firmware() call times out after 60 seconds per subsystem, stalling boot entirely. Verify the firmware is staged correctly:
ls /lib/firmware/qcom/qcs6490/
# Expected: adsp.mdt, cdsp.mdt, wpss.mdt (and associated .bNN segments)
If WLAN or audio are not required during early boot, disable the corresponding remoteproc in the board device tree overlay and start it from user space after the critical path completes:
/* In board DTS overlay */
&remoteproc_wpss {
    status = "disabled";
};
Start it from user space when ready:
echo start > /sys/class/remoteproc/remoteproc2/state
For remoteproc driver configuration details, see Configure the RemoteProcessor (remoteproc) subsystems.

Kernel command line quick reference

The following parameters have a measurable impact on boot time: Table: Boot-time kernel command line parameters
ParameterEffect
quietSuppresses most kernel log messages; reduces serial I/O on slow UARTs by 200–500 ms.
loglevel=0Silences all printk output below KERN_EMERG. Use with quiet for maximum suppression.
initcall_debugEnables per-initcall timing. Use only for profiling, not production builds.
driver_async_probe=<list>Forces listed drivers into async probe mode.
deferred_probe_timeout=<s>Continues boot after this many seconds if deferred devices do not resolve.
cma=<size>Reduces CMA reservation when DSP or camera memory requirements are lower than the default.
audit=0Disables the Linux audit subsystem; reduces syscall overhead.