diff options
author | Thierry Reding <treding@nvidia.com> | 2014-08-01 14:34:21 +0200 |
---|---|---|
committer | Thierry Reding <treding@nvidia.com> | 2014-08-07 17:00:17 +0200 |
commit | bc47c8347138d889c8409b712bf9aa920ea950c2 (patch) | |
tree | 2212e19c0b1effa41912d0f00a6d323a7fafff14 | |
parent | 9bff5ebcf5317312691ce6aafbc145a5e5356e18 (diff) |
drm/tegra: IOMMU support + dma_mmap_writecombine()
-rw-r--r-- | drivers/gpu/drm/tegra/gem.c | 18 |
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; |