3、iommu模块,对业务驱动往上封装 dma_map_ops 这个结构,对下需要实现 struct iommu_ops ,先描述对上部分,比如intel硬件的iommu对业务驱动实现实例化如下: const struct dma_map_ops intel_dma_ops = {//caq:dma_map_ops 注意与 iommu_ops 区别 .alloc = intel_alloc_coherent,//caq:创建一个一致性内存映...
.map_page = dma_direct_map_page,//caq:只有map,ops没有实现unmap,说明不需要 .map_sg = dma_direct_map_sg, .dma_supported = dma_direct_supported,//caq:是不是支持dma,设置dma mask 时检查 .mapping_error = dma_direct_mapping_error, }; 相当于把direct的映射,封装成了一个dma_map_ops,这个主...
dma_map_single->dma_map_single_attrs->dma_map_page_attrs 根据是否direct(有smmu),分别调用dma_direct_map_page 或者ops->map_page (iommu_dma_map_page) 见上。 iommu_dma_map_page __iommu_dma_map ---见(1) //direct dma_direct_map_page 如果!dma_capable(dev, dma_addr, size, true) //...
虽然并不是所有的DMA mapping实现都支持dma_mapping_error这个接口(调用dma_mapping_error函数实际上会调用底层dma_map_ops操作函数集中的mapping_error成员函数),但是调用它来进行出错处理仍然是一个好的做法。这样做的好处是可以确保DMA mapping代码在所有DMA实现中都能正常工作,而不需要依赖底层实现的细节。没有检查错...
ffff000008a50000 r arm64_swiotlb_dma_ops ffff000008a50000 R vdso_end 例:驱动使用ops的map_page函数: [ 421.258031] dump_backtrace+0x0/0x1b8 [ 421.265029] show_stack+0x24/0x30 [ 421.271647] dump_stack+0x90/0xb4 [ 421.278219] __swiotlb_map_page+0x60/0xf0 [ 421.285523] e1000_alloc_rx...
include/asm/dma-mapping.h:extern struct dma_map_ops arm_coherent_dma_ops; mach-highbank/highbank.c:set_dma_ops(dev, &arm_coherent_dma_ops); mach-mvebu/coherency.c:set_dma_ops(dev, &arm_coherent_dma_ops); 5.dma_alloc_coherent申请的内存一定是物理连续的吗?
这个dma_map_ops的实例, intel 下会赋值给 dma_ops 这个全局的变量来保存, arm下 会赋值给 arm_smmu_ops 这个全局变量, 同时,他们会在 iommu_device 的ops 成员中保存,以便调用。 比如查看对应的dma_ops,有的时候是: crash> p dma_ops->alloc
Arnd Bergmann:dma_alloc_coherent()is a wrapper around a device-specific allocator,based on the dma_map_ops implementation.Thedefaultallocator from arm_dma_ops gives you uncached,buffered memory.It is expected that the driver uses abarrier(which is implied by readl/writel ...
当调用dma_map_single()返回错误的时候,你应当调用dma_mapping_error()来处理错误。虽然并不是所有的DMA mapping实现都支持dma_mapping_error这个接口(调用dma_mapping_error函数实际上会调用底层dma_map_ops操作函数集中的mapping_error成员函数),但是调用它来进行出错处理仍然是一个好的做法。这样做的好处是可以确保...
EXPORT_SYMBOL(noncoherent_swiotlb_dma_ops); Cpu会调用dma_map_single dma_map_single 例如:usb驱动收发数据 Cpu会调用dma_map_single进行clean或invalid int usb_gadget_map_request(struct usb_gadget \*gadget, struct usb_request \*req, int is_in) ...