summaryrefslogtreecommitdiffstats
path: root/sys/dev/pci/drm/i915_irq.c
diff options
context:
space:
mode:
authorjsg <jsg@openbsd.org>2012-09-25 10:19:46 +0000
committerjsg <jsg@openbsd.org>2012-09-25 10:19:46 +0000
commit0642c20bdec0ed0da7abfa7c344453d06e7c927b (patch)
tree4fdcefadfa310e5793e3e268b02dbaa2c530f0b2 /sys/dev/pci/drm/i915_irq.c
parentRemove unused acpi locking code. (diff)
downloadwireguard-openbsd-0642c20bdec0ed0da7abfa7c344453d06e7c927b.tar.xz
wireguard-openbsd-0642c20bdec0ed0da7abfa7c344453d06e7c927b.zip
Add minimal support for gen7/ivy bridge in inteldrm.
Like gen6/sandy bridge this is enough to manage memory but does not attempt to setup the rings. ok kettenis@
Diffstat (limited to 'sys/dev/pci/drm/i915_irq.c')
-rw-r--r--sys/dev/pci/drm/i915_irq.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/sys/dev/pci/drm/i915_irq.c b/sys/dev/pci/drm/i915_irq.c
index a61eea60a9c..99edae49483 100644
--- a/sys/dev/pci/drm/i915_irq.c
+++ b/sys/dev/pci/drm/i915_irq.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: i915_irq.c,v 1.53 2012/05/19 18:02:53 kettenis Exp $ */
+/* $OpenBSD: i915_irq.c,v 1.54 2012/09/25 10:19:46 jsg Exp $ */
/* i915_irq.c -- IRQ support for the I915 -*- linux-c -*-
*/
/*
@@ -68,7 +68,7 @@ ironlake_enable_graphics_irq(struct inteldrm_softc *dev_priv, u_int32_t mask)
if ((dev_priv->gt_irq_mask_reg & mask) != 0) {
/* XXX imr bullshit */
dev_priv->gt_irq_mask_reg &= ~mask;
- if (IS_GEN6(dev_priv)) {
+ if (IS_GEN6(dev_priv) || IS_GEN7(dev_priv)) {
I915_WRITE(0x20a8, dev_priv->gt_irq_mask_reg);
(void)I915_READ(0x20a8);
} else {
@@ -83,7 +83,7 @@ ironlake_disable_graphics_irq(struct inteldrm_softc *dev_priv, u_int32_t mask)
{
if ((dev_priv->gt_irq_mask_reg & mask) != mask) {
dev_priv->gt_irq_mask_reg |= mask;
- if (IS_GEN6(dev_priv)) {
+ if (IS_GEN6(dev_priv) || IS_GEN7(dev_priv)) {
I915_WRITE(0x20a8, dev_priv->gt_irq_mask_reg);
(void)I915_READ(0x20a8);
} else {
@@ -172,7 +172,7 @@ i915_get_vblank_counter(struct drm_device *dev, int pipe)
/* GM45 just had to be different... */
if (IS_GM45(dev_priv) || IS_G4X(dev_priv) || IS_IRONLAKE(dev_priv) ||
- IS_GEN6(dev_priv)) {
+ IS_GEN6(dev_priv) || IS_GEN7(dev_priv)) {
return (I915_READ(PIPE_FRMCOUNT_GM45(pipe)));
}
@@ -226,7 +226,10 @@ i915_enable_vblank(struct drm_device *dev, int pipe)
return (EINVAL);
mtx_enter(&dev_priv->user_irq_lock);
- if (HAS_PCH_SPLIT(dev_priv))
+ if (IS_GEN7(dev_priv))
+ ironlake_enable_display_irq(dev_priv,
+ DE_PIPEA_VBLANK_IVB << (5 * pipe));
+ else if (HAS_PCH_SPLIT(dev_priv))
ironlake_enable_display_irq(dev_priv, (pipe == 0) ?
DE_PIPEA_VBLANK : DE_PIPEB_VBLANK);
else
@@ -244,7 +247,10 @@ i915_disable_vblank(struct drm_device *dev, int pipe)
struct inteldrm_softc *dev_priv = dev->dev_private;
mtx_enter(&dev_priv->user_irq_lock);
- if (HAS_PCH_SPLIT(dev_priv))
+ if (IS_GEN7(dev_priv))
+ ironlake_disable_display_irq(dev_priv,
+ DE_PIPEA_VBLANK_IVB << (pipe * 5));
+ else if (HAS_PCH_SPLIT(dev_priv))
ironlake_disable_display_irq(dev_priv, (pipe == 0) ?
DE_PIPEA_VBLANK : DE_PIPEB_VBLANK);
else
@@ -262,7 +268,8 @@ i915_driver_irq_install(struct drm_device *dev)
struct inteldrm_softc *dev_priv = dev->dev_private;
dev->vblank->vb_max = 0xffffff; /* only 24 bits of frame count */
- if (IS_G4X(dev_priv) || IS_IRONLAKE(dev_priv) || IS_GEN6(dev_priv))
+ if (IS_G4X(dev_priv) || IS_IRONLAKE(dev_priv) || IS_GEN6(dev_priv) ||
+ IS_GEN7(dev_priv))
dev->vblank->vb_max = 0xffffffff;
I915_WRITE(HWSTAM, 0xeffe);