summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/common/io/drm/drmP.h2
-rw-r--r--usr/src/uts/common/io/drm/drm_irq.c10
-rw-r--r--usr/src/uts/intel/io/drm/i915_drv.h2
-rw-r--r--usr/src/uts/intel/io/drm/i915_irq.c7
-rw-r--r--usr/src/uts/intel/io/drm/radeon_drv.h6
-rw-r--r--usr/src/uts/intel/io/drm/radeon_irq.c11
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