PCI使用DMA时关于DAC的困惑

发布于 2022-09-23 15:20:47 字数 4179 浏览 17 评论 0

在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. */
#define DMA_ADDR_LO32(A) ((u32) (A))

......

        u32 index = stream_posted % BUFFERS_PER_STREAM;
        dma_addr_t addr = stream->read_dma_addrs[index];

        cmd.buffer_addr_lo32 = DMA_ADDR_LO32(addr);
        cmd.buffer_addr_hi32 = DMA_ADDR_HI32(addr);

        CMD_TRACE("READ channel= %d, size= %d, bus_addr= %#llx\n",
              cmd.channel, cmd.size, addr);

        cmd_index = cmds_posted % PCIE_CMD_QUEUE_ENTRIES;
        tlr->buffer_cmd_array[cmd_index] = cmd;
        cmds_posted++;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

够运 2022-09-30 15:20:47

DAC, SAC, 24BIT是PCI设备的能力, 和CPU完全没关系。  

DAC - 有的PCI设备支持, PCIe设备必须支持(除非是PCIe Legacy Endpoint)
SAC -  PCI设备必须支持
24BIT - 有些ISA设备做了一个PCI frontend,就只能支持24bit的DMA

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文