*参照元 [#y2043c1b] #backlinks *説明 [#nd8166be] -パス: [[linux-4.4.1/drivers/base/dma-coherent.c]] -FIXME: これは何? --説明 **引数 [#n79ae54f] -struct device *dev -- --[[linux-4.4.1/device]] -struct vm_area_struct *vma -- --[[linux-4.4.1/vm_area_struct]] -void *vaddr -- -size_t size -- -int *ret -- **返り値 [#s1fa12fc] -int -- **参考 [#l9badc66] *実装 [#l1a72a51] /** * dma_mmap_from_coherent() - try to mmap the memory allocated from * per-device coherent memory pool to userspace * @dev: device from which the memory was allocated * @vma: vm_area for the userspace memory * @vaddr: cpu address returned by dma_alloc_from_coherent * @size: size of the memory buffer allocated by dma_alloc_from_coherent * @ret: result from remap_pfn_range() * * This checks whether the memory was allocated from the per-device * coherent memory pool and if so, maps that memory to the provided vma. * * Returns 1 if we correctly mapped the memory, or 0 if the caller should * proceed with mapping memory from generic pools. */ int dma_mmap_from_coherent(struct device *dev, struct vm_area_struct *vma, void *vaddr, size_t size, int *ret) { struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL; - --[[linux-4.4.1/dma_coherent_mem]] if (mem && vaddr >= mem->virt_base && vaddr + size <= (mem->virt_base + (mem->size << PAGE_SHIFT))) { unsigned long off = vma->vm_pgoff; int start = (vaddr - mem->virt_base) >> PAGE_SHIFT; int user_count = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; int count = size >> PAGE_SHIFT; *ret = -ENXIO; if (off < count && user_count <= count - off) { unsigned long pfn = mem->pfn_base + start + off; *ret = remap_pfn_range(vma, vma->vm_start, pfn, user_count << PAGE_SHIFT, vma->vm_page_prot); - --[[linux-4.4.1/remap_pfn_range()]] } return 1; } return 0; } EXPORT_SYMBOL(dma_mmap_from_coherent); - --[[linux-4.4.1/EXPORT_SYMBOL()]] *コメント [#w235093e]