我的pcie设备有一个错误,它不能用于低于4G的地址,我应该使用什么掩码与dma_set_mask告诉内核?
答案 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位以上的特定映射。