是否可以使用dma_set_mask()告诉内核不要在4G下使用内存

时间:2015-03-12 09:36:38

标签: linux-kernel linux-device-driver kernel-module dma pci-e

我的pcie设备有一个错误,它不能用于低于4G的地址,我应该使用什么掩码与dma_set_mask告诉内核?

2 个答案:

答案 0 :(得分:2)

没有。 pci_set_dma_mask()与您想要的完全相反:它告诉内核不要使用更高的地址。

最简单的方法可能是在启动时保留高内存并仅使用该内存。看一下linux/include/linux/dma-contiguous.h的灵感。特别是dma_declare_contiguous()

如果无法尽早分配内存,事情会变得更加棘手。在这种情况下,您将必须阅读“正常”PCI分配代码的功能,并自行推送。

我发现去年嵌入式Linux会议的the slides of this presentation很有见地。它们肯定包含许多指向有用标题和源代码的指针。

答案 1 :(得分:0)

查看DMA_API_HOWTO,似乎需要dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64))来启用> 32位映射地址。特别是(对于一致的映射):

  

对于非NULL dev,一致的DMA映射接口将通过   默认返回一个32位可寻址的DMA地址。即使是   设备指示(通过DMA掩码)它可以寻址高32位,   一致的分配只会返回> DMA的32位地址if   已通过明确更改了一致的DMA掩码   dma_set_coherent_mask()。对于dma_pool接口,这是正确的   好。

但是这个(dma_set_mask_and_coherent()调用)不能保证工作(有关详细信息,请参阅HOWTO)。此外,您可能需要多次调用dma_alloc_coherent(),直到获得大于4GB的DMA地址...

我不知道如何强制使用32位以上的特定映射。