Operating System Integration and Development AMD ZynqMP™ device portfolio
This is a getting started guide providing walk through style examples using the AMD Embedded Development Framework (EDF). This sections covers Operating System Integration and Development - The full software build flow. For other personas and tasks see the parent pages.
Some of the prompts on this page use exact steps for specific boards. If your specific board is not mentioned you can look at the following information in order to verify your board is supported for the flow described here, and how to modify the examples for your specific board: Common Specifications | EDF prebuilt Yocto machine definitions
Table of Contents
Operating System Integration and Development
The operating system (OS) developer creates custom OS images based on application or system requirements. In the simplest case, it is a plain Linux image, in more complex scenarios this can involve hypervisors, containers, multiple OSes based on processing domains (For example, RTOS's and bare-metal components etc.) It also entails more low-level boot component like PMU, PLM and PSM firmware (AMD-specific), U-Boot, ARM TF-A, OPTEE etc.
The Yocto Project provides a build environment that allows users to create custom, complex, heterogenous boot and OS images. Note: at this stage basic to advanced Yocto knowledge is required depending on the task you want to perform.
Yocto Project™ build setup instructions for EDF
This section describes how to get your build host ready to work with EDF meta layers and the required upstream layers.
Pre-requisites: See Preparing Build Host documentation.
Configure the git settings before you run the repo commands.
$ git config --global user.email "you@example.com" $ git config --global user.name "Your Name"Make sure build host shell is bash not csh or dash.
A basic understanding of the Yocto build system is assumed - please consult the documentation for further information https://docs.yoctoproject.org/
Download and install the Repo tool (if it was not installed in a previous step) - note that if you have repo installed through a package manager, that should be removed first as it is likely out of date and will cause issues.
$ curl https://storage.googleapis.com/git-repo-downloads/repo > repo $ chmod a+x repo $ mv repo ~/bin/ $ PATH=~/bin:$PATH $ repo --helpInitialize a Repo client.
Create the edf project directory.
$ mkdir -p yocto/edf $ cd yocto/edfClone the Yocto meta layer source using the yocto manifest as show below. A successful initialization will end with a message stating that Repo is initialized in your working directory. Your directory should now contain a .repo directory where repo control files such as the manifest are stored but you should not need to touch this directory. To learn more about repo, look at
Repo command reference | Android Open Source Project
$ repo init -u https://github.com/Xilinx/yocto-manifests.git -b rel-v2025.2 -m default-edf.xml
Fetch all the repositories.
$ repo syncStart a branch with for development starting from the revision specified in the manifest. This is an optional step.
$ repo start <branch_name> --allInitialize a build environment using the edf-init-build-env script. Once the environment is initialized, bblayers.conf and local.conf are set from the meta-amd-edf layer default templates.
$ source edf-init-build-envIf you are building without network access, follow the below steps (otherwise skip this step):
Extract the downloads and sstate tarball files to ${TOPDIR}/build directory:
$ tar -xf downloads.tar.gz -C <path-to>/yocto/edf/build $ tar -xf sstate-cache.tar.gz -C <path-to>/yocto/edf/buildAdjust the download (SOURCE_MIRROR_URL) and sstate (SSTATE_MIRRORS) mirrors variables by editing build/conf/local.conf to point to local paths as shown below. Note:
INHERIT += "own-mirrors"is already included in the local.conf file.SOURCE_MIRROR_URL = "file:///<path-to>/yocto/edf/build/downloads" SSTATE_MIRRORS = "\ file://.* file:///<path-to>/yocto/edf/build/sstate-cache/PATH \n \ "Set the BB_NO_NETWORK variable in build/conf/local.conf
BB_NO_NETWORK = "1" PREMIRRORS:append = ""
For an NFS build host system, modify the build/conf/local.conf and add the TMPDIR path as shown below. On local storage $TMPDIR will be set to build/tmp.
TMPDIR = "/tmp/<user-name>/yocto/release_version/build"Depending on the build configuration, several 10s of GB of storage space might be required in the TMPDIR. Make sure you have plenty of storage space available. Alternatively, to save disk space, you can add the below to your build/conf/local.conf. This option removes the work dir after build and only keeps the logs.
INHERIT += "rm_work"In the following sections we will use the build environment set up in this section.
EDF Linux® disk image build using a prebuilt Yocto Project machine and pre-built Vivado artifacts (BIT) - SDCARD boot
Boot Architecture Common Specifications | Boot Architecture for AMD Evaluation boards
Evaluation boards and default boot modes AMD Embedded Development Framework (EDF) | Packaged BSP for AMD evaluation boards
Build Yocto pre-requisites by following Operating System Integration and Development AMD ZynqMP™ device portfolio | Yocto Project™ build setup instructions for EDF
Build the Boot.bin image for the board.
See Common Specifications | EDF prebuilt Yocto machine definitions for the list of pre-built machines that support generating a boot.bin file.
xilinx-bootbin-recipe
# Syntax: $ MACHINE=<machine-name> bitbake xilinx-bootbin # Example Usage for ZCU104: $ MACHINE=zynqmp-zcu104-sdt-full bitbake xilinx-bootbin
Build EDF Common disk images containing EDF Linux® OS (wic).
See Common Specifications | EDF Common disk images containing EDF Linux® OS Yocto machine definitions an... for Yocto machine definitions and supported recipes
An example is shown below for amd-cortexa53-mali-common (ZynqMP family)
linux-image-recipe
# Syntax: $ MACHINE=<machine-name> bitbake edf-linux-disk-image #Example Usage for ZynqMP $ MACHINE=amd-cortexa53-mali-common bitbake edf-linux-disk-image
Combine the xilinx-bootbin and EDF Common disk images to make single SD card image (boot.bin, kernel, rootfs, boot script), by adding the boot.bin to the EFI partition in the WIC Image (Partition 0 = index 1 in the WIC)
The WIC tools are available from within the Yocto build environment, but you may need to install additional packages (not included in the Yocto setup)
wic uses mcopy which is provided by the mtools package on Canonical Ubuntu - sudo apt install mtools
#help for wic
$ wic help
#list the partition map of the .wic file
$ wic ls tmp/deploy/images/amd-cortexa53-mali-common/edf-linux-disk-image-amd-cortexa53-mali-common.rootfs.wic
Num Start End Size Fstype
1 16384 536887295 536870912 fat32
2 536887296 1073758207 536870912 ext4
3 1073758208 7516209151 6442450944 ext4
4 7516209152 8589950975 1073741824 fat32
#show the content of the efi partition
$ wic ls tmp/deploy/images/amd-cortexa53-mali-common/edf-linux-disk-image-amd-cortexa53-mali-common.rootfs.wic:1
Volume in drive : is esp
Volume Serial Number is 0B04-E4DA
Directory for ::/
No files
535 797 760 bytes free
# Copy the boot.bin into the efi partition of the wic image
$ wic cp \
tmp/deploy/images/zynqmp-zcu104-sdt-full/boot.bin \
tmp/deploy/images/amd-cortexa53-mali-common/edf-linux-disk-image-amd-cortexa53-mali-common.rootfs.wic:1
#Check the content of the wic
$ wic ls tmp/deploy/images/amd-cortexa53-mali-common/edf-linux-disk-image-amd-cortexa53-mali-common.rootfs.wic:1
Volume in drive : is esp
Volume Serial Number is 0B04-E4DA
Directory for ::/
boot bin 1850460 2025-11-24 10:03
1 file 1 850 460 bytes
533 946 368 bytes freeFlashing the SD card
The generated image now needs to be flashed to the SD card.
Follow the instructions from here: Discovery and Evaluation AMD ZynqMP™ device portfolio | Writing the EDF Linux® disk image (wic) to the boot media : SD card
Once the flashing completes, safely remove the SD card and insert it into the SD card slot of the board.
Boot the board as described in Discovery and Evaluation AMD ZynqMP™ device portfolio | How to boot a board using the pre built Images : Single stage boot SD mode Se...
Default username 'amd-edf'
Building Images for QEMU
Note: The below set of instructions are for a ZCU104 based board design. For other Zynq boards, use the appropriate board names.
Set up the build environment and Yocto Project™ pre-requisites by following Yocto Project build setup instructions for EDF
Build the Boot.bin image.
See Common Specifications | EDF prebuilt Yocto machine definitions for the list of pre-built machines that support generating a boot.bin file.
xilinx-bootbin-recipe
# Syntax: $ MACHINE=<machine-name> bitbake xilinx-bootbin # Example Usage for ZCU104: $ MACHINE=zynqmp-zcu104-sdt-full bitbake xilinx-bootbin
Build the qemu-helper-native package to set up QEMU network tap devices
qemu-helper-native (for ZCU104):# Syntax: $ MACHINE=<machine-name> bitbake qemu-helper-native # Example Usage for ZCU104: $ MACHINE=amd-cortexa53-mali-common bitbake qemu-helper-native
a. If user does not have sudo permissions on build host you can skip step 2 and 3.
b. Use the slirp option if you do not have sudo permissions and tap devices are not enabled on your build host.
Manually configure a tap interface for your build system. As root run <path-to>/sources/poky/scripts/runqemu-gen-tapdevs, which should generate a list of tap devices. Once the tap interfaces are successfully created, you should be able to see all of the interfaces by running the ifconfig or ip a command.
$ sudo ./<path-to-layer>/poky/scripts/runqemu-gen-tapdevs $(id -u $USER) $(id -g $USER) 4Combine the xilinx-bootbin and qemu helper native images to make single wic.qemu-sd (boot.bin, kernel, rootfs, boot script), by adding the boot.bin to the EFI partition in the WIC Image (Partition 0 = index 1 in the WIC)
The WIC tools are available from within the Yocto build environment, but you may need to install additional packages (not included in the Yocto setup)
wic uses mcopy which is provided by the mtools package on Canonical Ubuntu - sudo apt install mtools
#help for wic
$ wic help
#list the partition map of the .wic file
$ wic ls tmp/deploy/images/amd-cortexa53-mali-common/edf-linux-disk-image-amd-cortexa53-mali-common.rootfs.wic
Num Start End Size Fstype
1 16384 536887295 536870912 fat32
2 536887296 1073758207 536870912 ext4
3 1073758208 7516209151 6442450944 ext4
4 7516209152 8589950975 1073741824 fat32
#show the content of the efi partition
$ wic ls tmp/deploy/images/amd-cortexa53-mali-common/edf-linux-disk-image-amd-cortexa53-mali-common.rootfs.wic:1
Volume in drive : is esp
Volume Serial Number is 0B04-E4DA
Directory for ::/
No files
535 797 760 bytes free
# Copy the boot.bin into the efi partition of the wic image
$ wic cp \
tmp/deploy/images/zynqmp-zcu104-sdt-full/boot.bin \
tmp/deploy/images/amd-cortexa53-mali-common/edf-linux-disk-image-amd-cortexa53-mali-common.rootfs.wic:1
#Check the content of the wic
$ wic ls tmp/deploy/images/amd-cortexa53-mali-common/edf-linux-disk-image-amd-cortexa53-mali-common.rootfs.wic:1
Volume in drive : is esp
Volume Serial Number is 0B04-E4DA
Directory for ::/
boot bin 1850460 2025-11-24 10:03
1 file 1 850 460 bytes
533 946 368 bytes freeNow you can simulate the image using QEMU emulator.
Note: To terminate QEMU, usually the command is <Ctrl+A> followed by <X>
Create a directory under ${DEPLOY_DIR}/images (tmp/deploy/images) and copy the board and common images to this new directory.
$ mkdir -p tmp/deploy/images/zcu104-common-qemu-images $ cp -r ./tmp/deploy/images/amd-cortexa53-mali-common/* tmp/deploy/images/zcu104-common-qemu-images/ $ cp -r ./tmp/deploy/images/zynqmp-zcu104-sdt-full/* tmp/deploy/images/zcu104-common-qemu-images/Merge the BOOT-zynqmp-zcu104-sdt-full board and edf-linux-disk-image-zynqmp-zcu104-sdt-full qemuboot files and generate a new combined qemuboot.conf file using qemuboot-tool.
$ ../sources/meta-xilinx/meta-xilinx-core/scripts/qemuboot-tool \ load tmp/deploy/images/zcu104-common-qemu-images/BOOT-zynqmp-zcu104-sdt-full.qemuboot.conf \ remove image_link_name \ remove image_name \ merge tmp/deploy/images/zcu104-common-qemu-images/edf-linux-disk-image-zynqmp-zcu104-sdt-full.rootfs.qemuboot.conf \ > tmp/deploy/images/zcu104-common-qemu-images/zcu104-common-combined.qemuboot.confAfter successfully creation of the combined qemuboot.conf file, the content of the tmp/deploy/images/zcu104-common-qemu-images/zcu104-common-combined.qemuboot.conf should look like the following.
zcu104-common-combined.qemuboot.conf:
$ cat tmp/deploy/images/zcu104-common-qemu-images/zcu104-common-combined.qemuboot.conf [config_bsp] deploy_dir_image = . image_link_name = edf-linux-disk-image-amd-cortexa53-mali-common.rootfs image_name = edf-linux-disk-image-amd-cortexa53-mali-common.rootfs-20251121234700 kernel_imagetype = Image machine = zynqmp-zcu104-sdt-full qb_cmdline_ip_slirp = ip=dhcp qb_cmdline_ip_tap = ip=192.168.7.@CLIENT@::192.168.7.@GATEWAY@:255.255.255.0::eth0:off:8.8.8.8 net.ifnames=0 qb_default_fstype = wic.qemu-sd qb_default_kernel = BOOT-zynqmp-zcu104-sdt-full.bin qb_drive_type = /dev/sd qb_dtb = qemu-hw-devicetrees/multiarch/board-zynqmp-zcu104.dtb qb_graphics = qb_kernel_cmdline = none qb_kernel_cmdline_append = swiotlb=0 qb_machine = -machine arm-generic-fdt qb_mem = -m 4G qb_network_device = -net nic -net nic -net nic -net nic,netdev=net0,macaddr=@MAC@ qb_nfsrootfs_extra_opt = qb_no_pni = net.ifnames=0 qb_opt_append = -nodefaults -global xlnx,zynqmp-boot.cpu-num=0 -global xlnx,zynqmp-boot.use-pmufw=true -device loader,addr=0xfffc0000,data=0x584c4e5801000000,data-be=true,data-len=8 -device loader,addr=0xfffc0008,data=0x0000000800000000,data-be=true,data-len=8 -device loader,addr=0xfffc0010,data=0x1000000000000000,data-be=true,data-len=8 -device loader,addr=0xffd80048,data=0xfffc0000,data-len=4,attrs-secure=on -device loader,file=@DEPLOY_DIR_IMAGE@/arm-trusted-firmware.elf,cpu-num=0 -device loader,file=@DEPLOY_DIR_IMAGE@/u-boot.elf -device loader,file=@DEPLOY_DIR_IMAGE@/system.dtb,addr=0x100000,force-raw=on -boot mode=5 -pmu-args ' -M microblaze-fdt -display none -hw-dtb @DEPLOY_DIR_IMAGE@/qemu-hw-devicetrees/multiarch/zynqmp-pmu.dtb -kernel @DEPLOY_DIR_IMAGE@/pmu-rom.elf -device loader,file=@DEPLOY_DIR_IMAGE@/pmu-firmware-zynqmp-zcu104-sdt-full.elf -device loader,addr=0xfd1a0074,data=0x1011003,data-len=4 -device loader,addr=0xfd1a007C,data=0x1010f03,data-len=4 ' qb_rng = qb_rootfs = qb_rootfs_extra_opt = qb_rootfs_opt = -drive if=sd,index=1,file=@ROOTFS@,format=raw qb_serial_opt = qb_smp = qb_system_name = qemu-system-aarch64-multiarch serial_consoles = 115200;ttyPS0 115200;ttyPS1 staging_bindir_native = ../../../work/x86_64-linux/qemu-helper-native/1.0/recipe-sysroot-native/usr/bin staging_dir_host = ../../../work/zynqmp_zcu104_sdt_full-amd-linux/xilinx-bootbin/1.0/recipe-sysroot staging_dir_native = ../../../work/zynqmp_zcu104_sdt_full-amd-linux/xilinx-bootbin/1.0/recipe-sysroot-native tune_arch = aarch64 uninative_loader = ../../../sysroots-uninative/x86_64-linux/lib/ld-linux-x86-64.so.2Launch the QEMU boot instance by executing the runqemu script.
$ runqemu tmp/deploy/images/zcu104-common-qemu-images/zcu104-common-combined.qemuboot.conf nographic slirpQemu Boot Log:
Upon first boot, Linux requires a password to be set for the default user account.
AMD EDF 25.05 - AMD Vivado™ Design Suite 2025.1
Default username 'amd-edf'
Building an SDK for application cross-development
A pre-built SDK for Linux application cross-development is provided. See Getting Started - Walkthrough Examples | Software Application Development using SDK for instructions on how to use it. An SDK is not extensible; if a user wants to enable additional dev tools or dev packages in the SDK, a new SDK has to be built and installed. The following tutorial shows how to modify and build a new EDF Linux® SDK.
Set up the build environment and Yocto Project™ pre-requisites by following https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/3268149250/Operating+System+Integration+and+Development+AMD+ZynqMP+device+portfolio#EDF-Yocto-Project%E2%84%A2-build-setup-instructions
The SDK recipe can be found in sources/meta-amd-edf/recipes-core/meta/meta-edf-app-sdk.bb
This recipe can be modified to contain additional recipes as required - append the recipes to the TOOLCHAIN_TARGET_TASK list
Build SDK for application development.
sdk-build:
$ MACHINE=amd-cortexa53-mali-common bitbake meta-edf-app-sdk $ ls tmp/deploy/amd-cortexa53-mali-common/installer/*.sh tmp/deploy/sdk/amd-edf-glibc-x86_64-meta-edf-app-sdk-cortexa72-cortexa53-amd-cortexa53-mali-common-toolchain-25.11+development-027ae3f30fdccfa8b8043955821a11c6286cd66e.shSee https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/3258089893/Software+Application+Development#SDK-installation for information on installing the generated SDK and for cross-building an example hello world application.
Related Links
Trademarks
Yocto Project and all related marks and logos are trademarks of The Linux Foundation. This website is not, in any way, endorsed by the Yocto Project or The Linux Foundation.
Linux® is the registered trademark of Linus Torvalds in the U.S. and other countries.
© 2025 Advanced Micro Devices, Inc. Privacy Policy