About this

This document describes the information about Xilinx Zynq UltraScale+ MPSOC U-Boot support. Core support is available in arch/arm/mach-zynqmp folder.

ZynqMP boards

  • zcu100 (ultra96 v1), zcu102, zcu104, zcu106 - Evaluation boards
  • zc1232 - Characterization boards
  • zcu111, zcu208, zcu216 - RFSOC evaluation boards
  • zcu1254, zcu1275, zcu1285 - RFSOC characterization boards
  • a2197 - System Controller on Versal boards
  • mini - Mini U-Boot running out of OCM
  • zc1751 - Characterization Processor boards
    • zc1751-xm015-dc1
    • zc1751-xm016-dc2
    • zc1751-xm017-dc3
    • zc1751-xm018-dc4
    • zc1751-xm019-dc5


Configure and build for zcu102 board:

$ source arm64 toolchain
$ export DEVICE_TREE=zynqmp-zcu102-revA
$ make xilinx_zynqmp_virt_defconfig
$ make

U-Boot SPL flow

For getting U-Boot SPL flow up and running it is necessary to do some additional steps because booting device requires external images which are not the part of U-Boot repository.

PMU firmware

The Platform Management Unit (PMU) RAM can be loaded with a firmware (PMU Firmware) at run-time and can be used to extend or customize the functionality of PMU. The PMU firmware is the part of boot image (boot.bin) and it is automatically loaded by BootROM. boot.bin can be directly generated by mkimage tool as the part of make. If you want to create boot.bin with PMU Firmware include please point CONFIG_PMUFW_INIT_FILE to PMU firmware binary. For example::


If you see below message you need to load PMU Firmware:

PMUFW is not found - Please load it!

The second external blob is PMU Configuration object which is object which is passed from U-Boot SPL to PMU Firmware for initial system configuration. PMU configuration object is the part of U-Boot SPL image. For pointing to this object please use CONFIG_ZYNQMP_SPL_PM_CFG_OBJ_FILE symbol. For example::


PMU configuration object

Object can be obtain in several ways. The easiest way is to take pm_cfg_obj.c from SDK/Vitis design and build it::

$ git clone https://github.com/Xilinx/embeddedsw.git
$ export EMBEDDED_SW=$PWD/embeddedsw
$ gcc -c pm_cfg_obj.c -I ${EMBEDDED_SW}/lib/bsp/standalone/src/common/ -I ${EMBEDDED_SW}/lib/sw_services/xilpm/src/zynqmp/client/common/
$ objcopy -O binary pm_cfg_obj.o pmu_obj.bin

The second way is to use tools/zynqmp_pm_cfg_obj_convert.py. For more information about this tool please run it with -h parameter.

The third way is to extract it from Xilinx FSBL elf file. Object is starting at XPm_ConfigObject symbol.

Arm Trusted Firmware (ATF)

U-Boot itself can run from EL3 to EL1. Without ATF U-Boot runs in EL3. Boot flow is U-Boot SPL->U-Boot in EL3. When ATF is used U-Boot normally runs in EL2. Boot flow is U-Boot SPL->ATF->U-Boot in EL2. As the part of build process u-boot.itb is generated. When BL31 shell variable is present u-boot.itb is generated with ATF included. You can point to it by::

$ export BL31=<path>/bl31.bin


SD Card

To write an image that boots from a SD card first create a FAT32 partition and a FAT32 filesystem on the SD card:

sudo fdisk /dev/sdx
sudo mkfs.vfat -F 32 /dev/sdx1

Mount the SD card and copy the SPL and U-Boot to the root directory of the SD card:

sudo mount -t vfat /dev/sdx1 /mnt
sudo cp spl/boot.bin /mnt
sudo cp u-boot.itb /mnt