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