Linux kernel 是否可以使用dma_set_mask()告诉内核不要使用4G以下的内存
我的pcie设备有一个错误,它无法dma到4G以下的地址,我应该使用什么掩码与dma_设置_掩码一起告诉内核?查看一下,似乎需要Linux kernel 是否可以使用dma_set_mask()告诉内核不要使用4G以下的内存,linux-kernel,linux-device-driver,kernel-module,dma,pci-e,Linux Kernel,Linux Device Driver,Kernel Module,Dma,Pci E,我的pcie设备有一个错误,它无法dma到4G以下的地址,我应该使用什么掩码与dma_设置_掩码一起告诉内核?查看一下,似乎需要dma_设置_掩码_和_相干(dev,dma_BIT_掩码(64))来启用>32位映射地址。特别是(对于一致映射): 对于非空dev,一致的DMA映射接口将由 默认返回32位可寻址的DMA地址。即使 设备指示(通过DMA掩码)它可以寻址高32位, 一致分配仅在以下情况下返回DMA的>32位地址 一致DMA掩码已通过显式更改 dma_设置_相干_掩码()。dma_池接口也
dma_设置_掩码_和_相干(dev,dma_BIT_掩码(64))
来启用>32位映射地址。特别是(对于一致映射):
对于非空dev,一致的DMA映射接口将由
默认返回32位可寻址的DMA地址。即使
设备指示(通过DMA掩码)它可以寻址高32位,
一致分配仅在以下情况下返回DMA的>32位地址
一致DMA掩码已通过显式更改
dma_设置_相干_掩码()。dma_池接口也是如此
嗯
但是,这个(dma_set_mask_和_coherent()调用)不能保证工作(有关更多详细信息,请参阅HOWTO)。此外,您可能需要多次调用dma\u alloc\u coherent()
,直到获得大于4GB的dma地址
我不知道有什么方法可以强制特定映射超过32位。否。
pci\u set\u dma\u mask()
的作用与您想要的正好相反:它告诉内核不要使用更高的地址
最简单的方法可能是在引导时保留高内存,并仅使用该内存。请看一下linux/include/linux/dma continuous.h
以获得灵感。特别是dma\u declare\u continuous()
如果不能尽早分配内存,事情会变得更加棘手。在这种情况下,您必须通读“正常”PCI分配代码的功能,然后自己滚动
我从去年的嵌入式Linux会议中发现了深刻的见解。它们当然包含许多指向有用的头文件和源代码的指针,以便通读 不,你不能。DMA掩码定义从地址0x00000000开始的区域。您指的是soc侧的DMA还是外部设备侧的DMA?在使用DMA_alloc_相干()之后,我应该使用DMA_map_single()吗?或者我的设备是否已经dma到返回的总线地址?