pci_dma_sync_single_for_cpu到底同步的是什么?
看了Documentation/DMA-mapping.txt这篇文档还是没明白,可能是e文太差了。。 原帖由 smalloc 于 2008-3-28 16:22 发表 http://linux.chinaunix.net/bbs/images/common/back.gif看了Documentation/DMA-mapping.txt这篇文档还是没明白,可能是e文太差了。。
If you need to use the same streaming DMA region multiple times and touch
the data in between the DMA transfers, the buffer needs to be synced
properly in order for the cpu and device to see the most uptodate and
correct copy of the DMA buffer.
So, firstly, just map it with pci_map_{single,sg}, and after each DMA
transfer call either:
pci_dma_sync_single_for_cpu(dev, dma_handle, size, direction);
or:
pci_dma_sync_sg_for_cpu(dev, sglist, nents, direction);
由于single和sg都是streaming mapping, 所以硬件并不保证RAM──那块DMA buffer──和 CPU片上Cache之间的数据同步。如果你对同一块buffer 做2次map, 而且又想在这2次map中间的时候,从CPU 碰碰它,就得自己负责 数据一致性。
所以,流程是:
1) pci_map_single
2) pci_dma_sync_single_for_cpu
3) 尽情的读写这块内存
4)pci_dma_sync_single_for_device
5)第2次对同一块buffer进行pci_map_single
PS, X86的内存全都是consistent的, 即使你用streaming DMA。
有些arch, 如MIPS, 不保证cache一致性,因此consistent内存就必须得是uncacheable的内存。 原帖由 albcamus 于 2008-3-28 16:52 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
PS, X86的内存全都是consistent的, 即使你用streaming DMA。
虽然这么说但在e100的x86的驱动里还是使用了pci_dma_sync_single_for_cpu为什么呢?
http://tomoyo.sourceforge.jp/cgi-bin/lxr/source/drivers/net/e100.c 1820 2154行 原帖由 duanius 于 2008-3-30 21:28 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
虽然这么说但在e100的x86的驱动里还是使用了pci_dma_sync_single_for_cpu为什么呢?
http://tomoyo.sourceforge.jp/cgi-bin/lxr/source/drivers/net/e100.c 1820 2154行
a版主说的对,内核里对x86这个函数为空,什么也没做。 查了下 确实是这样
既然怎么都是一致性映射不知道是不是为了兼容性代码才写成这样 又把这老帖翻上来
当年老A走的太快.我没跟上:oops:
现在回想起来,好象和2次pci_map_single没关系吧
页:
[1]