Table of Contents

Introduction

The information on this page is specific to Zynq-7000 SoC devices.  The Zynq-7000 Programmable Logic (PL) can be programmed either using First Stage Boot-loader (FSBL), U-Boot or through Linux.
This page provides the details about programming the PL from Linux world.

References:
https://github.com/Xilinx/linux-xlnx/blob/master/Documentation/fpga/fpga-mgr.txt
https://github.com/Xilinx/linux-xlnx/blob/master/Documentation/devicetree/bindings/fpga/fpga-region.tx

HW IP Features

Features supported in the Driver

 

Missing Features, Known Issues and Limitations


NOTE:
The descriptions in subsequent sections refer to use of Device Tree Overlay (DTO) fragments with FPGA manager framework. It has to be noted that the generation of DTO fragments are not supported in official Xilinx Petalinux release. 
Below sections describe steps for manual creation of pl.dtsi (contains the DTO fragment) to be used along with Xilinx 2018.3 Linux.

Kernel Configuration

The following config options should be enabled in order to use FPGA Manager (In zynq_defconfig this options are enabled by default)

Zynq FPGA Manager Configuration:
Select: Device Drivers ---> FPGA Configuration Framework



DT overlay ConfigFS interface Configuration:
This is required only if the user is using to the Bitstream using DTO
Select: Device Drivers --> Device Tree and Open Firmware support

Contiguous Memory Allocator Configuration:

CONFIG_CMA

Select: Memory Management options ---> Contiguous Memory Allocator

CONFIG_DMA_CMA

Library routines--> DMA Contiguous Memory Allocator 



Device-tree

devcfg: devcfg@f8007000 {
        compatible = "xlnx,zynq-devcfg-1.0";
        interrupt-parent = <&&intc>;
        interrupts = <0 8 4>;
        reg = <0xf8007000 0x100>;
        clocks = <&&clkc 12>, <&&clkc 15>, <&&clkc 16>, <&&clkc 17>, <&&clkc 18>;
        clock-names = "ref_clk", "fclk0", "fclk1", "fclk2", "fclk3";
        syscon = <&&slcr>;
};
fpga_full: fpga-full {
       compatible = "fpga-region";
       fpga-mgr = <&&devcfg>;
       #address-cells = <2>;
       #size-cells = <2>;
};
Reference Link for device-tree bindings:
https://github.com/Xilinx/linux-xlnx/blob/master/Documentation/devicetree/bindings/fpga/fpga-region.txt

FPGA programming using Device Tree Overlay (DTO)

The Device Tree Overlay (DTO) is used to reprogram an FPGA while Linux is running. The DTO overlay will add the child node and the fragments from the .dtbo file to the base device tree,, The newly added device node/drivers will be probed after bitstream programming
DTO contains:

Steps for programming the bitstream using overlay: Refer
Steps to remove the drivers got added as part of DTO: Refer


Example:
//Device Tree Example: Full Reconfiguration without Bridges
// HSI Generated overlay/pl.dtsi file.
// Enable the axi-gpio interface
/dts-v1/;
/plugin/;
 
/ {
 
    fragment@0 {
 
        target = <&&fpga_full>;
        #address-cells = <1>;
        #size-cells = <1>;
 
        __overlay__ {
            #address-cells = <1>;
            #size-cells = <1>;
 
            firmware-name = "design_1_wrapper.bit.bin";
        };
    };
 
    fragment@1 {
 
                target = <&&amba>;
                __overlay__ {
                        axi_gpio_0: gpio@a0000000 {
                                #gpio-cells = <2>;
                                compatible = "xlnx,xps-gpio-1.00.a";
                                gpio-controller ;
                                reg = <0x0 0xa0000000 0x0 0x10000>;
                                xlnx,all-inputs = <0x0>;
                                xlnx,all-inputs-2 = <0x0>;
                                xlnx,all-outputs = <0x1>;
                                xlnx,all-outputs-2 = <0x0>;
                                xlnx,dout-default = <0x00000000>;
                                xlnx,dout-default-2 = <0x00000000>;
                                xlnx,gpio-width = <0x8>;
                                xlnx,gpio2-width = <0x20>;
                                xlnx,interrupt-present = <0x0>;
                                xlnx,is-dual = <0x0>;
                                xlnx,tri-default = <0xFFFFFFFF>;
                                xlnx,tri-default-2 = <0xFFFFFFFF>;
                        };
                };
        };
 
};

Tools Required

NOTE:

Images Required for testing


Generating .bin from .bit file using Bootgen
bootgen -image Full_Bitstream.bif -arch zynq -process_bitstream bin
Full_Bitstream.bif file should contains the below lines:
all:
{
        design_1_wrapper.bit /* Bitstream file name */
}

Required Steps to Create the DT-Overlay Fragment for the Given HDF
  1. Clone the device-tree-xlnx repo:
    git clone https://gitenterprise.xilinx.com/Linux/device-tree-xlnx.git


  2. Helper script: dt_overaly.tcl
    Command: xsct dt_overaly.tcl system.hdf ps7_cortexa9_0 device-tree-xlnx output_dir
    Example: xsct dt_overaly.tcl system.hdf ps7_cortexa9_0 ${DTS_REPO}/device-tree-xlnx overlay

The command will create the overlay file with the required DT-Overlay fragments (overlay/pl.dtsi)
// HSI Generated overlay/pl.dtsi file.
// Enable the axi-gpio interface
/dts-v1/;
/plugin/;
 
/ {
 
    fragment@0 {
 
        target = <&&fpga_full>;
        #address-cells = <1>;
        #size-cells = <1>;
 
        __overlay__ {
            #address-cells = <1>;
            #size-cells = <1>;
 
            firmware-name = "design_1_wrapper.bit.bin";
        };
    };
 
    fragment@1 {
 
                target = <&&amba>;
                __overlay__ {
                        axi_gpio_0: gpio@a0000000 {
                                #gpio-cells = <2>;
                                compatible = "xlnx,xps-gpio-1.00.a";
                                gpio-controller ;
                                reg = <0x0 0xa0000000 0x0 0x10000>;
                                xlnx,all-inputs = <0x0>;
                                xlnx,all-inputs-2 = <0x0>;
                                xlnx,all-outputs = <0x1>;
                                xlnx,all-outputs-2 = <0x0>;
                                xlnx,dout-default = <0x00000000>;
                                xlnx,dout-default-2 = <0x00000000>;
                                xlnx,gpio-width = <0x8>;
                                xlnx,gpio2-width = <0x20>;
                                xlnx,interrupt-present = <0x0>;
                                xlnx,is-dual = <0x0>;
                                xlnx,tri-default = <0xFFFFFFFF>;
                                xlnx,tri-default-2 = <0xFFFFFFFF>;
                        };
                };
        };
 
};
Compiling a Device Tree Overlay Blob (.dtbo) file from the pl.dts file.
dtc -O dtb -o pl.dtbo -b 0 -@ pl.dtsi
Example: ./scripts/dtc -O dtb -o pl.dtbo -b 0 -@ pl.dtsi
For more info about DTG please refer the below link
http://www.wiki.xilinx.com/Build%20Device%20Tree%20Blob

Test Procedure

Using Device Tree Overlay:

Steps to Load Full Bitstream
Once the Linux is up run the below commands to load the required Full Bitstream.
1) Set flags for Full Bitstream.

2) Copy the Full Bitstream (.bin) and pl.dtbo files into firmware folder

3) Apply DTBO (To add device nodes)

4) Steps to remove device nodes

Steps to Re-Load Full Bitstream
1) Remove The overlay file will be applied earlier.

2) Set flags for Full Bitstream.

3) Copy the Full Bitstream and pl.dtbo files into firmware folder

3) Apply DTBO

Expected Output Using DTBO

root@xilinx-zc702-2018_1:/configfs/device-tree/overlays# echo -n "pl.dtbo" > full/path
fpga_manager fpga0: writing zc702_wrapper.bit.bin to Xilinx Zynq FPGA Manager
XGpio: /amba/gpio@41200000: registered, base is 902
root@xilinx-zc702-2018_1:/configfs/device-tree/overlays#


Using sysfs interface

Once the linux is up run the below commands to load the Bitstream.
1)Set flags for Full Bitstream.

2) Loading Bitstream into PL.

Steps for programming the Encrypted Bitstream

1)Set flags for Encrypted Bitstream

2)Load the Bitstream

Expected Output Using Sysfs

root@Xilinx:~# mount /dev/mmcblk0p1 /media/
root@Xilinx:~#mkdir -p /lib/firmware
root@Xilinx:~# echo 0 > /sys/class/fpga_manager/fpga0/flags
root@Xilinx:~# cp /media/system_wrapper.bit.bin /lib/firmware/
root@Xilinx:~# echo system_wrapper.bit.bin > /sys/class/fpga_manager/fpga0/firmware
[  120.266851] fpga_manager fpga0: writing system_wrapper.bit.bin to Xilinx Zynq FPGA Manager
root@Xilinx:~# devmem 0xA0000000
0x00000000

Change Log

2021.2

2021.1

2020.2

Summary:

Commits:

2020.1

2019.2

2019.1

2018.3


2018.2

2018.1



Related Links

https://github.com/Xilinx/linux-xlnx/blob/master/drivers/fpga/zynq-fpga.c
For ZynqUS+ see Solution ZynqMP PL Programming