diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_irq.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 38 |
1 files changed, 20 insertions, 18 deletions
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 4fb8a2f56281..d68328fa175b 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
@@ -139,27 +139,30 @@ static const u32 hpd_bxt[HPD_NUM_PINS] = { | |||
139 | /* | 139 | /* |
140 | * We should clear IMR at preinstall/uninstall, and just check at postinstall. | 140 | * We should clear IMR at preinstall/uninstall, and just check at postinstall. |
141 | */ | 141 | */ |
142 | #define GEN5_ASSERT_IIR_IS_ZERO(reg) do { \ | 142 | static void gen5_assert_iir_is_zero(struct drm_i915_private *dev_priv, u32 reg) |
143 | u32 val = I915_READ(reg); \ | 143 | { |
144 | if (val) { \ | 144 | u32 val = I915_READ(reg); |
145 | WARN(1, "Interrupt register 0x%x is not zero: 0x%08x\n", \ | 145 | |
146 | (reg), val); \ | 146 | if (val == 0) |
147 | I915_WRITE((reg), 0xffffffff); \ | 147 | return; |
148 | POSTING_READ(reg); \ | 148 | |
149 | I915_WRITE((reg), 0xffffffff); \ | 149 | WARN(1, "Interrupt register 0x%x is not zero: 0x%08x\n", |
150 | POSTING_READ(reg); \ | 150 | reg, val); |
151 | } \ | 151 | I915_WRITE(reg, 0xffffffff); |
152 | } while (0) | 152 | POSTING_READ(reg); |
153 | I915_WRITE(reg, 0xffffffff); | ||
154 | POSTING_READ(reg); | ||
155 | } | ||
153 | 156 | ||
154 | #define GEN8_IRQ_INIT_NDX(type, which, imr_val, ier_val) do { \ | 157 | #define GEN8_IRQ_INIT_NDX(type, which, imr_val, ier_val) do { \ |
155 | GEN5_ASSERT_IIR_IS_ZERO(GEN8_##type##_IIR(which)); \ | 158 | gen5_assert_iir_is_zero(dev_priv, GEN8_##type##_IIR(which)); \ |
156 | I915_WRITE(GEN8_##type##_IER(which), (ier_val)); \ | 159 | I915_WRITE(GEN8_##type##_IER(which), (ier_val)); \ |
157 | I915_WRITE(GEN8_##type##_IMR(which), (imr_val)); \ | 160 | I915_WRITE(GEN8_##type##_IMR(which), (imr_val)); \ |
158 | POSTING_READ(GEN8_##type##_IMR(which)); \ | 161 | POSTING_READ(GEN8_##type##_IMR(which)); \ |
159 | } while (0) | 162 | } while (0) |
160 | 163 | ||
161 | #define GEN5_IRQ_INIT(type, imr_val, ier_val) do { \ | 164 | #define GEN5_IRQ_INIT(type, imr_val, ier_val) do { \ |
162 | GEN5_ASSERT_IIR_IS_ZERO(type##IIR); \ | 165 | gen5_assert_iir_is_zero(dev_priv, type##IIR); \ |
163 | I915_WRITE(type##IER, (ier_val)); \ | 166 | I915_WRITE(type##IER, (ier_val)); \ |
164 | I915_WRITE(type##IMR, (imr_val)); \ | 167 | I915_WRITE(type##IMR, (imr_val)); \ |
165 | POSTING_READ(type##IMR); \ | 168 | POSTING_READ(type##IMR); \ |
@@ -707,12 +710,11 @@ static u32 i915_get_vblank_counter(struct drm_device *dev, unsigned int pipe) | |||
707 | return (((high1 << 8) | low) + (pixel >= vbl_start)) & 0xffffff; | 710 | return (((high1 << 8) | low) + (pixel >= vbl_start)) & 0xffffff; |
708 | } | 711 | } |
709 | 712 | ||
710 | static u32 gm45_get_vblank_counter(struct drm_device *dev, unsigned int pipe) | 713 | static u32 g4x_get_vblank_counter(struct drm_device *dev, unsigned int pipe) |
711 | { | 714 | { |
712 | struct drm_i915_private *dev_priv = dev->dev_private; | 715 | struct drm_i915_private *dev_priv = dev->dev_private; |
713 | int reg = PIPE_FRMCOUNT_GM45(pipe); | ||
714 | 716 | ||
715 | return I915_READ(reg); | 717 | return I915_READ(PIPE_FRMCOUNT_G4X(pipe)); |
716 | } | 718 | } |
717 | 719 | ||
718 | /* raw reads, only for fast reads of display block, no need for forcewake etc. */ | 720 | /* raw reads, only for fast reads of display block, no need for forcewake etc. */ |
@@ -3365,7 +3367,7 @@ static void ibx_irq_postinstall(struct drm_device *dev) | |||
3365 | else | 3367 | else |
3366 | mask = SDE_GMBUS_CPT | SDE_AUX_MASK_CPT; | 3368 | mask = SDE_GMBUS_CPT | SDE_AUX_MASK_CPT; |
3367 | 3369 | ||
3368 | GEN5_ASSERT_IIR_IS_ZERO(SDEIIR); | 3370 | gen5_assert_iir_is_zero(dev_priv, SDEIIR); |
3369 | I915_WRITE(SDEIMR, ~mask); | 3371 | I915_WRITE(SDEIMR, ~mask); |
3370 | } | 3372 | } |
3371 | 3373 | ||
@@ -4397,7 +4399,7 @@ void intel_irq_init(struct drm_i915_private *dev_priv) | |||
4397 | dev->driver->get_vblank_counter = i8xx_get_vblank_counter; | 4399 | dev->driver->get_vblank_counter = i8xx_get_vblank_counter; |
4398 | } else if (IS_G4X(dev_priv) || INTEL_INFO(dev_priv)->gen >= 5) { | 4400 | } else if (IS_G4X(dev_priv) || INTEL_INFO(dev_priv)->gen >= 5) { |
4399 | dev->max_vblank_count = 0xffffffff; /* full 32 bit counter */ | 4401 | dev->max_vblank_count = 0xffffffff; /* full 32 bit counter */ |
4400 | dev->driver->get_vblank_counter = gm45_get_vblank_counter; | 4402 | dev->driver->get_vblank_counter = g4x_get_vblank_counter; |
4401 | } else { | 4403 | } else { |
4402 | dev->driver->get_vblank_counter = i915_get_vblank_counter; | 4404 | dev->driver->get_vblank_counter = i915_get_vblank_counter; |
4403 | dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */ | 4405 | dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */ |