Module Name:    src
Committed By:   riastradh
Date:           Sun Dec 19 11:51:59 UTC 2021

Modified Files:
        src/sys/external/bsd/drm2/dist/drm/i915: i915_drv.h
        src/sys/external/bsd/drm2/dist/drm/i915/gt: intel_engine_types.h
            intel_engine_user.c
        src/sys/external/bsd/drm2/i915drm: files.i915drmkms

Log Message:
i915: Disentangle uabi engines rb/llist/list spaghetti.


To generate a diff of this commit:
cvs rdiff -u -r1.44 -r1.45 src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h
cvs rdiff -u -r1.6 -r1.7 \
    src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_engine_types.h
cvs rdiff -u -r1.3 -r1.4 \
    src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_engine_user.c
cvs rdiff -u -r1.81 -r1.82 src/sys/external/bsd/drm2/i915drm/files.i915drmkms

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.h
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h:1.44 src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h:1.45
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h:1.44	Sun Dec 19 11:33:49 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h	Sun Dec 19 11:51:59 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_drv.h,v 1.44 2021/12/19 11:33:49 riastradh Exp $	*/
+/*	$NetBSD: i915_drv.h,v 1.45 2021/12/19 11:51:59 riastradh Exp $	*/
 
 /* i915_drv.h -- Private header for the I915 driver -*- linux-c -*-
  */
@@ -987,6 +987,7 @@ struct drm_i915_private {
 
 	struct intel_engine_cs *engine[I915_NUM_ENGINES];
 	struct rb_root uabi_engines;
+	struct llist_head uabi_engines_llist;
 
 	struct resource mch_res;
 
@@ -1381,12 +1382,12 @@ static inline struct drm_i915_private *p
 	     0;)
 
 #define rb_to_uabi_engine(rb) \
-	rb_entry_safe(rb, struct intel_engine_cs, uabi_node)
+	rb_entry_safe(rb, struct intel_engine_cs, uabi_node.rbtree)
 
 #define for_each_uabi_engine(engine__, i915__) \
 	for ((engine__) = rb_to_uabi_engine(rb_first(&(i915__)->uabi_engines));\
 	     (engine__); \
-	     (engine__) = rb_to_uabi_engine(rb_next2(&(i915__)->uabi_engines, &(engine__)->uabi_node)))
+	     (engine__) = rb_to_uabi_engine(rb_next2(&(i915__)->uabi_engines, &(engine__)->uabi_node.rbtree)))
 
 #define I915_GTT_OFFSET_NONE ((u32)-1)
 

Index: src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_engine_types.h
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_engine_types.h:1.6 src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_engine_types.h:1.7
--- src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_engine_types.h:1.6	Sun Dec 19 11:46:47 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_engine_types.h	Sun Dec 19 11:51:59 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: intel_engine_types.h,v 1.6 2021/12/19 11:46:47 riastradh Exp $	*/
+/*	$NetBSD: intel_engine_types.h,v 1.7 2021/12/19 11:51:59 riastradh Exp $	*/
 
 /*
  * SPDX-License-Identifier: MIT
@@ -299,7 +299,11 @@ struct intel_engine_cs {
 	unsigned int context_tag;
 #define NUM_CONTEXT_TAG roundup_pow_of_two(2 * EXECLIST_MAX_PORTS)
 
-	struct rb_node uabi_node;
+	union {
+		struct rb_node rbtree;
+		struct llist_node llist;
+		struct list_head list;
+	} uabi_node;
 
 	struct intel_sseu sseu;
 

Index: src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_engine_user.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_engine_user.c:1.3 src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_engine_user.c:1.4
--- src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_engine_user.c:1.3	Sun Dec 19 11:38:37 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_engine_user.c	Sun Dec 19 11:51:59 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: intel_engine_user.c,v 1.3 2021/12/19 11:38:37 riastradh Exp $	*/
+/*	$NetBSD: intel_engine_user.c,v 1.4 2021/12/19 11:51:59 riastradh Exp $	*/
 
 /*
  * SPDX-License-Identifier: MIT
@@ -7,7 +7,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intel_engine_user.c,v 1.3 2021/12/19 11:38:37 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intel_engine_user.c,v 1.4 2021/12/19 11:51:59 riastradh Exp $");
 
 #include <linux/list.h>
 #include <linux/list_sort.h>
@@ -20,9 +20,57 @@ __KERNEL_RCSID(0, "$NetBSD: intel_engine
 
 #include <linux/nbsd-namespace.h>
 
+#ifdef __NetBSD__
+
+static int
+compare_engines(void *cookie, const void *va, const void *vb)
+{
+	const struct intel_engine_cs *csa = va;
+	const struct intel_engine_cs *csb = vb;
+
+	if (csa->class < csb->class)
+		return -1;
+	if (csa->class > csb->class)
+		return +1;
+	if (csa->instance < csb->instance)
+		return -1;
+	if (csa->instance > csb->instance)
+		return +1;
+	return 0;
+}
+
+static int
+compare_engine_key(void *cookie, const void *vn, const void *vk)
+{
+	const struct intel_engine_cs *cs = vn;
+	const u8 *k = vk;
+
+	if (cs->class < k[0])
+		return -1;
+	if (cs->class > k[0])
+		return +1;
+	if (cs->instance < k[1])
+		return -1;
+	if (cs->instance > k[1])
+		return +1;
+	return 0;
+}
+
+static const rb_tree_ops_t engine_ops = {
+	.rbto_compare_nodes = compare_engines,
+	.rbto_compare_key = compare_engine_key,
+	.rbto_node_offset = offsetof(struct intel_engine_cs, uabi_node.rbtree),
+};
+
+#endif
+
 struct intel_engine_cs *
 intel_engine_lookup_user(struct drm_i915_private *i915, u8 class, u8 instance)
 {
+#ifdef __NetBSD__
+	const u8 key[2] = {class, instance};
+	return rb_tree_find_node(&i915->uabi_engines.rbr_tree, key);
+#else
 	struct rb_node *p = i915->uabi_engines.rb_node;
 
 	while (p) {
@@ -41,12 +89,12 @@ intel_engine_lookup_user(struct drm_i915
 	}
 
 	return NULL;
+#endif
 }
 
 void intel_engine_add_user(struct intel_engine_cs *engine)
 {
-	llist_add((struct llist_node *)&engine->uabi_node,
-		  (struct llist_head *)&engine->i915->uabi_engines);
+	llist_add(&engine->uabi_node.llist, &engine->i915->uabi_engines_llist);
 }
 
 static const u8 uabi_classes[] = {
@@ -59,9 +107,9 @@ static const u8 uabi_classes[] = {
 static int engine_cmp(void *priv, struct list_head *A, struct list_head *B)
 {
 	const struct intel_engine_cs *a =
-		container_of((struct rb_node *)A, typeof(*a), uabi_node);
+		container_of(A, typeof(*a), uabi_node.list);
 	const struct intel_engine_cs *b =
-		container_of((struct rb_node *)B, typeof(*b), uabi_node);
+		container_of(B, typeof(*b), uabi_node.list);
 
 	if (uabi_classes[a->class] < uabi_classes[b->class])
 		return -1;
@@ -78,7 +126,7 @@ static int engine_cmp(void *priv, struct
 
 static struct llist_node *get_engines(struct drm_i915_private *i915)
 {
-	return llist_del_all((struct llist_head *)&i915->uabi_engines);
+	return llist_del_all(&i915->uabi_engines_llist);
 }
 
 static void sort_engines(struct drm_i915_private *i915,
@@ -88,9 +136,8 @@ static void sort_engines(struct drm_i915
 
 	llist_for_each_safe(pos, next, get_engines(i915)) {
 		struct intel_engine_cs *engine =
-			container_of((struct rb_node *)pos, typeof(*engine),
-				     uabi_node);
-		list_add((struct list_head *)&engine->uabi_node, engines);
+			llist_entry(pos, typeof(*engine), uabi_node.llist);
+		list_add(&engine->uabi_node.list, engines);
 	}
 	list_sort(NULL, engines, engine_cmp);
 }
@@ -200,12 +247,17 @@ void intel_engines_driver_register(struc
 
 	sort_engines(i915, &engines);
 
+#ifdef __NetBSD__
+	__USE(prev);
+	__USE(p);
+	rb_tree_init(&i915->uabi_engines.rbr_tree, &engine_ops);
+#else
 	prev = NULL;
 	p = &i915->uabi_engines.rb_node;
+#endif
 	list_for_each_safe(it, next, &engines) {
 		struct intel_engine_cs *engine =
-			container_of((struct rb_node *)it, typeof(*engine),
-				     uabi_node);
+			container_of(it, typeof(*engine), uabi_node.list);
 		char old[sizeof(engine->name)];
 
 		if (intel_gt_has_init_error(engine->gt))
@@ -224,8 +276,15 @@ void intel_engines_driver_register(struc
 			  engine->uabi_instance);
 		DRM_DEBUG_DRIVER("renamed %s to %s\n", old, engine->name);
 
+#ifdef __NetBSD__
+		struct intel_engine_cs *collision __diagused;
+		collision = rb_tree_insert_node(&i915->uabi_engines.rbr_tree,
+		    engine);
+		KASSERT(collision == engine);
+#else
 		rb_link_node(&engine->uabi_node, prev, p);
 		rb_insert_color(&engine->uabi_node, &i915->uabi_engines);
+#endif
 
 		GEM_BUG_ON(intel_engine_lookup_user(i915,
 						    engine->uabi_class,
@@ -234,11 +293,13 @@ void intel_engines_driver_register(struc
 		/* Fix up the mapping to match default execbuf::user_map[] */
 		add_legacy_ring(&ring, engine);
 
+#ifndef __NetBSD__
 		prev = &engine->uabi_node;
 		p = &prev->rb_right;
+#endif
 	}
 
-	if (IS_ENABLED(CONFIG_DRM_I915_SELFTESTS) &&
+	if (IS_ENABLED(CONFIG_DRM_I915_SELFTEST) &&
 	    IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM)) {
 		struct intel_engine_cs *engine;
 		unsigned int isolation;
@@ -286,7 +347,12 @@ void intel_engines_driver_register(struc
 		}
 
 		if (WARN(errors, "Invalid UABI engine mapping found"))
+#ifdef __NetBSD__
+			rb_tree_init(&i915->uabi_engines.rbr_tree,
+			    &engine_ops);
+#else
 			i915->uabi_engines = RB_ROOT;
+#endif
 	}
 
 	set_scheduler_caps(i915);

Index: src/sys/external/bsd/drm2/i915drm/files.i915drmkms
diff -u src/sys/external/bsd/drm2/i915drm/files.i915drmkms:1.81 src/sys/external/bsd/drm2/i915drm/files.i915drmkms:1.82
--- src/sys/external/bsd/drm2/i915drm/files.i915drmkms:1.81	Sun Dec 19 11:50:31 2021
+++ src/sys/external/bsd/drm2/i915drm/files.i915drmkms	Sun Dec 19 11:51:59 2021
@@ -1,4 +1,4 @@
-#	$NetBSD: files.i915drmkms,v 1.81 2021/12/19 11:50:31 riastradh Exp $
+#	$NetBSD: files.i915drmkms,v 1.82 2021/12/19 11:51:59 riastradh Exp $
 
 version	20180827
 
@@ -171,7 +171,7 @@ file	external/bsd/drm2/dist/drm/i915/gt/
 file	external/bsd/drm2/dist/drm/i915/gt/intel_engine_heartbeat.c	i915drmkms
 #file	external/bsd/drm2/dist/drm/i915/gt/intel_engine_pm.c	i915drmkms
 file	external/bsd/drm2/dist/drm/i915/gt/intel_engine_pool.c	i915drmkms
-#file	external/bsd/drm2/dist/drm/i915/gt/intel_engine_user.c	i915drmkms
+file	external/bsd/drm2/dist/drm/i915/gt/intel_engine_user.c	i915drmkms
 file	external/bsd/drm2/dist/drm/i915/gt/intel_ggtt.c	i915drmkms
 file	external/bsd/drm2/dist/drm/i915/gt/intel_gt.c	i915drmkms
 file	external/bsd/drm2/dist/drm/i915/gt/intel_gt_irq.c	i915drmkms

Reply via email to