เมื่อใช้งาน dmatest for DMAC ใน FPGA SoC Intel® Stratix® 10 หรือ Intel Agilex® 7 SoC FPGA คุณอาจพบข้อผิดพลาดต่อไปนี้เมื่อเปลี่ยน test_buf_size เป็นค่าที่มากกว่า (ค่าเริ่มต้นของ test_buf_size คือ 16 KB):
root@agilex:~# echo 1 > /sys/module/dmatest/parameters/run
[ 149.931113] dmatest: ไม่มีการกําหนดค่าแชนเนล ดําเนินการต่อกับทุก
[ 149.937236] dmatest: เพิ่ม 1 เธรดโดยใช้ dma0chan0
[ 149.942349] dmatest: เริ่มต้น 1 เธรดโดยใช้ dma0chan0
root@agilex:~# [ 149.963288] dma-pl330 ffda0000.pdma: swiotlb buffer เต็ม (sz: 2097152 ไบต์), รวม 32768 (ช่อง), ใช้ 1024 (ช่องเสียบ)
[ 149.974096] dma-pl330 ffda0000.pdma: overflow 0x00000003ebc00000+2097152 ของมาสก์ DMA ffffff bus mask 0
[ 149.983622] ------------[ ตัดที่นี่ ]------------
สาเหตุหลักคือ DMAC 330 มีความกว้างของแอดเดรส 32 บิตเท่านั้น ขนาดบัฟเฟอร์เริ่มต้น SWIOTLB ไม่เพียงพอสําหรับ DMAC 330 ในการเข้าถึง DDR ทั้งช่วง
ในการแก้ไขปัญหานี้ คุณสามารถใช้หนึ่งในวิธีแก้ปัญหาต่อไปนี้:
- ตั้ง ค่า คอน ฟิก Linux เพื่อใช้ DDR 2 GB แรกเท่านั้น DMAC สามารถเข้าถึงช่วงหน่วยความจํา 2 GB ด้วยแอดเดรสที่มีความกว้าง 32 บิต จึงไม่จําเป็นต้องเพิ่มบัฟเฟอร์ SWIOTLB
- ปรับเปลี่ยน แหล่งเคอร์เนลและบรรทัดคําสั่ง U-boot เพื่อทําให้บัฟเฟอร์ SWIOTLB ใหญ่ขึ้น:
ใน /include/linux/swiotlb.h เปลี่ยน IO_TLB_SEGSIZE เป็นตัวเลขที่ใหญ่กว่า (ควรเป็นพลังของ 2) ตัวอย่างเช่น #define IO_TLB_SEGSIZE 1024
เปลี่ยนสภาพแวดล้อม U-boot เพื่อเพิ่มมูลค่า Swiotlb ที่กําหนดเอง ตัวอย่างเช่น setenv bootargs earlycon console=ttyPS0,115200 swiotlb=32768