Troubleshooting

Build failures

PetaLinux build fails with bitbake petalinux-image-minimal failed and sstate fetch errors

If a make petalinux TARGET=<target> run ends with errors like

ERROR: <package>-<ver>-r0 do_..._setscene: Fetcher failure: Unable to find file file://.../sstate:...
[ERROR] Command bitbake petalinux-image-minimal failed

the actual build is not broken. These _setscene errors come from bitbake trying to pull prebuilt artifacts from the public Xilinx sstate-cache mirror, which occasionally returns 404 for individual packages. Bitbake falls back to building those packages locally and succeeds, but still exits non-zero because of the failed fetches — so the Makefile stops before the petalinux-package step that produces BOOT.BIN.

Fix: just re-run the same command. The second attempt finds the missing packages in the local sstate cache (populated by the first run) and completes cleanly, producing BOOT.BIN. The reference design itself is fine; this is a transient issue with the public mirror.

General build issues

Check the following if the project fails to build or generate a bitstream:

  1. Are you using the correct version of Vivado for this version of the repository?
    This design is built for Vivado/Vitis/PetaLinux 2025.2. build.tcl checks the installed Vivado version and refuses to build with any other version. If you are using a different version of the tools, refer to the release tags to find a matching commit of the repository.

  2. Do you have the MRMAC license?
    The Versal Integrated MRMAC requires a (free, no-cost) license to generate a bitstream. If the implementation fails at device-image generation with a licensing error, obtain the MRMAC license from the AMD Xilinx Licensing site.

  3. Did you correctly follow the build instructions?
    Please check the build instructions carefully as you may have missed a step.

  4. Did you copy/clone the repo into a short directory structure?
    Windows doesn’t cope well with long directory structures, so copy/clone the repo into a short directory structure such as C:\projects\. When working in long directory structures, you can get errors relating to missing files.

PetaLinux / hardware issues

The MRMAC bring-up messages are in the kernel log. The single most useful diagnostic is:

dmesg | grep -iE "mrmac|axienet|si53|block lock|link|reset done"

A healthy port prints MRMAC setup at 10000 (link monitored) (25000 on the _25g targets), and — with a link partner connected — MRMAC link up at 10000.

A port reports GT TX Reset Done not achieved

xilinx_axienet 80010000.mrmac eth0: GT TX Reset Done not achieved (Status=0x0)

The port’s GT lane never came out of reset, which almost always means the GT reference clock is missing. The Si5328 on the FMC sources the reference clock (GBTCLK0) for all four lanes — check that the clk-si5324 driver probed and programmed it (item 3 above), and that the FMC is seated on the correct connector (FMCP1).

A port comes up at the wrong rate

xilinx_axienet 80010000.mrmac eth0: MRMAC setup at 25000

on a 10G build (or vice versa) means the device tree that was built into your image does not match the bitstream: the max-speed property set by the port-config overlay (ports-versal-0123 = 10000, ports-versal-0123-25g = 25000) selects the rate the driver programs. The hardware rate is fixed by the bitstream (the MRMAC preset and GT line rate), so a mismatched device tree leaves the port dead. Rebuild the PetaLinux project for the correct target.

A port fails to probe with -EBUSY / iormeap failed for the dma

xilinx_axienet 80050000.axi_mcdma: error -16: can't request region ... iormeap failed for the dma

The standalone xilinx_dma dmaengine driver grabbed the MCDMA register region before xilinx_axienet could. The port-config.dtsi overlay works around this by overriding the MCDMA node’s compatible to "xlnx,eth-dma" (see the Modifications layered on the stock BSP section of advanced). If you hit this, that override is missing from your device tree.

Echo server issues

  1. No response to ping. The echo server’s IP addresses are fixed: port N answers on 192.168.<(N+1)*10>.10 (port 0 = 192.168.10.10, port 1 = 192.168.20.10, etc.). The PC’s interface must have a static address on the matching subnet (e.g. 192.168.10.20/24 to reach port 0) and its NIC must run at the target’s fixed rate with auto-negotiation and FEC off, exactly as for the PetaLinux case above. Watch the UART output: the application prints port N: link UP when the port acquires block lock, and re-issues the port reset once per second while it is down.

  2. telnet does not connect. The echo server is a raw-Ethernet application with no TCP stack — it answers ARP, ICMP ping and UDP only. Use echo hello | nc -u 192.168.10.10 7 instead (any UDP port number works).