summaryrefslogtreecommitdiff
path: root/bsd-core/drm_dma.c
diff options
context:
space:
mode:
authorEric Anholt <anholt@freebsd.org>2003-10-17 05:13:48 +0000
committerEric Anholt <anholt@freebsd.org>2003-10-17 05:13:48 +0000
commit2950f9e6823d43abae151966ae808d1a63e6659c (patch)
treeb7fbcbc101da31d02c5f3748568bc9caf54b13fa /bsd-core/drm_dma.c
parentff58476011ba8fe72d65e884380d3d86710bfdd4 (diff)
- Move IRQ functions from drm_dma.h to new drm_irq.h and disentangle them
from __HAVE_DMA. This will be useful for adding vblank sync support to sis and tdfx. Rename dma_service to irq_handler, which is more accurately what it is. - Fix the #if _HAVE_DMA_IRQ in radeon, r128, mga, i810, i830, gamma to have the right number of underscores. This may have been a problem in the case that the server died without doing its DRM_IOCTL_CONTROL to uninit.
Diffstat (limited to 'bsd-core/drm_dma.c')
-rw-r--r--bsd-core/drm_dma.c227
1 files changed, 6 insertions, 221 deletions
diff --git a/bsd-core/drm_dma.c b/bsd-core/drm_dma.c
index 6c502efb..877fd4e1 100644
--- a/bsd-core/drm_dma.c
+++ b/bsd-core/drm_dma.c
@@ -149,224 +149,11 @@ void DRM(reclaim_buffers)(drm_device_t *dev, DRMFILE filp)
}
#endif
-
-#if __HAVE_DMA_IRQ
-
-int DRM(irq_install)( drm_device_t *dev, int irq )
-{
- int retcode;
-
- if ( irq == 0 || dev->dev_private == NULL)
- return DRM_ERR(EINVAL);
-
- DRM_LOCK();
- if ( dev->irq ) {
- DRM_UNLOCK();
- return DRM_ERR(EBUSY);
- }
- dev->irq = irq;
- DRM_UNLOCK();
-
- DRM_DEBUG( "%s: irq=%d\n", __FUNCTION__, irq );
-
- dev->context_flag = 0;
-
- dev->dma->next_buffer = NULL;
- dev->dma->this_buffer = NULL;
-
-#if __HAVE_DMA_IRQ_BH
- TASK_INIT(&dev->task, 0, DRM(dma_immediate_bh), dev);
-#endif
-
-#if __HAVE_VBL_IRQ && 0 /* disabled */
- DRM_SPININIT( dev->vbl_lock, "vblsig" );
- TAILQ_INIT( &dev->vbl_sig_list );
-#endif
-
- /* Before installing handler */
- DRM(driver_irq_preinstall)( dev );
-
- /* Install handler */
- dev->irqrid = 0;
-#ifdef __FreeBSD__
- dev->irqr = bus_alloc_resource(dev->device, SYS_RES_IRQ, &dev->irqrid,
- 0, ~0, 1, RF_SHAREABLE);
- if (!dev->irqr) {
-#elif defined(__NetBSD__)
- if (pci_intr_map(&dev->pa, &dev->ih) != 0) {
-#endif
- DRM_LOCK();
- dev->irq = 0;
- dev->irqrid = 0;
- DRM_UNLOCK();
- return ENOENT;
- }
-
-#ifdef __FreeBSD__
-#if __FreeBSD_version < 500000
- retcode = bus_setup_intr(dev->device, dev->irqr, INTR_TYPE_TTY,
- DRM(dma_service), dev, &dev->irqh);
-#else
- retcode = bus_setup_intr(dev->device, dev->irqr, INTR_TYPE_TTY | INTR_MPSAFE,
- DRM(dma_service), dev, &dev->irqh);
-#endif
- if ( retcode ) {
-#elif defined(__NetBSD__)
- dev->irqh = pci_intr_establish(&dev->pa.pa_pc, dev->ih, IPL_TTY,
- (irqreturn_t (*)(DRM_IRQ_ARGS))DRM(dma_service), dev);
- if ( !dev->irqh ) {
-#endif
- DRM_LOCK();
-#ifdef __FreeBSD__
- bus_release_resource(dev->device, SYS_RES_IRQ, dev->irqrid, dev->irqr);
-#endif
- dev->irq = 0;
- dev->irqrid = 0;
- DRM_UNLOCK();
- return retcode;
- }
-
- /* After installing handler */
- DRM(driver_irq_postinstall)( dev );
-
- return 0;
-}
-
-int DRM(irq_uninstall)( drm_device_t *dev )
-{
- int irq;
- int irqrid;
-
- DRM_LOCK();
- irq = dev->irq;
- irqrid = dev->irqrid;
- dev->irq = 0;
- dev->irqrid = 0;
- DRM_UNLOCK();
-
- if ( !irq )
- return DRM_ERR(EINVAL);
-
- DRM_DEBUG( "%s: irq=%d\n", __FUNCTION__, irq );
-
- DRM(driver_irq_uninstall)( dev );
-
-#ifdef __FreeBSD__
- bus_teardown_intr(dev->device, dev->irqr, dev->irqh);
- bus_release_resource(dev->device, SYS_RES_IRQ, irqrid, dev->irqr);
-#elif defined(__NetBSD__)
- pci_intr_disestablish(&dev->pa.pa_pc, dev->irqh);
-#endif
-
- return 0;
-}
-
-int DRM(control)( DRM_IOCTL_ARGS )
-{
- DRM_DEVICE;
- drm_control_t ctl;
-
- DRM_COPY_FROM_USER_IOCTL( ctl, (drm_control_t *) data, sizeof(ctl) );
-
- switch ( ctl.func ) {
- case DRM_INST_HANDLER:
- return DRM(irq_install)( dev, ctl.irq );
- case DRM_UNINST_HANDLER:
- return DRM(irq_uninstall)( dev );
- default:
- return DRM_ERR(EINVAL);
- }
-}
-
-#if __HAVE_VBL_IRQ
-int DRM(wait_vblank)( DRM_IOCTL_ARGS )
-{
- DRM_DEVICE;
- drm_wait_vblank_t vblwait;
- struct timeval now;
- int ret;
-
- if (!dev->irq)
- return DRM_ERR(EINVAL);
-
- DRM_COPY_FROM_USER_IOCTL( vblwait, (drm_wait_vblank_t *)data,
- sizeof(vblwait) );
-
- if (vblwait.request.type & _DRM_VBLANK_RELATIVE) {
- vblwait.request.sequence += atomic_read(&dev->vbl_received);
- vblwait.request.type &= ~_DRM_VBLANK_RELATIVE;
- }
-
- flags = vblwait.request.type & _DRM_VBLANK_FLAGS_MASK;
- if (flags & _DRM_VBLANK_SIGNAL) {
-#if 0 /* disabled */
- drm_vbl_sig_t *vbl_sig = DRM_MALLOC(sizeof(drm_vbl_sig_t));
- if (vbl_sig == NULL)
- return ENOMEM;
- bzero(vbl_sig, sizeof(*vbl_sig));
-
- vbl_sig->sequence = vblwait.request.sequence;
- vbl_sig->signo = vblwait.request.signal;
- vbl_sig->pid = DRM_CURRENTPID;
-
- vblwait.reply.sequence = atomic_read(&dev->vbl_received);
-
- DRM_SPINLOCK(&dev->vbl_lock);
- TAILQ_INSERT_HEAD(&dev->vbl_sig_list, vbl_sig, link);
- DRM_SPINUNLOCK(&dev->vbl_lock);
- ret = 0;
-#endif
- ret = EINVAL;
- } else {
- ret = DRM(vblank_wait)(dev, &vblwait.request.sequence);
-
- microtime(&now);
- vblwait.reply.tval_sec = now.tv_sec;
- vblwait.reply.tval_usec = now.tv_usec;
- }
-
- DRM_COPY_TO_USER_IOCTL( (drm_wait_vblank_t *)data, vblwait,
- sizeof(vblwait) );
-
- return ret;
-}
-
-void DRM(vbl_send_signals)(drm_device_t *dev)
-{
-}
-
-#if 0 /* disabled */
-void DRM(vbl_send_signals)( drm_device_t *dev )
-{
- drm_vbl_sig_t *vbl_sig;
- unsigned int vbl_seq = atomic_read( &dev->vbl_received );
- struct proc *p;
-
- DRM_SPINLOCK(&dev->vbl_lock);
-
- vbl_sig = TAILQ_FIRST(&dev->vbl_sig_list);
- while (vbl_sig != NULL) {
- drm_vbl_sig_t *next = TAILQ_NEXT(vbl_sig, link);
-
- if ( ( vbl_seq - vbl_sig->sequence ) <= (1<<23) ) {
- p = pfind(vbl_sig->pid);
- if (p != NULL)
- psignal(p, vbl_sig->signo);
-
- TAILQ_REMOVE(&dev->vbl_sig_list, vbl_sig, link);
- DRM_FREE(vbl_sig,sizeof(*vbl_sig));
- }
- vbl_sig = next;
- }
-
- DRM_SPINUNLOCK(&dev->vbl_lock);
-}
-#endif
-
-#endif /* __HAVE_VBL_IRQ */
-
-#else
-
+#if !__HAVE_IRQ
+/* This stub DRM_IOCTL_CONTROL handler is for the drivers that used to require
+ * IRQs for DMA but no longer do. It maintains compatibility with the X Servers
+ * that try to use the control ioctl by simply returning success.
+ */
int DRM(control)( DRM_IOCTL_ARGS )
{
drm_control_t ctl;
@@ -381,8 +168,6 @@ int DRM(control)( DRM_IOCTL_ARGS )
return DRM_ERR(EINVAL);
}
}
-
-#endif /* __HAVE_DMA_IRQ */
+#endif
#endif /* __HAVE_DMA */
-