Ultra96용 Debian GNU/Linux에서 AXI I/F 데이터의 비트 폭 변경
소개
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로 표시된 페이지를 보기 쉽고 좋다고 생각합니다.
사실 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로 표시된 페이지를 보기 쉽고 좋다고 생각합니다.
다음은 장치 트리 오버레이를 사용하여 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>;
};
};
};
};
Reference
이 문제에 관하여(Ultra96용 Debian GNU/Linux에서 AXI I/F 데이터의 비트 폭 변경), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ikwzm/items/a1ad7e22ed7c44940d88텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)