Unified Guide for Versal Gen2 PL Loading and Yocto Integration
This page consolidates the PL deployment guidance for VEK385 into one place.
It covers two practical workflows:
Rapid development: quickly generate/copy
pl.dtsi/dtbo+PDIand load on target.Yocto integration: create a custom layer/machine integration that installs PL firmware in the image.
1. Rapid Development: Quickly Create & Transfer pl.dtsi/dtbo and PDI
A. Generate PL Artifacts (PDI, pl.dtsi, pl.dtbo)
Clone Example Hardware Repo
Use the official example or your custom design:git clone https://github.com/Xilinx/amd-yocto-hw-platforms.git -b xlnx_rel_v2025.2 cd amd-yocto-hw-platforms/eval_board_examples/vek385_bram_gpio_timerBuild the Design
make all JOBS=8 make gen_overlayThis generates:
pl.dtsi(Device Tree Source Include)pl.dtbo(Device Tree Overlay Binary)<design>_pld.pdi(Partial PDI)shell.json(for dfx-mgr)
Output directory:
<design>-fw/(e.g.,vek385_bram_gpio_timer-fw/)
Manual Flow (Vivado GUI/CLI)
Open base Vivado project.
Modify/add IP blocks as needed.
Ensure the golden
.ncrfile from the base project is included.Generate XSA, run SDTGen, and create the firmware bundle as described above.
References:
B. Transfer & Load on Target
Copy Firmware Bundle to Target
scp -r vek385_bram_gpio_timer-fw <user>@<target_ip>:/lib/firmware/xilinx/List Available Packages
sudo dfx-mgr-client -listPackageLoad the PL Firmware
sudo dfx-mgr-client -load vek385_bram_gpio_timer-fwThe PL is now loaded and device drivers are updated via the overlay.
Alternative: Using
fpga-utilsudo fpgautil -b /lib/firmware/xilinx/vek385_bram_gpio_timer-fw/vek385_bram_gpio_timer_pld.pdi -o /lib/firmware/xilinx/vek385_bram_gpio_timer-fw/pl.dtboUse
-f Partialfor partial reconfiguration if needed.
Use the Right Tool (and avoid mixed guidance)
Use this rule to remove ambiguity:
Use
fpgautilwhen you want direct, explicit loading of a flat/segmented PL payload (.pdi) and overlay (.dtbo) by path.Use
dfx-mgrwhen you need package discovery, slot-aware DFX accelerator load/unload, or daemon-managed runtime behavior.For VEK385 segmented configuration bring-up, start with
fpgautil. Move todfx-mgronly when you need managed DFX package operations.
2. Yocto Integration: Create a Layer for a Custom Machine (with PL Content)
A. Generate pl.dtsi with gen-machine-conf
Use the SDT handoff directory from Vivado/SDTGen:
gen-machine-conf parse-sdt --template <template-yaml> --hw-description <path-to-sdt-handoff-dir> -O <machine-override> --machine-name <machine-name>For segmented config: add
-g fullOutput:
pl.dtsimatching your hardware
References:
B. Create a Yocto Firmware Recipe
Create Layer and Recipe
bitbake-layers create-layer <path-to-meta-custom> bitbake-layers add-layer <path-to-meta-custom> mkdir -p <path-to-meta-custom>/recipes-firmware/<firmware-app>/files cp <your files> <path-to-meta-custom>/recipes-firmware/<firmware-app>/files/ recipetool create -o <path-to-meta-custom>/recipes-firmware/<firmware-app>/<firmware-app>.bb file://<path-to-meta-custom>/recipes-firmware/<firmware-app>/filesEdit the Recipe to Use
dfx_user_dts
Examplefirmware-app.bb:SUMMARY = "vek385 segmented PL firmware" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" inherit dfx_user_dts SRC_URI = " \ file://vek385_bram_gpio_timer_pld.pdi \ file://pl.dtsi \ file://pl.dtbo \ file://shell.json \ " COMPATIBLE_MACHINE:vek385 = "${MACHINE}"For segmented config,
shell.jsonis optional.For DFX, include
shell.json.
Content of shell.json
{
"shell_type": "XRT_FLAT",
"num_slots": "1"
}Steps to generate pl.dtbo
pl.dtsi will be generated in the build/conf/dts/${MACHINE}/pl-overlay-full by the gen_machineconf step above.
Convert pl.dtsi to pl.dtbo:
dtc -I dts -O dtb -o pl.dtbo pl.dtsiReferences:
https://raw.githubusercontent.com/Xilinx/meta-xilinx/rel-v2024.2/meta-xilinx-core/classes-recipe/dfx_user_dts.bbclass
Add to Image and Enable Overlay
Inlocal.conf:MACHINE_FEATURES += "fpga-overlay" IMAGE_INSTALL:append = " firmware-app fpga-manager-script"Build and Deploy
MACHINE=<machine-name> bitbake <image-name>The firmware will be installed to
/lib/firmware/xilinx/<firmware-app>/on the target.
C. Load PL from Yocto Image
Use
dfx-mgr-clientorfpgautilas above to load the PL and overlay.
3. Directory Structure & Key Files
Firmware Bundle Example:
vek385_bram_gpio_timer-fw/ ├── pl.dtbo ├── pl.dtsi ├── shell.json └── vek385_bram_gpio_timer_pld.pdiYocto Firmware Directory:
/lib/firmware/xilinx/<firmware-app>/ ├── pl.dtbo ├── pl.dtsi ├── shell.json └── <design>_pld.pdi
4. References & Further Reading
Summary Table
Use Case | Steps | Key Tools/Files |
|---|---|---|
Rapid Dev | Build with Makefile or Vivado, transfer to |
|
Yocto Layer | Generate | Same as above, plus Yocto recipe |