免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3028 | 回复: 1
打印 上一主题 下一主题

PCI使用DMA时关于DAC的困惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-16 19:54 |只看该作者 |倒序浏览
在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++;


另外这个mask是控制什么的?i386要求是24-bit的mask,但在dma_map_single中没有做任何检查:
static inline int
dma_set_mask(struct device *dev, u64 mask)
{
    if(!dev->dma_mask || !dma_supported(dev, mask))
        return -EIO;

    *dev->dma_mask = mask;

    return 0;
}


使用的地方搜索了一下太杂一时没看出什么来。

再补充一句,上面的实际驱动是一个PCIe的板子的,对于PCIe还需要关心DAC吗?

[ 本帖最后由 Cyberman.Wu 于 2009-2-17 09:01 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-02-17 11:33 |只看该作者
DAC, SAC, 24BIT是PCI设备的能力, 和CPU完全没关系。  

DAC - 有的PCI设备支持, PCIe设备必须支持(除非是PCIe Legacy Endpoint)
SAC -  PCI设备必须支持
24BIT - 有些ISA设备做了一个PCI frontend,就只能支持24bit的DMA
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP