iommu的dma_map_ops是drivers\iommu\Dma-iommu.c中定义的iommu_dma_ops。 iommu的dma_map_ops是drivers/xen/swiotlb-xen.c中定义的xen_swiotlb_dma_ops。 #define dma_map_single(d, a, s, r) dma_map_single_attrs(d, a, s, r, 0) #define dma_unmap_single(d, a, s, r) dma_unmap_single_...
dma_addr_taddr,size_tsize,enumdma_data_direction dir,unsignedlongattrs){phys_addr_tphys =dma_to_phys(dev, addr);if(!(attrs & DMA_ATTR_SKIP_CPU_SYNC))dma_direct_sync_single_for_cpu(dev, addr, size, dir);if(unlikely(is_swiotlb_buffer(phys)))swiotlb_tbl_unmap_single(dev, phys, size...
当使用CONFIG_OF_EMBED的方式时,也就是dtb集成到uboot的bin文件中时,通过__dtb_dt_begin符号来获取dtb地址 gd->fdt_blob = __dtb_dt_begin; # elif defined CONFIG_OF_SEPARATE # ifdef CONFIG_SPL_BUILD /* FDT is at end of BSS unless it is in a different memory region */ if (IS_ENABLED(C...
系统 I/O 设备驱动程序通过dma_alloc_coherent()等接口分配内存,这个过程除了分配内存外,还会通过 SMMU 设备驱动程序的操作函数,创建地址转换表,并完成 SMMU CD 等数据结构的设置。在 Linux 内核中,不同的子系统实际调用的分配 DMA 内存的方法不同,但最终都需要调用dma_alloc_coherent()函数,这样分配的内存,在通...
如果为 IOMMU 设备执行探测初始化先进行,则总线在发现及添加设备,并和对应的设备驱动程序绑定时,调用of_dma_configure()之类的函数尝试执行 SMMU 驱动中的系统 I/O 设备探测。 SMMUv3 设备驱动程序probe时执行系统 I/O 设备的 IOMMU 探测 SMMUv3 设备驱动程序probe时,通过如下这样的调用链: ...
如果为 IOMMU 设备执行探测初始化先进行,则总线在发现及添加设备,并和对应的设备驱动程序绑定时,调用of_dma_configure()之类的函数尝试执行 SMMU 驱动中的系统 I/O 设备探测。 SMMUv3 设备驱动程序probe时执行系统 I/O 设备的 IOMMU 探测 SMMUv3 设备驱动程序probe时,通过如下这样的调用链: ...
returnof_dma_configure(dev,dma_dev->of_node,0); returnof_dma_configure_id(dev,dma_dev->of_node,0,&input_id); } staticssize_tmodalias_show(structdevice*dev,structdevice_attribute*attr, Expand Down 81 changes: 44 additions & 37 deletions81drivers/iommu/of_iommu.c ...
int (*dma_configure)(struct device *dev); const struct dev_pm_ops *pm; const struct iommu_ops *iommu_ops; struct subsys_private *p; struct lock_class_key lock_key; bool need_parent_lock; }; 1. 2. 3. 4. 5. 6. 7. 8.
函数的执行入口是,在系统启动的早期进行的 of_platform_default_populate_init, 该函数在文件drivers/of/platform.c中定义,具体代码如下: staticint__initof_platform_default_populate_init(void){structdevice_node*node;device_links_supplier_sync_state_pause();if(!of_have_populated_dt())return-ENODEV;if(...
staticint__igb_open(struct net_device*netdev,bool resuming){/* 分配多 TX 队列的内存空间 */err=igb_setup_all_tx_resources(adapter);/* 分配多 RX 队列的内存空间 */err=igb_setup_all_rx_resources(adapter);/* 给网卡配置 RX/TX 队列,给 RX 申请 DMA 空间 */igb_configure(adapter);/* 注册...