summaryrefslogtreecommitdiffstats
path: root/sys/dev/pci/drm/drm_irq.c
diff options
context:
space:
mode:
authoroga <oga@openbsd.org>2008-11-25 17:06:03 +0000
committeroga <oga@openbsd.org>2008-11-25 17:06:03 +0000
commit3084979f04b659cc4785fb2d139fb814beca4f7a (patch)
tree106e6d5831b0564dda3fe45bb315b9cf71d598ef /sys/dev/pci/drm/drm_irq.c
parentEven if neither stdin nor stdout are ttys we may still have /dev/tty (diff)
downloadwireguard-openbsd-3084979f04b659cc4785fb2d139fb814beca4f7a.tar.xz
wireguard-openbsd-3084979f04b659cc4785fb2d139fb814beca4f7a.zip
Don't try and enable the vblank handler if irqs are disabled.
This is the source of the radeon issues with seizing at X startup. I didn't see this since my test box in coimbra is a pcie amd64 machine running MP. i.e. it has a slightly less shitty interrupt controller.
Diffstat (limited to 'sys/dev/pci/drm/drm_irq.c')
-rw-r--r--sys/dev/pci/drm/drm_irq.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/sys/dev/pci/drm/drm_irq.c b/sys/dev/pci/drm/drm_irq.c
index 065ce7449d1..64dd726682e 100644
--- a/sys/dev/pci/drm/drm_irq.c
+++ b/sys/dev/pci/drm/drm_irq.c
@@ -235,18 +235,20 @@ drm_vblank_get(struct drm_device *dev, int crtc)
{
int ret = 0;
- DRM_SPINLOCK(&dev->vbl_lock);
+ if (dev_priv->irq_enabled == 0)
+ return (EINVAL);
+ DRM_SPINLOCK(&dev->vbl_lock);
atomic_add(1, &dev->vblank[crtc].vbl_refcount);
if (dev->vblank[crtc].vbl_refcount == 1 &&
dev->vblank[crtc].vbl_enabled == 0) {
- ret = dev->driver->enable_vblank(dev, crtc);
- if (ret) {
- atomic_dec(&dev->vblank[crtc].vbl_refcount);
- } else {
+ if ((ret = dev->driver->enable_vblank(dev, crtc)) == 0) {
dev->vblank[crtc].vbl_enabled = 1;
drm_update_vblank_count(dev, crtc);
+ } else {
+ atomic_dec(&dev->vblank[crtc].vbl_refcount);
}
+
}
DRM_SPINUNLOCK(&dev->vbl_lock);
@@ -256,6 +258,9 @@ drm_vblank_get(struct drm_device *dev, int crtc)
void
drm_vblank_put(struct drm_device *dev, int crtc)
{
+ if (dev->irq_enabled == 0)
+ return;
+
DRM_SPINLOCK(&dev->vbl_lock);
/* Last user schedules interrupt disable */
atomic_dec(&dev->vblank[crtc].vbl_refcount);