我注意到pci_unmap_sg的签名(我显示了dma_unmap_sg_attrs,它是由pci_unmap_sg通过两个宏调用并具有明确的参数命名)包含方向和属性。
static inline void dma_unmap_sg_attrs(
struct device *dev,
struct scatterlist *sg,
int nents,
enum dma_data_direction dir,
struct dma_attrs *attrs)我想知道为什么有必要知道取消映射的方向和属性。起初,我认为映射有点像malloc和free。但看到这一点,我想知道这样的事情是否合法:
dma_map_sg_attrs(..., dir=DMA_BIDIRECTIONAL,...);
...
dma_unmap_sg_attrs(..., dir=DMA_FROM_DEVICE ,...);
//continue use in TO_DEVICE direction或
dma_map_sg_attrs(..., dir=DMA_TO_DEVICE,...);
...
dma_map_sg_attrs(..., dir=DMA_FROM_DEVICE ,...);
//start bidirectional use此外,我还可以这样做(通过DMA将数据从一个设备传输到另一个设备,如果它们之间不能直接交互):
dma_map_sg_attrs(dev1, ..., dir=DMA_FROM_DEVICE ,...);
dma_map_sg_attrs(dev2, ..., dir=DMA_TO_DEVICE ,...);我试着深入了解这个函数,但是以get_dma_ops结尾,它从全局获取函数指针。但是如何进一步遵循这段代码是另一个问题
更新
我发现同步api更令人困惑:
pci_dma_sync_sg_for_cpu(
struct pci_dev *hwdev,
struct scatterlist *sg,
int nelems,
int direction
)这个api知道方向的原因是什么?api没有办法记住原始的映射方向,如果我们只映射为sync_for_cpu,那么它是否可以单独列出DMA_TO_DEVICE呢?
发布于 2015-01-18 12:53:27
答案将是简单和有力的同时。这取决于您对正在使用的CPU体系结构的了解程度。DMA的问题是CPU缓存。对于DMA来说,CPU缓存必须是一致的。因此,我们在同步API中有不同的方向,因为我们可以访问来自DMA和CPU的数据。正如您已经知道的,同步API是映射API中方向参数的一个原因。
无论如何,这不是一个全面的答案。为此,您必须阅读特定的文献和文档。我建议你从Documentation/DMA*.txt文件开始。
https://stackoverflow.com/questions/28006268
复制相似问题