Module Name: src
Committed By: riastradh
Date: Sun Dec 19 11:52:38 UTC 2021
Modified Files:
src/sys/external/bsd/drm2/dist/drm/radeon: radeon.h radeon_device.c
radeon_fence.c
Log Message:
radeon: Reduce #ifdef __NetBSD__ around condvars.
To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/sys/external/bsd/drm2/dist/drm/radeon/radeon.h
cvs rdiff -u -r1.12 -r1.13 \
src/sys/external/bsd/drm2/dist/drm/radeon/radeon_device.c
cvs rdiff -u -r1.21 -r1.22 \
src/sys/external/bsd/drm2/dist/drm/radeon/radeon_fence.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/radeon/radeon.h
diff -u src/sys/external/bsd/drm2/dist/drm/radeon/radeon.h:1.10 src/sys/external/bsd/drm2/dist/drm/radeon/radeon.h:1.11
--- src/sys/external/bsd/drm2/dist/drm/radeon/radeon.h:1.10 Sat Dec 18 23:45:42 2021
+++ src/sys/external/bsd/drm2/dist/drm/radeon/radeon.h Sun Dec 19 11:52:38 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: radeon.h,v 1.10 2021/12/18 23:45:42 riastradh Exp $ */
+/* $NetBSD: radeon.h,v 1.11 2021/12/19 11:52:38 riastradh Exp $ */
/*
* Copyright 2008 Advanced Micro Devices, Inc.
@@ -392,11 +392,7 @@ struct radeon_fence {
unsigned ring;
bool is_vm_update;
-#ifdef __NetBSD__
TAILQ_ENTRY(radeon_fence) fence_check;
-#else
- wait_queue_entry_t fence_wake;
-#endif
};
int radeon_fence_driver_start_ring(struct radeon_device *rdev, int ring);
@@ -2435,13 +2431,9 @@ struct radeon_device {
struct radeon_doorbell doorbell;
struct radeon_mman mman;
struct radeon_fence_driver fence_drv[RADEON_NUM_RINGS];
-#ifdef __NetBSD__
spinlock_t fence_lock;
drm_waitqueue_t fence_queue;
TAILQ_HEAD(, radeon_fence) fence_check;
-#else
- wait_queue_head_t fence_queue;
-#endif
u64 fence_context;
struct mutex ring_lock;
struct radeon_ring ring[RADEON_NUM_RINGS];
Index: src/sys/external/bsd/drm2/dist/drm/radeon/radeon_device.c
diff -u src/sys/external/bsd/drm2/dist/drm/radeon/radeon_device.c:1.12 src/sys/external/bsd/drm2/dist/drm/radeon/radeon_device.c:1.13
--- src/sys/external/bsd/drm2/dist/drm/radeon/radeon_device.c:1.12 Sun Dec 19 11:26:26 2021
+++ src/sys/external/bsd/drm2/dist/drm/radeon/radeon_device.c Sun Dec 19 11:52:38 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: radeon_device.c,v 1.12 2021/12/19 11:26:26 riastradh Exp $ */
+/* $NetBSD: radeon_device.c,v 1.13 2021/12/19 11:52:38 riastradh Exp $ */
/*
* Copyright 2008 Advanced Micro Devices, Inc.
@@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: radeon_device.c,v 1.12 2021/12/19 11:26:26 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: radeon_device.c,v 1.13 2021/12/19 11:52:38 riastradh Exp $");
#include <linux/console.h>
#include <linux/efi.h>
@@ -1430,12 +1430,8 @@ int radeon_device_init(struct radeon_dev
mutex_init(&rdev->srbm_mutex);
init_rwsem(&rdev->pm.mclk_lock);
init_rwsem(&rdev->exclusive_lock);
-#ifdef __NetBSD__
spin_lock_init(&rdev->irq.vblank_lock);
DRM_INIT_WAITQUEUE(&rdev->irq.vblank_queue, "radvblnk");
-#else
- init_waitqueue_head(&rdev->irq.vblank_queue);
-#endif
r = radeon_gem_init(rdev);
if (r)
return r;
@@ -1710,12 +1706,10 @@ void radeon_device_fini(struct radeon_de
if (rdev->family >= CHIP_BONAIRE)
radeon_doorbell_fini(rdev);
-#ifdef __NetBSD__
DRM_DESTROY_WAITQUEUE(&rdev->irq.vblank_queue);
spin_lock_destroy(&rdev->irq.vblank_lock);
destroy_rwsem(&rdev->exclusive_lock);
destroy_rwsem(&rdev->pm.mclk_lock);
-#endif
mutex_destroy(&rdev->srbm_mutex);
mutex_destroy(&rdev->gpu_clock_mutex);
mutex_destroy(&rdev->pm.mutex);
Index: src/sys/external/bsd/drm2/dist/drm/radeon/radeon_fence.c
diff -u src/sys/external/bsd/drm2/dist/drm/radeon/radeon_fence.c:1.21 src/sys/external/bsd/drm2/dist/drm/radeon/radeon_fence.c:1.22
--- src/sys/external/bsd/drm2/dist/drm/radeon/radeon_fence.c:1.21 Sun Dec 19 11:08:25 2021
+++ src/sys/external/bsd/drm2/dist/drm/radeon/radeon_fence.c Sun Dec 19 11:52:38 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: radeon_fence.c,v 1.21 2021/12/19 11:08:25 riastradh Exp $ */
+/* $NetBSD: radeon_fence.c,v 1.22 2021/12/19 11:52:38 riastradh Exp $ */
/*
* Copyright 2009 Jerome Glisse.
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: radeon_fence.c,v 1.21 2021/12/19 11:08:25 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: radeon_fence.c,v 1.22 2021/12/19 11:52:38 riastradh Exp $");
#include <linux/atomic.h>
#include <linux/firmware.h>
@@ -171,20 +171,10 @@ int radeon_fence_emit(struct radeon_devi
* for the fence locking itself, so unlocked variants are used for
* fence_signal, and remove_wait_queue.
*/
-#ifdef __NetBSD__
static int radeon_fence_check_signaled(struct radeon_fence *fence)
-#else
-static int radeon_fence_check_signaled(wait_queue_entry_t *wait, unsigned mode, int flags, void *key)
-#endif
{
-#ifndef __NetBSD__
- struct radeon_fence *fence;
-#endif
u64 seq;
-#ifndef __NetBSD__
- fence = container_of(wait, struct radeon_fence, fence_wake);
-#endif
BUG_ON(!spin_is_locked(&fence->rdev->fence_lock));
/*
@@ -201,18 +191,13 @@ static int radeon_fence_check_signaled(w
DMA_FENCE_TRACE(&fence->base, "was already signaled\n");
radeon_irq_kms_sw_irq_put(fence->rdev, fence->ring);
-#ifdef __NetBSD__
TAILQ_REMOVE(&fence->rdev->fence_check, fence, fence_check);
-#else
- __remove_wait_queue(&fence->rdev->fence_queue, &fence->fence_wake);
-#endif
dma_fence_put(&fence->base);
} else
DMA_FENCE_TRACE(&fence->base, "pending\n");
return 0;
}
-#ifdef __NetBSD__
void
radeon_fence_wakeup_locked(struct radeon_device *rdev)
{
@@ -224,7 +209,6 @@ radeon_fence_wakeup_locked(struct radeon
radeon_fence_check_signaled(fence);
}
}
-#endif
/**
* radeon_fence_activity - check for fence activity
@@ -319,16 +303,12 @@ static void radeon_fence_check_lockup(st
rdev = fence_drv->rdev;
ring = fence_drv - &rdev->fence_drv[0];
-#ifdef __NetBSD__
spin_lock(&rdev->fence_lock);
-#endif
if (!down_read_trylock(&rdev->exclusive_lock)) {
/* just reschedule the check if a reset is going on */
radeon_fence_schedule_check(rdev, ring);
-#ifdef __NetBSD__
spin_unlock(&rdev->fence_lock);
-#endif
return;
}
@@ -342,11 +322,7 @@ static void radeon_fence_check_lockup(st
}
if (radeon_fence_activity(rdev, ring))
-#ifdef __NetBSD__
radeon_fence_wakeup_locked(rdev);
-#else
- wake_up_all(&rdev->fence_queue);
-#endif
else if (radeon_ring_is_lockup(rdev, ring, &rdev->ring[ring])) {
@@ -358,16 +334,10 @@ static void radeon_fence_check_lockup(st
/* remember that we need an reset */
rdev->needs_reset = true;
-#ifdef __NetBSD__
radeon_fence_wakeup_locked(rdev);
-#else
- wake_up_all(&rdev->fence_queue);
-#endif
}
up_read(&rdev->exclusive_lock);
-#ifdef __NetBSD__
spin_unlock(&rdev->fence_lock);
-#endif
}
/**
@@ -382,11 +352,7 @@ static void radeon_fence_check_lockup(st
static void radeon_fence_process_locked(struct radeon_device *rdev, int ring)
{
if (radeon_fence_activity(rdev, ring))
-#ifdef __NetBSD__
radeon_fence_wakeup_locked(rdev);
-#else
- wake_up_all(&rdev->fence_queue);
-#endif
}
void radeon_fence_process(struct radeon_device *rdev, int ring)
@@ -472,11 +438,7 @@ static bool radeon_fence_enable_signalin
radeon_irq_kms_sw_irq_get(rdev, fence->ring);
if (radeon_fence_activity(rdev, fence->ring))
-#ifdef __NetBSD__
radeon_fence_wakeup_locked(rdev);
-#else
- wake_up_all_locked(&rdev->fence_queue);
-#endif
/* did fence get signaled after we enabled the sw irq? */
if (atomic64_read(&rdev->fence_drv[fence->ring].last_seq) >= fence->seq) {
@@ -493,14 +455,7 @@ static bool radeon_fence_enable_signalin
radeon_fence_schedule_check(rdev, fence->ring);
}
-#ifdef __NetBSD__
TAILQ_INSERT_TAIL(&rdev->fence_check, fence, fence_check);
-#else
- fence->fence_wake.flags = 0;
- fence->fence_wake.private = NULL;
- fence->fence_wake.func = radeon_fence_check_signaled;
- __add_wait_queue(&rdev->fence_queue, &fence->fence_wake);
-#endif
dma_fence_get(f);
DMA_FENCE_TRACE(&fence->base, "armed on ring %i!\n", fence->ring);
@@ -594,7 +549,6 @@ static long radeon_fence_wait_seq_timeou
radeon_irq_kms_sw_irq_get(rdev, i);
}
-#ifdef __NetBSD__
if (intr)
DRM_SPIN_TIMED_WAIT_UNTIL(r, &rdev->fence_queue,
&rdev->fence_lock, timeout,
@@ -605,17 +559,6 @@ static long radeon_fence_wait_seq_timeou
&rdev->fence_lock, timeout,
(radeon_fence_any_seq_signaled(rdev, target_seq)
|| rdev->needs_reset));
-#else
- if (intr) {
- r = wait_event_interruptible_timeout(rdev->fence_queue, (
- radeon_fence_any_seq_signaled(rdev, target_seq)
- || rdev->needs_reset), timeout);
- } else {
- r = wait_event_timeout(rdev->fence_queue, (
- radeon_fence_any_seq_signaled(rdev, target_seq)
- || rdev->needs_reset), timeout);
- }
-#endif
if (rdev->needs_reset)
r = -EDEADLK;
@@ -1021,13 +964,9 @@ int radeon_fence_driver_init(struct rade
{
int ring;
-#ifdef __NetBSD__
spin_lock_init(&rdev->fence_lock);
DRM_INIT_WAITQUEUE(&rdev->fence_queue, "radfence");
TAILQ_INIT(&rdev->fence_check);
-#else
- init_waitqueue_head(&rdev->fence_queue);
-#endif
for (ring = 0; ring < RADEON_NUM_RINGS; ring++) {
radeon_fence_driver_init_ring(rdev, ring);
}
@@ -1059,23 +998,17 @@ void radeon_fence_driver_fini(struct rad
radeon_fence_driver_force_completion(rdev, ring);
}
cancel_delayed_work_sync(&rdev->fence_drv[ring].lockup_work);
-#ifdef __NetBSD__
spin_lock(&rdev->fence_lock);
radeon_fence_wakeup_locked(rdev);
spin_unlock(&rdev->fence_lock);
-#else
- wake_up_all(&rdev->fence_queue);
-#endif
radeon_scratch_free(rdev, rdev->fence_drv[ring].scratch_reg);
rdev->fence_drv[ring].initialized = false;
}
mutex_unlock(&rdev->ring_lock);
-#ifdef __NetBSD__
BUG_ON(!TAILQ_EMPTY(&rdev->fence_check));
DRM_DESTROY_WAITQUEUE(&rdev->fence_queue);
spin_lock_destroy(&rdev->fence_lock);
-#endif
}
/**
@@ -1189,106 +1122,48 @@ static inline bool radeon_test_signaled(
return test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->base.flags);
}
-#ifdef __NetBSD__
+struct radeon_wait_cb {
+ struct dma_fence_cb base;
+};
static void
-radeon_fence_wakeup_cb(struct dma_fence *fence, struct dma_fence_cb *cb)
+radeon_fence_wait_cb(struct dma_fence *fence, struct dma_fence_cb *cb)
{
struct radeon_fence *rfence = to_radeon_fence(fence);
struct radeon_device *rdev = rfence->rdev;
BUG_ON(!spin_is_locked(&rdev->fence_lock));
- cv_broadcast(&rdev->fence_queue);
+ DRM_SPIN_WAKEUP_ALL(&rdev->fence_queue, &rdev->fence_lock);
}
-static signed long
-radeon_fence_default_wait(struct dma_fence *f, bool intr, signed long timo)
+static signed long radeon_fence_default_wait(struct dma_fence *f, bool intr,
+ signed long t)
{
- struct dma_fence_cb fcb;
struct radeon_fence *fence = to_radeon_fence(f);
struct radeon_device *rdev = fence->rdev;
+ struct radeon_wait_cb cb;
int r;
- r = dma_fence_add_callback(f, &fcb, radeon_fence_wakeup_cb);
- if (r) /* fence is done already */
- return timo;
+ if (dma_fence_add_callback(f, &cb.base, radeon_fence_wait_cb))
+ return t;
spin_lock(&rdev->fence_lock);
if (intr) {
DRM_SPIN_TIMED_WAIT_UNTIL(r, &rdev->fence_queue,
- &rdev->fence_lock, timo,
+ &rdev->fence_lock, t,
radeon_test_signaled(fence));
} else {
DRM_SPIN_TIMED_WAIT_NOINTR_UNTIL(r, &rdev->fence_queue,
- &rdev->fence_lock, timo,
+ &rdev->fence_lock, t,
radeon_test_signaled(fence));
}
spin_unlock(&rdev->fence_lock);
- (void)dma_fence_remove_callback(f, &fcb);
-
- return r;
-}
-
-#else
-
-struct radeon_wait_cb {
- struct dma_fence_cb base;
- struct task_struct *task;
-};
-
-static void
-radeon_fence_wait_cb(struct dma_fence *fence, struct dma_fence_cb *cb)
-{
- struct radeon_wait_cb *wait =
- container_of(cb, struct radeon_wait_cb, base);
-
- wake_up_process(wait->task);
-}
-
-static signed long radeon_fence_default_wait(struct dma_fence *f, bool intr,
- signed long t)
-{
- struct radeon_fence *fence = to_radeon_fence(f);
- struct radeon_device *rdev = fence->rdev;
- struct radeon_wait_cb cb;
-
- cb.task = current;
-
- if (dma_fence_add_callback(f, &cb.base, radeon_fence_wait_cb))
- return t;
-
- while (t > 0) {
- if (intr)
- set_current_state(TASK_INTERRUPTIBLE);
- else
- set_current_state(TASK_UNINTERRUPTIBLE);
-
- /*
- * radeon_test_signaled must be called after
- * set_current_state to prevent a race with wake_up_process
- */
- if (radeon_test_signaled(fence))
- break;
-
- if (rdev->needs_reset) {
- t = -EDEADLK;
- break;
- }
-
- t = schedule_timeout(t);
-
- if (t > 0 && intr && signal_pending(current))
- t = -ERESTARTSYS;
- }
-
- __set_current_state(TASK_RUNNING);
dma_fence_remove_callback(f, &cb.base);
- return t;
+ return r;
}
-#endif
const struct dma_fence_ops radeon_fence_ops = {
.get_driver_name = radeon_fence_get_driver_name,
.get_timeline_name = radeon_fence_get_timeline_name,