Module Name:    src
Committed By:   riastradh
Date:           Sun Dec 19 01:44:57 UTC 2021

Modified Files:
        src/sys/external/bsd/drm2/dist/drm/i915: i915_active.c i915_vma.c
        src/sys/external/bsd/drm2/dist/drm/i915/gem: i915_gem_shmem.c

Log Message:
Hack i915_vma.c: rbtree, unmap by pa rather than vm object, PRIx64.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 \
    src/sys/external/bsd/drm2/dist/drm/i915/i915_active.c
cvs rdiff -u -r1.4 -r1.5 src/sys/external/bsd/drm2/dist/drm/i915/i915_vma.c
cvs rdiff -u -r1.4 -r1.5 \
    src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shmem.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_active.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_active.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/i915_active.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_active.c:1.2	Sat Dec 18 23:45:28 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_active.c	Sun Dec 19 01:44:57 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_active.c,v 1.2 2021/12/18 23:45:28 riastradh Exp $	*/
+/*	$NetBSD: i915_active.c,v 1.3 2021/12/19 01:44:57 riastradh Exp $	*/
 
 /*
  * SPDX-License-Identifier: MIT
@@ -7,7 +7,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_active.c,v 1.2 2021/12/18 23:45:28 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_active.c,v 1.3 2021/12/19 01:44:57 riastradh Exp $");
 
 #include <linux/debugobjects.h>
 
@@ -246,6 +246,15 @@ active_instance(struct i915_active *ref,
 	spin_lock_irq(&ref->tree_lock);
 	GEM_BUG_ON(i915_active_is_idle(ref));
 
+#ifdef __NetBSD__
+	__USE(parent);
+	__USE(p);
+	node = rb_tree_find_node(&vma->active.rbr_tree, &idx);
+	if (node) {
+		KASSERT(node->timeline == idx);
+		goto out;
+	}
+#else
 	parent = NULL;
 	p = &ref->tree.rb_node;
 	while (*p) {
@@ -262,14 +271,21 @@ active_instance(struct i915_active *ref,
 		else
 			p = &parent->rb_left;
 	}
+#endif
 
 	node = prealloc;
 	__i915_active_fence_init(&node->base, NULL, node_retire);
 	node->ref = ref;
 	node->timeline = idx;
 
+#ifdef __NetBSD__
+	struct i915_vma_active *collision __diagused;
+	collision = rb_tree_insert_node(&vma->active.rbr_tree, node);
+	KASSERT(collision == node);
+#else
 	rb_link_node(&node->node, parent, p);
 	rb_insert_color(&node->node, &ref->tree);
+#endif
 
 out:
 	ref->cache = node;
@@ -279,6 +295,40 @@ out:
 	return &node->base;
 }
 
+#ifdef __NetBSD__
+static int
+compare_active(void *cookie, const void *va, const void *vb)
+{
+	const struct i915_active *a = va;
+	const struct i915_active *b = vb;
+
+	if (a->timeline < b->timeline)
+		return -1;
+	if (a->timeline > b->timeline)
+		return +1;
+	return 0;
+}
+
+static int
+compare_active_key(void *cookie, const void *vn, const void *vk)
+{
+	const struct i915_active *a = vn;
+	const uint64_t *k = vk;
+
+	if (a->timeline < *k)
+		return -1;
+	if (a->timeline > *k)
+		return +1;
+	return 0;
+}
+
+static const rb_tree_ops_t active_rb_ops = {
+	.rbto_compare_nodes = compare_active,
+	.rbto_compare_key = compare_active_key,
+	.rbto_node_offset = offsetof(struct i915_active, node),
+};
+#endif
+
 void __i915_active_init(struct i915_active *ref,
 			int (*active)(struct i915_active *ref),
 			void (*retire)(struct i915_active *ref),
@@ -296,7 +346,11 @@ void __i915_active_init(struct i915_acti
 		ref->flags |= I915_ACTIVE_RETIRE_SLEEPS;
 
 	spin_lock_init(&ref->tree_lock);
+#ifdef __NetBSD__
+	rb_tree_init(&vma->active.rbr_tree, &active_rb_ops);
+#else
 	ref->tree = RB_ROOT;
+#endif
 	ref->cache = NULL;
 
 	init_llist_head(&ref->preallocated_barriers);

Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_vma.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_vma.c:1.4 src/sys/external/bsd/drm2/dist/drm/i915/i915_vma.c:1.5
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_vma.c:1.4	Sun Dec 19 01:35:25 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_vma.c	Sun Dec 19 01:44:57 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_vma.c,v 1.4 2021/12/19 01:35:25 riastradh Exp $	*/
+/*	$NetBSD: i915_vma.c,v 1.5 2021/12/19 01:44:57 riastradh Exp $	*/
 
 /*
  * Copyright © 2016 Intel Corporation
@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_vma.c,v 1.4 2021/12/19 01:35:25 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_vma.c,v 1.5 2021/12/19 01:44:57 riastradh Exp $");
 
 #include <linux/sched/mm.h>
 #include <drm/drm_gem.h>
@@ -104,6 +104,49 @@ static void __i915_vma_retire(struct i91
 	i915_vma_put(active_to_vma(ref));
 }
 
+#ifdef __NetBSD__
+struct i915_vma_key {
+	struct i915_address_space *vm;
+	const struct i915_ggtt_view *view;
+};
+
+static int
+compare_vma(void *cookie, const void *va, const void *vb)
+{
+	const struct i915_vma *a = va;
+	const struct i915_vma *b = vb;
+	long cmp = i915_vma_compare(__UNCONST(a), b->vm, &b->ggtt_view);
+
+	return (cmp < 0 ? -1 : cmp > 0 ? +1 : 0);
+}
+
+static int
+compare_vma_key(void *cookie, const void *vn, const void *vk)
+{
+	const struct i915_vma *vma = vn;
+	const struct i915_vma_key *key = vk;
+	long cmp = i915_vma_compare(__UNCONST(vma), key->vm, key->view);
+
+	return (cmp < 0 ? -1 : cmp > 0 ? +1 : 0);
+}
+
+static const rb_tree_ops_t vma_tree_rb_ops = {
+	.rbto_compare_nodes = compare_vma,
+	.rbto_compare_key = compare_vma_key,
+	.rbto_node_offset = offsetof(struct i915_vma, obj_node),
+};
+#endif
+
+void
+i915_vma_tree_init(struct drm_i915_gem_object *obj)
+{
+#ifdef __NetBSD__
+	rb_tree_init(&obj->vma_tree.rbr_tree, &vma_tree_rb_ops);
+#else
+	obj->vma_tree = RB_ROOT;
+#endif
+}
+
 static struct i915_vma *
 vma_create(struct drm_i915_gem_object *obj,
 	   struct i915_address_space *vm,
@@ -186,6 +229,13 @@ vma_create(struct drm_i915_gem_object *o
 		__set_bit(I915_VMA_GGTT_BIT, __i915_vma_flags(vma));
 	}
 
+#ifdef __NetBSD__
+	__USE(rb);
+	__USE(p);
+	struct i915_vma *collision __diagused;
+	collision = rb_tree_insert_node(&obj->vma_tree.rbr_tree, vma);
+	KASSERT(collision == vma);
+#else
 	spin_lock(&obj->vma.lock);
 
 	rb = NULL;
@@ -216,6 +266,7 @@ vma_create(struct drm_i915_gem_object *o
 	}
 	rb_link_node(&vma->obj_node, rb, p);
 	rb_insert_color(&vma->obj_node, &obj->vma.tree);
+#endif
 
 	if (i915_vma_is_ggtt(vma))
 		/*
@@ -242,6 +293,11 @@ vma_lookup(struct drm_i915_gem_object *o
 	   struct i915_address_space *vm,
 	   const struct i915_ggtt_view *view)
 {
+#ifdef __NetBSD__
+	const struct i915_vma_key key = { .vm = vm, .view = view };
+
+	return rb_tree_find_node(&obj->vma_tree.rbr_tree, &key);
+#else
 	struct rb_node *rb;
 
 	rb = obj->vma.tree.rb_node;
@@ -260,6 +316,7 @@ vma_lookup(struct drm_i915_gem_object *o
 	}
 
 	return NULL;
+#endif
 }
 
 /**
@@ -660,7 +717,7 @@ i915_vma_insert(struct i915_vma *vma, u6
 	 * attempt to find space.
 	 */
 	if (size > end) {
-		DRM_DEBUG("Attempting to bind an object larger than the aperture: request=%llu > %s aperture=%llu\n",
+		DRM_DEBUG("Attempting to bind an object larger than the aperture: request=%"PRIu64" > %s aperture=%"PRIu64"\n",
 			  size, flags & PIN_MAPPABLE ? "mappable" : "total",
 			  end);
 		return -ENOSPC;
@@ -1117,7 +1174,11 @@ static void __i915_vma_iounmap(struct i9
 	if (vma->iomap == NULL)
 		return;
 
+#ifdef __NetBSD__
+	io_mapping_unmap(&i915_vm_to_ggtt(vma->vm)->iomap, vma->iomap);
+#else
 	io_mapping_unmap(vma->iomap);
+#endif
 	vma->iomap = NULL;
 }
 
@@ -1132,12 +1193,22 @@ void i915_vma_revoke_mmap(struct i915_vm
 	GEM_BUG_ON(!i915_vma_is_map_and_fenceable(vma));
 	GEM_BUG_ON(!vma->obj->userfault_count);
 
+#ifdef __NetBSD__
+	__USE(vma_offset);
+	__USE(node);
+	struct drm_i915_private *i915 = to_i915(vma->obj->base.dev);
+	paddr_t pa = i915->ggtt.gmadr.start + vma->node.start;
+	vsize_t npgs = vma->size >> PAGE_SHIFT;
+	while (npgs --> 0)
+		pmap_pv_protect(pa = (npgs << PAGE_SHIFT), VM_PROT_NONE);
+#else
 	node = &vma->mmo->vma_node;
 	vma_offset = vma->ggtt_view.partial.offset << PAGE_SHIFT;
 	unmap_mapping_range(vma->vm->i915->drm.anon_inode->i_mapping,
 			    drm_vma_node_offset_addr(node) + vma_offset,
 			    vma->size,
 			    1);
+#endif
 
 	i915_vma_unset_userfault(vma);
 	if (!--vma->obj->userfault_count)
@@ -1199,40 +1270,6 @@ int i915_vma_move_to_active(struct i915_
 	return 0;
 }
 
-#ifdef __NetBSD__
-static int
-compare_active(void *cookie, const void *va, const void *vb)
-{
-	const struct i915_vma_active *a = va;
-	const struct i915_vma_active *b = vb;
-
-	if (a->timeline < b->timeline)
-		return -1;
-	if (a->timeline > b->timeline)
-		return +1;
-	return 0;
-}
-
-static int
-compare_active_key(void *cookie, const void *vn, const void *vk)
-{
-	const struct i915_vma_active *a = vn;
-	const uint64_t *k = vk;
-
-	if (a->timeline < *k)
-		return -1;
-	if (a->timeline > *k)
-		return +1;
-	return 0;
-}
-
-static const rb_tree_ops_t vma_active_rb_ops = {
-	.rbto_compare_nodes = compare_active,
-	.rbto_compare_key = compare_active_key,
-	.rbto_node_offset = offsetof(struct i915_vma_active, node),
-};
-#endif
-
 int __i915_vma_unbind(struct i915_vma *vma)
 {
 	int ret;

Index: src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shmem.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shmem.c:1.4 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shmem.c:1.5
--- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shmem.c:1.4	Sun Dec 19 01:34:08 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shmem.c	Sun Dec 19 01:44:57 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_gem_shmem.c,v 1.4 2021/12/19 01:34:08 riastradh Exp $	*/
+/*	$NetBSD: i915_gem_shmem.c,v 1.5 2021/12/19 01:44:57 riastradh Exp $	*/
 
 /*
  * SPDX-License-Identifier: MIT
@@ -7,7 +7,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_gem_shmem.c,v 1.4 2021/12/19 01:34:08 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_gem_shmem.c,v 1.5 2021/12/19 01:44:57 riastradh Exp $");
 
 #include <linux/pagevec.h>
 #include <linux/swap.h>
@@ -461,6 +461,9 @@ static int __create_shmem(struct drm_i91
 			  struct drm_gem_object *obj,
 			  resource_size_t size)
 {
+#ifdef __NetBSD__
+	return drm_gem_object_init(dev, obj, size);
+#else
 	unsigned long flags = VM_NORESERVE;
 	struct file *filp;
 
@@ -476,6 +479,7 @@ static int __create_shmem(struct drm_i91
 
 	obj->filp = filp;
 	return 0;
+#endif
 }
 
 static struct drm_i915_gem_object *

Reply via email to