int dma_set_mask_and_coherent(struct device *dev, u64 mask); 这将为流式 API(streaming )和一致性 API(coherent) 一起设置掩码。 如果您有一些特殊要求,则可以使用以下两个单独的调用来代替: 流映射的设置是通过调用 dma_set_mask() 来执行的 int dma_set_mask(struct device *dev, u64 mask); ...
dma_mask表示的是该设备通过DMA方式可寻址的物理地址范围,coherent_dma_mask表示所有设备通过DMA方式可寻址的公共的物理地址范围,因为不是所有的硬件设备都能够支持64bit的地址宽度。/include/linux/dma-mapping.h /** Set both the DMA mask and the coherent DMA mask to the same thing.* Note that we don...
其中的函数dma_set_mask_and_coherent用于对dma_mask和coherent_dma_mask赋值。 dma_mask表示的是该设备通过DMA方式可寻址的物理地址范围,coherent_dma_mask表示所有设备通过DMA方式可寻址的公共的物理地址范围, 因为不是所有的硬件设备都能够支持64bit的地址宽度。 /include/linux/dma-mapping.h /* * Set both the...
rc = dma_set_mask(&pci_dev->dev, DMA_BIT_MASK(64));if(rc) { rc = dma_set_mask_and_coherent(&pci_dev->dev, DMA_BIT_MASK(32)); }else{/* * The virtio ring base address is expressed as a 32-bit PFN, * with a page size of 1 << VIRTIO_PCI_QUEUE_ADDR_SHIFT. */dma_set...
int dma_set_mask_and_coherent(struct device *dev, u64 mask); which will set the mask for both streaming and coherent APIs together. If you have some special requirements, then the following two separate calls can be used instead: 将同时为流式和连贯 API 设置掩码。如果您有一些特殊要求,可以...
* Set both the DMA mask and the coherent DMA mask to the same thing. * Note that we don't check the return value from dma_set_coherent_mask() * as the DMA API guarantees that the coherent DMA mask can be set to * the same or smaller than the streaming DMA mask. */ static inli...
在device结构体中,除了有dma_mask之外,还有一个coherent_dma_mask成员,dma_mask是设备DMA可以寻址的范围,而coherent_dma_mask作用用于申请一致性的DMA缓冲区: 一致性DMA缓冲区: DMA映射包括两个部分的工作:分配一片DMA缓冲区,为这片缓冲区产生设备可访问的地址。同时,DMA映射必须也要考虑cache一致性的问题。内核提供...
对于primaII而言,绝大多少的外设的dma_coherent_mask都设置为0XffffffffULL(4GB内存全覆盖),但是SD那个则设置为256MB-1对应的数字。这样当primaII的SD驱动调用dma_alloc_coherent()的时候,GFP_DMA标记被设置,以指挥内核从DMA ZONE申请内存。但是,其他的外设,mask覆盖了整个4GB,调用dma_alloc_coherent()获得的内存就...
一、前言 在 嵌入式Linux 的内核及驱动中,DMA 常常被人提起。我们也许清楚它的原理且很明白它非常重要,但在某种程度上,对于 DMA 的使用者来说,我们一般使用其接口,...