*参照元 [#adbf5100] #backlinks *説明 [#yc141f7a] -パス: [[linux-4.4.1/drivers/base/dma-mapping.c]] -FIXME: これは何? --説明 **引数 [#h734cdc0] -struct device *dev -- --[[linux-4.4.1/device]] -struct vm_area_struct *vma -- --[[linux-4.4.1/vm_area_struct]] -void *cpu_addr -- -dma_addr_t dma_addr -- --[[linux-4.4.1/dma_addr_t]] -size_t size -- **返り値 [#q272019c] -int -- **参考 [#oa4ba104] *実装 [#k2e3a08f] /* * Create userspace mapping for the DMA-coherent memory. */ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, void *cpu_addr, dma_addr_t dma_addr, size_t size) { int ret = -ENXIO; #ifdef CONFIG_MMU - --[[linux-4.4.1/CONFIG_MMU]] unsigned long user_count = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; unsigned long count = PAGE_ALIGN(size) >> PAGE_SHIFT; unsigned long pfn = page_to_pfn(virt_to_page(cpu_addr)); unsigned long off = vma->vm_pgoff; - --[[linux-4.4.1/PAGE_ALIGN()]] --[[linux-4.4.1/page_to_pfn()]] --[[linux-4.4.1/virt_to_page()]] vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); - --[[linux-4.4.1/pgprot_noncached()]] if (dma_mmap_from_coherent(dev, vma, cpu_addr, size, &ret)) return ret; - --[[linux-4.4.1/dma_mmap_from_coherent()]] if (off < count && user_count <= (count - off)) { ret = remap_pfn_range(vma, vma->vm_start, pfn + off, user_count << PAGE_SHIFT, vma->vm_page_prot); } - --[[linux-4.4.1/remap_pfn_range()]] #endif /* CONFIG_MMU */ return ret; } EXPORT_SYMBOL(dma_common_mmap); - --[[linux-4.4.1/EXPORT_SYMBOL()]] *コメント [#p563c9e7]