Module Name: src
Committed By: riastradh
Date: Sun Dec 19 11:36:17 UTC 2021
Modified Files:
src/sys/external/bsd/drm2/dist/drm/i915: i915_request.c i915_request.h
src/sys/external/bsd/drm2/include: i915_trace.h
Log Message:
i915: Adapt i915_request.
To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 \
src/sys/external/bsd/drm2/dist/drm/i915/i915_request.c
cvs rdiff -u -r1.3 -r1.4 \
src/sys/external/bsd/drm2/dist/drm/i915/i915_request.h
cvs rdiff -u -r1.18 -r1.19 src/sys/external/bsd/drm2/include/i915_trace.h
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_request.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_request.c:1.4 src/sys/external/bsd/drm2/dist/drm/i915/i915_request.c:1.5
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_request.c:1.4 Sun Dec 19 01:51:27 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_request.c Sun Dec 19 11:36:17 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: i915_request.c,v 1.4 2021/12/19 01:51:27 riastradh Exp $ */
+/* $NetBSD: i915_request.c,v 1.5 2021/12/19 11:36:17 riastradh Exp $ */
/*
* Copyright © 2008-2015 Intel Corporation
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_request.c,v 1.4 2021/12/19 01:51:27 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_request.c,v 1.5 2021/12/19 11:36:17 riastradh Exp $");
#include <linux/dma-fence-array.h>
#include <linux/irq_work.h>
@@ -121,7 +121,6 @@ static void i915_fence_release(struct dm
i915_sw_fence_fini(&rq->submit);
i915_sw_fence_fini(&rq->semaphore);
- DRM_DESTROY_WAITQUEUE(&rq->execute);
dma_fence_destroy(&rq->fence);
spin_lock_destroy(&rq->lock);
kmem_cache_free(global.slab_requests, rq);
@@ -450,7 +449,7 @@ void i915_request_submit(struct i915_req
void __i915_request_unsubmit(struct i915_request *request)
{
- struct intel_engine_cs *engine = request->engine;
+ struct intel_engine_cs *engine __lockdep_used = request->engine;
RQ_TRACE(request, "\n");
@@ -603,7 +602,9 @@ static void __i915_request_ctor(void *ar
i915_sw_fence_init(&rq->submit, submit_notify);
i915_sw_fence_init(&rq->semaphore, semaphore_notify);
+#ifndef __NetBSD__
dma_fence_init(&rq->fence, &i915_fence_ops, &rq->lock, 0, 0);
+#endif
rq->file_priv = NULL;
rq->capture_list = NULL;
@@ -669,10 +670,14 @@ __i915_request_create(struct intel_conte
rq->ring = ce->ring;
rq->execution_mask = ce->engine->mask;
+#ifdef __NetBSD__
+ dma_fence_init(&rq->fence, &i915_fence_ops, &rq->lock, 0, 0);
+#else
kref_init(&rq->fence.refcount);
rq->fence.flags = 0;
rq->fence.error = 0;
INIT_LIST_HEAD(&rq->fence.cb_list);
+#endif
ret = intel_timeline_get_seqno(tl, rq, &seqno);
if (ret)
@@ -1477,9 +1482,7 @@ static bool __i915_spin_request(const st
struct request_wait {
struct dma_fence_cb cb;
#ifdef __NetBSD__
- bool complete;
- kcondvar_t cv;
- /* XXX lock, condvar, ...? */
+ drm_waitqueue_t wq;
#else
struct task_struct *tsk;
#endif
@@ -1489,7 +1492,11 @@ static void request_wait_wake(struct dma
{
struct request_wait *wait = container_of(cb, typeof(*wait), cb);
+#ifdef __NetBSD__
+ DRM_SPIN_WAKEUP_ALL(&wait->wq, fence->lock);
+#else
wake_up_process(wait->tsk);
+#endif
}
/**
@@ -1511,8 +1518,12 @@ long i915_request_wait(struct i915_reque
unsigned int flags,
long timeout)
{
+#ifdef __NetBSD__
+ const int state = 0;
+#else
const int state = flags & I915_WAIT_INTERRUPTIBLE ?
TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE;
+#endif
struct request_wait wait;
might_sleep();
@@ -1581,6 +1592,25 @@ long i915_request_wait(struct i915_reque
i915_schedule_bump_priority(rq, I915_PRIORITY_WAIT);
}
+#ifdef __NetBSD__
+ DRM_INIT_WAITQUEUE(&wait.wq, "i915req");
+ if (dma_fence_add_callback(&rq->fence, &wait.cb, request_wait_wake))
+ goto out;
+ spin_lock(rq->fence.lock);
+ if (flags & I915_WAIT_INTERRUPTIBLE) {
+ DRM_SPIN_TIMED_WAIT_UNTIL(timeout, &wait.wq,
+ rq->fence.lock, timeout,
+ i915_request_completed(rq));
+ } else {
+ DRM_SPIN_TIMED_WAIT_NOINTR_UNTIL(timeout, &wait.wq,
+ rq->fence.lock, timeout,
+ i915_request_completed(rq));
+ }
+ if (timeout > 0) /* succeeded before timeout */
+ dma_fence_signal(&rq->fence);
+ spin_unlock(rq->fence.lock);
+ DRM_DESTROY_WAITQUEUE(&wait.wq);
+#else
wait.tsk = current;
if (dma_fence_add_callback(&rq->fence, &wait.cb, request_wait_wake))
goto out;
@@ -1607,6 +1637,7 @@ long i915_request_wait(struct i915_reque
timeout = io_schedule_timeout(timeout);
}
__set_current_state(TASK_RUNNING);
+#endif
dma_fence_remove_callback(&rq->fence, &wait.cb);
Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_request.h
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_request.h:1.3 src/sys/external/bsd/drm2/dist/drm/i915/i915_request.h:1.4
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_request.h:1.3 Sun Dec 19 11:20:02 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_request.h Sun Dec 19 11:36:17 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: i915_request.h,v 1.3 2021/12/19 11:20:02 riastradh Exp $ */
+/* $NetBSD: i915_request.h,v 1.4 2021/12/19 11:36:17 riastradh Exp $ */
/*
* Copyright © 2008-2018 Intel Corporation
@@ -201,7 +201,9 @@ struct i915_request {
*/
struct i915_sw_fence submit;
union {
-#ifndef __NetBSD__ /* XXX */
+#ifdef __NetBSD__ /* XXX */
+ struct i915_sw_fence_waiter submitq;
+#else
wait_queue_entry_t submitq;
#endif
struct i915_sw_dma_fence_cb dmaq;
Index: src/sys/external/bsd/drm2/include/i915_trace.h
diff -u src/sys/external/bsd/drm2/include/i915_trace.h:1.18 src/sys/external/bsd/drm2/include/i915_trace.h:1.19
--- src/sys/external/bsd/drm2/include/i915_trace.h:1.18 Sun Dec 19 11:13:14 2021
+++ src/sys/external/bsd/drm2/include/i915_trace.h Sun Dec 19 11:36:17 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: i915_trace.h,v 1.18 2021/12/19 11:13:14 riastradh Exp $ */
+/* $NetBSD: i915_trace.h,v 1.19 2021/12/19 11:36:17 riastradh Exp $ */
/*-
* Copyright (c) 2013, 2018 The NetBSD Foundation, Inc.
@@ -242,9 +242,9 @@ trace_i915_request_retire(struct i915_re
I915_DEFINE_TRACE_REQ(i915,, request__wait__begin);
static inline void
-trace_i915_request_wait_begin(struct i915_request *request)
+trace_i915_request_wait_begin(struct i915_request *request, unsigned int flags)
{
- I915_TRACE_REQ(i915,, request__wait__begin, request, 0);
+ I915_TRACE_REQ(i915,, request__wait__begin, request, flags);
}
I915_DEFINE_TRACE_REQ(i915,, request__wait__end);