pci_set_dma_mask的功能

时间:2016-02-08 15:28:31

标签: c pci

我对pci_set_dma_mask感到有点困惑。那么有人可以解释我在下面的代码中究竟发生了什么。

#define DMA_64BIT_MASK DMA_BIT_MASK(64)
pci_set_dma_mask(dev, DMA_64BIT_MASK)

此致 Rabinarayan

2 个答案:

答案 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不是这个问题的地方,因为这不是一个真正的问题,可以有一个绝对正确的“答案”或“解决方案”......