PCI使用DMA时关于DAC的困惑
在LLD3的提到要使用64-bit地址的话需要使用DAC,此时要调用pci_dac_set_dma_mask设置,而使用的地址也是dma64_addr_t。对于64-bit的CPU是不是用哪个都是一样的?看过一个实际驱动的直接自己处理的:
/* This macro gets the upper 32 bits of a 32 or 64 bit dma_addr_t, and * yields 0 on 32-bit dma_addr_t's. The bizarre shift expression is * necessary to compile on 32-bit platforms. */ #define DMA_ADDR_HI32(A) ((u32)((sizeof(A) == 8) ? ((A) >> (sizeof(A) * 8 - 32)) : 0)) /* This macro yields the low 32 bits of a 32 or 64 bit dma_addr_t. */ ...... u32 index = stream_posted % BUFFERS_PER_STREAM; cmd.buffer_addr_lo32 = DMA_ADDR_LO32(addr); CMD_TRACE("READ channel= %d, size= %d, bus_addr= %#llx\n", cmd_index = cmds_posted % PCIE_CMD_QUEUE_ENTRIES; |
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
DAC, SAC, 24BIT是PCI设备的能力, 和CPU完全没关系。
DAC - 有的PCI设备支持, PCIe设备必须支持(除非是PCIe Legacy Endpoint)
SAC - PCI设备必须支持
24BIT - 有些ISA设备做了一个PCI frontend,就只能支持24bit的DMA