[Letux-kernel] [small team RFC v3 05/10] XXX omapdrm: fast userspace mapping of tiled buffers

H. Nikolaus Schaller hns at goldelico.com
Mon Feb 5 17:21:00 CET 2018


From: Matthijs van Duin <matthijsvanduin at gmail.com>

---
 drivers/gpu/drm/omapdrm/omap_gem.c | 29 ++++++++++++++++++++++++++---
 1 file changed, 26 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/omap_gem.c b/drivers/gpu/drm/omapdrm/omap_gem.c
index 6cf190156dcf..670845b19e49 100644
--- a/drivers/gpu/drm/omapdrm/omap_gem.c
+++ b/drivers/gpu/drm/omapdrm/omap_gem.c
@@ -396,6 +396,7 @@ static int fault_1d(struct drm_gem_object *obj,
 	return vm_insert_mixed(vma, vmf->address, __pfn_to_pfn_t(pfn, PFN_DEV));
 }
 
+#if 0
 /* Special handling for the case of faulting in 2d tiled buffers */
 static int fault_2d(struct drm_gem_object *obj,
 		struct vm_area_struct *vma, struct vm_fault *vmf)
@@ -497,6 +498,7 @@ static int fault_2d(struct drm_gem_object *obj,
 
 	return 0;
 }
+#endif
 
 /**
  * omap_gem_fault		-	pagefault handler for GEM objects
@@ -536,7 +538,7 @@ int omap_gem_fault(struct vm_fault *vmf)
 	 */
 
 	if (omap_obj->flags & OMAP_BO_TILED)
-		ret = fault_2d(obj, vma, vmf);
+		ret = -EFAULT; //fault_2d(obj, vma, vmf);
 	else
 		ret = fault_1d(obj, vma, vmf);
 
@@ -579,8 +581,10 @@ int omap_gem_mmap_obj(struct drm_gem_object *obj,
 {
 	struct omap_gem_object *omap_obj = to_omap_bo(obj);
 
-	vma->vm_flags &= ~VM_PFNMAP;
-	vma->vm_flags |= VM_MIXEDMAP;
+	if (!(omap_obj->flags & OMAP_BO_TILED)) {
+		vma->vm_flags &= ~VM_PFNMAP;
+		vma->vm_flags |= VM_MIXEDMAP;
+	}
 
 	vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
 
@@ -613,6 +617,25 @@ int omap_gem_mmap_obj(struct drm_gem_object *obj,
 		vma->vm_file  = get_file(obj->filp);
 	}
 
+	if (omap_obj->flags & OMAP_BO_TILED) {
+		const enum tiler_fmt fmt = gem2fmt(omap_obj->flags);
+		const uint vstride = tiler_vsize(fmt, omap_obj->width, 1);
+		const uint pstride = tiler_stride(fmt, 0) >> PAGE_SHIFT;
+		unsigned long vaddr = vma->vm_start;
+		unsigned long pfn = omap_obj->dma_addr >> PAGE_SHIFT;
+		uint i;
+		int ret = 0;
+		for (i = 0; i < omap_obj->height; i++) {
+			ret = remap_pfn_range(vma, vaddr, pfn, vstride,
+					vma->vm_page_prot);
+			if (ret)
+				break;
+			vaddr += vstride;
+			pfn += pstride;
+		}
+		return ret;
+	}
+
 	return 0;
 }
 
-- 
2.12.2



More information about the Letux-kernel mailing list