我对pci_set_dma_mask感到有点困惑。那么有人可以解释我在下面的代码中究竟发生了什么。
#define DMA_64BIT_MASK DMA_BIT_MASK(64)
pci_set_dma_mask(dev, DMA_64BIT_MASK)
此致 Rabinarayan
答案 0 :(得分:3)
基本上 DMA_BIT_MASK(64)是一个返回64位地址'1'的宏。 即。 0xFFFF FFFF FFFF FFFF
如果使用 DMA_BIT_MASK(32),则会是 0xFFFF FFFF
pci_set_dma_mask(dev,DMA_64BIT_MASK)用于查询dev表示的pcie设备:你支持64位DMA吗?调用标准内核驱动程序初始化例程时提供dev。
从内核文档:
如果您的卡可以在机器上正确执行DMA,则返回零 给出你提供的地址掩码。一般来说,设备结构 您的设备嵌入在您的设备的总线专用设备结构中 设备。例如,& pdev-> dev是指向设备结构的指针 PCI设备(pdev是指向您的PCI设备结构的指针) 装置)。
如果它返回非零值,则您的设备无法正常执行DMA 这个平台,并试图这样做将导致未定义 行为。您必须使用不同的掩码,或者不使用DMA。
答案 1 :(得分:1)
AFAIK知道,如果参数中的PCI设备可以在支持的PCI地址上执行DMA,则此函数返回0。如果它返回非零,则您的设备无法执行DMA,并且DMA转换(如果使用)是不可预测的。
不管我的答案如何,我认为SO不是这个问题的地方,因为这不是一个真正的问题,可以有一个绝对正确的“答案”或“解决方案”......