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...
a, s, r, 0)staticinlinedma_addr_tdma_map_single_attrs(structdevice *dev,void*ptr,size_tsize,enumdma_data_direction dir,unsignedlongattrs){debug_dma_map_single(dev, ptr, size);returndma_map_page_attrs(dev,virt_to_page(ptr
在__iommu_alloc_attrs函数中调用iommu_dma_alloc函数来完成iova和pa的分配与映射; iommu_dma_alloc->__iommu_dma_alloc_pages, 首先会调用者个函数来完成物理页面的分配: 函数__iommu_dma_alloc_pages中完成的任务是页面分配,iommu_dma_alloc_iova完成的就是iova的分配,最后iommu_map_sg即可完成iova到pa的映射...
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...
[MT_MEMORY_DMA_READY] = {.prot_pte= L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY | L_PTE_XN,.prot_l1= PMD_TYPE_TABLE,.domain= DOMAIN_KERNEL, }, }; 这样一个map_desc数据结构就完整描述了一个内存区间,调用create_mapping()时以此数据结构指针为调用参数; ...
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...
函数__iommu_dma_alloc_pages中完成的任务是页面分配,iommu_dma_alloc_iova完成的就是iova的分配,最后iommu_map_sg即可完成iova到pa的映射; linux 采用rb tree来管理每一段的iova区间,这其实和我们的虚拟内存的分配是类似的,我们的vma的管理也是这样的; ...
音频子系统 ALSA 的驱动程序,通过snd_pcm_lib_preallocate_pages()/snd_pcm_lib_preallocate_pages_for_all()/snd_pcm_lib_malloc_pages()等函数为 DMA 分配内存,这些函数定义 (位于sound/core/pcm_memory.c文件中) 如下: staticintdo_alloc_pages(struct snd_card*card,int type,struct device*dev,size_...
但如上所述,DMA mapping和VFIO使用场景中,设备的ASID和VMID与CPU并不共享。设备的SMMU TLB中具有同样ASID,VMID的TLB项不应该受到CPU发过来的TLBI broadcast的影响。实际上,SMMU driver会设置CD.ASET, [47] ASET ASIDSet. Selects typeforASID, between setssharedandnon-sharedwithPE ASIDs. This flag affects ...
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...