summaryrefslogtreecommitdiffstats
path: root/sys/dev/drm/drm_lists.h
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/drm/drm_lists.h')
-rw-r--r--sys/dev/drm/drm_lists.h110
1 files changed, 24 insertions, 86 deletions
diff --git a/sys/dev/drm/drm_lists.h b/sys/dev/drm/drm_lists.h
index bc26687..b8f6fed 100644
--- a/sys/dev/drm/drm_lists.h
+++ b/sys/dev/drm/drm_lists.h
@@ -31,7 +31,6 @@
* $FreeBSD$
*/
-#define __NO_VERSION__
#include "dev/drm/drmP.h"
#if __HAVE_DMA_WAITLIST
@@ -39,26 +38,28 @@
int DRM(waitlist_create)(drm_waitlist_t *bl, int count)
{
if (bl->count)
- return DRM_OS_ERR(EINVAL);
+ return DRM_ERR( EINVAL );
bl->bufs = DRM(alloc)((bl->count + 2) * sizeof(*bl->bufs),
DRM_MEM_BUFLISTS);
- if(!bl->bufs) return DRM_OS_ERR(ENOMEM);
+ if(!bl->bufs) return DRM_ERR(ENOMEM);
+
+ bzero(bl->bufs, sizeof(*bl->bufs));
bl->count = count;
bl->rp = bl->bufs;
bl->wp = bl->bufs;
bl->end = &bl->bufs[bl->count+1];
- DRM_OS_SPININIT( bl->write_lock, "writelock" );
- DRM_OS_SPININIT( bl->read_lock, "readlock" );
+ DRM_SPININIT( bl->write_lock, "writelock" );
+ DRM_SPININIT( bl->read_lock, "readlock" );
return 0;
}
int DRM(waitlist_destroy)(drm_waitlist_t *bl)
{
if (bl->rp != bl->wp)
- return DRM_OS_ERR(EINVAL);
+ return DRM_ERR( EINVAL );
if (bl->bufs) DRM(free)(bl->bufs,
(bl->count + 2) * sizeof(*bl->bufs),
DRM_MEM_BUFLISTS);
@@ -67,50 +68,32 @@ int DRM(waitlist_destroy)(drm_waitlist_t *bl)
bl->rp = NULL;
bl->wp = NULL;
bl->end = NULL;
+ DRM_SPINUNINIT( bl->write_lock );
+ DRM_SPINUNINIT( bl->read_lock );
return 0;
}
int DRM(waitlist_put)(drm_waitlist_t *bl, drm_buf_t *buf)
{
int left;
-#ifdef __linux__
- unsigned long flags;
-#endif /* __linux__ */
-#ifdef __FreeBSD__
int s;
-#endif /* __FreeBSD__ */
left = DRM_LEFTCOUNT(bl);
if (!left) {
DRM_ERROR("Overflow while adding buffer %d from pid %d\n",
buf->idx, buf->pid);
- return DRM_OS_ERR(EINVAL);
+ return DRM_ERR( EINVAL );
}
#if __HAVE_DMA_HISTOGRAM
-#ifdef __linux__
- buf->time_queued = get_cycles();
-#endif /* __linux__ */
-#ifdef __FreeBSD__
getnanotime(&buf->time_queued);
-#endif /* __FreeBSD__ */
#endif
buf->list = DRM_LIST_WAIT;
-#ifdef __linux__
- spin_lock_irqsave(&bl->write_lock, flags);
-#endif /* __linux__ */
-#ifdef __FreeBSD__
- DRM_OS_SPINLOCK(&bl->write_lock);
+ DRM_SPINLOCK(&bl->write_lock);
s = spldrm();
-#endif /* __FreeBSD__ */
*bl->wp = buf;
if (++bl->wp >= bl->end) bl->wp = bl->bufs;
-#ifdef __linux__
- spin_unlock_irqrestore(&bl->write_lock, flags);
-#endif /* __linux__ */
-#ifdef __FreeBSD__
splx(s);
- DRM_OS_SPINUNLOCK(&bl->write_lock);
-#endif /* __FreeBSD__ */
+ DRM_SPINUNLOCK(&bl->write_lock);
return 0;
}
@@ -118,36 +101,19 @@ int DRM(waitlist_put)(drm_waitlist_t *bl, drm_buf_t *buf)
drm_buf_t *DRM(waitlist_get)(drm_waitlist_t *bl)
{
drm_buf_t *buf;
-#ifdef __linux__
- unsigned long flags;
-#endif /* __linux__ */
-#ifdef __FreeBSD__
int s;
-#endif /* __FreeBSD__ */
-#ifdef __linux__
- spin_lock_irqsave(&bl->read_lock, flags);
- buf = *bl->rp;
- if (bl->rp == bl->wp) {
- spin_unlock_irqrestore(&bl->read_lock, flags);
- return NULL;
- }
- if (++bl->rp >= bl->end) bl->rp = bl->bufs;
- spin_unlock_irqrestore(&bl->read_lock, flags);
-#endif /* __linux__ */
-#ifdef __FreeBSD__
- DRM_OS_SPINLOCK(&bl->read_lock);
+ DRM_SPINLOCK(&bl->read_lock);
s = spldrm();
buf = *bl->rp;
if (bl->rp == bl->wp) {
splx(s);
- DRM_OS_SPINUNLOCK(&bl->read_lock);
+ DRM_SPINUNLOCK(&bl->read_lock);
return NULL;
}
if (++bl->rp >= bl->end) bl->rp = bl->bufs;
splx(s);
- DRM_OS_SPINUNLOCK(&bl->read_lock);
-#endif /* __FreeBSD__ */
+ DRM_SPINUNLOCK(&bl->read_lock);
return buf;
}
@@ -161,17 +127,12 @@ int DRM(freelist_create)(drm_freelist_t *bl, int count)
{
atomic_set(&bl->count, 0);
bl->next = NULL;
-#ifdef __linux__
- init_waitqueue_head(&bl->waiting);
-#endif /* __linux__ */
-#ifdef __FreeBSD__
bl->waiting = 0;
-#endif /* __FreeBSD__ */
bl->low_mark = 0;
bl->high_mark = 0;
atomic_set(&bl->wfh, 0);
- DRM_OS_SPININIT( bl->lock, "freelistlock" );
+ DRM_SPININIT( bl->lock, "freelistlock" );
++bl->initialized;
return 0;
}
@@ -180,6 +141,7 @@ int DRM(freelist_destroy)(drm_freelist_t *bl)
{
atomic_set(&bl->count, 0);
bl->next = NULL;
+ DRM_SPINUNINIT( bl->lock );
return 0;
}
@@ -198,20 +160,15 @@ int DRM(freelist_put)(drm_device_t *dev, drm_freelist_t *bl, drm_buf_t *buf)
}
if (!bl) return 1;
#if __HAVE_DMA_HISTOGRAM
-#ifdef __linux__
- buf->time_freed = get_cycles();
-#endif /* __linux__ */
-#ifdef __FreeBSD__
getnanotime(&buf->time_queued);
-#endif /* __FreeBSD__ */
DRM(histogram_compute)(dev, buf);
#endif
buf->list = DRM_LIST_FREE;
- DRM_OS_SPINLOCK( &bl->lock );
+ DRM_SPINLOCK( &bl->lock );
buf->next = bl->next;
bl->next = buf;
- DRM_OS_SPINUNLOCK( &bl->lock );
+ DRM_SPINUNLOCK( &bl->lock );
atomic_inc(&bl->count);
if (atomic_read(&bl->count) > dma->buf_count) {
@@ -223,7 +180,7 @@ int DRM(freelist_put)(drm_device_t *dev, drm_freelist_t *bl, drm_buf_t *buf)
/* Check for high water mark */
if (atomic_read(&bl->wfh) && atomic_read(&bl->count)>=bl->high_mark) {
atomic_set(&bl->wfh, 0);
- DRM_OS_WAKEUP_INT(&bl->waiting);
+ DRM_WAKEUP_INT((void *)&bl->waiting);
}
return 0;
}
@@ -235,14 +192,14 @@ static drm_buf_t *DRM(freelist_try)(drm_freelist_t *bl)
if (!bl) return NULL;
/* Get buffer */
- DRM_OS_SPINLOCK(&bl->lock);
+ DRM_SPINLOCK(&bl->lock);
if (!bl->next) {
- DRM_OS_SPINUNLOCK(&bl->lock);
+ DRM_SPINUNLOCK(&bl->lock);
return NULL;
}
buf = bl->next;
bl->next = bl->next->next;
- DRM_OS_SPINUNLOCK(&bl->lock);
+ DRM_SPINUNLOCK(&bl->lock);
atomic_dec(&bl->count);
buf->next = NULL;
@@ -258,12 +215,7 @@ static drm_buf_t *DRM(freelist_try)(drm_freelist_t *bl)
drm_buf_t *DRM(freelist_get)(drm_freelist_t *bl, int block)
{
drm_buf_t *buf = NULL;
-#ifdef __linux__
- DECLARE_WAITQUEUE(entry, current);
-#endif /* __linux__ */
-#ifdef __FreeBSD__
int error;
-#endif /* __FreeBSD__ */
if (!bl || !bl->initialized) return NULL;
@@ -272,28 +224,14 @@ drm_buf_t *DRM(freelist_get)(drm_freelist_t *bl, int block)
atomic_set(&bl->wfh, 1);
if (atomic_read(&bl->wfh)) {
if (block) {
-#ifdef __linux__
- add_wait_queue(&bl->waiting, &entry);
- for (;;) {
- current->state = TASK_INTERRUPTIBLE;
- if (!atomic_read(&bl->wfh)
- && (buf = DRM(freelist_try)(bl))) break;
- schedule();
- if (signal_pending(current)) break;
- }
- current->state = TASK_RUNNING;
- remove_wait_queue(&bl->waiting, &entry);
-#endif /* __linux__ */
-#ifdef __FreeBSD__
for (;;) {
if (!atomic_read(&bl->wfh)
&& (buf = DRM(freelist_try(bl)))) break;
- error = tsleep(&bl->waiting, PZERO|PCATCH,
+ error = tsleep((void *)&bl->waiting, PZERO|PCATCH,
"drmfg", 0);
if (error)
break;
}
-#endif /* __FreeBSD__ */
}
return buf;
}
OpenPOWER on IntegriCloud