#ifndef __HAVE_DMA_IRQ
#define __HAVE_DMA_IRQ 0
#endif
-#ifndef __HAVE_DMA_WAITLIST
-#define __HAVE_DMA_WAITLIST 0
-#endif
-#ifndef __HAVE_DMA_FREELIST
-#define __HAVE_DMA_FREELIST 0
-#endif
#define DRM_DEBUG_CODE 0 /* Include debugging code (if > 1, then
also include looping detection. */
void *address; /* Address of buffer */
unsigned long bus_address; /* Bus address of buffer */
struct drm_buf *next; /* Kernel-only: used for free list */
- __volatile__ int waiting; /* On kernel DMA queue */
__volatile__ int pending; /* On hardware DMA queue */
- wait_queue_head_t dma_wait; /* Processes waiting */
DRMFILE filp; /* Unique identifier of holding process */
int context; /* Kernel queue for this buffer */
- int while_locked;/* Dispatch this buffer while locked */
enum {
DRM_LIST_NONE = 0,
DRM_LIST_FREE = 1,
atomic_t count; /* Number of free buffers */
drm_buf_t *next; /* End pointer */
- wait_queue_head_t waiting; /* Processes waiting on free bufs */
int low_mark; /* Low water mark */
int high_mark; /* High water mark */
- atomic_t wfh; /* If waiting for high mark */
DRM_SPINTYPE lock;
} drm_freelist_t;
struct drm_device *devXX;
};
-typedef struct drm_queue {
- atomic_t use_count; /* Outstanding uses (+1) */
- atomic_t finalization; /* Finalization in progress */
- atomic_t block_count; /* Count of processes waiting */
- atomic_t block_read; /* Queue blocked for reads */
- wait_queue_head_t read_queue; /* Processes waiting on block_read */
- atomic_t block_write; /* Queue blocked for writes */
- wait_queue_head_t write_queue; /* Processes waiting on block_write */
-#if 1
- atomic_t total_queued; /* Total queued statistic */
- atomic_t total_flushed;/* Total flushes statistic */
- atomic_t total_locks; /* Total locks statistics */
-#endif
- drm_ctx_flags_t flags; /* Context preserving and 2D-only */
- drm_waitlist_t waitlist; /* Pending buffers */
- wait_queue_head_t flush_queue; /* Processes waiting until flush */
-} drm_queue_t;
-
typedef struct drm_lock_data {
drm_hw_lock_t *hw_lock; /* Hardware lock */
DRMFILE filp; /* Unique identifier of holding process (NULL is kernel)*/
/* DMA support */
drm_buf_t *this_buffer; /* Buffer being sent */
drm_buf_t *next_buffer; /* Selected buffer to send */
- drm_queue_t *next_queue; /* Queue from which buffer selected*/
- wait_queue_head_t waiting; /* Processes waiting on free bufs */
} drm_device_dma_t;
#if __REALLY_HAVE_AGP
/* Memory management */
drm_map_list_t *maplist; /* Linked list of regions */
- int map_count; /* Number of mappable regions */
drm_local_map_t **context_sareas;
int max_context;
drm_lock_data_t lock; /* Information on hardware lock */
/* DMA queues (contexts) */
- int queue_count; /* Number of active DMA queues */
- int queue_reserved; /* Number of reserved DMA queues */
- int queue_slots; /* Actual length of queuelist */
- drm_queue_t **queuelist; /* Vector of pointers to DMA queues */
drm_device_dma_t *dma; /* Optional pointer for DMA support */
/* Context support */
#endif
void *irqh; /* Handle from bus_setup_intr */
atomic_t context_flag; /* Context swapping flag */
- atomic_t interrupt_flag; /* Interruption handler flag */
- atomic_t dma_flag; /* DMA dispatch flag */
struct callout timer; /* Timer for delaying ctx switch */
- wait_queue_head_t context_wait; /* Processes waiting on ctx switch */
- int last_checked; /* Last context checked for DMA */
int last_context; /* Last current context */
- unsigned long last_switch; /* jiffies at last context switch */
#if __FreeBSD_version >= 400005
struct task task;
#endif
extern int DRM(waitlist_put)(drm_waitlist_t *bl, drm_buf_t *buf);
extern drm_buf_t *DRM(waitlist_get)(drm_waitlist_t *bl);
#endif
-#if __HAVE_DMA_FREELIST
-extern int DRM(freelist_create)(drm_freelist_t *bl, int count);
-extern int DRM(freelist_destroy)(drm_freelist_t *bl);
-extern int DRM(freelist_put)(drm_device_t *dev, drm_freelist_t *bl,
- drm_buf_t *buf);
-extern drm_buf_t *DRM(freelist_get)(drm_freelist_t *bl, int block);
-#endif
#endif /* __HAVE_DMA */
#if __HAVE_VBL_IRQ
extern int DRM(vblank_wait)(drm_device_t *dev, unsigned int *vbl_seq);
sizeof(*entry->buflist),
DRM_MEM_BUFS);
-#if __HAVE_DMA_FREELIST
- DRM(freelist_destroy)(&entry->freelist);
-#endif
-
entry->buf_count = 0;
}
}
buf->bus_address = agp_offset + offset;
buf->address = (void *)(agp_offset + offset);
buf->next = NULL;
- buf->waiting = 0;
buf->pending = 0;
- buf->dma_wait = 0;
buf->filp = NULL;
buf->dev_priv_size = sizeof(DRIVER_BUF_PRIV_T);
DRM_DEBUG( "dma->buf_count : %d\n", dma->buf_count );
DRM_DEBUG( "entry->buf_count : %d\n", entry->buf_count );
-#if __HAVE_DMA_FREELIST
- DRM(freelist_create)( &entry->freelist, entry->buf_count );
- for ( i = 0 ; i < entry->buf_count ; i++ ) {
- DRM(freelist_put)( dev, &entry->freelist, &entry->buflist[i] );
- }
-#endif
DRM_UNLOCK;
request->count = entry->buf_count;
order = DRM(order)(request->size);
size = 1 << order;
- DRM_DEBUG( "count=%d, size=%d (%d), order=%d, queue_count=%d\n",
- request->count, request->size, size,
- order, dev->queue_count );
+ DRM_DEBUG( "count=%d, size=%d (%d), order=%d\n",
+ request->count, request->size, size, order );
if ( order < DRM_MIN_ORDER || order > DRM_MAX_ORDER )
return DRM_ERR(EINVAL);
buf->offset = (dma->byte_count + byte_count + offset);
buf->address = (void *)(page + offset);
buf->next = NULL;
- buf->waiting = 0;
buf->pending = 0;
- buf->dma_wait = 0;
buf->filp = NULL;
DRM_DEBUG( "buffer %d @ %p\n",
entry->buf_count, buf->address );
dma->page_count += entry->seg_count << page_order;
dma->byte_count += PAGE_SIZE * (entry->seg_count << page_order);
-#if __HAVE_DMA_FREELIST
- DRM(freelist_create)( &entry->freelist, entry->buf_count );
- for ( i = 0 ; i < entry->buf_count ; i++ ) {
- DRM(freelist_put)( dev, &entry->freelist, &entry->buflist[i] );
- }
-#endif
DRM_UNLOCK;
request->count = entry->buf_count;
buf->bus_address = agp_offset + offset;
buf->address = (void *)(agp_offset + offset + dev->sg->handle);
buf->next = NULL;
- buf->waiting = 0;
buf->pending = 0;
- buf->dma_wait = 0;
buf->filp = NULL;
buf->dev_priv_size = sizeof(DRIVER_BUF_PRIV_T);
DRM_DEBUG( "dma->buf_count : %d\n", dma->buf_count );
DRM_DEBUG( "entry->buf_count : %d\n", entry->buf_count );
-#if __HAVE_DMA_FREELIST
- DRM(freelist_create)( &entry->freelist, entry->buf_count );
- for ( i = 0 ; i < entry->buf_count ; i++ ) {
- DRM(freelist_put)( dev, &entry->freelist, &entry->buflist[i] );
- }
-#endif
DRM_UNLOCK;
request->count = entry->buf_count;
if (request.count < 0 || request.count > 4096)
return DRM_ERR(EINVAL);
- if (dev->queue_count)
- return DRM_ERR(EBUSY); /* Not while in use */
-
DRM_SPINLOCK(&dev->count_lock);
if (dev->buf_use) {
DRM_SPINUNLOCK(&dev->count_lock);
int DRM(context_switch_complete)( drm_device_t *dev, int new )
{
dev->last_context = new; /* PRE/POST: This is the _only_ writer. */
- dev->last_switch = jiffies;
if ( !_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock) ) {
DRM_ERROR( "Lock isn't held after context switch\n" );
when the kernel holds the lock, release
that lock here. */
clear_bit( 0, &dev->context_flag );
- DRM_WAKEUP( (void *)&dev->context_wait );
return 0;
}
dma->bufs[i].buf_count *
sizeof(*dma->bufs[0].buflist),
DRM_MEM_BUFS);
-#if __HAVE_DMA_FREELIST
- DRM(freelist_destroy)(&dma->bufs[i].freelist);
-#endif
}
}
{
if (!buf) return;
- buf->waiting = 0;
buf->pending = 0;
buf->filp = NULL;
buf->used = 0;
-
- if ( buf->dma_wait ) {
- wakeup( (void *)&buf->dma_wait );
- buf->dma_wait = 0;
- }
-#if __HAVE_DMA_FREELIST
- else {
- drm_device_dma_t *dma = dev->dma;
- /* If processes are waiting, the last one
- to wake will put the buffer on the free
- list. If no processes are waiting, we
- put the buffer on the freelist here. */
- DRM(freelist_put)(dev, &dma->bufs[buf->order].freelist, buf);
- }
-#endif
}
#if !__HAVE_DMA_RECLAIM
DRM_DEBUG( "%s: irq=%d\n", __FUNCTION__, irq );
dev->context_flag = 0;
- dev->interrupt_flag = 0;
- dev->dma_flag = 0;
dev->dma->next_buffer = NULL;
- dev->dma->next_queue = NULL;
dev->dma->this_buffer = NULL;
#if __HAVE_DMA_IRQ_BH
#ifndef __HAVE_DMA_QUEUE
#define __HAVE_DMA_QUEUE 0
#endif
-#ifndef __HAVE_MULTIPLE_DMA_QUEUES
-#define __HAVE_MULTIPLE_DMA_QUEUES 0
-#endif
#ifndef __HAVE_DMA_SCHEDULE
#define __HAVE_DMA_SCHEDULE 0
#endif
if(dev->maplist == NULL) return DRM_ERR(ENOMEM);
memset(dev->maplist, 0, sizeof(*dev->maplist));
TAILQ_INIT(dev->maplist);
- dev->map_count = 0;
dev->lock.hw_lock = NULL;
dev->lock.lock_queue = 0;
- dev->queue_count = 0;
- dev->queue_reserved = 0;
- dev->queue_slots = 0;
- dev->queuelist = NULL;
dev->irq = 0;
dev->context_flag = 0;
- dev->interrupt_flag = 0;
- dev->dma_flag = 0;
dev->last_context = 0;
- dev->last_switch = 0;
- dev->last_checked = 0;
#if __FreeBSD_version >= 500000
callout_init( &dev->timer, 1 );
#else
callout_init( &dev->timer );
#endif
- dev->context_wait = 0;
#ifdef __FreeBSD__
dev->buf_sigio = NULL;
dev->maplist = NULL;
}
-#if __HAVE_DMA_QUEUE || __HAVE_MULTIPLE_DMA_QUEUES
- if ( dev->queuelist ) {
- for ( i = 0 ; i < dev->queue_count ; i++ ) {
- DRM(waitlist_destroy)( &dev->queuelist[i]->waitlist );
- if ( dev->queuelist[i] ) {
- DRM(free)( dev->queuelist[i],
- sizeof(*dev->queuelist[0]),
- DRM_MEM_QUEUES );
- dev->queuelist[i] = NULL;
- }
- }
- DRM(free)( dev->queuelist,
- dev->queue_slots * sizeof(*dev->queuelist),
- DRM_MEM_QUEUES );
- dev->queuelist = NULL;
- }
- dev->queue_count = 0;
-#endif
-
#if __HAVE_DMA
DRM(dma_takedown)( dev );
#endif
DRM_DEVICE;
drm_lock_t lock;
int ret = 0;
-#if __HAVE_MULTIPLE_DMA_QUEUES
- drm_queue_t *q;
-#endif
DRM_COPY_FROM_USER_IOCTL( lock, (drm_lock_t *)data, sizeof(lock) );
#if __HAVE_DMA_QUEUE
if ( lock.context < 0 )
return DRM_ERR(EINVAL);
-#elif __HAVE_MULTIPLE_DMA_QUEUES
- if ( lock.context < 0 || lock.context >= dev->queue_count )
- return DRM_ERR(EINVAL);
- q = dev->queuelist[lock.context];
#endif
if ( !ret ) {
idx = map.offset;
DRM_LOCK;
- if (idx < 0 || idx >= dev->map_count) {
+ if (idx < 0) {
DRM_UNLOCK;
return DRM_ERR(EINVAL);
}
static int DRM(name_info)DRM_SYSCTL_HANDLER_ARGS;
static int DRM(vm_info)DRM_SYSCTL_HANDLER_ARGS;
static int DRM(clients_info)DRM_SYSCTL_HANDLER_ARGS;
-static int DRM(queues_info)DRM_SYSCTL_HANDLER_ARGS;
static int DRM(bufs_info)DRM_SYSCTL_HANDLER_ARGS;
struct DRM(sysctl_list) {
{ "mem", DRM(mem_info) },
{ "vm", DRM(vm_info) },
{ "clients", DRM(clients_info) },
- { "queues", DRM(queues_info) },
{ "bufs", DRM(bufs_info) },
};
#define DRM_SYSCTL_ENTRIES (sizeof(DRM(sysctl_list))/sizeof(DRM(sysctl_list)[0]))
}
-static int DRM(_queues_info)DRM_SYSCTL_HANDLER_ARGS
-{
- drm_device_t *dev = arg1;
- int i;
- drm_queue_t *q;
- char buf[128];
- int error;
-
- DRM_SYSCTL_PRINT(" ctx/flags use fin"
- " blk/rw/rwf wait flushed queued"
- " locks\n\n");
- for (i = 0; i < dev->queue_count; i++) {
- q = dev->queuelist[i];
- atomic_inc(&q->use_count);
- DRM_SYSCTL_PRINT_RET(atomic_dec(&q->use_count),
- "%5d/0x%03x %5d %5d"
- " %5d/%c%c/%c%c%c %5d %10d %10d %10d\n",
- i,
- q->flags,
- atomic_read(&q->use_count),
- atomic_read(&q->finalization),
- atomic_read(&q->block_count),
- atomic_read(&q->block_read) ? 'r' : '-',
- atomic_read(&q->block_write) ? 'w' : '-',
- q->read_queue ? 'r':'-',
- q->write_queue ? 'w':'-',
- q->flush_queue ? 'f':'-',
- (int)DRM_BUFCOUNT(&q->waitlist),
- atomic_read(&q->total_flushed),
- atomic_read(&q->total_queued),
- atomic_read(&q->total_locks));
- atomic_dec(&q->use_count);
- }
-
- SYSCTL_OUT(req, "", 1);
- return 0;
-}
-
-static int DRM(queues_info) DRM_SYSCTL_HANDLER_ARGS
-{
- drm_device_t *dev = arg1;
- int ret;
-
- DRM_LOCK;
- ret = DRM(_queues_info)(oidp, arg1, arg2, req);
- DRM_UNLOCK;
- return ret;
-}
-
/* drm_bufs_info is called whenever a process reads
hw.dri.0.bufs. */
#ifndef __HAVE_DMA_IRQ
#define __HAVE_DMA_IRQ 0
#endif
-#ifndef __HAVE_DMA_WAITLIST
-#define __HAVE_DMA_WAITLIST 0
-#endif
-#ifndef __HAVE_DMA_FREELIST
-#define __HAVE_DMA_FREELIST 0
-#endif
#define DRM_DEBUG_CODE 0 /* Include debugging code (if > 1, then
also include looping detection. */
void *address; /* Address of buffer */
unsigned long bus_address; /* Bus address of buffer */
struct drm_buf *next; /* Kernel-only: used for free list */
- __volatile__ int waiting; /* On kernel DMA queue */
__volatile__ int pending; /* On hardware DMA queue */
- wait_queue_head_t dma_wait; /* Processes waiting */
DRMFILE filp; /* Unique identifier of holding process */
int context; /* Kernel queue for this buffer */
- int while_locked;/* Dispatch this buffer while locked */
enum {
DRM_LIST_NONE = 0,
DRM_LIST_FREE = 1,
atomic_t count; /* Number of free buffers */
drm_buf_t *next; /* End pointer */
- wait_queue_head_t waiting; /* Processes waiting on free bufs */
int low_mark; /* Low water mark */
int high_mark; /* High water mark */
- atomic_t wfh; /* If waiting for high mark */
DRM_SPINTYPE lock;
} drm_freelist_t;
struct drm_device *devXX;
};
-typedef struct drm_queue {
- atomic_t use_count; /* Outstanding uses (+1) */
- atomic_t finalization; /* Finalization in progress */
- atomic_t block_count; /* Count of processes waiting */
- atomic_t block_read; /* Queue blocked for reads */
- wait_queue_head_t read_queue; /* Processes waiting on block_read */
- atomic_t block_write; /* Queue blocked for writes */
- wait_queue_head_t write_queue; /* Processes waiting on block_write */
-#if 1
- atomic_t total_queued; /* Total queued statistic */
- atomic_t total_flushed;/* Total flushes statistic */
- atomic_t total_locks; /* Total locks statistics */
-#endif
- drm_ctx_flags_t flags; /* Context preserving and 2D-only */
- drm_waitlist_t waitlist; /* Pending buffers */
- wait_queue_head_t flush_queue; /* Processes waiting until flush */
-} drm_queue_t;
-
typedef struct drm_lock_data {
drm_hw_lock_t *hw_lock; /* Hardware lock */
DRMFILE filp; /* Unique identifier of holding process (NULL is kernel)*/
/* DMA support */
drm_buf_t *this_buffer; /* Buffer being sent */
drm_buf_t *next_buffer; /* Selected buffer to send */
- drm_queue_t *next_queue; /* Queue from which buffer selected*/
- wait_queue_head_t waiting; /* Processes waiting on free bufs */
} drm_device_dma_t;
#if __REALLY_HAVE_AGP
/* Memory management */
drm_map_list_t *maplist; /* Linked list of regions */
- int map_count; /* Number of mappable regions */
drm_local_map_t **context_sareas;
int max_context;
drm_lock_data_t lock; /* Information on hardware lock */
/* DMA queues (contexts) */
- int queue_count; /* Number of active DMA queues */
- int queue_reserved; /* Number of reserved DMA queues */
- int queue_slots; /* Actual length of queuelist */
- drm_queue_t **queuelist; /* Vector of pointers to DMA queues */
drm_device_dma_t *dma; /* Optional pointer for DMA support */
/* Context support */
#endif
void *irqh; /* Handle from bus_setup_intr */
atomic_t context_flag; /* Context swapping flag */
- atomic_t interrupt_flag; /* Interruption handler flag */
- atomic_t dma_flag; /* DMA dispatch flag */
struct callout timer; /* Timer for delaying ctx switch */
- wait_queue_head_t context_wait; /* Processes waiting on ctx switch */
- int last_checked; /* Last context checked for DMA */
int last_context; /* Last current context */
- unsigned long last_switch; /* jiffies at last context switch */
#if __FreeBSD_version >= 400005
struct task task;
#endif
extern int DRM(waitlist_put)(drm_waitlist_t *bl, drm_buf_t *buf);
extern drm_buf_t *DRM(waitlist_get)(drm_waitlist_t *bl);
#endif
-#if __HAVE_DMA_FREELIST
-extern int DRM(freelist_create)(drm_freelist_t *bl, int count);
-extern int DRM(freelist_destroy)(drm_freelist_t *bl);
-extern int DRM(freelist_put)(drm_device_t *dev, drm_freelist_t *bl,
- drm_buf_t *buf);
-extern drm_buf_t *DRM(freelist_get)(drm_freelist_t *bl, int block);
-#endif
#endif /* __HAVE_DMA */
#if __HAVE_VBL_IRQ
extern int DRM(vblank_wait)(drm_device_t *dev, unsigned int *vbl_seq);
sizeof(*entry->buflist),
DRM_MEM_BUFS);
-#if __HAVE_DMA_FREELIST
- DRM(freelist_destroy)(&entry->freelist);
-#endif
-
entry->buf_count = 0;
}
}
buf->bus_address = agp_offset + offset;
buf->address = (void *)(agp_offset + offset);
buf->next = NULL;
- buf->waiting = 0;
buf->pending = 0;
- buf->dma_wait = 0;
buf->filp = NULL;
buf->dev_priv_size = sizeof(DRIVER_BUF_PRIV_T);
DRM_DEBUG( "dma->buf_count : %d\n", dma->buf_count );
DRM_DEBUG( "entry->buf_count : %d\n", entry->buf_count );
-#if __HAVE_DMA_FREELIST
- DRM(freelist_create)( &entry->freelist, entry->buf_count );
- for ( i = 0 ; i < entry->buf_count ; i++ ) {
- DRM(freelist_put)( dev, &entry->freelist, &entry->buflist[i] );
- }
-#endif
DRM_UNLOCK;
request->count = entry->buf_count;
order = DRM(order)(request->size);
size = 1 << order;
- DRM_DEBUG( "count=%d, size=%d (%d), order=%d, queue_count=%d\n",
- request->count, request->size, size,
- order, dev->queue_count );
+ DRM_DEBUG( "count=%d, size=%d (%d), order=%d\n",
+ request->count, request->size, size, order );
if ( order < DRM_MIN_ORDER || order > DRM_MAX_ORDER )
return DRM_ERR(EINVAL);
buf->offset = (dma->byte_count + byte_count + offset);
buf->address = (void *)(page + offset);
buf->next = NULL;
- buf->waiting = 0;
buf->pending = 0;
- buf->dma_wait = 0;
buf->filp = NULL;
DRM_DEBUG( "buffer %d @ %p\n",
entry->buf_count, buf->address );
dma->page_count += entry->seg_count << page_order;
dma->byte_count += PAGE_SIZE * (entry->seg_count << page_order);
-#if __HAVE_DMA_FREELIST
- DRM(freelist_create)( &entry->freelist, entry->buf_count );
- for ( i = 0 ; i < entry->buf_count ; i++ ) {
- DRM(freelist_put)( dev, &entry->freelist, &entry->buflist[i] );
- }
-#endif
DRM_UNLOCK;
request->count = entry->buf_count;
buf->bus_address = agp_offset + offset;
buf->address = (void *)(agp_offset + offset + dev->sg->handle);
buf->next = NULL;
- buf->waiting = 0;
buf->pending = 0;
- buf->dma_wait = 0;
buf->filp = NULL;
buf->dev_priv_size = sizeof(DRIVER_BUF_PRIV_T);
DRM_DEBUG( "dma->buf_count : %d\n", dma->buf_count );
DRM_DEBUG( "entry->buf_count : %d\n", entry->buf_count );
-#if __HAVE_DMA_FREELIST
- DRM(freelist_create)( &entry->freelist, entry->buf_count );
- for ( i = 0 ; i < entry->buf_count ; i++ ) {
- DRM(freelist_put)( dev, &entry->freelist, &entry->buflist[i] );
- }
-#endif
DRM_UNLOCK;
request->count = entry->buf_count;
if (request.count < 0 || request.count > 4096)
return DRM_ERR(EINVAL);
- if (dev->queue_count)
- return DRM_ERR(EBUSY); /* Not while in use */
-
DRM_SPINLOCK(&dev->count_lock);
if (dev->buf_use) {
DRM_SPINUNLOCK(&dev->count_lock);
int DRM(context_switch_complete)( drm_device_t *dev, int new )
{
dev->last_context = new; /* PRE/POST: This is the _only_ writer. */
- dev->last_switch = jiffies;
if ( !_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock) ) {
DRM_ERROR( "Lock isn't held after context switch\n" );
when the kernel holds the lock, release
that lock here. */
clear_bit( 0, &dev->context_flag );
- DRM_WAKEUP( (void *)&dev->context_wait );
return 0;
}
dma->bufs[i].buf_count *
sizeof(*dma->bufs[0].buflist),
DRM_MEM_BUFS);
-#if __HAVE_DMA_FREELIST
- DRM(freelist_destroy)(&dma->bufs[i].freelist);
-#endif
}
}
{
if (!buf) return;
- buf->waiting = 0;
buf->pending = 0;
buf->filp = NULL;
buf->used = 0;
-
- if ( buf->dma_wait ) {
- wakeup( (void *)&buf->dma_wait );
- buf->dma_wait = 0;
- }
-#if __HAVE_DMA_FREELIST
- else {
- drm_device_dma_t *dma = dev->dma;
- /* If processes are waiting, the last one
- to wake will put the buffer on the free
- list. If no processes are waiting, we
- put the buffer on the freelist here. */
- DRM(freelist_put)(dev, &dma->bufs[buf->order].freelist, buf);
- }
-#endif
}
#if !__HAVE_DMA_RECLAIM
DRM_DEBUG( "%s: irq=%d\n", __FUNCTION__, irq );
dev->context_flag = 0;
- dev->interrupt_flag = 0;
- dev->dma_flag = 0;
dev->dma->next_buffer = NULL;
- dev->dma->next_queue = NULL;
dev->dma->this_buffer = NULL;
#if __HAVE_DMA_IRQ_BH
#ifndef __HAVE_DMA_QUEUE
#define __HAVE_DMA_QUEUE 0
#endif
-#ifndef __HAVE_MULTIPLE_DMA_QUEUES
-#define __HAVE_MULTIPLE_DMA_QUEUES 0
-#endif
#ifndef __HAVE_DMA_SCHEDULE
#define __HAVE_DMA_SCHEDULE 0
#endif
if(dev->maplist == NULL) return DRM_ERR(ENOMEM);
memset(dev->maplist, 0, sizeof(*dev->maplist));
TAILQ_INIT(dev->maplist);
- dev->map_count = 0;
dev->lock.hw_lock = NULL;
dev->lock.lock_queue = 0;
- dev->queue_count = 0;
- dev->queue_reserved = 0;
- dev->queue_slots = 0;
- dev->queuelist = NULL;
dev->irq = 0;
dev->context_flag = 0;
- dev->interrupt_flag = 0;
- dev->dma_flag = 0;
dev->last_context = 0;
- dev->last_switch = 0;
- dev->last_checked = 0;
#if __FreeBSD_version >= 500000
callout_init( &dev->timer, 1 );
#else
callout_init( &dev->timer );
#endif
- dev->context_wait = 0;
#ifdef __FreeBSD__
dev->buf_sigio = NULL;
dev->maplist = NULL;
}
-#if __HAVE_DMA_QUEUE || __HAVE_MULTIPLE_DMA_QUEUES
- if ( dev->queuelist ) {
- for ( i = 0 ; i < dev->queue_count ; i++ ) {
- DRM(waitlist_destroy)( &dev->queuelist[i]->waitlist );
- if ( dev->queuelist[i] ) {
- DRM(free)( dev->queuelist[i],
- sizeof(*dev->queuelist[0]),
- DRM_MEM_QUEUES );
- dev->queuelist[i] = NULL;
- }
- }
- DRM(free)( dev->queuelist,
- dev->queue_slots * sizeof(*dev->queuelist),
- DRM_MEM_QUEUES );
- dev->queuelist = NULL;
- }
- dev->queue_count = 0;
-#endif
-
#if __HAVE_DMA
DRM(dma_takedown)( dev );
#endif
DRM_DEVICE;
drm_lock_t lock;
int ret = 0;
-#if __HAVE_MULTIPLE_DMA_QUEUES
- drm_queue_t *q;
-#endif
DRM_COPY_FROM_USER_IOCTL( lock, (drm_lock_t *)data, sizeof(lock) );
#if __HAVE_DMA_QUEUE
if ( lock.context < 0 )
return DRM_ERR(EINVAL);
-#elif __HAVE_MULTIPLE_DMA_QUEUES
- if ( lock.context < 0 || lock.context >= dev->queue_count )
- return DRM_ERR(EINVAL);
- q = dev->queuelist[lock.context];
#endif
if ( !ret ) {
idx = map.offset;
DRM_LOCK;
- if (idx < 0 || idx >= dev->map_count) {
+ if (idx < 0) {
DRM_UNLOCK;
return DRM_ERR(EINVAL);
}
static int DRM(name_info)DRM_SYSCTL_HANDLER_ARGS;
static int DRM(vm_info)DRM_SYSCTL_HANDLER_ARGS;
static int DRM(clients_info)DRM_SYSCTL_HANDLER_ARGS;
-static int DRM(queues_info)DRM_SYSCTL_HANDLER_ARGS;
static int DRM(bufs_info)DRM_SYSCTL_HANDLER_ARGS;
struct DRM(sysctl_list) {
{ "mem", DRM(mem_info) },
{ "vm", DRM(vm_info) },
{ "clients", DRM(clients_info) },
- { "queues", DRM(queues_info) },
{ "bufs", DRM(bufs_info) },
};
#define DRM_SYSCTL_ENTRIES (sizeof(DRM(sysctl_list))/sizeof(DRM(sysctl_list)[0]))
}
-static int DRM(_queues_info)DRM_SYSCTL_HANDLER_ARGS
-{
- drm_device_t *dev = arg1;
- int i;
- drm_queue_t *q;
- char buf[128];
- int error;
-
- DRM_SYSCTL_PRINT(" ctx/flags use fin"
- " blk/rw/rwf wait flushed queued"
- " locks\n\n");
- for (i = 0; i < dev->queue_count; i++) {
- q = dev->queuelist[i];
- atomic_inc(&q->use_count);
- DRM_SYSCTL_PRINT_RET(atomic_dec(&q->use_count),
- "%5d/0x%03x %5d %5d"
- " %5d/%c%c/%c%c%c %5d %10d %10d %10d\n",
- i,
- q->flags,
- atomic_read(&q->use_count),
- atomic_read(&q->finalization),
- atomic_read(&q->block_count),
- atomic_read(&q->block_read) ? 'r' : '-',
- atomic_read(&q->block_write) ? 'w' : '-',
- q->read_queue ? 'r':'-',
- q->write_queue ? 'w':'-',
- q->flush_queue ? 'f':'-',
- (int)DRM_BUFCOUNT(&q->waitlist),
- atomic_read(&q->total_flushed),
- atomic_read(&q->total_queued),
- atomic_read(&q->total_locks));
- atomic_dec(&q->use_count);
- }
-
- SYSCTL_OUT(req, "", 1);
- return 0;
-}
-
-static int DRM(queues_info) DRM_SYSCTL_HANDLER_ARGS
-{
- drm_device_t *dev = arg1;
- int ret;
-
- DRM_LOCK;
- ret = DRM(_queues_info)(oidp, arg1, arg2, req);
- DRM_UNLOCK;
- return ret;
-}
-
/* drm_bufs_info is called whenever a process reads
hw.dri.0.bufs. */