dma_addr_t dma_handle;structpage *page = buffer->page; unsignedlongoffset = buffer->offset; size_t size= buffer->len; dma_handle=dma_map_page(dev, page, offset, size, direction); dma_unmap_page(dev, dma_handle, size, direction); 对散列表的映射和取消映射如下,nents是sglist中entry的...
在某些情况下,dma_map_single()、dma_map_page()和dma_map_resource()将无法创建映射。驱动程序可以通过使用dma_mapping_error()测试返回的DMA地址来检查这些错误。非零返回值表示无法创建映射,驱动程序应采取适当的措施(例如减少当前DMA映射使用或延迟并稍后重试)。 dma_map_sg 和 dma_unmap_sg intdma_map_sg(...
这通常通过命令行参数iommu=pt来启用。在这样的环境中,当进行DMA操作时,如在e100网卡驱动中所展示的那样,数据的物理地址(PADDR)会通过DMA映射进行处理,最终通过pci_map_single函数进行处理,调用intel_map_page函数。如果存在iommu硬件,那么这个函数最终会调用intel_map_page。在intel_map_page函数中...
dma_alloc_coherent和dma_alloc_writecombine的区别是dma_alloc_coherent(cache disable,buffer disable),dma_alloc_writecombine(cache disable,buffer enable) 流式DMA映射,使用这个函数前需要事先分配连续物理内存,这个函数只是物理地址映射到虚拟地址 dma_map_single dma_unmap_single DMA池 DMA cache一致性问题 DMA如...
*/ od->zero_page = dma_map_page_attrs(od->ddev.dev, ZERO_PAGE(0), 0, PAGE_SIZE, DMA_TO_DEVICE, DMA_ATTR_SKIP_CPU_SYNC); /* 从dts中获取可用的dma通道 */ /* Request DMA channel mask from device tree */ if (of_property_read_u32(pdev->dev.of_node, "brcm,dma-channel-mask...
dma_map_single()和dma_unmap_single()都在include\linux\dma-mapping.h里定义。如果没有特殊情况,会调用dma_direct_map_page()、dma_direct_unmap_page()。 arm64的特殊情况包括iommu和Xen虚拟机。 iommu和Xen虚拟机都需要提供dma_map_ops,于是使用其中的map、unmap函数。iommu的dma_map_ops是drivers\iommu\D...
假设不设置32bit的寻址能力,那么在流式DMA映射的时候就会报错。报错是swiotlb_full函数打印出来的。 printk(KERN_ERR "DMA: Out of SW-IOMMU space for %zu bytes at " "device %s\n",size,dev? dev_name(dev) : "?"); 以下分析下DMA映射的相关代码swiotlb_map_page函数实现: ...
这也就是DMA API存在的原因之一:驱动程序可以向 dma_map_single() 等接口提供虚拟地址 X,然后dma_map_single()设置任何所需的 IOMMU 映射并返回 DMA 地址 Z, 最后驱动程序告诉设备对 Z 执行 DMA,IOMMU 将其映射到 系统 RAM 中地址 Y 处的缓冲区。
驱动在调用dma_map_single这样的接口函数的时候会传递一个虚拟地址X,在这个函数中会设定IOMMU的页表,将地址X映射到Z,并且将返回z这个总线地址。驱动可以把Z这个总线地址设定到设备上的DMA相关的寄存器中。这样,当设备发起对地址Z开始的DMA操作的时候,IOMMU可以进行地址映射,并将DMA操作定位到Y地址开始的DMA buffer。
dma_map_single流程如下:dma_map_single dma_map_single_attrs ops->map_page 没有iommu的话会走__swiotlb_map_page。 大题流程如下: 收录于合集 #DMA Mapping 3个 上一篇没有IOMMU的DMA操作下一篇DMA和CPU访问内存的一致性问题 喜欢此内容的人还喜欢 ...