与其他映射接口一样,dma_map_sg()可能会失败。失败时返回0,驱动程序必须采取适当的措施。驱动程序必须采取行动是至关重要的,在块驱动程序的情况下,中止请求甚至是发生故障也比不采取任何行动和损坏文件系统要好。 使用散射列表时,可以像这样使用生成的映射: inti, count = dma_map_sg(dev, sglist, nents, dir...
另外,传递给dma_unmap_sg的nents参数需要等于传递给dma_map_sg的nents参数,而不是该函数返回的count。 由于DMA地址空间是共享资源,每一次dma_map_{single,sg}() 的调用都需要有其对应的dma_unmap_{single,sg}(),如果你总是分配dma地址资源而不回收,那么系统将会由于DMA address被用尽而陷入不可用的状态。 3...
.map_sg = iommu_dma_map_sg, .unmap_sg = iommu_dma_unmap_sg, .sync_single_for_cpu = iommu_dma_sync_single_for_cpu, .sync_single_for_device = iommu_dma_sync_single_for_device, .sync_sg_for_cpu = iommu_dma_sync_sg_for_cpu, .sync_sg_for_device = iommu_dma_sync_sg_for_device...
这时,内存在给DMA使用之前,就要调用一次dma_map_sg()或dma_map_single(),取决于你的DMA引擎是否支持聚集散列(DMA scatter-gather),支持就用dma_map_sg(),不支持就用dma_map_single()。DMA用完之后要调用对应的unmap接口。 由于协议栈下来的包的数据有可能还在cache里面,调用dma_map_single()后,CPU就会做一次c...
在某些场景下,通过dma_map_single及dma_map_page创建映射可能会失败。驱动程序可以通过此函数来检测这些错误。一个非零返回值表示未成功创建映射,驱动程序需要采取适当措施(比如降低当前DMA映射使用率或者等待一段时间再尝试)。intdma_map_sg(struct device *dev, struct scatterlist *sg, int nents, enum dma_...
DMA 地址空间在某些架构上是有限的,分配失败可以通过以下方式确定: 检查dma_alloc_coherent() 是否返回 NULL 或 dma_map_sg 返回 0 使用dma_mapping_error() 检查从 dma_map_single() 和 dma_map_page() 返回的 dma_addr_t: dma_addr_t dma_handle; ...
这也就是DMA API存在的原因之一:驱动程序可以向 dma_map_single() 等接口提供虚拟地址 X,然后dma_map_single()设置任何所需的 IOMMU 映射并返回 DMA 地址 Z, 最后驱动程序告诉设备对 Z 执行 DMA,IOMMU 将其映射到 系统 RAM 中地址 Y 处的缓冲区。
With scatterlists, you map a region gathered from several regions by: 使用scatterlist,您可以通过以下方式从多个区域收集映射: int i, count = dma_map_sg(dev, sglist, nents, direction); struct scatterlist *sg; for_each_sg(sglist, sg, count, i) { ...
一旦失败,将返回 0,驱动程序必须采取适当措施。在块驱动程序中,中止请求甚至 "哎呀 "一声都比什么都不做和破坏文件系统要好。 With scatterlists, you use the resulting mapping like this: 使用scatterlists时,可以这样使用生成的映射: int i, count = dma_map_sg(dev, sglist, nents, direction);...