diff options
Diffstat (limited to 'sys/dev/drm/drm_lists.h')
-rw-r--r-- | sys/dev/drm/drm_lists.h | 110 |
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; } |