diff options
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/uts/common/io/drm/drmP.h | 2 | ||||
-rw-r--r-- | usr/src/uts/common/io/drm/drm_irq.c | 10 | ||||
-rw-r--r-- | usr/src/uts/intel/io/drm/i915_drv.h | 2 | ||||
-rw-r--r-- | usr/src/uts/intel/io/drm/i915_irq.c | 7 | ||||
-rw-r--r-- | usr/src/uts/intel/io/drm/radeon_drv.h | 6 | ||||
-rw-r--r-- | usr/src/uts/intel/io/drm/radeon_irq.c | 11 |
6 files changed, 24 insertions, 14 deletions
diff --git a/usr/src/uts/common/io/drm/drmP.h b/usr/src/uts/common/io/drm/drmP.h index a02604296f..12eda8c761 100644 --- a/usr/src/uts/common/io/drm/drmP.h +++ b/usr/src/uts/common/io/drm/drmP.h @@ -545,7 +545,7 @@ struct drm_driver_info { int (*kernel_context_switch)(struct drm_device *, int, int); int (*kernel_context_switch_unlock)(struct drm_device *); int (*device_is_agp) (struct drm_device *); - void (*irq_preinstall)(struct drm_device *); + int (*irq_preinstall)(struct drm_device *); void (*irq_postinstall)(struct drm_device *); void (*irq_uninstall)(struct drm_device *dev); uint_t (*irq_handler)(DRM_IRQ_ARGS); diff --git a/usr/src/uts/common/io/drm/drm_irq.c b/usr/src/uts/common/io/drm/drm_irq.c index a91a461333..bd5054644f 100644 --- a/usr/src/uts/common/io/drm/drm_irq.c +++ b/usr/src/uts/common/io/drm/drm_irq.c @@ -221,12 +221,13 @@ drm_irq_install(drm_device_t *dev) DRM_ERROR("drm_irq_install: irq already enabled"); return (EBUSY); } - dev->irq_enabled = 1; + DRM_DEBUG("drm_irq_install irq=%d\n", dev->irq); - dev->context_flag = 0; /* before installing handler */ - dev->driver->irq_preinstall(dev); + ret = dev->driver->irq_preinstall(dev); + if (ret) + return (EINVAL); /* install handler */ ret = drm_install_irq_handle(dev); @@ -238,6 +239,9 @@ drm_irq_install(drm_device_t *dev) /* after installing handler */ dev->driver->irq_postinstall(dev); + dev->irq_enabled = 1; + dev->context_flag = 0; + return (0); } diff --git a/usr/src/uts/intel/io/drm/i915_drv.h b/usr/src/uts/intel/io/drm/i915_drv.h index 88273a8cb2..dc3743a44b 100644 --- a/usr/src/uts/intel/io/drm/i915_drv.h +++ b/usr/src/uts/intel/io/drm/i915_drv.h @@ -267,7 +267,7 @@ extern int i915_enable_vblank(struct drm_device *dev, int crtc); extern void i915_disable_vblank(struct drm_device *dev, int crtc); extern u32 i915_get_vblank_counter(struct drm_device *dev, int crtc); extern irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS); -extern void i915_driver_irq_preinstall(drm_device_t * dev); +extern int i915_driver_irq_preinstall(drm_device_t * dev); extern void i915_driver_irq_postinstall(drm_device_t * dev); extern void i915_driver_irq_uninstall(drm_device_t * dev); extern int i915_emit_irq(drm_device_t * dev); diff --git a/usr/src/uts/intel/io/drm/i915_irq.c b/usr/src/uts/intel/io/drm/i915_irq.c index a8e44ca953..3e4ba88cec 100644 --- a/usr/src/uts/intel/io/drm/i915_irq.c +++ b/usr/src/uts/intel/io/drm/i915_irq.c @@ -942,13 +942,18 @@ int i915_vblank_swap(DRM_IOCTL_ARGS) /* drm_dma.h hooks */ -void i915_driver_irq_preinstall(drm_device_t * dev) +int i915_driver_irq_preinstall(drm_device_t * dev) { drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; + if (!dev_priv->mmio_map) + return -EINVAL; + I915_WRITE(HWSTAM, 0xeffe); I915_WRITE(IMR, 0xffffffff); I915_WRITE(IER, 0x0); + + return 0; } void i915_driver_irq_postinstall(drm_device_t * dev) diff --git a/usr/src/uts/intel/io/drm/radeon_drv.h b/usr/src/uts/intel/io/drm/radeon_drv.h index 463dbc1950..0a0b0466ec 100644 --- a/usr/src/uts/intel/io/drm/radeon_drv.h +++ b/usr/src/uts/intel/io/drm/radeon_drv.h @@ -1,5 +1,5 @@ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ /* @@ -33,8 +33,6 @@ * Gareth Hughes <gareth@valinux.com> */ -#pragma ident "%Z%%M% %I% %E% SMI" - #ifndef __RADEON_DRV_H__ #define __RADEON_DRV_H__ @@ -372,7 +370,7 @@ extern int radeon_driver_vblank_wait(drm_device_t *dev, extern int radeon_driver_vblank_wait2(drm_device_t *dev, unsigned int *sequence); extern irqreturn_t radeon_driver_irq_handler(DRM_IRQ_ARGS); -extern void radeon_driver_irq_preinstall(drm_device_t *dev); +extern int radeon_driver_irq_preinstall(drm_device_t *dev); extern void radeon_driver_irq_postinstall(drm_device_t *dev); extern void radeon_driver_irq_uninstall(drm_device_t *dev); extern int radeon_vblank_crtc_get(struct drm_device *dev); diff --git a/usr/src/uts/intel/io/drm/radeon_irq.c b/usr/src/uts/intel/io/drm/radeon_irq.c index e8843b51ed..0c7e2e8a8b 100644 --- a/usr/src/uts/intel/io/drm/radeon_irq.c +++ b/usr/src/uts/intel/io/drm/radeon_irq.c @@ -1,6 +1,6 @@ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ /* radeon_irq.c -- IRQ handling for radeon -*- linux-c -*- */ @@ -35,8 +35,6 @@ * Michel D�zer <michel@daenzer.net> */ -#pragma ident "%Z%%M% %I% %E% SMI" - #include "drmP.h" #include "radeon_drm.h" #include "radeon_drv.h" @@ -296,12 +294,15 @@ static void radeon_enable_interrupt(struct drm_device *dev) /* * drm_dma.h hooks */ -void +int radeon_driver_irq_preinstall(drm_device_t *dev) { drm_radeon_private_t *dev_priv = (drm_radeon_private_t *)dev->dev_private; + if (!dev_priv->mmio) + return (EINVAL); + /* Disable *all* interrupts */ RADEON_WRITE(RADEON_GEN_INT_CNTL, 0); @@ -309,6 +310,8 @@ radeon_driver_irq_preinstall(drm_device_t *dev) (void) radeon_acknowledge_irqs(dev_priv, (RADEON_SW_INT_TEST_ACK | RADEON_CRTC_VBLANK_STAT | RADEON_CRTC2_VBLANK_STAT)); + + return (0); } void |