+ u64 bus_dma_mask; /* upstream dma_mask constraint *///caq:引入这个变量 unsigned long dma_pfn_offset; struct device_dma_parameters *dma_parms; @@ -1002,7 +1003,6 @@ struct device { bool offline_disabled:1; bool offline:1; bool of_node_reused:1; - bool dma_32bit_limit:1;//...
64 bit addresses for consistent allocations such descriptors. */unsignedlongdma_pfn_offset;structdevice_dma_parameters *dma_parms;structlist_head dma_pools;/*dma pools (if dma'ble)*/struct dma_coherent_mem *dma_mem; /*internal for coherent mem... }; dma_mask与coherent_dma_mask这两个参数表...
无论虚拟地址(逻辑地址?)还是物理地址,地址的组成都分成了两个部分:PFN(page frame number)和offset,假设先的PAGE_SIZE是4096byte,那么低12bit就是作为page中的offset,如果把这低12bit向右移出去,得到的值就是PFN。获取pfn的操作在kernel中很常见,具体移出去多少bit,取决于PAGE_SHIFT这个值。 15.1.3. High and ...
在PFN和地址之间转换是常见操作;宏PAGE_SHIFT告诉此转换须偏移多少位。 物理页通过Page Frame Number (PFN)识别。PFN可以从物理地址轻易计算出来,除以page size 或 去掉PAGE_SHIFTbits。 PFN计算: PFN = (physical address/page frame size) 取整。余数是page frame offset。 通常,page frames大小等于virtual pages。
offset:内存区域在映射文件中的起始位置。偏移量为0表示内存区域的起始位置映射文件的开始位置 major-minor:拥有映射文件的设备的主设备号和次设备号。 对于设备映射来说,主设备号和次设备号指的是包含设备特殊文件的磁盘分区。该文件由用户而非设备自身打开 ...
offset_in_page(ptr), size, dir, addr, true); return addr; } 如果有iommu硬件的情况下(以intel iommu为例)他最终会走到intel_map_page,下面我们来看一下这个函数的核心逻辑 static dma_addr_t __intel_map_single(struct device *dev, phys_addr_t paddr, ...
首先是 mmap,就是在调用vfio_pci_mmap的时候最终调用remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, req_len, vma->vm_page_prot);来将物理内存映射到用户态空间,这就是上面的栗子中 mmap 系统调用的入口,而具体要映射的物理内存是通过一系列pci_resource_xxx宏从 PCI bar 空间读出来的配置。
unsigned int offset = dev_addr & ~PAGE_MASK; return __pfn_to_phys(dma_to_pfn(dev, dev_addr)) + offset;1 change: 0 additions & 1 deletion 1 arch/arm/include/asm/dma-iommu.h Original file line numberDiff line numberDiff line change @@ -6,7 +6,6 @@ #include <linux/mm_types...
offset = pfn_level_offset(pfn, level); pte = &parent[offset]; if (!pte || (dma_pte_superpage(pte) || !dma_pte_present(pte))) { pr_info("PTE not present at level %d\n", level); break; } pr_info("pte level: %d, pte value: 0x%016llx\n", level, pte->val); if (leve...
#define _DMA_CH_REG_OFFSET(ch) ((ch) * 0x40ul)#define _DMA_CH_REG(reg_base, ch) ...