Diagram of the MediaTek Genio four-stage ARM Trusted Firmware boot chain from BL2 through Linux
mediatekgenioboot flowu-boottf-abspembedded linux

MediaTek Genio boot flow: from power-on to Linux

Andres Campos ·

MediaTek Genio follows the standard ARM Trusted Firmware boot architecture, but the exact layout — which partitions hold what, how device tree overlays are loaded, and how boot mode is selected — is specific to the Genio platform. Understanding it fully matters when you’re bringing up a custom carrier board or debugging a failed flash.

Key Insights

  • The boot chain is four stages: BL2 (TF-A, DRAM init) → BL31 (EL3 secure monitor, stays resident) → BL32 (OP-TEE) → BL33 (U-Boot, loads Linux).
  • BL31+BL32+BL33 are packaged as fip.bin in the bootloaders partition. BL2 lives in mmc0boot0, loaded by the bootrom before the partition table is accessible.
  • Set boot_conf to load device tree overlays — it accepts hash-delimited DTB/DTBO paths and can be set at Yocto build time, from the U-Boot shell, or from Linux via fw_setenv.
  • U-Boot reads the fused chip ID at runtime and selects the correct DTB automatically via UBOOT_CHIP_DTB_MAP — one fip.bin can cover Genio 720 and 520 on a shared carrier board.
  • External 12 kΩ strapping resistors are required on MT8391. Floating strapping pins cause random boot mode selection on every power cycle.

The four-stage Genio boot chain

Genio follows the standard ARM Trusted Firmware boot architecture. Each stage runs at a specific exception level:

Power-on

BL2 (TF-A) — mmc0boot0
    DRAM initialization, OP-TEE setup

BL31 (Trusted Firmware) — EL3, stays resident
    Secure monitor for system lifetime
    Handles all PSCI calls from Linux

BL32 (OP-TEE) — TrustZone EL1S
    Secure OS, Trusted Applications

BL33 (U-Boot) — EL1
    Loads fitImage, selects DTB via chip ID

Linux kernel — EL1

BL31 is important to understand: it stays resident at EL3 and handles every PSCI call from Linux — CPU hotplug, suspend/resume, power domain control. If your Linux system has power management issues on Genio, BL31 is worth checking.

The entire BL31+BL32+BL33 chain is packaged as fip.bin (4MB) in the bootloaders partition. BL2 lives in mmc0boot0, a separate boot area the bootrom loads before the main partition table is accessible.

Partition layout

PartitionSizePurpose
mmc0boot0BL2 (TF-A)
mmc0boot1U-Boot environment + backup BL2
bootloaders4MBfip.bin (BL31 + BL32 + BL33)
bootloaders_b4MBA/B backup of bootloaders
kernel32MBfitImage (kernel + DTB + DTBOs)
rootfsvariesLinux rootfs
bootassets32MBDTBs, overlays, board assets
EFI100MBEFI system partition (optional)
misc1MBA/B update state tracking
dramk512KBDRAM calibration data
firmware32MBSCP, SOF, PMIC firmware
firmware_b32MBA/B backup of firmware

A/B update covers the bootloaders and firmware partitions. The misc partition tracks which slot is active. A failed bootloader update can be recovered from the _b slot — a real advantage over single-copy bootloader designs.

How U-Boot selects the right DTB

U-Boot does runtime chip ID detection and selects the correct DTB from the fitImage automatically via UBOOT_CHIP_DTB_MAP:

UBOOT_CHIP_DTB_MAP = "mt8366:mediatek/mt8366-genio-360-evk.dtb \
                      mt8367:mediatek/mt8367-genio-360p-evk.dtb"

At boot, U-Boot reads the fused chip ID from hardware and picks the matching DTB. A single fip.bin and fitImage can cover multiple SoC variants on the same carrier board — useful for products supporting both MT8391 and MT8371 (Genio 720 and 520) on a common PCB.

Loading device tree overlays — boot_conf

DTBOs are loaded via the boot_conf U-Boot environment variable:

boot_conf=#conf-mediatek_mt8391-genio-720-evk.dtb#conf-display-dsi.dtbo#conf-camera-imx214-csi0.dtbo

Three ways to set this:

1. At Yocto build time:

KERNEL_DEVICETREE_OVERLAYS_AUTOLOAD += "display-dsi.dtbo"

2. From the U-Boot shell (persistent):

setenv boot_conf "#conf-mediatek_mt8391-genio-720-evk.dtb#conf-display-dsi.dtbo"
saveenv

3. From Linux (persistent, no U-Boot shell needed):

fw_setenv boot_conf "#conf-mediatek_mt8391-genio-720-evk.dtb#conf-display-dsi.dtbo"

fw_setenv modifies the U-Boot environment stored in mmc0boot1 — changes take effect on the next boot.

Available overlays on the Genio 720 EVK include:

  • display-dsi.dtbo — MIPI DSI display
  • display-hdmi.dtbo — HDMI output
  • display-dpoc.dtbo — DisplayPort over Type-C (required on Genio 520/720 — no HDMI on these SoCs)
  • audio-sof.dtbo — SOF audio DSP
  • camera-imx214-csi0.dtbo — IMX214 on CSI0
  • camera-lt6911uxe-csi0-std.dtbo — LT6911 HDMI-to-CSI serializer

Boot mode strapping on custom carrier boards

This is where carrier board bring-up often stalls. Genio latches the boot mode on the RESETB rising edge — whatever the strapping pins read at that instant is the boot mode for this power cycle.

External 12 kΩ pull-up or pull-down resistors are required. Floating strapping pins cause the SoC to read random logic levels and boot into unpredictable modes. The failure pattern: USB download mode on some power cycles, eMMC boot on others, with no obvious cause.

MT8391 (Genio 720) supports: eMMC, UFS, SD, SPI NOR, and USB download mode. The strapping combination determines which. Get the resistors in place before first power-on — debugging a floating strapping pin after assembly is a significant setback.

We cover additional carrier board hardware design gotchas in the Genio hardware design post. For any Genio BSP work from a custom carrier board, we handle this from schematic review through first boot at ProventusNova.

Frequently Asked Questions

What is the boot sequence on MediaTek Genio?

BL2 (TF-A) from mmc0boot0 initializes DRAM, BL31 sets up the EL3 secure monitor, BL32 (OP-TEE) runs the TrustZone secure OS, and BL33 (U-Boot) loads the fitImage and starts Linux.

How do I load a device tree overlay on MediaTek Genio?

Set the boot_conf U-Boot environment variable with hash-delimited DTB and DTBO paths. Set it at Yocto build time, from the U-Boot shell with setenv/saveenv, or from Linux with fw_setenv.

What does the Genio fitImage contain?

The fitImage (32MB kernel partition) contains the kernel binary, main board DTB, and any DTBOs. U-Boot selects the correct DTB at runtime from the chip ID via UBOOT_CHIP_DTB_MAP.

What is the boot mode strapping on MediaTek Genio?

Boot mode is latched from strapping pins on the RESETB rising edge. External 12 kΩ pull-up or pull-down resistors are required. Floating strapping pins produce random boot mode selection.

How does A/B update work on MediaTek Genio?

A/B update covers the bootloaders and firmware partitions. The 1MB misc partition tracks the active slot. Kernel and rootfs A/B operate independently.

MediaTek Genio Expert Support

Building on MediaTek Genio?

BSP bring-up, GStreamer pipelines, NeuroPilot integration — we've shipped it. Get unblocked fast. One call to scope it, fixed bid to deliver it.

Frequently Asked Questions

What is the boot sequence on MediaTek Genio?

Genio boots in four stages: BL2 (TF-A) loads from mmc0boot0 and initializes DRAM, BL31 sets up the secure monitor at EL3, BL32 (OP-TEE) runs the TrustZone secure OS, then BL33 (U-Boot) loads the fitImage from the kernel partition and hands off to Linux. The chain is bundled as fip.bin in the bootloaders partition.

How do I load a device tree overlay on MediaTek Genio?

Set the boot_conf U-Boot environment variable. Format: boot_conf=#conf-<board>.dtb#conf-<overlay1>.dtbo. You can set it three ways: in Yocto via KERNEL_DEVICETREE_OVERLAYS_AUTOLOAD, from the U-Boot shell with setenv/saveenv, or from Linux with fw_setenv. The U-Boot and Linux methods persist across reboots.

What does the Genio fitImage contain?

The fitImage is a packed image stored in the kernel partition (32MB). It contains the kernel binary, the main DTB for your board, and any DTBOs. U-Boot selects the right DTB at runtime based on the chip ID using UBOOT_CHIP_DTB_MAP — one fitImage can cover multiple SoC variants.

What is the boot mode strapping on MediaTek Genio?

Boot mode is determined by strapping pins latched on the RESETB rising edge. External 12 kΩ pull-up or pull-down resistors are required on MT8391. Floating strapping pins cause random boot mode behavior — the SoC enters USB download mode on some power cycles and eMMC boot on others.

How does A/B update work on MediaTek Genio?

A/B update covers the bootloaders and firmware partitions. The misc partition (1MB) tracks which slot is active. Kernel and rootfs A/B operate independently from the bootloader A/B.

Andrés Campos, Co-Founder & CTO at ProventusNova

Written by

Andrés Campos

Co-Founder & CTO · ProventusNova

8 years deep in embedded systems — from underwater ROVs to edge AI. Andrés leads every technical delivery personally.

Connect on LinkedIn