인텔® Stratix® 10 SoC FPGA 또는 인텔 Agilex® 7 SoC FPGA DMAC용 dmatest를 실행할 때 test_buf_size 더 큰 값으로 변경할 때 다음 오류가 발생할 수 있습니다( test_buf_size 기본값은 16KB입니다).
root@agilex:~# 에코 1 > /sys/module/dmatest/매개변수/실행
[149.931113] dmatest: 채널이 구성되지 않고 계속 진행됨
[149.937236] dmatest: dma0chan0을 사용하여 스레드 1개 추가
[149.942349] dmatest: dma0chan0을 사용하여 스레드 1개 시작
root@agilex:~# [149.963288] dma-pl330 ffda0000.pdma: swiotlb 버퍼가 가득 찼습니다(sz: 2097152 바이트), 총 32768(슬롯), 사용 1024(슬롯)
[149.974096] dma-pl330 ffda0000.pdma: 오버플로 0x00000003ebc00000+2097152 DMA 마스크 ffffffff 버스 마스크 0
[149.983622] ------------[여기 잘라내기]------------
근본 원인은 DMAC 330의 주소 폭이 32비트에 불과하다는 것입니다. SWIOTLB 기본 버퍼 크기는 DMAC 330이 전체 DDR 범위에 액세스하기에 충분하지 않습니다.
이 문제를 해결하려면 다음 솔루션 중 하나를 사용할 수 있습니다.
- 구성 Linux는 처음 2GB의 DDR만 사용합니다. DMAC는 32비트 폭 주소로 2GB 메모리 범위에 액세스할 수 있으므로 SWIOTLB 버퍼를 늘릴 필요가 없습니다.
- 커널 소스와 U-Boot 명령줄을 수정하여 SWIOTLB 버퍼를 더 크게 만듭니다.
/include/linux/swiotlb.h에서 IO_TLB_SEGSIZE 더 많은 수로 변경합니다(2의 전력이어야 합니다); 예를 들어, #define IO_TLB_SEGSIZE 1024
U-Boot 환경을 변경하여 사용자 정의 swiotlb 값을 추가합니다. 예를 들어 setenv bootargs earlycon 콘솔=ttyPS0,115200 swiotlb=32768