Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/riastradh-drm2]: src/sys/external/bsd/drm2 Tidy up and reuse the code I ...



details:   https://anonhg.NetBSD.org/src/rev/563fe4137c88
branches:  riastradh-drm2
changeset: 788625:563fe4137c88
user:      riastradh <riastradh%NetBSD.org@localhost>
date:      Wed Jan 22 16:40:44 2014 +0000

description:
Tidy up and reuse the code I had already written for gem mmapping.

diffstat:

 sys/external/bsd/drm2/dist/include/drm/drmP.h |    4 +-
 sys/external/bsd/drm2/drm/drm_drv.c           |  121 +++++++------------------
 sys/external/bsd/drm2/drm/drm_gem_vm.c        |   25 ++--
 sys/external/bsd/drm2/drm/drm_vm.c            |   23 ++++-
 4 files changed, 71 insertions(+), 102 deletions(-)

diffs (truncated from 313 to 300 lines):

diff -r fcea01fddaee -r 563fe4137c88 sys/external/bsd/drm2/dist/include/drm/drmP.h
--- a/sys/external/bsd/drm2/dist/include/drm/drmP.h     Wed Jan 22 14:58:47 2014 +0000
+++ b/sys/external/bsd/drm2/dist/include/drm/drmP.h     Wed Jan 22 16:40:44 2014 +0000
@@ -1494,6 +1494,8 @@
 
                                /* Mapping support (drm_vm.h) */
 #ifdef __NetBSD__
+extern int drm_mmap_object(struct drm_device *, off_t, size_t, int,
+    struct uvm_object **);
 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);
@@ -1846,7 +1848,7 @@
 #ifdef __NetBSD__
 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 drm_gem_mmap_object(struct drm_device *, off_t, size_t, int,
     struct uvm_object **);
 #else
 void drm_gem_vm_open(struct vm_area_struct *vma);
diff -r fcea01fddaee -r 563fe4137c88 sys/external/bsd/drm2/drm/drm_drv.c
--- a/sys/external/bsd/drm2/drm/drm_drv.c       Wed Jan 22 14:58:47 2014 +0000
+++ b/sys/external/bsd/drm2/drm/drm_drv.c       Wed Jan 22 16:40:44 2014 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: drm_drv.c,v 1.1.2.32 2014/01/22 14:58:47 riastradh Exp $       */
+/*     $NetBSD: drm_drv.c,v 1.1.2.33 2014/01/22 16:40:44 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.1.2.32 2014/01/22 14:58:47 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_drv.c,v 1.1.2.33 2014/01/22 16:40:44 riastradh Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -43,13 +43,7 @@
 #include <sys/poll.h>
 #include <sys/select.h>
 
-#include <uvm/uvm.h>
-#include <uvm/uvm_device.h>
 #include <uvm/uvm_extern.h>
-#include <uvm/uvm_fault.h>
-#include <uvm/uvm_page.h>
-#include <uvm/uvm_pmap.h>
-#include <uvm/uvm_prot.h>
 
 #include <drm/drmP.h>
 
@@ -104,8 +98,6 @@
 static int     drm_ioctl(struct file *, unsigned long, void *);
 static int     drm_version_string(char *, size_t *, const char *);
 static paddr_t drm_mmap(dev_t, off_t, int);
-static int     drm_do_mmap(struct uvm_object *, vm_prot_t, voff_t, size_t,
-                   vaddr_t *);
 
 static drm_ioctl_t     drm_version;
 static drm_ioctl_t     drm_mmap_ioctl;
@@ -886,101 +878,56 @@
        const int prot = args->dnm_prot;
        const int flags = args->dnm_flags;
        const off_t offset = args->dnm_offset;
-       struct drm_gem_mm *const mm = dev->mm_private;
-       struct drm_hash_item *hash;
+       struct uvm_object *uobj;
+       const vm_prot_t vm_maxprot = (VM_PROT_READ | VM_PROT_WRITE);
        vm_prot_t vm_prot;
-       dev_t devno;
-       struct uvm_object *uobj;
-       vaddr_t vaddr;
+       int uvmflag;
+       vaddr_t align, vaddr;
        int ret;
 
        /* XXX Copypasta from drm_gem_mmap.  */
        if (drm_device_is_unplugged(dev))
                return -ENODEV;
 
-       if (prot != (PROT_READ | PROT_WRITE))
+       if (prot != (prot & (PROT_READ | PROT_WRITE)))
                return -EACCES;
        if (flags != MAP_SHARED)
                return -EINVAL;
        (void)addr;             /* XXX ignore -- no MAP_FIXED for now */
 
-       KASSERT(prot == (PROT_READ | PROT_WRITE));
-       vm_prot = (VM_PROT_READ | VM_PROT_WRITE);
-
-       mutex_lock(&dev->struct_mutex);
-       if (drm_ht_find_item(&mm->offset_hash, atop(offset), &hash) == 0) {
-               /* GEM object.  Map the GEM shared-memory uobj.  */
-
-               struct drm_local_map *const map =
-                   drm_hash_entry(hash, struct drm_map_list, hash)->map;
-               if ((map == NULL) ||
-                   (ISSET(map->flags, _DRM_RESTRICTED) && !DRM_SUSER())) {
-                       ret = -EPERM;
-                       goto out_unlock;
-               }
-               if (map->size < size) {
-                       ret = -EINVAL;
-                       goto out_unlock;
-               }
-
-               struct drm_gem_object *const obj = map->handle;
-               if (obj->dev->driver->gem_uvm_ops == NULL) {
-                       ret = -EINVAL;
-                       goto out_unlock;
-               }
-
-               uobj = obj->gemo_shm_uao;
-               ret = drm_do_mmap(uobj, prot, offset, size, &vaddr);
-               if (ret)
-                       goto out_unlock;
-               drm_gem_object_reference(obj);
+       /* Try a GEM object mapping first.  */
+       ret = drm_gem_mmap_object(dev, offset, size, prot, &uobj);
+       if (ret)
+               return ret;
+       if (uobj != NULL)
+               goto map;
 
-out_unlock:    mutex_unlock(&dev->struct_mutex);
-       } else {
-               /*
-                * Not a GEM object.  Use the old mmap.
-                *
-                * XXX Unlocking is wrong here, but the uvm device mmap
-                * API will call cdev_mmap immediately (where we can
-                * control whether or not the device is locked) and in
-                * the fault handler (where the device is unlocked and
-                * we can't do a thing about it), so we have to unlock
-                * the device first.  The good news is that this should
-                * only enable a broken application to use paddrs that
-                * it is allowed to use anyway but that perhaps are not
-                * the ones it expected.
-                */
-               mutex_unlock(&dev->struct_mutex);
+       /* Try a traditional DRM mapping second.  */
+       ret = drm_mmap_object(dev, offset, size, prot, &uobj);
+       if (ret)
+               return ret;
+       if (uobj != NULL)
+               goto map;
 
-               devno = file->minor->device;
-               uobj = udv_attach(&devno, prot, offset, size);
-               if (uobj == NULL) {
-                       ret = -EINVAL;
-                       goto out;
-               }
-
-               ret = drm_do_mmap(uobj, prot, offset, size, &vaddr);
-       }
+       /* Fail.  */
+       return ret;
 
-out:   if (ret == 0)
-               args->dnm_addr = (void *)vaddr;
-       return ret;
-}
-
-static int
-drm_do_mmap(struct uvm_object *uobj, vm_prot_t prot, voff_t offset,
-    size_t size, vaddr_t *vaddr)
-{
-       vaddr_t align;
-       int uvmflag;
+map:   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,
+           UVM_ADV_RANDOM, UVM_FLAG_COPYONW);
 
        align = 0;              /* XXX */
-       uvmflag = UVM_MAPFLAG(prot, prot, UVM_INH_COPY, UVM_ADV_RANDOM,
-           UVM_FLAG_COPYONW);
-
-       *vaddr = (*curproc->p_emul->e_vm_default_addr)(curproc,
+       vaddr = (*curproc->p_emul->e_vm_default_addr)(curproc,
            (vaddr_t)curproc->p_vmspace->vm_daddr, size);
        /* XXX errno NetBSD->Linux */
-       return -uvm_map(&curproc->p_vmspace->vm_map, vaddr, size, uobj, offset,
+       ret = -uvm_map(&curproc->p_vmspace->vm_map, &vaddr, size, uobj, offset,
            align, uvmflag);
+       if (ret)
+               return ret;
+
+       /* Success!  */
+       args->dnm_addr = (void *)vaddr;
+       return 0;
 }
diff -r fcea01fddaee -r 563fe4137c88 sys/external/bsd/drm2/drm/drm_gem_vm.c
--- a/sys/external/bsd/drm2/drm/drm_gem_vm.c    Wed Jan 22 14:58:47 2014 +0000
+++ b/sys/external/bsd/drm2/drm/drm_gem_vm.c    Wed Jan 22 16:40:44 2014 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: drm_gem_vm.c,v 1.1.2.3 2013/09/08 15:56:32 riastradh Exp $     */
+/*     $NetBSD: drm_gem_vm.c,v 1.1.2.4 2014/01/22 16:40:44 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.1.2.3 2013/09/08 15:56:32 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_gem_vm.c,v 1.1.2.4 2014/01/22 16:40:44 riastradh Exp $");
 
 #include <sys/types.h>
 
@@ -38,8 +38,8 @@
 
 #include <drm/drmP.h>
 
-static int     drm_gem_mmap_object_locked(struct drm_device *, off_t *,
-                   size_t, struct uvm_object **);
+static int     drm_gem_mmap_object_locked(struct drm_device *, off_t, size_t,
+                   int, struct uvm_object **);
 
 void
 drm_gem_pager_reference(struct uvm_object *uobj)
@@ -60,30 +60,31 @@
 }
 
 int
-drm_gem_mmap_object(struct drm_device *dev, off_t *byte_offsetp, size_t nbytes,
-    struct uvm_object **uobjp)
+drm_gem_mmap_object(struct drm_device *dev, off_t byte_offset, size_t nbytes,
+    int prot, struct uvm_object **uobjp)
 {
-       int error;
+       int ret;
 
        mutex_lock(&dev->struct_mutex);
-       error = drm_gem_mmap_object_locked(dev, byte_offsetp, nbytes, uobjp);
+       ret = drm_gem_mmap_object_locked(dev, byte_offset, nbytes, prot,
+           uobjp);
        mutex_unlock(&dev->struct_mutex);
 
-       return error;
+       return ret;
 }
 
 static int
-drm_gem_mmap_object_locked(struct drm_device *dev, off_t *byte_offsetp,
-    size_t nbytes, struct uvm_object **uobjp)
+drm_gem_mmap_object_locked(struct drm_device *dev, off_t byte_offset,
+    size_t nbytes, int prot __unused, struct uvm_object **uobjp)
 {
        struct drm_gem_mm *const mm = dev->mm_private;
-       const off_t byte_offset = *byte_offsetp;
        const off_t page_offset = (byte_offset >> PAGE_SHIFT);
        struct drm_hash_item *hash;
 
        KASSERT(mutex_is_locked(&dev->struct_mutex));
        KASSERT(drm_core_check_feature(dev, DRIVER_GEM));
        KASSERT(dev->driver->gem_uvm_ops != NULL);
+       KASSERT(prot == (prot & (PROT_READ | PROT_WRITE)));
 
        if (byte_offset != (byte_offset & ~(PAGE_SIZE-1))) /* XXX kassert?  */
                return -EINVAL;
diff -r fcea01fddaee -r 563fe4137c88 sys/external/bsd/drm2/drm/drm_vm.c
--- a/sys/external/bsd/drm2/drm/drm_vm.c        Wed Jan 22 14:58:47 2014 +0000
+++ b/sys/external/bsd/drm2/drm/drm_vm.c        Wed Jan 22 16:40:44 2014 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: drm_vm.c,v 1.1.2.3 2014/01/22 14:58:47 riastradh Exp $ */
+/*     $NetBSD: drm_vm.c,v 1.1.2.4 2014/01/22 16:40:44 riastradh Exp $ */
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -30,11 +30,13 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_vm.c,v 1.1.2.3 2014/01/22 14:58:47 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_vm.c,v 1.1.2.4 2014/01/22 16:40:44 riastradh Exp $");
 
 #include <sys/types.h>
+#include <sys/conf.h>
 
 #include <uvm/uvm_extern.h>
+#include <uvm/uvm_device.h>
 
 #include <drm/drmP.h>
 
@@ -43,6 +45,23 @@
 static paddr_t drm_mmap_map_paddr(struct drm_device *, struct drm_local_map *,
                    off_t, int);
 
+extern struct cdevsw drm_cdevsw;       /* XXX */
+
+int
+drm_mmap_object(struct drm_device *dev, off_t offset, size_t size, int prot,
+    struct uvm_object **uobjp)
+{
+       dev_t devno = cdevsw_lookup_major(&drm_cdevsw);



Home | Main Index | Thread Index | Old Index