Fpga端使用pcie接口往arm cpu主动发起写DMA数据传输。
写数据的时候,ARM Linux报内存控制器错误。该错误最后定位的原因是iova地址不对,和arm linux实际申请的dma内存地址不匹配。
Fpga dma的目的地址是由dma_alloc_coherent函数申请获得的物理地址,
该物理地址和错误log中的iova=0xc001000不相等,并且存在一个偏移量。
尝试修改fpga dma地址,可以拼凑出和iova相等的情况,这个时候fpga发送的数据能正常写入到ARM的内存中。
下面两种内存申请方式,均会存在上述错误。
pd->readBuffer = dma_alloc_coherent(&pdev->dev, BUF_SIZE, &pd->readHWAddr, GFP_KERNEL );
pd->readHWAddr = pci_map_single(pdev, pd->readBuffer, BUF_SIZE, PCI_DMA_FROMDEVICE);
1. 使用dma_alloc_coherent返回的物理地址能否作为pcie传输地址?
2. 如果dma_alloc_coherent返回的地址不能作为pcie地址,那么内存的iova地址如何获得?
离线