# Boot architecture

The boot architecture uses boot loaders and Board Support Package (BSP) images at each stage of boot.
The boot loaders manage each boot stage until the Linux Kernel and the applications are ready to run.

## Boot loader

The system runs the boot loader software when powered on, serving as an interface for loading the operating system and other required applications.

Qualcomm chipsets, including the ones supported by Qualcomm Linux, use a multistage boot process as follows:

<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="1100" height="164.636581420898438" viewbox="0 0 1100 164.636581420898438" aria-label="../../_images/boot-loader.svg">
  <g>
    <rect x=".50408935546875" y=".5035400390625" width="1098.99169921875" height="163.62890625" rx="7.560546874999999" ry="7.560546874999999" style="fill: #fafafa;"></rect>
    <path d="M1091.93572998046875,1.008026123046875c3.890869140625,0,7.0562744140625,3.165557861328125,7.0562744140625,7.056427001953125v148.507705688476562c0,3.890853881835938-3.1654052734375,7.056427001953125-7.0562744140625,7.056427001953125H8.064430236816406c-3.890861511230469,0-7.056434631347656-3.165573120117188-7.056434631347656-7.056427001953125V8.064453125c0-3.890869140625,3.165573120117188-7.056427001953125,7.056434631347656-7.056427001953125h1083.871299743652344M1091.93572998046875,0H8.064430236816406C3.610572814941406,0,0,3.610595703125,0,8.064453125v148.507705688476562c0,4.453857421875,3.610572814941406,8.064422607421875,8.064430236816406,8.064422607421875h1083.871299743652344c4.45367431640625,0,8.06427001953125-3.610565185546875,8.06427001953125-8.064422607421875V8.064453125c0-4.453857421875-3.610595703125-8.064453125-8.06427001953125-8.064453125h0Z" style="fill: #d2d7e1;"></path>
  </g>
  <rect x="572.681010060965491" y="15.120691330490445" width="233.41818552082259" height="134.395200455337545" rx="4.032175949496377" ry="4.032175949496377" style="fill: #6280cc;"></rect>
  <rect x="851.461175013617321" y="15.120691330490445" width="233.41818552082259" height="134.395200455337545" rx="4.032175949494558" ry="4.032175949494558" style="fill: #6280cc;"></rect>
  <rect x="15.120680155660011" y="15.120691330490445" width="233.418185520823499" height="134.395200455337545" rx="4.032175949495468" ry="4.032175949495468" style="fill: #6280cc;"></rect>
  <rect x="293.900845108313661" y="15.120691330490445" width="233.41818552082259" height="134.395200455337545" rx="4.032175949496377" ry="4.032175949496377" style="fill: #6280cc;"></rect>
  <g>
    <text transform="translate(57.74774169921875 47.1910400390625)" style="fill: #fff; font-family: Roboto-Bold, Roboto; font-size: 16px; font-weight: 700;"><tspan x="0" y="0">Primary Boot Loader</tspan><tspan x="53.85546875" y="19.2001953125">(PBL)</tspan></text>
    <text transform="translate(42.46649169921875 107.5172119140625)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 16px;"><tspan x="0" y="0">Establishes a secure RoT</tspan><tspan x="-.09375" y="19.2001953125">and Secure Boot Process</tspan></text>
  </g>
  <g>
    <text transform="translate(326.77801513671875 47.1910400390625)" style="fill: #fff; font-family: Roboto-Bold, Roboto; font-size: 16px; font-weight: 700;"><tspan x="0" y="0">eXtensible Boot Loader</tspan><tspan x="63.68359375" y="19.2001953125">(XBL)</tspan></text>
    <text transform="translate(345.66473388671875 107.5172119140625)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 16px;"><tspan x="0" y="0">Initializes memory</tspan><tspan x="26.0234375" y="19.2001953125">subsystem</tspan></text>
  </g>
  <g>
    <text transform="translate(624.44891357421875 37.5142822265625)" style="fill: #fff; font-family: Roboto-Bold, Roboto; font-size: 16px; font-weight: 700;"><tspan x="0" y="0">Unified Extensible</tspan><tspan x="-27.3203125" y="19.2001953125">Firmware Interface (UEFI)</tspan></text>
    <text transform="translate(589.26141357421875 97.8394775390625)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 16px;"><tspan x="0" y="0">Defines a software interface</tspan><tspan x="8.1484375" y="19.2001953125">between the Linux OS and</tspan><tspan x="35.94921875" y="38.400390625">platform firmware</tspan></text>
  </g>
  <g>
    <text transform="translate(884.32684326171875 47.1910400390625)" style="fill: #fff; font-family: Roboto-Bold, Roboto; font-size: 16px; font-weight: 700;"><tspan x="0" y="0">systemd-boot manager</tspan></text>
    <text transform="translate(896.95184326171875 107.5172119140625)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 16px;"><tspan x="0" y="0">Runs configured EFI</tspan><tspan x="45.0625" y="19.2001953125">images</tspan></text>
  </g>
  <g>
    <line x1="248.538864135742188" y1="82.31829833984375" x2="288.113677978515625" y2="82.31829833984375" style="fill: none; stroke: #000; stroke-miterlimit: 10; stroke-width: 1.008043987374px;"></line>
    <polygon points="286.937103271484375 86.339447021484375 293.900848388671875 82.31829833984375 286.937103271484375 78.297149658203125 286.937103271484375 86.339447021484375"></polygon>
  </g>
  <g>
    <line x1="527.31903076171875" y1="82.31829833984375" x2="566.89385986328125" y2="82.31829833984375" style="fill: none; stroke: #000; stroke-miterlimit: 10; stroke-width: 1.008043987374px;"></line>
    <polygon points="565.717254638671875 86.339447021484375 572.680999755859375 82.31829833984375 565.717254638671875 78.297149658203125 565.717254638671875 86.339447021484375"></polygon>
  </g>
  <g>
    <line x1="806.09918212890625" y1="82.31829833984375" x2="845.67401123046875" y2="82.31829833984375" style="fill: none; stroke: #000; stroke-miterlimit: 10; stroke-width: 1.008043987374px;"></line>
    <polygon points="844.4974365234375 86.339447021484375 851.461181640625 82.31829833984375 844.4974365234375 78.297149658203125 844.4974365234375 86.339447021484375"></polygon>
  </g>
</svg>

### Primary boot loader (PBL)

- Establishes a secure root-of-trust (RoT) and secure boot process for applications. For more information, see [Secure boot](https://docs.qualcomm.com/doc/80-70023-11/topic/features.html#secure-boot).
- Identifies the primary storage device and loads the secondary boot loader called the eXtensible Boot Loader (XBL).

    If the system encounters any recoverable error while loading the XBL image, the PBL enters the emergency download (EDL) mode. For more information about how to detect EDL mode, see [Enumeration of EDL device manager](https://docs.qualcomm.com/doc/80-70023-4/topic/edl-device-manager-enumeration.html#edl-device-manager-enumeration).
- Loads XBL segments into the boot SoC internal memory. For more
information about how PBL loads the XBL segments, see [APSS cold boot flow](https://docs.qualcomm.com/doc/80-70023-4/topic/bootloader-architecture.html#bootloader-architecture).

### eXtensible Boot Loader (XBL)

- Initializes the hardware, firmware images, CPU cache, MMU, boot
device, PMIC, and DDR.
- Sets up the RAM dump USB driver, USB charging, thermal
check, power management integrated circuit
([PMIC](https://docs.qualcomm.com/doc/80-70023-4/topic/pmic-developer-touchpoints.html)),
and low-power double data rate (LPDDR) clock functions.
- Collects the RAM dump over USB onto the host computer.
- Loads and verifies the Qualcomm^®^ Trusted Execution Environment (Qualcomm TEE), Qualcomm Hypervisor, and UEFI image.
- Provides the XBL configuration (`XBL_CFG`), which is part of the cold boot flow and includes PMIC and other driver settings.
- Provides XBL with a Qualcomm-signed ELF segment to initialize the
external protection units (xPU).
- XBL\_CFG is a standalone binary with platform-specific configurations and settings. The XBL uses the XBL\_CFG driver to load and configure the required settings. The driver uses the binary to provide on-demand read access to each setting of XBL\_CFG.

### Unified extensible firmware interface (UEFI)

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewbox="0 0 640 400" width="640" height="400" style="cursor:auto !important" aria-label="../../_images/Boot_QLI_videos_html.svg" class="align-center">
    <defs>
      <style>@import url("https://fonts.googleapis.com/css2?family=Roboto+Flex:opsz,wght@8..144,100..1000&amp;display=swap");
.svg-2 .bg-fill { fill: var(--color-background) }
.svg-2 .fill-text { color: var(--color-content); fill: var(--color-content) }
.svg-2 .video-hoverbox { transition: opacity 0.15s ease-in-out }
.svg-2 .video-hoverbox:hover { opacity: 0.9 }</style>
  </defs>

  <foreignobject x="0" y="0" width="640" height="400">
    <body xmlns="http://www.w3.org/1999/xhtml">
        <iframe width="640" height="400" src="https://players.brightcove.net/1414329538001/4JiZQnWhg_default/index.html?videoId=6362756918112" allowfullscreen="" allow="encrypted-media"></iframe>.
    <div class='topic-detail'><div class='topic-updated-date'><span> Last Published: </span>Dec 28, 2025</div><div class='prev-and-next-links'><span class='previous-topic-link'><span aria-hidden='true' class='disabled' data-tip='' data-effect='solid'></span></span></div></div></body>
    </foreignobject>
</svg>

UEFI is the software interface between an operating system (OS) and the platform firmware.

It includes data tables with platform information, along with the boot and runtime service calls that the OS and its loader can use. Together, they create a standard environment for booting an OS and running the UEFI applications.

Qualcomm uses Tianocore EDK-II, an open-source implementation available at
[http://www.tianocore.org/edk2/](https://github.com/tianocore/tianocore.github.io/wiki/EDK-II/), which follows the [UEFI
specification](https://uefi.org/specs/UEFI/2.10/).

The system offers the following build options:

- Retail build: Has minimal debug features and an optimal memory
footprint, making it ideal for production environments.
- Debug build: Ideal for development environments, with all debug
features enabled.

For developing a UEFI application, see [Unified Extensible Firmware Interface (UEFI)](https://docs.qualcomm.com/doc/80-70023-4/topic/develop-boot-public.html#develop-boot-public).

### systemd-boot OS manager

systemd-boot is a UEFI boot manager that executes configured EFI
images. It only supports systems with UEFI firmware and does the
following:

- Loads boot entry information from the EFI system partition (ESP),
mounted at `/efi`, `/boot`, or `/boot/efi` during the Linux OS
runtime and from the extended boot loader partition (XBOOTLDR)
(mounted to `/boot`).

    You must locate the configuration file fragments, kernels, initial RAM disk (initrd), and other EFI images within the ESP or XBOOTLDR.
- Reads simple and generic boot loader configuration files, and selects one file per boot loader entry. All the files are in the ESP
partition.

To ensure that the Qualcomm Linux Kernel can run as an EFI image, use the `CONFIG_EFI_STUB` compilation option.

## Next steps

- For EFI boot stub, see
[https://docs.kernel.org/admin-guide/efi-stub.html](https://docs.kernel.org/admin-guide/efi-stub.html).
- For a sample structure of the EFI partition, see [Systemd-boot in
Qualcomm Linux Yocto Guide](https://docs.qualcomm.com/doc/80-70022-27/topic/configure_and_secure_boot_with_systemd_boot_and_uki.html#efi-image).

Last Published: Dec 28, 2025

[Previous Topic
Boot overview](https://docs.qualcomm.com/bundle/publicresource/80-70023-4/topics/overview.md) [Next Topic
APSS cold boot flow](https://docs.qualcomm.com/bundle/publicresource/80-70023-4/topics/bootloader-architecture.md)