Module Name:    src
Committed By:   riastradh
Date:           Sun Dec 19 11:36:08 UTC 2021

Modified Files:
        src/sys/external/bsd/drm2/dist/drm/i915: i915_sw_fence.c
            i915_sw_fence.h
        src/sys/external/bsd/drm2/i915drm: files.i915drmkms i915_module.c

Log Message:
i915: Adapt sw_fence.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 \
    src/sys/external/bsd/drm2/dist/drm/i915/i915_sw_fence.c
cvs rdiff -u -r1.5 -r1.6 \
    src/sys/external/bsd/drm2/dist/drm/i915/i915_sw_fence.h
cvs rdiff -u -r1.70 -r1.71 src/sys/external/bsd/drm2/i915drm/files.i915drmkms
cvs rdiff -u -r1.14 -r1.15 src/sys/external/bsd/drm2/i915drm/i915_module.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_sw_fence.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_sw_fence.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/i915_sw_fence.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_sw_fence.c:1.2	Sat Dec 18 23:45:28 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_sw_fence.c	Sun Dec 19 11:36:08 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_sw_fence.c,v 1.2 2021/12/18 23:45:28 riastradh Exp $	*/
+/*	$NetBSD: i915_sw_fence.c,v 1.3 2021/12/19 11:36:08 riastradh Exp $	*/
 
 /*
  * SPDX-License-Identifier: MIT
@@ -7,7 +7,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_sw_fence.c,v 1.2 2021/12/18 23:45:28 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_sw_fence.c,v 1.3 2021/12/19 11:36:08 riastradh Exp $");
 
 #include <linux/slab.h>
 #include <linux/dma-fence.h>
@@ -17,6 +17,10 @@ __KERNEL_RCSID(0, "$NetBSD: i915_sw_fenc
 #include "i915_sw_fence.h"
 #include "i915_selftest.h"
 
+#include <drm/drm_wait_netbsd.h>
+
+#include <linux/nbsd-namespace.h>
+
 #if IS_ENABLED(CONFIG_DRM_I915_DEBUG)
 #define I915_SW_FENCE_BUG_ON(expr) BUG_ON(expr)
 #else
@@ -25,7 +29,11 @@ __KERNEL_RCSID(0, "$NetBSD: i915_sw_fenc
 
 #define I915_SW_FENCE_FLAG_ALLOC BIT(3) /* after WQ_FLAG_* for safety */
 
+#ifdef __NetBSD__		/* XXX */
+spinlock_t i915_sw_fence_lock;
+#else
 static DEFINE_SPINLOCK(i915_sw_fence_lock);
+#endif
 
 enum {
 	DEBUG_FENCE_IDLE = 0,
@@ -132,11 +140,66 @@ static int __i915_sw_fence_notify(struct
 	return fn(fence, state);
 }
 
-#ifdef CONFIG_DRM_I915_SW_FENCE_DEBUG_OBJECTS
 void i915_sw_fence_fini(struct i915_sw_fence *fence)
 {
+#ifdef CONFIG_DRM_I915_SW_FENCE_DEBUG_OBJECTS
 	debug_fence_free(fence);
+#endif
+	spin_lock_destroy(&fence->wait.lock);
+	BUG_ON(!list_empty(&fence->wait.head));
+}
+
+#ifdef __NetBSD__
+
+/* XXX whattakludge */
+
+typedef struct i915_sw_fence_queue wait_queue_head_t;
+typedef struct i915_sw_fence_waiter wait_queue_entry_t;
+
+#define	TASK_NORMAL	0
+
+struct i915_sw_fence_wq {
+	struct i915_sw_fence *fence;
+	drm_waitqueue_t wq;
+};
+
+static int
+autoremove_wake_function(struct i915_sw_fence_waiter *waiter, unsigned mode,
+    int flags, void *cookie)
+{
+	struct i915_sw_fence_wq *sfw = cookie;
+
+	/* Caller presumably already completed the fence.  */
+	DRM_SPIN_WAKEUP_ALL(&sfw->wq, &sfw->fence->wait.lock);
+
+	list_del_init(&waiter->entry);
+
+	return 0;
 }
+
+void
+i915_sw_fence_wait(struct i915_sw_fence *fence)
+{
+	struct i915_sw_fence_waiter waiter;
+	struct i915_sw_fence_wq sfw;
+	int ret;
+
+	INIT_LIST_HEAD(&waiter.entry);
+	waiter.flags = 0;
+	waiter.func = autoremove_wake_function;
+	waiter.private = &sfw;
+
+	sfw.fence = fence;
+	DRM_INIT_WAITQUEUE(&sfw.wq, "i915swf");
+
+	spin_lock(&fence->wait.lock);
+	DRM_SPIN_WAIT_NOINTR_UNTIL(ret, &sfw.wq, &fence->wait.lock,
+	    i915_sw_fence_done(fence));
+	spin_unlock(&fence->wait.lock);
+
+	DRM_DESTROY_WAITQUEUE(&sfw.wq);
+}
+
 #endif
 
 static void __i915_sw_fence_wake_up_all(struct i915_sw_fence *fence,
@@ -147,7 +210,6 @@ static void __i915_sw_fence_wake_up_all(
 	unsigned long flags;
 
 	debug_fence_deactivate(fence);
-	atomic_set_release(&fence->pending, -1); /* 0 -> -1 [done] */
 
 	/*
 	 * To prevent unbounded recursion as we traverse the graph of
@@ -157,6 +219,7 @@ static void __i915_sw_fence_wake_up_all(
 	 */
 
 	spin_lock_irqsave_nested(&x->lock, flags, 1 + !!continuation);
+	atomic_set_release(&fence->pending, -1); /* 0 -> -1 [done] */
 	if (continuation) {
 		list_for_each_entry_safe(pos, next, &x->head, entry) {
 			if (pos->func == autoremove_wake_function)
@@ -229,7 +292,12 @@ void __i915_sw_fence_init(struct i915_sw
 {
 	BUG_ON(!fn || (unsigned long)fn & ~I915_SW_FENCE_MASK);
 
+#ifdef __NetBSD__
+	spin_lock_init(&fence->wait.lock);
+	INIT_LIST_HEAD(&fence->wait.head);
+#else
 	__init_waitqueue_head(&fence->wait, name, key);
+#endif
 	fence->flags = (unsigned long)fn;
 
 	i915_sw_fence_reinit(fence);
@@ -363,7 +431,11 @@ static int __i915_sw_fence_await_sw_fenc
 
 	spin_lock_irqsave(&signaler->wait.lock, flags);
 	if (likely(!i915_sw_fence_done(signaler))) {
+#ifdef __NetBSD__
+		list_add(&wq->entry, &signaler->wait.head);
+#else
 		__add_wait_queue_entry_tail(&signaler->wait, wq);
+#endif
 		pending = 1;
 	} else {
 		i915_sw_fence_wake(wq, 0, signaler->error, NULL);
@@ -415,10 +487,10 @@ static void timer_i915_sw_fence_wake(str
 	if (!fence)
 		return;
 
-	pr_notice("Asynchronous wait on fence %s:%s:%llx timed out (hint:%pS)\n",
+	pr_notice("Asynchronous wait on fence %s:%s:%"PRIx64" timed out (hint:%p)\n",
 		  cb->dma->ops->get_driver_name(cb->dma),
 		  cb->dma->ops->get_timeline_name(cb->dma),
-		  cb->dma->seqno,
+		  (uint64_t)cb->dma->seqno,
 		  i915_sw_fence_debug_hint(fence));
 
 	i915_sw_fence_set_error_once(fence, -ETIMEDOUT);

Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_sw_fence.h
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_sw_fence.h:1.5 src/sys/external/bsd/drm2/dist/drm/i915/i915_sw_fence.h:1.6
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_sw_fence.h:1.5	Sun Dec 19 11:30:45 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_sw_fence.h	Sun Dec 19 11:36:08 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_sw_fence.h,v 1.5 2021/12/19 11:30:45 riastradh Exp $	*/
+/*	$NetBSD: i915_sw_fence.h,v 1.6 2021/12/19 11:36:08 riastradh Exp $	*/
 
 /*
  * SPDX-License-Identifier: MIT
@@ -20,8 +20,18 @@
 struct completion;
 struct dma_resv;
 
+struct i915_sw_fence_waiter {
+	struct list_head entry;
+	int flags;
+	int (*func)(struct i915_sw_fence_waiter *, unsigned, int, void *);
+	void *private;
+};
+
 struct i915_sw_fence {
-	wait_queue_head_t wait;
+	struct i915_sw_fence_queue {
+		spinlock_t lock;
+		struct list_head head;
+	} wait;
 	unsigned long flags;
 	atomic_t pending;
 	int error;
@@ -58,17 +68,19 @@ do {								\
 
 void i915_sw_fence_reinit(struct i915_sw_fence *fence);
 
-#ifdef CONFIG_DRM_I915_SW_FENCE_DEBUG_OBJECTS
 void i915_sw_fence_fini(struct i915_sw_fence *fence);
-#else
-static inline void i915_sw_fence_fini(struct i915_sw_fence *fence) {}
-#endif
 
 void i915_sw_fence_commit(struct i915_sw_fence *fence);
 
+#ifdef __NetBSD__
+int i915_sw_fence_await_sw_fence(struct i915_sw_fence *,
+				 struct i915_sw_fence *,
+				 struct i915_sw_fence_waiter *);
+#else
 int i915_sw_fence_await_sw_fence(struct i915_sw_fence *fence,
 				 struct i915_sw_fence *after,
 				 wait_queue_entry_t *wq);
+#endif
 int i915_sw_fence_await_sw_fence_gfp(struct i915_sw_fence *fence,
 				     struct i915_sw_fence *after,
 				     gfp_t gfp);
@@ -106,10 +118,14 @@ static inline bool i915_sw_fence_done(co
 	return atomic_read(&fence->pending) < 0;
 }
 
+#ifdef __NetBSD__
+void i915_sw_fence_wait(struct i915_sw_fence *);
+#else
 static inline void i915_sw_fence_wait(struct i915_sw_fence *fence)
 {
 	wait_event(fence->wait, i915_sw_fence_done(fence));
 }
+#endif
 
 static inline void
 i915_sw_fence_set_error_once(struct i915_sw_fence *fence, int error)

Index: src/sys/external/bsd/drm2/i915drm/files.i915drmkms
diff -u src/sys/external/bsd/drm2/i915drm/files.i915drmkms:1.70 src/sys/external/bsd/drm2/i915drm/files.i915drmkms:1.71
--- src/sys/external/bsd/drm2/i915drm/files.i915drmkms:1.70	Sun Dec 19 11:33:49 2021
+++ src/sys/external/bsd/drm2/i915drm/files.i915drmkms	Sun Dec 19 11:36:08 2021
@@ -1,4 +1,4 @@
-#	$NetBSD: files.i915drmkms,v 1.70 2021/12/19 11:33:49 riastradh Exp $
+#	$NetBSD: files.i915drmkms,v 1.71 2021/12/19 11:36:08 riastradh Exp $
 
 version	20180827
 
@@ -31,6 +31,8 @@ makeoptions	i915drmkms	"CPPFLAGS.i915drm
 makeoptions	i915drmkms	"CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_PRELIMINARY_HW_SUPPORT=0"
 makeoptions	i915drmkms	"CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_DEBUG_MMIO=1" # XXX
 makeoptions	i915drmkms	"CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_FORCE_PROBE=0"
+makeoptions	i915drmkms	"CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_SPIN_REQUEST=0"
+makeoptions	i915drmkms	"CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_SW_FENCE_CHECK_DAG=1" # XXX expensive debug option?
 
 makeoptions	i915drmkms	"CWARNFLAGS.i915drmkms"+="-Wno-missing-field-initializers"
 makeoptions	i915drmkms	"CWARNFLAGS.i915drmkms"+="-Wno-pointer-arith"
@@ -204,7 +206,7 @@ file	external/bsd/drm2/dist/drm/i915/i91
 file	external/bsd/drm2/dist/drm/i915/i915_scatterlist.c	i915drmkms
 file	external/bsd/drm2/dist/drm/i915/i915_scheduler.c	i915drmkms
 file	external/bsd/drm2/dist/drm/i915/i915_suspend.c	i915drmkms
-#file	external/bsd/drm2/dist/drm/i915/i915_sw_fence.c	i915drmkms
+file	external/bsd/drm2/dist/drm/i915/i915_sw_fence.c	i915drmkms
 file	external/bsd/drm2/dist/drm/i915/i915_sw_fence_work.c	i915drmkms
 file	external/bsd/drm2/dist/drm/i915/i915_switcheroo.c	i915drmkms
 file	external/bsd/drm2/dist/drm/i915/i915_syncmap.c	i915drmkms

Index: src/sys/external/bsd/drm2/i915drm/i915_module.c
diff -u src/sys/external/bsd/drm2/i915drm/i915_module.c:1.14 src/sys/external/bsd/drm2/i915drm/i915_module.c:1.15
--- src/sys/external/bsd/drm2/i915drm/i915_module.c:1.14	Sun Dec 19 11:33:49 2021
+++ src/sys/external/bsd/drm2/i915drm/i915_module.c	Sun Dec 19 11:36:08 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_module.c,v 1.14 2021/12/19 11:33:49 riastradh Exp $	*/
+/*	$NetBSD: i915_module.c,v 1.15 2021/12/19 11:36:08 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_module.c,v 1.14 2021/12/19 11:33:49 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_module.c,v 1.15 2021/12/19 11:36:08 riastradh Exp $");
 
 #include <sys/types.h>
 #include <sys/module.h>
@@ -53,6 +53,8 @@ MODULE(MODULE_CLASS_DRIVER, i915drmkms, 
 
 struct drm_sysctl_def i915_def = DRM_SYSCTL_INIT();
 
+extern spinlock_t i915_sw_fence_lock;
+
 int i915_global_buddy_init(void); /* XXX */
 
 static int
@@ -70,6 +72,7 @@ i915drmkms_init(void)
 
 	drm_sysctl_init(&i915_def);
 	spin_lock_init(&mchdev_lock);
+	spin_lock_init(&i915_sw_fence_lock);
 
 	return 0;
 }
@@ -91,6 +94,7 @@ static void
 i915drmkms_fini(void)
 {
 
+	spin_lock_destroy(&i915_sw_fence_lock);
 	spin_lock_destroy(&mchdev_lock);
 	drm_sysctl_fini(&i915_def);
 }

Reply via email to