summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThierry Reding <treding@nvidia.com>2014-08-01 14:34:21 +0200
committerThierry Reding <treding@nvidia.com>2014-08-07 17:00:17 +0200
commitbc47c8347138d889c8409b712bf9aa920ea950c2 (patch)
tree2212e19c0b1effa41912d0f00a6d323a7fafff14
parent9bff5ebcf5317312691ce6aafbc145a5e5356e18 (diff)
drm/tegra: IOMMU support + dma_mmap_writecombine()
-rw-r--r--drivers/gpu/drm/tegra/gem.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/drivers/gpu/drm/tegra/gem.c b/drivers/gpu/drm/tegra/gem.c
index 48e567bf8899..2143c553a92d 100644
--- a/drivers/gpu/drm/tegra/gem.c
+++ b/drivers/gpu/drm/tegra/gem.c
@@ -507,16 +507,22 @@ int tegra_drm_mmap(struct file *file, struct vm_area_struct *vma)
bo = to_tegra_bo(gem);
if (!bo->pages) {
- unsigned long size = vma->vm_end - vma->vm_start;
- unsigned long pfn = bo->paddr >> PAGE_SHIFT;
+ unsigned long vm_pgoff = vma->vm_pgoff;
- ret = remap_pfn_range(vma, vma->vm_start, pfn, size,
- vma->vm_page_prot);
- if (ret)
- drm_gem_vm_close(vma);
+ vma->vm_flags &= ~VM_PFNMAP;
+ vma->vm_pgoff = 0;
+
+ ret = dma_mmap_writecombine(gem->dev->dev, vma, bo->vaddr,
+ bo->paddr, gem->size);
+
+ vma->vm_pgoff = vm_pgoff;
} else {
+ pgprot_t prot = vm_get_page_prot(vma->vm_flags);
+
vma->vm_flags |= VM_MIXEDMAP;
vma->vm_flags &= ~VM_PFNMAP;
+
+ vma->vm_page_prot = pgprot_writecombine(prot);
}
return ret;