Ultra96용 Debian GNU/Linux에서 AXI I/F 데이터의 비트 폭 변경

7565 단어 FPGA리눅스zynqMP

소개



Zynq UltraScale+ MPSoC(ZynqMP)의 PS-PL Interface는 Fig.1과 같이 12개 있습니다. 그 중 10개는 데이터의 비트폭을 32bit, 64bit, 128bit에서 선택할 수 있습니다.



그림 1 ZynqMP의 PS-PL 인터페이스

이러한 AXI I/F 데이터의 비트폭의 변경은, 통상, PL측을 빌드할 때 지정해, 그것에 대응한 FSBL(First Stage Boot Loader)를 사용해 부트하는 것으로 행해집니다. 그러나, "Ultra96 용 데비안 GNU / Linux (v2018.2 버전) 부팅 이미지 제공"(@Qiita) 에서 소개한 것과 같은 범용의 FSBL 를 사용해 Linux 를 기동하고 나서 Device Tree Overlay 를 사용해 PL 측의 구성을 실시하는 경우에는 사용할 수 없습니다.

이 기사에서는 Device Tree를 사용하여 AXI I/F 데이터의 비트 폭을 변경하는 방법을 소개합니다.

자일링스 AFI 디바이스 드라이버



사실 Xilinx가 제공하는 Linux 배포판 (linux-xlnx)에는 ZynqMP AXI I/F 데이터 폭을 변경하는 장치 드라이버가 이미 있습니다. 이름은 xilinx-afi입니다.

소스 코드는 drivers/fpga/xilinx-afi.c입니다. menu config 등으로, CONFIG_XILINX_AFI=y 로 하는 것으로, 이 드라이버가 Linux Kernel 에 짜넣어집니다. "Ultra96 용 데비안 GNU / Linux (v2018.2 버전) 부팅 이미지 제공"(@Qiita) 에서 소개한 Linux Kernel 에는 이미 이 디바이스 드라이버가 짜넣어지고 있습니다.

xilinx-afi 드라이버를 사용하여 AXI 데이터 폭을 설정하려면 device tree에서 다음을 지정합니다.
    afi0: afi0 {
        compatible = "xlnx,afi-fpga";
        config-afi = <0 0>, <1 0>;
    };

device tree 에 어떠한 기술을 하는지는, linux-xlnk 의 Documentation/devicetree/bindings/fpga/xlnx,afi-fpga.txt 에 설명이 있습니다. 아래에 인용합니다.
Xilinx ZynqMp AFI interface Manager
The Zynq UltraScale+ MPSoC Processing System core provides access from PL
masters to PS internal peripherals, and memory through AXI FIFO interface
(AFI) interfaces.
Required properties:
-compatible:        Should contain "xlnx,afi-fpga"
-config-afi:        Pairs of  <regid value >
The possible values of regid and values are
 regid:     Regids of the register to be written possible values
        0- AFIFM0_RDCTRL
        1- AFIFM0_WRCTRL
        2- AFIFM1_RDCTRL
        3- AFIFM1_WRCTRL
        4- AFIFM2_RDCTRL
        5- AFIFM2_WRCTRL
        6- AFIFM3_RDCTRL
        7- AFIFM3_WRCTRL
        8- AFIFM4_RDCTRL
        9- AFIFM4_WRCTRL
        10- AFIFM5_RDCTRL
        11- AFIFM5_WRCTRL
        12- AFIFM6_RDCTRL
        13- AFIFM6_WRCTRL
        14- AFIFS
        15- AFIFS_SS2
- value:    Array of values to be written.
        for FM0_RDCTRL(0) the valid values-fabric width   2: 32-bit,1 : 64-bit ,0: 128-bit enabled
        for FM0_WRCTRL(1) the valid values-fabric width   2: 32-bit,1 : 64-bit ,0: 128-bit enabled
        for FM1_RDCTRL(2) the valid values-fabric width   2: 32-bit,1 : 64-bit ,0: 128-bit enabled
        for FM1_WRCTRL(3) the valid values-fabric width   2: 32-bit,1 : 64-bit ,0: 128-bit enabled
        for FM2_RDCTRL(4) the valid values-fabric width   2: 32-bit,1 : 64-bit ,0: 128-bit enabled
        for FM2_WRCTRL(5) the valid values-fabric width   2: 32-bit,1 : 64-bit ,0: 128-bit enabled
        for FM3_RDCTRL(6) the valid values-fabric width   2: 32-bit,1 : 64-bit ,0: 128-bit enabled
        for FM3_WRCTRL(7) the valid values-fabric width   2: 32-bit,1 : 64-bit ,0: 128-bit enabled
        for FM4_RDCTRL(8) the valid values-fabric width   2: 32-bit,1 : 64-bit ,0: 128-bit enabled
        for FM4_WRCTRL(9) the valid values-fabric width   2: 32-bit,1 : 64-bit ,0: 128-bit enabled
        for FM5_RDCTRL(10) the valid values-fabric width   2: 32-bit,1 : 64-bit ,0: 128-bit enabled
        for FM5_WRCTRL(11) the valid values-fabric width   2: 32-bit,1 : 64-bit ,0: 128-bit enabled
        for FM6_RDCTRL(12) the valid values-fabric width   2: 32-bit,1 : 64-bit ,0: 128-bit enabled
        for FM6_WRCTRL(13) the valid values-fabric width   2: 32-bit,1 : 64-bit ,0: 128-bit enabled
        for AFI_FA(14)
            dw_ss1_sel  bits (11:10)
            dw_ss0_sel  bits (9:8)
                0x0: 32-bit AXI data width),
                0x1: 64-bit AXI data width,
                0x2: 128-bit AXI data
        All other bits are 0 write ignored.
        for AFI_FA(15)  selects for ss2AXI data width valid values
                    0x000: 32-bit AXI data width),
                    0x100: 64-bit AXI data width,
                    0x200: 128-bit AXI data
Example:
afi0: afi0 {
    compatible = "xlnx,afi-fpga";
    config-afi = <0 2>, <1 1>, <2 1>;
};


자일링스 AFI 디바이스 트리의 regid 및 레지스터 대응



이전 섹션의 Documentation/devicetree/bindings/fpga/xlnx,afi-fpga.txt를 이해하기 어려운 것은 regid 설명입니다. 이것은 regid가 무엇을 의미하는지 모르겠습니다. 그래서 Linux Kernel 이나 Firmware 의 소스 코드를 쫓아 조사해 보았습니다. 그 때 발견된 regid 에 대응하는 ZynqMP Register Module 와 AXI I/F 를 다음 표에 나타냅니다.


regid
이름
Register
AXI I/F
value


모듈
Register


0
AFIFM0_RDCTRL
AFIFM0
RDCTRL
S_AXI_HPC0_FPD
2'b10: 32-bit 2'b01: 64-bit 2'b00: 128-bit


1
AFIFM0_WRCTRL
WRCTRL


2
AFIFM1_RDCTRL
AFIFM1
RDCTRL
S_AXI_HPC1_FPD


3
AFIFM1_WRCTRL
WRCTRL


4
AFIFM2_RDCTRL
AFIFM2
RDCTRL
S_AXI_HP0_FPD


5
AFIFM2_WRCTRL
WRCTRL


6
AFIFM3_RDCTRL
AFIFM3
RDCTRL
S_AXI_HP1_FPD


7
AFIFM3_WRCTRL
WRCTRL


8
AFIFM4_RDCTRL
AFIFM4
RDCTRL
S_AXI_HP2_FPD


9
AFIFM4_WRCTRL
WRCTRL


10
AFIFM5_RDCTRL
AFIFM5
RDCTRL
S_AXI_HP3_FPD


11
AFIFM5_WRCTRL
WRCTRL


12
AFIFM6_RDCTRL
AFIFM6
RDCTRL
S_AXI_LPD


13
AFIFM6_WRCTRL
WRCTRL


14
AFIFS
FPD_SLCR
afi_fs
SS0=M_AXI_HPM0_FPDSS1=M_AXI_HPM1_FPD
SS0_SEL bits[9:8]SS1_SEL bits[11:10] 2'b00: 32-bit 2'b01: 64-bit 2'b10: 128-bit


15
AFIFS_SS2
LPD_SLCR
afi_fs
SS2=M_AXI_HPM0_LPD
SS2_SEL bits[9:8] 2'b00: 32-bit 2'b01: 64-bit 2'b10: 128-bit


각 레지스터에 대한 자세한 내용은 Zynq UltraScale + Devices Register Reference를 참조하십시오. 이 문서는 다음 URL로 표시된 페이지를 보기 쉽고 좋다고 생각합니다.
  • htps //w w.ぃぃ x. 이 m / html_도 cs / 레기s rs / ug1087 / ug1087-zynq-ult 등 s ぇ-레기s rs. HTML

  • 다음은 장치 트리 오버레이를 사용하여 PL 구성과 동시에 S_AXI_HPC0_FPD 및 M_AXI_HPM0_FPD의 비트 폭을 128 비트로 설정하는 예입니다.
    /dts-v1/; /plugin/;
    / {
        fragment@0 {
            target-path = "/fpga-full";
            __overlay__ {
                firmware-name = "design_1_wrapper.bin";
            };
        };
        fragment@1 {
            target-path = "/amba_pl@0";
            __overlay__ {
                afi0 {
                    compatible    = "xlnx,afi-fpga";
                    config-afi    = <0 0>, <1 0>, <14 0x200>;
                };
            };
        };
    };
    

    좋은 웹페이지 즐겨찾기