- 论坛徽章:
- 0
|
原帖由 smalloc 于 2008-3-28 16:22 发表 ![]()
看了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 |
|