使用dma_mapping_error() 检查从 dma_map_single() 和 dma_map_page() 返回的 dma_addr_t: dma_addr_t dma_handle; dma_handle = dma_map_single(dev, addr, size, direction); if (dma_mapping_error(dev, dma_handle)) { /* * reduce current DMA mapping usage, * delay and try again ...
该API只能用于映射设备MMIO资源,不允许映射RAM。 dma_mapping_error intdma_mapping_error(structdevice *dev,dma_addr_tdma_addr) 在某些情况下,dma_map_single()、dma_map_page()和dma_map_resource()将无法创建映射。驱动程序可以通过使用dma_mapping_error()测试返回的DMA地址来检查这些错误。非零返回值表示无...
You should call dma_mapping_error() as dma_map_single() could fail and return error. Doing so will ensure that the mapping code will work correctly on all DMA implementations without any dependency on the specifics of the underlying implementation. Using the returned address without checking for...
需要注意,dma_map_single的返回值需要通过dma_mapping_error的检测,如果不检测直接使用返回值dma_handle,可能会导致data corruption从而使系统panic,这种问题很难定位。解映射 dma_unmap_single 一般发生在DMA传输结束后给CPU发送的中断处理函数中。 使用dma_map_signal接口有一个问题:无法映射高端内存。因此另一个以pag...
Cannotsetup DMA mapping, error 17, ignored rte_vhost_user.c: 763:vhost_session_mem_register:*INFO*: Registering VM memoryforvtophys translation - 0x7fa2dbc00000 len:0x1c2c400000 memory.c: 801:_vfio_iommu_map_dma:*NOTICE*: Cannotsetup DMA mapping, error 17, ignored rte_vhost_user.c: ...
首先,确保引入dma-mapping.h头文件 代码语言:javascript 代码运行次数:0 复制 Cloud Studio代码运行 #include<linux/dma-mapping.h> 在您的驱动程序中,以上头文件提供了 dma_addr_t 的定义。 此类型可以保存平台的任何有效 DMA 地址,并且应该在保存从 DMA 映射函数返回的 DMA 地址的任何地方使用。
如果驱动是通过伙伴系统的接口(例如__get_free_page*())或者类似kmalloc() or kmem_cache_alloc()这样的通用内存分配的接口来分配DMA buffer,那么这些接口函数返回的虚拟地址可以直接用于DMA mapping接口API,并通过DMA操作在外设和dma buffer中交换数据。
device=__iommu_sync_sg_for_device,.map_resource=iommu_dma_map_resource,.unmap_resource=iommu_dma_unmap_resource,.mapping_error=iommu_dma_mapping_error,}; 非iommu的话即调用__dma_alloc: 代码语言:javascript 复制 staticvoid*__dma_alloc(struct device*dev,size_t size,dma_addr_t*dma_handle,gfp...
device=__iommu_sync_sg_for_device,.map_resource=iommu_dma_map_resource,.unmap_resource=iommu_dma_unmap_resource,.mapping_error=iommu_dma_mapping_error,}; 非iommu的话即调用__dma_alloc: 代码语言:javascript 复制 staticvoid*__dma_alloc(struct device*dev,size_t size,dma_addr_t*dma_handle,gfp...
.mapping_error = __swiotlb_dma_mapping_error, }; static struct dma_map_ops iommu_dma_ops = { .alloc = __iommu_alloc_attrs, .free = __iommu_free_attrs, .mmap = __iommu_mmap_attrs, .get_sgtable = __iommu_get_sgtable,