Module Name:    src
Committed By:   riastradh
Date:           Wed Jul 24 02:54:09 UTC 2013

Modified Files:
        src/sys/external/bsd/drm2/dist/include/drm [riastradh-drm2]: drmP.h
        src/sys/modules/drm2 [riastradh-drm2]: Makefile
Added Files:
        src/sys/external/bsd/drm2/drm [riastradh-drm2]: drm_gem_vm.c

Log Message:
Add local drm_gem_vm.c, utilities for mapping gem objects into vm.


To generate a diff of this commit:
cvs rdiff -u -r1.1.1.1.2.41 -r1.1.1.1.2.42 \
    src/sys/external/bsd/drm2/dist/include/drm/drmP.h
cvs rdiff -u -r0 -r1.1.2.1 src/sys/external/bsd/drm2/drm/drm_gem_vm.c
cvs rdiff -u -r1.1.2.30 -r1.1.2.31 src/sys/modules/drm2/Makefile

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/include/drm/drmP.h
diff -u src/sys/external/bsd/drm2/dist/include/drm/drmP.h:1.1.1.1.2.41 src/sys/external/bsd/drm2/dist/include/drm/drmP.h:1.1.1.1.2.42
--- src/sys/external/bsd/drm2/dist/include/drm/drmP.h:1.1.1.1.2.41	Wed Jul 24 02:53:31 2013
+++ src/sys/external/bsd/drm2/dist/include/drm/drmP.h	Wed Jul 24 02:54:09 2013
@@ -1839,9 +1839,16 @@ int drm_gem_object_init(struct drm_devic
 int drm_gem_private_object_init(struct drm_device *dev,
 			struct drm_gem_object *obj, size_t size);
 void drm_gem_object_handle_free(struct drm_gem_object *obj);
+#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,
+    struct uvm_object **);
+#else
 void drm_gem_vm_open(struct vm_area_struct *vma);
 void drm_gem_vm_close(struct vm_area_struct *vma);
 int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma);
+#endif
 
 #include <drm/drm_global.h>
 

Index: src/sys/modules/drm2/Makefile
diff -u src/sys/modules/drm2/Makefile:1.1.2.30 src/sys/modules/drm2/Makefile:1.1.2.31
--- src/sys/modules/drm2/Makefile:1.1.2.30	Wed Jul 24 02:53:46 2013
+++ src/sys/modules/drm2/Makefile	Wed Jul 24 02:54:09 2013
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.1.2.30 2013/07/24 02:53:46 riastradh Exp $
+# $NetBSD: Makefile,v 1.1.2.31 2013/07/24 02:54:09 riastradh Exp $
 
 .include "../Makefile.inc"
 .include "Makefile.inc"
@@ -46,6 +46,7 @@ SRCS+=	drm_scatter.c
 SRCS+=	drm_stub.c
 SRCS+=	drm_vm.c
 
+SRCS+=	drm_gem_vm.c
 SRCS+=	drm_module.c
 SRCS+=	linux_idr.c
 

Added files:

Index: src/sys/external/bsd/drm2/drm/drm_gem_vm.c
diff -u /dev/null src/sys/external/bsd/drm2/drm/drm_gem_vm.c:1.1.2.1
--- /dev/null	Wed Jul 24 02:54:09 2013
+++ src/sys/external/bsd/drm2/drm/drm_gem_vm.c	Wed Jul 24 02:54:09 2013
@@ -0,0 +1,112 @@
+/*	$NetBSD: drm_gem_vm.c,v 1.1.2.1 2013/07/24 02:54:09 riastradh Exp $	*/
+
+/*-
+ * Copyright (c) 2013 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Taylor R. Campbell.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: drm_gem_vm.c,v 1.1.2.1 2013/07/24 02:54:09 riastradh Exp $");
+
+#include <sys/types.h>
+
+#include <uvm/uvm_extern.h>
+
+#include <drm/drmP.h>
+
+static int	drm_gem_mmap_object_locked(struct drm_device *, off_t *,
+		    size_t, struct uvm_object **);
+
+void
+drm_gem_pager_reference(struct uvm_object *uobj)
+{
+	struct drm_gem_object *const obj = container_of(uobj,
+	    struct drm_gem_object, gemo_uvmobj);
+
+	drm_gem_object_reference(obj);
+}
+
+void
+drm_gem_pager_detach(struct uvm_object *uobj)
+{
+	struct drm_gem_object *const obj = container_of(uobj,
+	    struct drm_gem_object, gemo_uvmobj);
+
+	drm_gem_object_unreference(obj);
+}
+
+int
+drm_gem_mmap_object(struct drm_device *dev, off_t *byte_offsetp, size_t nbytes,
+    struct uvm_object **uobjp)
+{
+	int error;
+
+	mutex_lock(&dev->struct_mutex);
+	error = drm_gem_mmap_object_locked(dev, byte_offsetp, nbytes, uobjp);
+	mutex_unlock(&dev->struct_mutex);
+
+	return error;
+}
+
+static int
+drm_gem_mmap_object_locked(struct drm_device *dev, off_t *byte_offsetp,
+    size_t nbytes, 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);
+
+	if (byte_offset != trunc_page(byte_offset)) /* XXX kassert?  */
+		return -EINVAL;
+
+	if (drm_ht_find_item(&mm->offset_hash, page_offset, &hash) != 0) {
+		/* Fall back to vanilla device mappings.  */
+		*uobjp = NULL;
+		return 0;
+	}
+
+	struct drm_local_map *const map = drm_hash_entry(hash,
+	    struct drm_map_list, hash)->map;
+
+	if (map == NULL)	/* XXX How can this happen?  */
+		return -EINVAL;
+	if (map->size < nbytes)
+		return -EOVERFLOW;
+
+	struct drm_gem_object *const obj = map->handle;
+	KASSERT(obj->dev == dev);
+
+	/* Success!  */
+	drm_gem_object_reference(obj); /* XXX Locking?  */
+	*uobjp = &obj->gemo_uvmobj;
+	return 0;
+}

Reply via email to