Ao executar o dmatest para DMAC em Intel® Stratix® 10 SoC FPGA ou Intel Agilex® 7 SoC FPGA, você pode encontrar o seguinte erro ao mudar o test_buf_size para um valor maior (o valor padrão do test_buf_size é de 16 KB):
root@agilex:~# eco 1 > /sys/module/dmatest/parâmetros/run
[ 149.931113] dmatest: sem canais configurados, continue com qualquer
[ 149.937236] dmatest: adicionado 1 threads usando dma0chan0
[ 149.942349] dmatest: Iniciado 1 threads usando dma0chan0
root@agilex:~# [149.963288] dma-pl330 ffda0000.pdma: buffer swiotlb está cheio (sz: 2097152 bytes), total de 32768 (slots), usado 1024 (slots)
[149.974096] dma-pl330 ffda0000.pdma: transbordamento 0x00000003ebc00000+2097152 de máscara DMA ffffffff bus mask 0
[149.983622] ------------[ corte aqui ]------------
A causa principal é que o DMAC 330 tem apenas 32 bits de largura de endereço; o tamanho padrão do buffer SWIOTLB não é suficiente para que o DMAC 330 acesse toda a gama de DDR.
Para resolver este problema, você pode usar uma das seguintes soluções:
- Configurar Linux para usar apenas os primeiros 2 GB de DDR; O DMAC pode acessar a faixa de memória de 2 GB com um endereço de largura de 32 bits, de modo que o buffer SWIOTLB não seja necessário para aumentar.
- Modifique a fonte do kernel e a linha de comando U-boot para tornar o buffer SWIOTLB maior:
Em /include/linux/swiotlb.h, mude de IO_TLB_SEGSIZE para um número maior (deve ser uma potência de2); por exemplo, #define IO_TLB_SEGSIZE 1024
Altere o ambiente U-boot para adicionar valor personalizado de swiotlb; por exemplo, setenv bootargs earlycon console=ttyPS0,115200 swiotlb=32768