您尚未登录。

楼主 # 2023-04-21 15:40:30

tom
会员
注册时间: 2018-03-14
已发帖子: 128
积分: 127.5

linux内存IOVA地址获取

功能描述

Fpga端使用pcie接口往arm cpu主动发起写DMA数据传输。

错误现象

写数据的时候,ARM Linux报内存控制器错误。该错误最后定位的原因是iova地址不对,和arm linux实际申请的dma内存地址不匹配。
iova-error.png

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地址如何获得?

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn