void pci_device_add(struct pci_dev *dev, struct pci_bus *bus) { int ret; pci_configure_device(dev); device_initialize(&dev->dev); dev->dev.release = pci_release_dev; set_dev_node(&dev->dev, pcibus_to_node(bus)); dev->dev.dma_mask = &dev->dma_mask; dev->dev.dma_parms =...
就取决于device的dma_mask,比如对于pci设备,在device结构的基础之上给这个指针赋值为pci_device的dma_mask。 注意,这里暂且不讨论device dma地址范围大于bus的mask的情况,这种情况留到下篇再讲。 device做dma时,自己根本就不知道有没有iommu,它就是拿着下发给他的地址来做总线访问,所以不管下发给device的是iova还是p...
dev_err(&pdev->dev,"Can't set PCI DMA mask, aborting.\n");returnerr; } } err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));if(err) { dev_warn(&pdev->dev,"Warning: couldn't set 64-bit consistent PCI DMA mask.\n"); err = pci_set_consistent_dma_mask(pdev, DM...
通用DMA支持层使用32位总线地址,然而PCI总线还支持64位地址模式,即 双重地址周期(DAC)。 通用DMA层并不支持该模式。 要使用PCI总线的DAC,必须设置一个单独的DMA掩码: int pci_dac_set_dma_mask(struct pci_dev *pdev,u64 mask); 建立映射 dma64_addr_t pci_dac_page_to_dma(struct pci_dev *pdev,struct...
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...
为使用 DAC, 你的驱动必须包含 <linux/pci.h>. 你必须设置一个单独的 DMA 掩码: int pci_dac_set_dma_mask(struct pci_dev *pdev, u64 mask); 你可使用 DAC 寻址只在这个调用返回 0 时. 一个特殊的类型 (dma64_addr_t) 被用作 DAC 映射. 为建立一个这些映射, 调用 pci_dac_page_to_dma: ...
从变动可以看出,18年通过这个commit引入了 bus_dma_mask,同时将原本的 dma_32bit_limit进行了删除。 而dma_32bit_limit 的引入,也是在2018年,但做得比较fix。 commit f068fe3170bcf06f14fd0a9eec0be12be04ff012 Author: Christoph Hellwig <hch@lst.de> ...
if(!pci_set_dma_mask(pdev,DMA_BIT_MASK(64))){pci_set_consistent_dma_mask(pdev,DMA_BIT_MASK(64));pr_info("Using a 64-bit DMA mask.\n");}elseif(!pci_set_dma_mask(pdev,DMA_BIT_MASK(32))){pci_set_consistent_dma_mask(pdev,DMA_BIT_MASK(32));pr_info("Using a 32-bit DMA...
话说明分配DMA缓冲区时必须是物理上连续的一段空间,原因我的理解是因为DMA是设备的一种机制,真正使用DMA的是设备,也就是说cpu分配好缓冲区给设备,设备来进行DMA操作,完成对缓冲区的访问,这个过程对cpu是不透明的,设备对缓冲区的寻址是物理地址,如果这个设备是挂载在PCI总线上,则设备对DMA缓冲区的寻址就是pci总线...
PCI双重地址周期映射 通常DMA支持层使用32位总线地址。其为设备的DMA掩码所约束 PCI总线还支持64位地址模式。既双重地址周期(DAC) 假设设备须要使用放在高端内存的大块缓冲区,能够考虑实现DAC支持 <linux/pci.h> int pci_dac_set_dma_mask(struct pci_dev *pdev, u64 mask); ...