MediaTek Genio boot flow: from power-on to Linux
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.binin thebootloaderspartition. BL2 lives inmmc0boot0, loaded by the bootrom before the partition table is accessible. - Set
boot_confto 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 viafw_setenv. - U-Boot reads the fused chip ID at runtime and selects the correct DTB automatically via
UBOOT_CHIP_DTB_MAP— onefip.bincan 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
| Partition | Size | Purpose |
|---|---|---|
mmc0boot0 | — | BL2 (TF-A) |
mmc0boot1 | — | U-Boot environment + backup BL2 |
bootloaders | 4MB | fip.bin (BL31 + BL32 + BL33) |
bootloaders_b | 4MB | A/B backup of bootloaders |
kernel | 32MB | fitImage (kernel + DTB + DTBOs) |
rootfs | varies | Linux rootfs |
bootassets | 32MB | DTBs, overlays, board assets |
EFI | 100MB | EFI system partition (optional) |
misc | 1MB | A/B update state tracking |
dramk | 512KB | DRAM calibration data |
firmware | 32MB | SCP, SOF, PMIC firmware |
firmware_b | 32MB | A/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 displaydisplay-hdmi.dtbo— HDMI outputdisplay-dpoc.dtbo— DisplayPort over Type-C (required on Genio 520/720 — no HDMI on these SoCs)audio-sof.dtbo— SOF audio DSPcamera-imx214-csi0.dtbo— IMX214 on CSI0camera-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.
Written by
Andrés CamposCo-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