Module Name:    src
Committed By:   riastradh
Date:           Sat Jul 26 21:15:45 UTC 2014

Modified Files:
        src/sys/external/bsd/drm2/dist/drm/i915: i915_drv.c
        src/sys/external/bsd/drm2/dist/drm/radeon: radeon_drv.c radeon_ttm.c
        src/sys/external/bsd/drm2/dist/include/drm: drmP.h
        src/sys/external/bsd/drm2/drm: drm_drv.c drm_gem_vm.c drm_vm.c

Log Message:
Let the drm driver decide what part of what object gets mmapped.

Pass the file around too so radeon/ttm can get at it to verify access.

Add drm_gem_or_legacy_mmap_object for drivers to choose the previous
behaviour, like i915.


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.c
cvs rdiff -u -r1.3 -r1.4 \
    src/sys/external/bsd/drm2/dist/drm/radeon/radeon_drv.c \
    src/sys/external/bsd/drm2/dist/drm/radeon/radeon_ttm.c
cvs rdiff -u -r1.6 -r1.7 src/sys/external/bsd/drm2/dist/include/drm/drmP.h
cvs rdiff -u -r1.8 -r1.9 src/sys/external/bsd/drm2/drm/drm_drv.c
cvs rdiff -u -r1.4 -r1.5 src/sys/external/bsd/drm2/drm/drm_gem_vm.c \
    src/sys/external/bsd/drm2/drm/drm_vm.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.c:1.5 src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.c:1.6
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.c:1.5	Wed Jul 16 23:25:18 2014
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.c	Sat Jul 26 21:15:45 2014
@@ -1049,6 +1049,8 @@ static struct drm_driver driver = {
 #endif
 	.gem_free_object = i915_gem_free_object,
 #ifdef __NetBSD__
+	/* XXX Not clear the `or legacy' part is important here.  */
+	.mmap_object = &drm_gem_or_legacy_mmap_object,
 	.gem_uvm_ops = &i915_gem_uvm_ops,
 #else
 	.gem_vm_ops = &i915_gem_vm_ops,

Index: src/sys/external/bsd/drm2/dist/drm/radeon/radeon_drv.c
diff -u src/sys/external/bsd/drm2/dist/drm/radeon/radeon_drv.c:1.3 src/sys/external/bsd/drm2/dist/drm/radeon/radeon_drv.c:1.4
--- src/sys/external/bsd/drm2/dist/drm/radeon/radeon_drv.c:1.3	Thu Jul 17 15:09:00 2014
+++ src/sys/external/bsd/drm2/dist/drm/radeon/radeon_drv.c	Sat Jul 26 21:15:45 2014
@@ -119,7 +119,10 @@ extern int radeon_get_crtc_scanoutpos(st
 extern bool radeon_is_px(struct drm_device *dev);
 extern const struct drm_ioctl_desc radeon_ioctls_kms[];
 extern int radeon_max_kms_ioctl;
-#ifndef __NetBSD__
+#ifdef __NetBSD__
+int radeon_mmap_object(struct drm_device *, off_t, size_t, vm_prot_t,
+    struct uvm_object **, voff_t *, struct file *);
+#else
 int radeon_mmap(struct file *filp, struct vm_area_struct *vma);
 #endif
 int radeon_mode_dumb_mmap(struct drm_file *filp,
@@ -563,6 +566,7 @@ static struct drm_driver kms_driver = {
 	.dumb_destroy = drm_gem_dumb_destroy,
 #ifdef __NetBSD__
 	.fops = NULL,
+	.mmap_object = &radeon_mmap_object,
 	.gem_uvm_ops = &radeon_gem_uvm_ops,
 #else
 	.fops = &radeon_driver_kms_fops,
Index: src/sys/external/bsd/drm2/dist/drm/radeon/radeon_ttm.c
diff -u src/sys/external/bsd/drm2/dist/drm/radeon/radeon_ttm.c:1.3 src/sys/external/bsd/drm2/dist/drm/radeon/radeon_ttm.c:1.4
--- src/sys/external/bsd/drm2/dist/drm/radeon/radeon_ttm.c:1.3	Thu Jul 17 03:34:13 2014
+++ src/sys/external/bsd/drm2/dist/drm/radeon/radeon_ttm.c	Sat Jul 26 21:15:45 2014
@@ -879,7 +879,7 @@ radeon_mmap_object(struct drm_device *de
 
 	if (__predict_false((offset >> PAGE_SHIFT) < DRM_FILE_PAGE_OFFSET))
 		return drm_mmap_object(dev, offset, size, prot, uobjp,
-		    uoffsetp /* , file */);
+		    uoffsetp, file);
 	else
 		return ttm_bo_mmap_object(&rdev->mman.bdev, offset, size, prot,
 		    uobjp, uoffsetp, file);

Index: src/sys/external/bsd/drm2/dist/include/drm/drmP.h
diff -u src/sys/external/bsd/drm2/dist/include/drm/drmP.h:1.6 src/sys/external/bsd/drm2/dist/include/drm/drmP.h:1.7
--- src/sys/external/bsd/drm2/dist/include/drm/drmP.h:1.6	Wed Jul 16 20:56:25 2014
+++ src/sys/external/bsd/drm2/dist/include/drm/drmP.h	Sat Jul 26 21:15:45 2014
@@ -1097,6 +1097,8 @@ struct drm_driver {
 
 	/* Driver private ops for this object */
 #ifdef __NetBSD__
+	int (*mmap_object)(struct drm_device *, off_t, size_t, int,
+	    struct uvm_object **, voff_t *, struct file *);
 	const struct uvm_pagerops *gem_uvm_ops;
 #else
 	const struct vm_operations_struct *gem_vm_ops;
@@ -1422,7 +1424,7 @@ extern int drm_release(struct inode *ino
 				/* Mapping support (drm_vm.h) */
 #ifdef __NetBSD__
 extern int drm_mmap_object(struct drm_device *, off_t, size_t, int,
-    struct uvm_object **, voff_t *);
+    struct uvm_object **, voff_t *, struct file *);
 extern paddr_t drm_mmap_paddr(struct drm_device *, off_t, int);
 #else
 extern int drm_mmap(struct file *filp, struct vm_area_struct *vma);
@@ -1775,7 +1777,9 @@ void drm_gem_private_object_init(struct 
 void drm_gem_pager_reference(struct uvm_object *);
 void drm_gem_pager_detach(struct uvm_object *);
 int drm_gem_mmap_object(struct drm_device *, off_t, size_t, int,
-    struct uvm_object **, voff_t *);
+    struct uvm_object **, voff_t *, struct file *);
+int drm_gem_or_legacy_mmap_object(struct drm_device *, off_t, size_t, int,
+    struct uvm_object **, voff_t *, struct file *);
 #else
 void drm_gem_vm_open(struct vm_area_struct *vma);
 void drm_gem_vm_close(struct vm_area_struct *vma);

Index: src/sys/external/bsd/drm2/drm/drm_drv.c
diff -u src/sys/external/bsd/drm2/drm/drm_drv.c:1.8 src/sys/external/bsd/drm2/drm/drm_drv.c:1.9
--- src/sys/external/bsd/drm2/drm/drm_drv.c:1.8	Fri Jul 25 08:10:39 2014
+++ src/sys/external/bsd/drm2/drm/drm_drv.c	Sat Jul 26 21:15:45 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: drm_drv.c,v 1.8 2014/07/25 08:10:39 dholland Exp $	*/
+/*	$NetBSD: drm_drv.c,v 1.9 2014/07/26 21:15:45 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_drv.c,v 1.8 2014/07/25 08:10:39 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_drv.c,v 1.9 2014/07/26 21:15:45 riastradh Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -754,24 +754,14 @@ drm_mmap_ioctl(struct drm_device *dev, v
 		return -EINVAL;
 	(void)addr;		/* XXX ignore -- no MAP_FIXED for now */
 
-	/* Try a GEM object mapping first.  */
-	ret = drm_gem_mmap_object(dev, offset, size, prot, &uobj, &uoffset);
+	ret = (*dev->driver->mmap_object)(dev, offset, size, prot, &uobj,
+	    &uoffset, file->filp);
 	if (ret)
 		return ret;
-	if (uobj != NULL)
-		goto map;
-
-	/* Try a traditional DRM mapping second.  */
-	ret = drm_mmap_object(dev, offset, size, prot, &uobj, &uoffset);
-	if (ret)
-		return ret;
-	if (uobj != NULL)
-		goto map;
-
-	/* Fail.  */
-	return ret;
+	if (uobj == NULL)
+		return -EINVAL;
 
-map:	vm_prot = ((ISSET(prot, PROT_READ)? VM_PROT_READ : 0) |
+	vm_prot = ((ISSET(prot, PROT_READ)? VM_PROT_READ : 0) |
 	    (ISSET(prot, PROT_WRITE)? VM_PROT_WRITE : 0));
 	KASSERT(vm_prot == (vm_prot & vm_maxprot));
 	uvmflag = UVM_MAPFLAG(vm_prot, vm_maxprot, UVM_INH_COPY,

Index: src/sys/external/bsd/drm2/drm/drm_gem_vm.c
diff -u src/sys/external/bsd/drm2/drm/drm_gem_vm.c:1.4 src/sys/external/bsd/drm2/drm/drm_gem_vm.c:1.5
--- src/sys/external/bsd/drm2/drm/drm_gem_vm.c:1.4	Wed Jul 16 20:56:25 2014
+++ src/sys/external/bsd/drm2/drm/drm_gem_vm.c	Sat Jul 26 21:15:45 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: drm_gem_vm.c,v 1.4 2014/07/16 20:56:25 riastradh Exp $	*/
+/*	$NetBSD: drm_gem_vm.c,v 1.5 2014/07/26 21:15:45 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_gem_vm.c,v 1.4 2014/07/16 20:56:25 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_gem_vm.c,v 1.5 2014/07/26 21:15:45 riastradh Exp $");
 
 #include <sys/types.h>
 
@@ -40,7 +40,7 @@ __KERNEL_RCSID(0, "$NetBSD: drm_gem_vm.c
 #include <drm/drm_vma_manager.h>
 
 static int	drm_gem_mmap_object_locked(struct drm_device *, off_t, size_t,
-		    int, struct uvm_object **, voff_t *);
+		    int, struct uvm_object **, voff_t *, struct file *);
 
 void
 drm_gem_pager_reference(struct uvm_object *uobj)
@@ -61,14 +61,32 @@ drm_gem_pager_detach(struct uvm_object *
 }
 
 int
+drm_gem_or_legacy_mmap_object(struct drm_device *dev, off_t byte_offset,
+    size_t nbytes, int prot, struct uvm_object **uobjp, voff_t *uoffsetp,
+    struct file *file)
+{
+	int ret;
+
+	ret = drm_gem_mmap_object(dev, byte_offset, nbytes, prot, uobjp,
+	    uoffsetp, file);
+	if (ret)
+		return ret;
+	if (*uobjp != NULL)
+		return 0;
+
+	return drm_mmap_object(dev, byte_offset, nbytes, prot, uobjp,
+	    uoffsetp, file);
+}
+
+int
 drm_gem_mmap_object(struct drm_device *dev, off_t byte_offset, size_t nbytes,
-    int prot, struct uvm_object **uobjp, voff_t *uoffsetp)
+    int prot, struct uvm_object **uobjp, voff_t *uoffsetp, struct file *file)
 {
 	int ret;
 
 	mutex_lock(&dev->struct_mutex);
 	ret = drm_gem_mmap_object_locked(dev, byte_offset, nbytes, prot,
-	    uobjp, uoffsetp);
+	    uobjp, uoffsetp, file);
 	mutex_unlock(&dev->struct_mutex);
 
 	return ret;
@@ -77,7 +95,7 @@ drm_gem_mmap_object(struct drm_device *d
 static int
 drm_gem_mmap_object_locked(struct drm_device *dev, off_t byte_offset,
     size_t nbytes, int prot __unused, struct uvm_object **uobjp,
-    voff_t *uoffsetp)
+    voff_t *uoffsetp, struct file *file __unused)
 {
 	const unsigned long startpage = (byte_offset >> PAGE_SHIFT);
 	const unsigned long npages = (nbytes >> PAGE_SHIFT);
Index: src/sys/external/bsd/drm2/drm/drm_vm.c
diff -u src/sys/external/bsd/drm2/drm/drm_vm.c:1.4 src/sys/external/bsd/drm2/drm/drm_vm.c:1.5
--- src/sys/external/bsd/drm2/drm/drm_vm.c:1.4	Wed Jul 16 20:56:25 2014
+++ src/sys/external/bsd/drm2/drm/drm_vm.c	Sat Jul 26 21:15:45 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: drm_vm.c,v 1.4 2014/07/16 20:56:25 riastradh Exp $	*/
+/*	$NetBSD: drm_vm.c,v 1.5 2014/07/26 21:15:45 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_vm.c,v 1.4 2014/07/16 20:56:25 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_vm.c,v 1.5 2014/07/26 21:15:45 riastradh Exp $");
 
 #include <sys/types.h>
 #include <sys/conf.h>
@@ -47,7 +47,7 @@ static paddr_t	drm_mmap_map_paddr(struct
 
 int
 drm_mmap_object(struct drm_device *dev, off_t offset, size_t size, int prot,
-    struct uvm_object **uobjp, voff_t *uoffsetp)
+    struct uvm_object **uobjp, voff_t *uoffsetp, struct file *file __unused)
 {
 	dev_t devno = cdevsw_lookup_major(&drm_cdevsw);
 	struct uvm_object *uobj;

Reply via email to