forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-06 08f87f769b595151be1afeff53e144f543faa614
kernel/drivers/gpu/drm/i915/i915_irq.c
....@@ -28,14 +28,29 @@
2828
2929 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
3030
31
-#include <linux/sysrq.h>
32
-#include <linux/slab.h>
3331 #include <linux/circ_buf.h>
34
-#include <drm/drmP.h>
35
-#include <drm/i915_drm.h>
32
+#include <linux/slab.h>
33
+#include <linux/sysrq.h>
34
+
35
+#include <drm/drm_drv.h>
36
+#include <drm/drm_irq.h>
37
+
38
+#include "display/intel_display_types.h"
39
+#include "display/intel_fifo_underrun.h"
40
+#include "display/intel_hotplug.h"
41
+#include "display/intel_lpe_audio.h"
42
+#include "display/intel_psr.h"
43
+
44
+#include "gt/intel_breadcrumbs.h"
45
+#include "gt/intel_gt.h"
46
+#include "gt/intel_gt_irq.h"
47
+#include "gt/intel_gt_pm_irq.h"
48
+#include "gt/intel_rps.h"
49
+
3650 #include "i915_drv.h"
51
+#include "i915_irq.h"
3752 #include "i915_trace.h"
38
-#include "intel_drv.h"
53
+#include "intel_pm.h"
3954
4055 /**
4156 * DOC: interrupt handling
....@@ -44,6 +59,8 @@
4459 * interrupt handling support. There's a lot more functionality in i915_irq.c
4560 * and related files, but that will be described in separate chapters.
4661 */
62
+
63
+typedef bool (*long_pulse_detect_func)(enum hpd_pin pin, u32 val);
4764
4865 static const u32 hpd_ilk[HPD_NUM_PINS] = {
4966 [HPD_PORT_A] = DE_DP_A_HOTPLUG,
....@@ -62,7 +79,7 @@
6279 [HPD_SDVO_B] = SDE_SDVOB_HOTPLUG,
6380 [HPD_PORT_B] = SDE_PORTB_HOTPLUG,
6481 [HPD_PORT_C] = SDE_PORTC_HOTPLUG,
65
- [HPD_PORT_D] = SDE_PORTD_HOTPLUG
82
+ [HPD_PORT_D] = SDE_PORTD_HOTPLUG,
6683 };
6784
6885 static const u32 hpd_cpt[HPD_NUM_PINS] = {
....@@ -70,7 +87,7 @@
7087 [HPD_SDVO_B] = SDE_SDVOB_HOTPLUG_CPT,
7188 [HPD_PORT_B] = SDE_PORTB_HOTPLUG_CPT,
7289 [HPD_PORT_C] = SDE_PORTC_HOTPLUG_CPT,
73
- [HPD_PORT_D] = SDE_PORTD_HOTPLUG_CPT
90
+ [HPD_PORT_D] = SDE_PORTD_HOTPLUG_CPT,
7491 };
7592
7693 static const u32 hpd_spt[HPD_NUM_PINS] = {
....@@ -78,7 +95,7 @@
7895 [HPD_PORT_B] = SDE_PORTB_HOTPLUG_CPT,
7996 [HPD_PORT_C] = SDE_PORTC_HOTPLUG_CPT,
8097 [HPD_PORT_D] = SDE_PORTD_HOTPLUG_CPT,
81
- [HPD_PORT_E] = SDE_PORTE_HOTPLUG_SPT
98
+ [HPD_PORT_E] = SDE_PORTE_HOTPLUG_SPT,
8299 };
83100
84101 static const u32 hpd_mask_i915[HPD_NUM_PINS] = {
....@@ -87,7 +104,7 @@
87104 [HPD_SDVO_C] = SDVOC_HOTPLUG_INT_EN,
88105 [HPD_PORT_B] = PORTB_HOTPLUG_INT_EN,
89106 [HPD_PORT_C] = PORTC_HOTPLUG_INT_EN,
90
- [HPD_PORT_D] = PORTD_HOTPLUG_INT_EN
107
+ [HPD_PORT_D] = PORTD_HOTPLUG_INT_EN,
91108 };
92109
93110 static const u32 hpd_status_g4x[HPD_NUM_PINS] = {
....@@ -96,7 +113,7 @@
96113 [HPD_SDVO_C] = SDVOC_HOTPLUG_INT_STATUS_G4X,
97114 [HPD_PORT_B] = PORTB_HOTPLUG_INT_STATUS,
98115 [HPD_PORT_C] = PORTC_HOTPLUG_INT_STATUS,
99
- [HPD_PORT_D] = PORTD_HOTPLUG_INT_STATUS
116
+ [HPD_PORT_D] = PORTD_HOTPLUG_INT_STATUS,
100117 };
101118
102119 static const u32 hpd_status_i915[HPD_NUM_PINS] = {
....@@ -105,132 +122,180 @@
105122 [HPD_SDVO_C] = SDVOC_HOTPLUG_INT_STATUS_I915,
106123 [HPD_PORT_B] = PORTB_HOTPLUG_INT_STATUS,
107124 [HPD_PORT_C] = PORTC_HOTPLUG_INT_STATUS,
108
- [HPD_PORT_D] = PORTD_HOTPLUG_INT_STATUS
125
+ [HPD_PORT_D] = PORTD_HOTPLUG_INT_STATUS,
109126 };
110127
111
-/* BXT hpd list */
112128 static const u32 hpd_bxt[HPD_NUM_PINS] = {
113129 [HPD_PORT_A] = BXT_DE_PORT_HP_DDIA,
114130 [HPD_PORT_B] = BXT_DE_PORT_HP_DDIB,
115
- [HPD_PORT_C] = BXT_DE_PORT_HP_DDIC
131
+ [HPD_PORT_C] = BXT_DE_PORT_HP_DDIC,
116132 };
117133
118134 static const u32 hpd_gen11[HPD_NUM_PINS] = {
119
- [HPD_PORT_C] = GEN11_TC1_HOTPLUG | GEN11_TBT1_HOTPLUG,
120
- [HPD_PORT_D] = GEN11_TC2_HOTPLUG | GEN11_TBT2_HOTPLUG,
121
- [HPD_PORT_E] = GEN11_TC3_HOTPLUG | GEN11_TBT3_HOTPLUG,
122
- [HPD_PORT_F] = GEN11_TC4_HOTPLUG | GEN11_TBT4_HOTPLUG
135
+ [HPD_PORT_TC1] = GEN11_TC_HOTPLUG(PORT_TC1) | GEN11_TBT_HOTPLUG(PORT_TC1),
136
+ [HPD_PORT_TC2] = GEN11_TC_HOTPLUG(PORT_TC2) | GEN11_TBT_HOTPLUG(PORT_TC2),
137
+ [HPD_PORT_TC3] = GEN11_TC_HOTPLUG(PORT_TC3) | GEN11_TBT_HOTPLUG(PORT_TC3),
138
+ [HPD_PORT_TC4] = GEN11_TC_HOTPLUG(PORT_TC4) | GEN11_TBT_HOTPLUG(PORT_TC4),
139
+ [HPD_PORT_TC5] = GEN11_TC_HOTPLUG(PORT_TC5) | GEN11_TBT_HOTPLUG(PORT_TC5),
140
+ [HPD_PORT_TC6] = GEN11_TC_HOTPLUG(PORT_TC6) | GEN11_TBT_HOTPLUG(PORT_TC6),
123141 };
124142
125143 static const u32 hpd_icp[HPD_NUM_PINS] = {
126
- [HPD_PORT_A] = SDE_DDIA_HOTPLUG_ICP,
127
- [HPD_PORT_B] = SDE_DDIB_HOTPLUG_ICP,
128
- [HPD_PORT_C] = SDE_TC1_HOTPLUG_ICP,
129
- [HPD_PORT_D] = SDE_TC2_HOTPLUG_ICP,
130
- [HPD_PORT_E] = SDE_TC3_HOTPLUG_ICP,
131
- [HPD_PORT_F] = SDE_TC4_HOTPLUG_ICP
144
+ [HPD_PORT_A] = SDE_DDI_HOTPLUG_ICP(PORT_A),
145
+ [HPD_PORT_B] = SDE_DDI_HOTPLUG_ICP(PORT_B),
146
+ [HPD_PORT_C] = SDE_DDI_HOTPLUG_ICP(PORT_C),
147
+ [HPD_PORT_TC1] = SDE_TC_HOTPLUG_ICP(PORT_TC1),
148
+ [HPD_PORT_TC2] = SDE_TC_HOTPLUG_ICP(PORT_TC2),
149
+ [HPD_PORT_TC3] = SDE_TC_HOTPLUG_ICP(PORT_TC3),
150
+ [HPD_PORT_TC4] = SDE_TC_HOTPLUG_ICP(PORT_TC4),
151
+ [HPD_PORT_TC5] = SDE_TC_HOTPLUG_ICP(PORT_TC5),
152
+ [HPD_PORT_TC6] = SDE_TC_HOTPLUG_ICP(PORT_TC6),
132153 };
133154
134
-/* IIR can theoretically queue up two events. Be paranoid. */
135
-#define GEN8_IRQ_RESET_NDX(type, which) do { \
136
- I915_WRITE(GEN8_##type##_IMR(which), 0xffffffff); \
137
- POSTING_READ(GEN8_##type##_IMR(which)); \
138
- I915_WRITE(GEN8_##type##_IER(which), 0); \
139
- I915_WRITE(GEN8_##type##_IIR(which), 0xffffffff); \
140
- POSTING_READ(GEN8_##type##_IIR(which)); \
141
- I915_WRITE(GEN8_##type##_IIR(which), 0xffffffff); \
142
- POSTING_READ(GEN8_##type##_IIR(which)); \
143
-} while (0)
155
+static void intel_hpd_init_pins(struct drm_i915_private *dev_priv)
156
+{
157
+ struct i915_hotplug *hpd = &dev_priv->hotplug;
144158
145
-#define GEN3_IRQ_RESET(type) do { \
146
- I915_WRITE(type##IMR, 0xffffffff); \
147
- POSTING_READ(type##IMR); \
148
- I915_WRITE(type##IER, 0); \
149
- I915_WRITE(type##IIR, 0xffffffff); \
150
- POSTING_READ(type##IIR); \
151
- I915_WRITE(type##IIR, 0xffffffff); \
152
- POSTING_READ(type##IIR); \
153
-} while (0)
159
+ if (HAS_GMCH(dev_priv)) {
160
+ if (IS_G4X(dev_priv) || IS_VALLEYVIEW(dev_priv) ||
161
+ IS_CHERRYVIEW(dev_priv))
162
+ hpd->hpd = hpd_status_g4x;
163
+ else
164
+ hpd->hpd = hpd_status_i915;
165
+ return;
166
+ }
154167
155
-#define GEN2_IRQ_RESET(type) do { \
156
- I915_WRITE16(type##IMR, 0xffff); \
157
- POSTING_READ16(type##IMR); \
158
- I915_WRITE16(type##IER, 0); \
159
- I915_WRITE16(type##IIR, 0xffff); \
160
- POSTING_READ16(type##IIR); \
161
- I915_WRITE16(type##IIR, 0xffff); \
162
- POSTING_READ16(type##IIR); \
163
-} while (0)
168
+ if (INTEL_GEN(dev_priv) >= 11)
169
+ hpd->hpd = hpd_gen11;
170
+ else if (IS_GEN9_LP(dev_priv))
171
+ hpd->hpd = hpd_bxt;
172
+ else if (INTEL_GEN(dev_priv) >= 8)
173
+ hpd->hpd = hpd_bdw;
174
+ else if (INTEL_GEN(dev_priv) >= 7)
175
+ hpd->hpd = hpd_ivb;
176
+ else
177
+ hpd->hpd = hpd_ilk;
178
+
179
+ if (!HAS_PCH_SPLIT(dev_priv) || HAS_PCH_NOP(dev_priv))
180
+ return;
181
+
182
+ if (HAS_PCH_TGP(dev_priv) || HAS_PCH_JSP(dev_priv) ||
183
+ HAS_PCH_ICP(dev_priv) || HAS_PCH_MCC(dev_priv))
184
+ hpd->pch_hpd = hpd_icp;
185
+ else if (HAS_PCH_CNP(dev_priv) || HAS_PCH_SPT(dev_priv))
186
+ hpd->pch_hpd = hpd_spt;
187
+ else if (HAS_PCH_LPT(dev_priv) || HAS_PCH_CPT(dev_priv))
188
+ hpd->pch_hpd = hpd_cpt;
189
+ else if (HAS_PCH_IBX(dev_priv))
190
+ hpd->pch_hpd = hpd_ibx;
191
+ else
192
+ MISSING_CASE(INTEL_PCH_TYPE(dev_priv));
193
+}
194
+
195
+static void
196
+intel_handle_vblank(struct drm_i915_private *dev_priv, enum pipe pipe)
197
+{
198
+ struct intel_crtc *crtc = intel_get_crtc_for_pipe(dev_priv, pipe);
199
+
200
+ drm_crtc_handle_vblank(&crtc->base);
201
+}
202
+
203
+void gen3_irq_reset(struct intel_uncore *uncore, i915_reg_t imr,
204
+ i915_reg_t iir, i915_reg_t ier)
205
+{
206
+ intel_uncore_write(uncore, imr, 0xffffffff);
207
+ intel_uncore_posting_read(uncore, imr);
208
+
209
+ intel_uncore_write(uncore, ier, 0);
210
+
211
+ /* IIR can theoretically queue up two events. Be paranoid. */
212
+ intel_uncore_write(uncore, iir, 0xffffffff);
213
+ intel_uncore_posting_read(uncore, iir);
214
+ intel_uncore_write(uncore, iir, 0xffffffff);
215
+ intel_uncore_posting_read(uncore, iir);
216
+}
217
+
218
+void gen2_irq_reset(struct intel_uncore *uncore)
219
+{
220
+ intel_uncore_write16(uncore, GEN2_IMR, 0xffff);
221
+ intel_uncore_posting_read16(uncore, GEN2_IMR);
222
+
223
+ intel_uncore_write16(uncore, GEN2_IER, 0);
224
+
225
+ /* IIR can theoretically queue up two events. Be paranoid. */
226
+ intel_uncore_write16(uncore, GEN2_IIR, 0xffff);
227
+ intel_uncore_posting_read16(uncore, GEN2_IIR);
228
+ intel_uncore_write16(uncore, GEN2_IIR, 0xffff);
229
+ intel_uncore_posting_read16(uncore, GEN2_IIR);
230
+}
164231
165232 /*
166233 * We should clear IMR at preinstall/uninstall, and just check at postinstall.
167234 */
168
-static void gen3_assert_iir_is_zero(struct drm_i915_private *dev_priv,
169
- i915_reg_t reg)
235
+static void gen3_assert_iir_is_zero(struct intel_uncore *uncore, i915_reg_t reg)
170236 {
171
- u32 val = I915_READ(reg);
237
+ u32 val = intel_uncore_read(uncore, reg);
172238
173239 if (val == 0)
174240 return;
175241
176
- WARN(1, "Interrupt register 0x%x is not zero: 0x%08x\n",
177
- i915_mmio_reg_offset(reg), val);
178
- I915_WRITE(reg, 0xffffffff);
179
- POSTING_READ(reg);
180
- I915_WRITE(reg, 0xffffffff);
181
- POSTING_READ(reg);
242
+ drm_WARN(&uncore->i915->drm, 1,
243
+ "Interrupt register 0x%x is not zero: 0x%08x\n",
244
+ i915_mmio_reg_offset(reg), val);
245
+ intel_uncore_write(uncore, reg, 0xffffffff);
246
+ intel_uncore_posting_read(uncore, reg);
247
+ intel_uncore_write(uncore, reg, 0xffffffff);
248
+ intel_uncore_posting_read(uncore, reg);
182249 }
183250
184
-static void gen2_assert_iir_is_zero(struct drm_i915_private *dev_priv,
185
- i915_reg_t reg)
251
+static void gen2_assert_iir_is_zero(struct intel_uncore *uncore)
186252 {
187
- u16 val = I915_READ16(reg);
253
+ u16 val = intel_uncore_read16(uncore, GEN2_IIR);
188254
189255 if (val == 0)
190256 return;
191257
192
- WARN(1, "Interrupt register 0x%x is not zero: 0x%08x\n",
193
- i915_mmio_reg_offset(reg), val);
194
- I915_WRITE16(reg, 0xffff);
195
- POSTING_READ16(reg);
196
- I915_WRITE16(reg, 0xffff);
197
- POSTING_READ16(reg);
258
+ drm_WARN(&uncore->i915->drm, 1,
259
+ "Interrupt register 0x%x is not zero: 0x%08x\n",
260
+ i915_mmio_reg_offset(GEN2_IIR), val);
261
+ intel_uncore_write16(uncore, GEN2_IIR, 0xffff);
262
+ intel_uncore_posting_read16(uncore, GEN2_IIR);
263
+ intel_uncore_write16(uncore, GEN2_IIR, 0xffff);
264
+ intel_uncore_posting_read16(uncore, GEN2_IIR);
198265 }
199266
200
-#define GEN8_IRQ_INIT_NDX(type, which, imr_val, ier_val) do { \
201
- gen3_assert_iir_is_zero(dev_priv, GEN8_##type##_IIR(which)); \
202
- I915_WRITE(GEN8_##type##_IER(which), (ier_val)); \
203
- I915_WRITE(GEN8_##type##_IMR(which), (imr_val)); \
204
- POSTING_READ(GEN8_##type##_IMR(which)); \
205
-} while (0)
267
+void gen3_irq_init(struct intel_uncore *uncore,
268
+ i915_reg_t imr, u32 imr_val,
269
+ i915_reg_t ier, u32 ier_val,
270
+ i915_reg_t iir)
271
+{
272
+ gen3_assert_iir_is_zero(uncore, iir);
206273
207
-#define GEN3_IRQ_INIT(type, imr_val, ier_val) do { \
208
- gen3_assert_iir_is_zero(dev_priv, type##IIR); \
209
- I915_WRITE(type##IER, (ier_val)); \
210
- I915_WRITE(type##IMR, (imr_val)); \
211
- POSTING_READ(type##IMR); \
212
-} while (0)
274
+ intel_uncore_write(uncore, ier, ier_val);
275
+ intel_uncore_write(uncore, imr, imr_val);
276
+ intel_uncore_posting_read(uncore, imr);
277
+}
213278
214
-#define GEN2_IRQ_INIT(type, imr_val, ier_val) do { \
215
- gen2_assert_iir_is_zero(dev_priv, type##IIR); \
216
- I915_WRITE16(type##IER, (ier_val)); \
217
- I915_WRITE16(type##IMR, (imr_val)); \
218
- POSTING_READ16(type##IMR); \
219
-} while (0)
279
+void gen2_irq_init(struct intel_uncore *uncore,
280
+ u32 imr_val, u32 ier_val)
281
+{
282
+ gen2_assert_iir_is_zero(uncore);
220283
221
-static void gen6_rps_irq_handler(struct drm_i915_private *dev_priv, u32 pm_iir);
222
-static void gen9_guc_irq_handler(struct drm_i915_private *dev_priv, u32 pm_iir);
284
+ intel_uncore_write16(uncore, GEN2_IER, ier_val);
285
+ intel_uncore_write16(uncore, GEN2_IMR, imr_val);
286
+ intel_uncore_posting_read16(uncore, GEN2_IMR);
287
+}
223288
224289 /* For display hotplug interrupt */
225290 static inline void
226291 i915_hotplug_interrupt_update_locked(struct drm_i915_private *dev_priv,
227
- uint32_t mask,
228
- uint32_t bits)
292
+ u32 mask,
293
+ u32 bits)
229294 {
230
- uint32_t val;
295
+ u32 val;
231296
232297 lockdep_assert_held(&dev_priv->irq_lock);
233
- WARN_ON(bits & ~mask);
298
+ drm_WARN_ON(&dev_priv->drm, bits & ~mask);
234299
235300 val = I915_READ(PORT_HOTPLUG_EN);
236301 val &= ~mask;
....@@ -251,47 +316,12 @@
251316 * version is also available.
252317 */
253318 void i915_hotplug_interrupt_update(struct drm_i915_private *dev_priv,
254
- uint32_t mask,
255
- uint32_t bits)
319
+ u32 mask,
320
+ u32 bits)
256321 {
257322 spin_lock_irq(&dev_priv->irq_lock);
258323 i915_hotplug_interrupt_update_locked(dev_priv, mask, bits);
259324 spin_unlock_irq(&dev_priv->irq_lock);
260
-}
261
-
262
-static u32
263
-gen11_gt_engine_identity(struct drm_i915_private * const i915,
264
- const unsigned int bank, const unsigned int bit);
265
-
266
-static bool gen11_reset_one_iir(struct drm_i915_private * const i915,
267
- const unsigned int bank,
268
- const unsigned int bit)
269
-{
270
- void __iomem * const regs = i915->regs;
271
- u32 dw;
272
-
273
- lockdep_assert_held(&i915->irq_lock);
274
-
275
- dw = raw_reg_read(regs, GEN11_GT_INTR_DW(bank));
276
- if (dw & BIT(bit)) {
277
- /*
278
- * According to the BSpec, DW_IIR bits cannot be cleared without
279
- * first servicing the Selector & Shared IIR registers.
280
- */
281
- gen11_gt_engine_identity(i915, bank, bit);
282
-
283
- /*
284
- * We locked GT INT DW by reading it. If we want to (try
285
- * to) recover from this succesfully, we need to clear
286
- * our bit, otherwise we are locking the register for
287
- * everybody.
288
- */
289
- raw_reg_write(regs, GEN11_GT_INTR_DW(bank), BIT(bit));
290
-
291
- return true;
292
- }
293
-
294
- return false;
295325 }
296326
297327 /**
....@@ -301,16 +331,16 @@
301331 * @enabled_irq_mask: mask of interrupt bits to enable
302332 */
303333 void ilk_update_display_irq(struct drm_i915_private *dev_priv,
304
- uint32_t interrupt_mask,
305
- uint32_t enabled_irq_mask)
334
+ u32 interrupt_mask,
335
+ u32 enabled_irq_mask)
306336 {
307
- uint32_t new_val;
337
+ u32 new_val;
308338
309339 lockdep_assert_held(&dev_priv->irq_lock);
310340
311
- WARN_ON(enabled_irq_mask & ~interrupt_mask);
341
+ drm_WARN_ON(&dev_priv->drm, enabled_irq_mask & ~interrupt_mask);
312342
313
- if (WARN_ON(!intel_irqs_enabled(dev_priv)))
343
+ if (drm_WARN_ON(&dev_priv->drm, !intel_irqs_enabled(dev_priv)))
314344 return;
315345
316346 new_val = dev_priv->irq_mask;
....@@ -325,270 +355,23 @@
325355 }
326356
327357 /**
328
- * ilk_update_gt_irq - update GTIMR
329
- * @dev_priv: driver private
330
- * @interrupt_mask: mask of interrupt bits to update
331
- * @enabled_irq_mask: mask of interrupt bits to enable
332
- */
333
-static void ilk_update_gt_irq(struct drm_i915_private *dev_priv,
334
- uint32_t interrupt_mask,
335
- uint32_t enabled_irq_mask)
336
-{
337
- lockdep_assert_held(&dev_priv->irq_lock);
338
-
339
- WARN_ON(enabled_irq_mask & ~interrupt_mask);
340
-
341
- if (WARN_ON(!intel_irqs_enabled(dev_priv)))
342
- return;
343
-
344
- dev_priv->gt_irq_mask &= ~interrupt_mask;
345
- dev_priv->gt_irq_mask |= (~enabled_irq_mask & interrupt_mask);
346
- I915_WRITE(GTIMR, dev_priv->gt_irq_mask);
347
-}
348
-
349
-void gen5_enable_gt_irq(struct drm_i915_private *dev_priv, uint32_t mask)
350
-{
351
- ilk_update_gt_irq(dev_priv, mask, mask);
352
- POSTING_READ_FW(GTIMR);
353
-}
354
-
355
-void gen5_disable_gt_irq(struct drm_i915_private *dev_priv, uint32_t mask)
356
-{
357
- ilk_update_gt_irq(dev_priv, mask, 0);
358
-}
359
-
360
-static i915_reg_t gen6_pm_iir(struct drm_i915_private *dev_priv)
361
-{
362
- WARN_ON_ONCE(INTEL_GEN(dev_priv) >= 11);
363
-
364
- return INTEL_GEN(dev_priv) >= 8 ? GEN8_GT_IIR(2) : GEN6_PMIIR;
365
-}
366
-
367
-static i915_reg_t gen6_pm_imr(struct drm_i915_private *dev_priv)
368
-{
369
- if (INTEL_GEN(dev_priv) >= 11)
370
- return GEN11_GPM_WGBOXPERF_INTR_MASK;
371
- else if (INTEL_GEN(dev_priv) >= 8)
372
- return GEN8_GT_IMR(2);
373
- else
374
- return GEN6_PMIMR;
375
-}
376
-
377
-static i915_reg_t gen6_pm_ier(struct drm_i915_private *dev_priv)
378
-{
379
- if (INTEL_GEN(dev_priv) >= 11)
380
- return GEN11_GPM_WGBOXPERF_INTR_ENABLE;
381
- else if (INTEL_GEN(dev_priv) >= 8)
382
- return GEN8_GT_IER(2);
383
- else
384
- return GEN6_PMIER;
385
-}
386
-
387
-/**
388
- * snb_update_pm_irq - update GEN6_PMIMR
389
- * @dev_priv: driver private
390
- * @interrupt_mask: mask of interrupt bits to update
391
- * @enabled_irq_mask: mask of interrupt bits to enable
392
- */
393
-static void snb_update_pm_irq(struct drm_i915_private *dev_priv,
394
- uint32_t interrupt_mask,
395
- uint32_t enabled_irq_mask)
396
-{
397
- uint32_t new_val;
398
-
399
- WARN_ON(enabled_irq_mask & ~interrupt_mask);
400
-
401
- lockdep_assert_held(&dev_priv->irq_lock);
402
-
403
- new_val = dev_priv->pm_imr;
404
- new_val &= ~interrupt_mask;
405
- new_val |= (~enabled_irq_mask & interrupt_mask);
406
-
407
- if (new_val != dev_priv->pm_imr) {
408
- dev_priv->pm_imr = new_val;
409
- I915_WRITE(gen6_pm_imr(dev_priv), dev_priv->pm_imr);
410
- POSTING_READ(gen6_pm_imr(dev_priv));
411
- }
412
-}
413
-
414
-void gen6_unmask_pm_irq(struct drm_i915_private *dev_priv, u32 mask)
415
-{
416
- if (WARN_ON(!intel_irqs_enabled(dev_priv)))
417
- return;
418
-
419
- snb_update_pm_irq(dev_priv, mask, mask);
420
-}
421
-
422
-static void __gen6_mask_pm_irq(struct drm_i915_private *dev_priv, u32 mask)
423
-{
424
- snb_update_pm_irq(dev_priv, mask, 0);
425
-}
426
-
427
-void gen6_mask_pm_irq(struct drm_i915_private *dev_priv, u32 mask)
428
-{
429
- if (WARN_ON(!intel_irqs_enabled(dev_priv)))
430
- return;
431
-
432
- __gen6_mask_pm_irq(dev_priv, mask);
433
-}
434
-
435
-static void gen6_reset_pm_iir(struct drm_i915_private *dev_priv, u32 reset_mask)
436
-{
437
- i915_reg_t reg = gen6_pm_iir(dev_priv);
438
-
439
- lockdep_assert_held(&dev_priv->irq_lock);
440
-
441
- I915_WRITE(reg, reset_mask);
442
- I915_WRITE(reg, reset_mask);
443
- POSTING_READ(reg);
444
-}
445
-
446
-static void gen6_enable_pm_irq(struct drm_i915_private *dev_priv, u32 enable_mask)
447
-{
448
- lockdep_assert_held(&dev_priv->irq_lock);
449
-
450
- dev_priv->pm_ier |= enable_mask;
451
- I915_WRITE(gen6_pm_ier(dev_priv), dev_priv->pm_ier);
452
- gen6_unmask_pm_irq(dev_priv, enable_mask);
453
- /* unmask_pm_irq provides an implicit barrier (POSTING_READ) */
454
-}
455
-
456
-static void gen6_disable_pm_irq(struct drm_i915_private *dev_priv, u32 disable_mask)
457
-{
458
- lockdep_assert_held(&dev_priv->irq_lock);
459
-
460
- dev_priv->pm_ier &= ~disable_mask;
461
- __gen6_mask_pm_irq(dev_priv, disable_mask);
462
- I915_WRITE(gen6_pm_ier(dev_priv), dev_priv->pm_ier);
463
- /* though a barrier is missing here, but don't really need a one */
464
-}
465
-
466
-void gen11_reset_rps_interrupts(struct drm_i915_private *dev_priv)
467
-{
468
- spin_lock_irq(&dev_priv->irq_lock);
469
-
470
- while (gen11_reset_one_iir(dev_priv, 0, GEN11_GTPM))
471
- ;
472
-
473
- dev_priv->gt_pm.rps.pm_iir = 0;
474
-
475
- spin_unlock_irq(&dev_priv->irq_lock);
476
-}
477
-
478
-void gen6_reset_rps_interrupts(struct drm_i915_private *dev_priv)
479
-{
480
- spin_lock_irq(&dev_priv->irq_lock);
481
- gen6_reset_pm_iir(dev_priv, dev_priv->pm_rps_events);
482
- dev_priv->gt_pm.rps.pm_iir = 0;
483
- spin_unlock_irq(&dev_priv->irq_lock);
484
-}
485
-
486
-void gen6_enable_rps_interrupts(struct drm_i915_private *dev_priv)
487
-{
488
- struct intel_rps *rps = &dev_priv->gt_pm.rps;
489
-
490
- if (READ_ONCE(rps->interrupts_enabled))
491
- return;
492
-
493
- spin_lock_irq(&dev_priv->irq_lock);
494
- WARN_ON_ONCE(rps->pm_iir);
495
-
496
- if (INTEL_GEN(dev_priv) >= 11)
497
- WARN_ON_ONCE(gen11_reset_one_iir(dev_priv, 0, GEN11_GTPM));
498
- else
499
- WARN_ON_ONCE(I915_READ(gen6_pm_iir(dev_priv)) & dev_priv->pm_rps_events);
500
-
501
- rps->interrupts_enabled = true;
502
- gen6_enable_pm_irq(dev_priv, dev_priv->pm_rps_events);
503
-
504
- spin_unlock_irq(&dev_priv->irq_lock);
505
-}
506
-
507
-void gen6_disable_rps_interrupts(struct drm_i915_private *dev_priv)
508
-{
509
- struct intel_rps *rps = &dev_priv->gt_pm.rps;
510
-
511
- if (!READ_ONCE(rps->interrupts_enabled))
512
- return;
513
-
514
- spin_lock_irq(&dev_priv->irq_lock);
515
- rps->interrupts_enabled = false;
516
-
517
- I915_WRITE(GEN6_PMINTRMSK, gen6_sanitize_rps_pm_mask(dev_priv, ~0u));
518
-
519
- gen6_disable_pm_irq(dev_priv, dev_priv->pm_rps_events);
520
-
521
- spin_unlock_irq(&dev_priv->irq_lock);
522
- synchronize_irq(dev_priv->drm.irq);
523
-
524
- /* Now that we will not be generating any more work, flush any
525
- * outstanding tasks. As we are called on the RPS idle path,
526
- * we will reset the GPU to minimum frequencies, so the current
527
- * state of the worker can be discarded.
528
- */
529
- cancel_work_sync(&rps->work);
530
- if (INTEL_GEN(dev_priv) >= 11)
531
- gen11_reset_rps_interrupts(dev_priv);
532
- else
533
- gen6_reset_rps_interrupts(dev_priv);
534
-}
535
-
536
-void gen9_reset_guc_interrupts(struct drm_i915_private *dev_priv)
537
-{
538
- assert_rpm_wakelock_held(dev_priv);
539
-
540
- spin_lock_irq(&dev_priv->irq_lock);
541
- gen6_reset_pm_iir(dev_priv, dev_priv->pm_guc_events);
542
- spin_unlock_irq(&dev_priv->irq_lock);
543
-}
544
-
545
-void gen9_enable_guc_interrupts(struct drm_i915_private *dev_priv)
546
-{
547
- assert_rpm_wakelock_held(dev_priv);
548
-
549
- spin_lock_irq(&dev_priv->irq_lock);
550
- if (!dev_priv->guc.interrupts_enabled) {
551
- WARN_ON_ONCE(I915_READ(gen6_pm_iir(dev_priv)) &
552
- dev_priv->pm_guc_events);
553
- dev_priv->guc.interrupts_enabled = true;
554
- gen6_enable_pm_irq(dev_priv, dev_priv->pm_guc_events);
555
- }
556
- spin_unlock_irq(&dev_priv->irq_lock);
557
-}
558
-
559
-void gen9_disable_guc_interrupts(struct drm_i915_private *dev_priv)
560
-{
561
- assert_rpm_wakelock_held(dev_priv);
562
-
563
- spin_lock_irq(&dev_priv->irq_lock);
564
- dev_priv->guc.interrupts_enabled = false;
565
-
566
- gen6_disable_pm_irq(dev_priv, dev_priv->pm_guc_events);
567
-
568
- spin_unlock_irq(&dev_priv->irq_lock);
569
- synchronize_irq(dev_priv->drm.irq);
570
-
571
- gen9_reset_guc_interrupts(dev_priv);
572
-}
573
-
574
-/**
575358 * bdw_update_port_irq - update DE port interrupt
576359 * @dev_priv: driver private
577360 * @interrupt_mask: mask of interrupt bits to update
578361 * @enabled_irq_mask: mask of interrupt bits to enable
579362 */
580363 static void bdw_update_port_irq(struct drm_i915_private *dev_priv,
581
- uint32_t interrupt_mask,
582
- uint32_t enabled_irq_mask)
364
+ u32 interrupt_mask,
365
+ u32 enabled_irq_mask)
583366 {
584
- uint32_t new_val;
585
- uint32_t old_val;
367
+ u32 new_val;
368
+ u32 old_val;
586369
587370 lockdep_assert_held(&dev_priv->irq_lock);
588371
589
- WARN_ON(enabled_irq_mask & ~interrupt_mask);
372
+ drm_WARN_ON(&dev_priv->drm, enabled_irq_mask & ~interrupt_mask);
590373
591
- if (WARN_ON(!intel_irqs_enabled(dev_priv)))
374
+ if (drm_WARN_ON(&dev_priv->drm, !intel_irqs_enabled(dev_priv)))
592375 return;
593376
594377 old_val = I915_READ(GEN8_DE_PORT_IMR);
....@@ -612,16 +395,16 @@
612395 */
613396 void bdw_update_pipe_irq(struct drm_i915_private *dev_priv,
614397 enum pipe pipe,
615
- uint32_t interrupt_mask,
616
- uint32_t enabled_irq_mask)
398
+ u32 interrupt_mask,
399
+ u32 enabled_irq_mask)
617400 {
618
- uint32_t new_val;
401
+ u32 new_val;
619402
620403 lockdep_assert_held(&dev_priv->irq_lock);
621404
622
- WARN_ON(enabled_irq_mask & ~interrupt_mask);
405
+ drm_WARN_ON(&dev_priv->drm, enabled_irq_mask & ~interrupt_mask);
623406
624
- if (WARN_ON(!intel_irqs_enabled(dev_priv)))
407
+ if (drm_WARN_ON(&dev_priv->drm, !intel_irqs_enabled(dev_priv)))
625408 return;
626409
627410 new_val = dev_priv->de_irq_mask[pipe];
....@@ -642,18 +425,18 @@
642425 * @enabled_irq_mask: mask of interrupt bits to enable
643426 */
644427 void ibx_display_interrupt_update(struct drm_i915_private *dev_priv,
645
- uint32_t interrupt_mask,
646
- uint32_t enabled_irq_mask)
428
+ u32 interrupt_mask,
429
+ u32 enabled_irq_mask)
647430 {
648
- uint32_t sdeimr = I915_READ(SDEIMR);
431
+ u32 sdeimr = I915_READ(SDEIMR);
649432 sdeimr &= ~interrupt_mask;
650433 sdeimr |= (~enabled_irq_mask & interrupt_mask);
651434
652
- WARN_ON(enabled_irq_mask & ~interrupt_mask);
435
+ drm_WARN_ON(&dev_priv->drm, enabled_irq_mask & ~interrupt_mask);
653436
654437 lockdep_assert_held(&dev_priv->irq_lock);
655438
656
- if (WARN_ON(!intel_irqs_enabled(dev_priv)))
439
+ if (drm_WARN_ON(&dev_priv->drm, !intel_irqs_enabled(dev_priv)))
657440 return;
658441
659442 I915_WRITE(SDEIMR, sdeimr);
....@@ -675,13 +458,15 @@
675458 * On pipe A we don't support the PSR interrupt yet,
676459 * on pipe B and C the same bit MBZ.
677460 */
678
- if (WARN_ON_ONCE(status_mask & PIPE_A_PSR_STATUS_VLV))
461
+ if (drm_WARN_ON_ONCE(&dev_priv->drm,
462
+ status_mask & PIPE_A_PSR_STATUS_VLV))
679463 return 0;
680464 /*
681465 * On pipe B and C we don't support the PSR interrupt yet, on pipe
682466 * A the same bit is for perf counters which we don't use either.
683467 */
684
- if (WARN_ON_ONCE(status_mask & PIPE_B_PSR_STATUS_VLV))
468
+ if (drm_WARN_ON_ONCE(&dev_priv->drm,
469
+ status_mask & PIPE_B_PSR_STATUS_VLV))
685470 return 0;
686471
687472 enable_mask &= ~(PIPE_FIFO_UNDERRUN_STATUS |
....@@ -693,10 +478,11 @@
693478 enable_mask |= SPRITE1_FLIP_DONE_INT_EN_VLV;
694479
695480 out:
696
- WARN_ONCE(enable_mask & ~PIPESTAT_INT_ENABLE_MASK ||
697
- status_mask & ~PIPESTAT_INT_STATUS_MASK,
698
- "pipe %c: enable_mask=0x%x, status_mask=0x%x\n",
699
- pipe_name(pipe), enable_mask, status_mask);
481
+ drm_WARN_ONCE(&dev_priv->drm,
482
+ enable_mask & ~PIPESTAT_INT_ENABLE_MASK ||
483
+ status_mask & ~PIPESTAT_INT_STATUS_MASK,
484
+ "pipe %c: enable_mask=0x%x, status_mask=0x%x\n",
485
+ pipe_name(pipe), enable_mask, status_mask);
700486
701487 return enable_mask;
702488 }
....@@ -707,12 +493,12 @@
707493 i915_reg_t reg = PIPESTAT(pipe);
708494 u32 enable_mask;
709495
710
- WARN_ONCE(status_mask & ~PIPESTAT_INT_STATUS_MASK,
711
- "pipe %c: status_mask=0x%x\n",
712
- pipe_name(pipe), status_mask);
496
+ drm_WARN_ONCE(&dev_priv->drm, status_mask & ~PIPESTAT_INT_STATUS_MASK,
497
+ "pipe %c: status_mask=0x%x\n",
498
+ pipe_name(pipe), status_mask);
713499
714500 lockdep_assert_held(&dev_priv->irq_lock);
715
- WARN_ON(!intel_irqs_enabled(dev_priv));
501
+ drm_WARN_ON(&dev_priv->drm, !intel_irqs_enabled(dev_priv));
716502
717503 if ((dev_priv->pipestat_irq_mask[pipe] & status_mask) == status_mask)
718504 return;
....@@ -730,12 +516,12 @@
730516 i915_reg_t reg = PIPESTAT(pipe);
731517 u32 enable_mask;
732518
733
- WARN_ONCE(status_mask & ~PIPESTAT_INT_STATUS_MASK,
734
- "pipe %c: status_mask=0x%x\n",
735
- pipe_name(pipe), status_mask);
519
+ drm_WARN_ONCE(&dev_priv->drm, status_mask & ~PIPESTAT_INT_STATUS_MASK,
520
+ "pipe %c: status_mask=0x%x\n",
521
+ pipe_name(pipe), status_mask);
736522
737523 lockdep_assert_held(&dev_priv->irq_lock);
738
- WARN_ON(!intel_irqs_enabled(dev_priv));
524
+ drm_WARN_ON(&dev_priv->drm, !intel_irqs_enabled(dev_priv));
739525
740526 if ((dev_priv->pipestat_irq_mask[pipe] & status_mask) == 0)
741527 return;
....@@ -747,13 +533,21 @@
747533 POSTING_READ(reg);
748534 }
749535
536
+static bool i915_has_asle(struct drm_i915_private *dev_priv)
537
+{
538
+ if (!dev_priv->opregion.asle)
539
+ return false;
540
+
541
+ return IS_PINEVIEW(dev_priv) || IS_MOBILE(dev_priv);
542
+}
543
+
750544 /**
751545 * i915_enable_asle_pipestat - enable ASLE pipestat for OpRegion
752546 * @dev_priv: i915 device private
753547 */
754548 static void i915_enable_asle_pipestat(struct drm_i915_private *dev_priv)
755549 {
756
- if (!dev_priv->opregion.asle || !IS_MOBILE(dev_priv))
550
+ if (!i915_has_asle(dev_priv))
757551 return;
758552
759553 spin_lock_irq(&dev_priv->irq_lock);
....@@ -819,13 +613,29 @@
819613 /* Called from drm generic code, passed a 'crtc', which
820614 * we use as a pipe index
821615 */
822
-static u32 i915_get_vblank_counter(struct drm_device *dev, unsigned int pipe)
616
+u32 i915_get_vblank_counter(struct drm_crtc *crtc)
823617 {
824
- struct drm_i915_private *dev_priv = to_i915(dev);
618
+ struct drm_i915_private *dev_priv = to_i915(crtc->dev);
619
+ struct drm_vblank_crtc *vblank = &dev_priv->drm.vblank[drm_crtc_index(crtc)];
620
+ const struct drm_display_mode *mode = &vblank->hwmode;
621
+ enum pipe pipe = to_intel_crtc(crtc)->pipe;
825622 i915_reg_t high_frame, low_frame;
826623 u32 high1, high2, low, pixel, vbl_start, hsync_start, htotal;
827
- const struct drm_display_mode *mode = &dev->vblank[pipe].hwmode;
828624 unsigned long irqflags;
625
+
626
+ /*
627
+ * On i965gm TV output the frame counter only works up to
628
+ * the point when we enable the TV encoder. After that the
629
+ * frame counter ceases to work and reads zero. We need a
630
+ * vblank wait before enabling the TV encoder and so we
631
+ * have to enable vblank interrupts while the frame counter
632
+ * is still in a working state. However the core vblank code
633
+ * does not like us returning non-zero frame counter values
634
+ * when we've told it that we don't have a working frame
635
+ * counter. Thus we must stop non-zero values leaking out.
636
+ */
637
+ if (!vblank->max_vblank_count)
638
+ return 0;
829639
830640 htotal = mode->crtc_htotal;
831641 hsync_start = mode->crtc_hsync_start;
....@@ -850,9 +660,9 @@
850660 * register.
851661 */
852662 do {
853
- high1 = I915_READ_FW(high_frame) & PIPE_FRAME_HIGH_MASK;
854
- low = I915_READ_FW(low_frame);
855
- high2 = I915_READ_FW(high_frame) & PIPE_FRAME_HIGH_MASK;
663
+ high1 = intel_de_read_fw(dev_priv, high_frame) & PIPE_FRAME_HIGH_MASK;
664
+ low = intel_de_read_fw(dev_priv, low_frame);
665
+ high2 = intel_de_read_fw(dev_priv, high_frame) & PIPE_FRAME_HIGH_MASK;
856666 } while (high1 != high2);
857667
858668 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
....@@ -869,9 +679,10 @@
869679 return (((high1 << 8) | low) + (pixel >= vbl_start)) & 0xffffff;
870680 }
871681
872
-static u32 g4x_get_vblank_counter(struct drm_device *dev, unsigned int pipe)
682
+u32 g4x_get_vblank_counter(struct drm_crtc *crtc)
873683 {
874
- struct drm_i915_private *dev_priv = to_i915(dev);
684
+ struct drm_i915_private *dev_priv = to_i915(crtc->dev);
685
+ enum pipe pipe = to_intel_crtc(crtc)->pipe;
875686
876687 return I915_READ(PIPE_FRMCOUNT_G4X(pipe));
877688 }
....@@ -908,15 +719,17 @@
908719 * pipe frame time stamp. The time stamp value
909720 * is sampled at every start of vertical blank.
910721 */
911
- scan_prev_time = I915_READ_FW(PIPE_FRMTMSTMP(crtc->pipe));
722
+ scan_prev_time = intel_de_read_fw(dev_priv,
723
+ PIPE_FRMTMSTMP(crtc->pipe));
912724
913725 /*
914726 * The TIMESTAMP_CTR register has the current
915727 * time stamp value.
916728 */
917
- scan_curr_time = I915_READ_FW(IVB_TIMESTAMP_CTR);
729
+ scan_curr_time = intel_de_read_fw(dev_priv, IVB_TIMESTAMP_CTR);
918730
919
- scan_post_time = I915_READ_FW(PIPE_FRMTMSTMP(crtc->pipe));
731
+ scan_post_time = intel_de_read_fw(dev_priv,
732
+ PIPE_FRMTMSTMP(crtc->pipe));
920733 } while (scan_post_time != scan_prev_time);
921734
922735 scanline = div_u64(mul_u32_u32(scan_curr_time - scan_prev_time,
....@@ -927,7 +740,10 @@
927740 return scanline;
928741 }
929742
930
-/* I915_READ_FW, only for fast reads of display block, no need for forcewake etc. */
743
+/*
744
+ * intel_de_read_fw(), only for fast reads of display block, no need for
745
+ * forcewake etc.
746
+ */
931747 static int __intel_get_crtc_scanline(struct intel_crtc *crtc)
932748 {
933749 struct drm_device *dev = crtc->base.dev;
....@@ -943,17 +759,17 @@
943759 vblank = &crtc->base.dev->vblank[drm_crtc_index(&crtc->base)];
944760 mode = &vblank->hwmode;
945761
946
- if (mode->private_flags & I915_MODE_FLAG_GET_SCANLINE_FROM_TIMESTAMP)
762
+ if (crtc->mode_flags & I915_MODE_FLAG_GET_SCANLINE_FROM_TIMESTAMP)
947763 return __intel_get_crtc_scanline_from_timestamp(crtc);
948764
949765 vtotal = mode->crtc_vtotal;
950766 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
951767 vtotal /= 2;
952768
953
- if (IS_GEN2(dev_priv))
954
- position = I915_READ_FW(PIPEDSL(pipe)) & DSL_LINEMASK_GEN2;
769
+ if (IS_GEN(dev_priv, 2))
770
+ position = intel_de_read_fw(dev_priv, PIPEDSL(pipe)) & DSL_LINEMASK_GEN2;
955771 else
956
- position = I915_READ_FW(PIPEDSL(pipe)) & DSL_LINEMASK_GEN3;
772
+ position = intel_de_read_fw(dev_priv, PIPEDSL(pipe)) & DSL_LINEMASK_GEN3;
957773
958774 /*
959775 * On HSW, the DSL reg (0x70000) appears to return 0 if we
....@@ -972,7 +788,7 @@
972788
973789 for (i = 0; i < 100; i++) {
974790 udelay(1);
975
- temp = I915_READ_FW(PIPEDSL(pipe)) & DSL_LINEMASK_GEN3;
791
+ temp = intel_de_read_fw(dev_priv, PIPEDSL(pipe)) & DSL_LINEMASK_GEN3;
976792 if (temp != position) {
977793 position = temp;
978794 break;
....@@ -987,21 +803,27 @@
987803 return (position + crtc->scanline_offset) % vtotal;
988804 }
989805
990
-static bool i915_get_crtc_scanoutpos(struct drm_device *dev, unsigned int pipe,
991
- bool in_vblank_irq, int *vpos, int *hpos,
806
+static bool i915_get_crtc_scanoutpos(struct drm_crtc *_crtc,
807
+ bool in_vblank_irq,
808
+ int *vpos, int *hpos,
992809 ktime_t *stime, ktime_t *etime,
993810 const struct drm_display_mode *mode)
994811 {
812
+ struct drm_device *dev = _crtc->dev;
995813 struct drm_i915_private *dev_priv = to_i915(dev);
996
- struct intel_crtc *intel_crtc = intel_get_crtc_for_pipe(dev_priv,
997
- pipe);
814
+ struct intel_crtc *crtc = to_intel_crtc(_crtc);
815
+ enum pipe pipe = crtc->pipe;
998816 int position;
999817 int vbl_start, vbl_end, hsync_start, htotal, vtotal;
1000818 unsigned long irqflags;
819
+ bool use_scanline_counter = INTEL_GEN(dev_priv) >= 5 ||
820
+ IS_G4X(dev_priv) || IS_GEN(dev_priv, 2) ||
821
+ crtc->mode_flags & I915_MODE_FLAG_USE_SCANLINE_COUNTER;
1001822
1002
- if (WARN_ON(!mode->crtc_clock)) {
1003
- DRM_DEBUG_DRIVER("trying to get scanoutpos for disabled "
1004
- "pipe %c\n", pipe_name(pipe));
823
+ if (drm_WARN_ON(&dev_priv->drm, !mode->crtc_clock)) {
824
+ drm_dbg(&dev_priv->drm,
825
+ "trying to get scanoutpos for disabled "
826
+ "pipe %c\n", pipe_name(pipe));
1005827 return false;
1006828 }
1007829
....@@ -1031,17 +853,17 @@
1031853 if (stime)
1032854 *stime = ktime_get();
1033855
1034
- if (IS_GEN2(dev_priv) || IS_G4X(dev_priv) || INTEL_GEN(dev_priv) >= 5) {
856
+ if (use_scanline_counter) {
1035857 /* No obvious pixelcount register. Only query vertical
1036858 * scanout position from Display scan line register.
1037859 */
1038
- position = __intel_get_crtc_scanline(intel_crtc);
860
+ position = __intel_get_crtc_scanline(crtc);
1039861 } else {
1040862 /* Have access to pixelcount since start of frame.
1041863 * We can split this into vertical and horizontal
1042864 * scanout position.
1043865 */
1044
- position = (I915_READ_FW(PIPEFRAMEPIXEL(pipe)) & PIPE_PIXEL_MASK) >> PIPE_PIXEL_SHIFT;
866
+ position = (intel_de_read_fw(dev_priv, PIPEFRAMEPIXEL(pipe)) & PIPE_PIXEL_MASK) >> PIPE_PIXEL_SHIFT;
1045867
1046868 /* convert to pixel counts */
1047869 vbl_start *= htotal;
....@@ -1092,7 +914,7 @@
1092914 else
1093915 position += vtotal - vbl_end;
1094916
1095
- if (IS_GEN2(dev_priv) || IS_G4X(dev_priv) || INTEL_GEN(dev_priv) >= 5) {
917
+ if (use_scanline_counter) {
1096918 *vpos = position;
1097919 *hpos = 0;
1098920 } else {
....@@ -1101,6 +923,14 @@
1101923 }
1102924
1103925 return true;
926
+}
927
+
928
+bool intel_crtc_get_vblank_timestamp(struct drm_crtc *crtc, int *max_error,
929
+ ktime_t *vblank_time, bool in_vblank_irq)
930
+{
931
+ return drm_crtc_vblank_helper_get_vblank_timestamp_internal(
932
+ crtc, max_error, vblank_time, in_vblank_irq,
933
+ i915_get_crtc_scanoutpos);
1104934 }
1105935
1106936 int intel_get_crtc_scanline(struct intel_crtc *crtc)
....@@ -1116,255 +946,8 @@
1116946 return position;
1117947 }
1118948
1119
-static void ironlake_rps_change_irq_handler(struct drm_i915_private *dev_priv)
1120
-{
1121
- u32 busy_up, busy_down, max_avg, min_avg;
1122
- u8 new_delay;
1123
-
1124
- spin_lock(&mchdev_lock);
1125
-
1126
- I915_WRITE16(MEMINTRSTS, I915_READ(MEMINTRSTS));
1127
-
1128
- new_delay = dev_priv->ips.cur_delay;
1129
-
1130
- I915_WRITE16(MEMINTRSTS, MEMINT_EVAL_CHG);
1131
- busy_up = I915_READ(RCPREVBSYTUPAVG);
1132
- busy_down = I915_READ(RCPREVBSYTDNAVG);
1133
- max_avg = I915_READ(RCBMAXAVG);
1134
- min_avg = I915_READ(RCBMINAVG);
1135
-
1136
- /* Handle RCS change request from hw */
1137
- if (busy_up > max_avg) {
1138
- if (dev_priv->ips.cur_delay != dev_priv->ips.max_delay)
1139
- new_delay = dev_priv->ips.cur_delay - 1;
1140
- if (new_delay < dev_priv->ips.max_delay)
1141
- new_delay = dev_priv->ips.max_delay;
1142
- } else if (busy_down < min_avg) {
1143
- if (dev_priv->ips.cur_delay != dev_priv->ips.min_delay)
1144
- new_delay = dev_priv->ips.cur_delay + 1;
1145
- if (new_delay > dev_priv->ips.min_delay)
1146
- new_delay = dev_priv->ips.min_delay;
1147
- }
1148
-
1149
- if (ironlake_set_drps(dev_priv, new_delay))
1150
- dev_priv->ips.cur_delay = new_delay;
1151
-
1152
- spin_unlock(&mchdev_lock);
1153
-
1154
- return;
1155
-}
1156
-
1157
-static void notify_ring(struct intel_engine_cs *engine)
1158
-{
1159
- const u32 seqno = intel_engine_get_seqno(engine);
1160
- struct i915_request *rq = NULL;
1161
- struct task_struct *tsk = NULL;
1162
- struct intel_wait *wait;
1163
-
1164
- if (unlikely(!engine->breadcrumbs.irq_armed))
1165
- return;
1166
-
1167
- rcu_read_lock();
1168
-
1169
- spin_lock(&engine->breadcrumbs.irq_lock);
1170
- wait = engine->breadcrumbs.irq_wait;
1171
- if (wait) {
1172
- /*
1173
- * We use a callback from the dma-fence to submit
1174
- * requests after waiting on our own requests. To
1175
- * ensure minimum delay in queuing the next request to
1176
- * hardware, signal the fence now rather than wait for
1177
- * the signaler to be woken up. We still wake up the
1178
- * waiter in order to handle the irq-seqno coherency
1179
- * issues (we may receive the interrupt before the
1180
- * seqno is written, see __i915_request_irq_complete())
1181
- * and to handle coalescing of multiple seqno updates
1182
- * and many waiters.
1183
- */
1184
- if (i915_seqno_passed(seqno, wait->seqno)) {
1185
- struct i915_request *waiter = wait->request;
1186
-
1187
- if (waiter &&
1188
- !test_bit(DMA_FENCE_FLAG_SIGNALED_BIT,
1189
- &waiter->fence.flags) &&
1190
- intel_wait_check_request(wait, waiter))
1191
- rq = i915_request_get(waiter);
1192
-
1193
- tsk = wait->tsk;
1194
- } else {
1195
- if (engine->irq_seqno_barrier &&
1196
- i915_seqno_passed(seqno, wait->seqno - 1)) {
1197
- set_bit(ENGINE_IRQ_BREADCRUMB,
1198
- &engine->irq_posted);
1199
- tsk = wait->tsk;
1200
- }
1201
- }
1202
-
1203
- engine->breadcrumbs.irq_count++;
1204
- } else {
1205
- if (engine->breadcrumbs.irq_armed)
1206
- __intel_engine_disarm_breadcrumbs(engine);
1207
- }
1208
- spin_unlock(&engine->breadcrumbs.irq_lock);
1209
-
1210
- if (rq) {
1211
- spin_lock(&rq->lock);
1212
- dma_fence_signal_locked(&rq->fence);
1213
- GEM_BUG_ON(!i915_request_completed(rq));
1214
- spin_unlock(&rq->lock);
1215
-
1216
- i915_request_put(rq);
1217
- }
1218
-
1219
- if (tsk && tsk->state & TASK_NORMAL)
1220
- wake_up_process(tsk);
1221
-
1222
- rcu_read_unlock();
1223
-
1224
- trace_intel_engine_notify(engine, wait);
1225
-}
1226
-
1227
-static void vlv_c0_read(struct drm_i915_private *dev_priv,
1228
- struct intel_rps_ei *ei)
1229
-{
1230
- ei->ktime = ktime_get_raw();
1231
- ei->render_c0 = I915_READ(VLV_RENDER_C0_COUNT);
1232
- ei->media_c0 = I915_READ(VLV_MEDIA_C0_COUNT);
1233
-}
1234
-
1235
-void gen6_rps_reset_ei(struct drm_i915_private *dev_priv)
1236
-{
1237
- memset(&dev_priv->gt_pm.rps.ei, 0, sizeof(dev_priv->gt_pm.rps.ei));
1238
-}
1239
-
1240
-static u32 vlv_wa_c0_ei(struct drm_i915_private *dev_priv, u32 pm_iir)
1241
-{
1242
- struct intel_rps *rps = &dev_priv->gt_pm.rps;
1243
- const struct intel_rps_ei *prev = &rps->ei;
1244
- struct intel_rps_ei now;
1245
- u32 events = 0;
1246
-
1247
- if ((pm_iir & GEN6_PM_RP_UP_EI_EXPIRED) == 0)
1248
- return 0;
1249
-
1250
- vlv_c0_read(dev_priv, &now);
1251
-
1252
- if (prev->ktime) {
1253
- u64 time, c0;
1254
- u32 render, media;
1255
-
1256
- time = ktime_us_delta(now.ktime, prev->ktime);
1257
-
1258
- time *= dev_priv->czclk_freq;
1259
-
1260
- /* Workload can be split between render + media,
1261
- * e.g. SwapBuffers being blitted in X after being rendered in
1262
- * mesa. To account for this we need to combine both engines
1263
- * into our activity counter.
1264
- */
1265
- render = now.render_c0 - prev->render_c0;
1266
- media = now.media_c0 - prev->media_c0;
1267
- c0 = max(render, media);
1268
- c0 *= 1000 * 100 << 8; /* to usecs and scale to threshold% */
1269
-
1270
- if (c0 > time * rps->power.up_threshold)
1271
- events = GEN6_PM_RP_UP_THRESHOLD;
1272
- else if (c0 < time * rps->power.down_threshold)
1273
- events = GEN6_PM_RP_DOWN_THRESHOLD;
1274
- }
1275
-
1276
- rps->ei = now;
1277
- return events;
1278
-}
1279
-
1280
-static void gen6_pm_rps_work(struct work_struct *work)
1281
-{
1282
- struct drm_i915_private *dev_priv =
1283
- container_of(work, struct drm_i915_private, gt_pm.rps.work);
1284
- struct intel_rps *rps = &dev_priv->gt_pm.rps;
1285
- bool client_boost = false;
1286
- int new_delay, adj, min, max;
1287
- u32 pm_iir = 0;
1288
-
1289
- spin_lock_irq(&dev_priv->irq_lock);
1290
- if (rps->interrupts_enabled) {
1291
- pm_iir = fetch_and_zero(&rps->pm_iir);
1292
- client_boost = atomic_read(&rps->num_waiters);
1293
- }
1294
- spin_unlock_irq(&dev_priv->irq_lock);
1295
-
1296
- /* Make sure we didn't queue anything we're not going to process. */
1297
- WARN_ON(pm_iir & ~dev_priv->pm_rps_events);
1298
- if ((pm_iir & dev_priv->pm_rps_events) == 0 && !client_boost)
1299
- goto out;
1300
-
1301
- mutex_lock(&dev_priv->pcu_lock);
1302
-
1303
- pm_iir |= vlv_wa_c0_ei(dev_priv, pm_iir);
1304
-
1305
- adj = rps->last_adj;
1306
- new_delay = rps->cur_freq;
1307
- min = rps->min_freq_softlimit;
1308
- max = rps->max_freq_softlimit;
1309
- if (client_boost)
1310
- max = rps->max_freq;
1311
- if (client_boost && new_delay < rps->boost_freq) {
1312
- new_delay = rps->boost_freq;
1313
- adj = 0;
1314
- } else if (pm_iir & GEN6_PM_RP_UP_THRESHOLD) {
1315
- if (adj > 0)
1316
- adj *= 2;
1317
- else /* CHV needs even encode values */
1318
- adj = IS_CHERRYVIEW(dev_priv) ? 2 : 1;
1319
-
1320
- if (new_delay >= rps->max_freq_softlimit)
1321
- adj = 0;
1322
- } else if (client_boost) {
1323
- adj = 0;
1324
- } else if (pm_iir & GEN6_PM_RP_DOWN_TIMEOUT) {
1325
- if (rps->cur_freq > rps->efficient_freq)
1326
- new_delay = rps->efficient_freq;
1327
- else if (rps->cur_freq > rps->min_freq_softlimit)
1328
- new_delay = rps->min_freq_softlimit;
1329
- adj = 0;
1330
- } else if (pm_iir & GEN6_PM_RP_DOWN_THRESHOLD) {
1331
- if (adj < 0)
1332
- adj *= 2;
1333
- else /* CHV needs even encode values */
1334
- adj = IS_CHERRYVIEW(dev_priv) ? -2 : -1;
1335
-
1336
- if (new_delay <= rps->min_freq_softlimit)
1337
- adj = 0;
1338
- } else { /* unknown event */
1339
- adj = 0;
1340
- }
1341
-
1342
- rps->last_adj = adj;
1343
-
1344
- /* sysfs frequency interfaces may have snuck in while servicing the
1345
- * interrupt
1346
- */
1347
- new_delay += adj;
1348
- new_delay = clamp_t(int, new_delay, min, max);
1349
-
1350
- if (intel_set_rps(dev_priv, new_delay)) {
1351
- DRM_DEBUG_DRIVER("Failed to set new GPU frequency\n");
1352
- rps->last_adj = 0;
1353
- }
1354
-
1355
- mutex_unlock(&dev_priv->pcu_lock);
1356
-
1357
-out:
1358
- /* Make sure not to corrupt PMIMR state used by ringbuffer on GEN6 */
1359
- spin_lock_irq(&dev_priv->irq_lock);
1360
- if (rps->interrupts_enabled)
1361
- gen6_unmask_pm_irq(dev_priv, dev_priv->pm_rps_events);
1362
- spin_unlock_irq(&dev_priv->irq_lock);
1363
-}
1364
-
1365
-
1366949 /**
1367
- * ivybridge_parity_work - Workqueue called when a parity error interrupt
950
+ * ivb_parity_work - Workqueue called when a parity error interrupt
1368951 * occurred.
1369952 * @work: workqueue struct
1370953 *
....@@ -1372,14 +955,15 @@
1372955 * this event, userspace should try to remap the bad rows since statistically
1373956 * it is likely the same row is more likely to go bad again.
1374957 */
1375
-static void ivybridge_parity_work(struct work_struct *work)
958
+static void ivb_parity_work(struct work_struct *work)
1376959 {
1377960 struct drm_i915_private *dev_priv =
1378961 container_of(work, typeof(*dev_priv), l3_parity.error_work);
962
+ struct intel_gt *gt = &dev_priv->gt;
1379963 u32 error_status, row, bank, subbank;
1380964 char *parity_event[6];
1381
- uint32_t misccpctl;
1382
- uint8_t slice = 0;
965
+ u32 misccpctl;
966
+ u8 slice = 0;
1383967
1384968 /* We must turn off DOP level clock gating to access the L3 registers.
1385969 * In order to prevent a get/put style interface, acquire struct mutex
....@@ -1388,7 +972,7 @@
1388972 mutex_lock(&dev_priv->drm.struct_mutex);
1389973
1390974 /* If we've screwed up tracking, just let the interrupt fire again */
1391
- if (WARN_ON(!dev_priv->l3_parity.which_slice))
975
+ if (drm_WARN_ON(&dev_priv->drm, !dev_priv->l3_parity.which_slice))
1392976 goto out;
1393977
1394978 misccpctl = I915_READ(GEN7_MISCCPCTL);
....@@ -1399,7 +983,8 @@
1399983 i915_reg_t reg;
1400984
1401985 slice--;
1402
- if (WARN_ON_ONCE(slice >= NUM_L3_SLICES(dev_priv)))
986
+ if (drm_WARN_ON_ONCE(&dev_priv->drm,
987
+ slice >= NUM_L3_SLICES(dev_priv)))
1403988 break;
1404989
1405990 dev_priv->l3_parity.which_slice &= ~(1<<slice);
....@@ -1436,159 +1021,29 @@
14361021 I915_WRITE(GEN7_MISCCPCTL, misccpctl);
14371022
14381023 out:
1439
- WARN_ON(dev_priv->l3_parity.which_slice);
1440
- spin_lock_irq(&dev_priv->irq_lock);
1441
- gen5_enable_gt_irq(dev_priv, GT_PARITY_ERROR(dev_priv));
1442
- spin_unlock_irq(&dev_priv->irq_lock);
1024
+ drm_WARN_ON(&dev_priv->drm, dev_priv->l3_parity.which_slice);
1025
+ spin_lock_irq(&gt->irq_lock);
1026
+ gen5_gt_enable_irq(gt, GT_PARITY_ERROR(dev_priv));
1027
+ spin_unlock_irq(&gt->irq_lock);
14431028
14441029 mutex_unlock(&dev_priv->drm.struct_mutex);
1445
-}
1446
-
1447
-static void ivybridge_parity_error_irq_handler(struct drm_i915_private *dev_priv,
1448
- u32 iir)
1449
-{
1450
- if (!HAS_L3_DPF(dev_priv))
1451
- return;
1452
-
1453
- spin_lock(&dev_priv->irq_lock);
1454
- gen5_disable_gt_irq(dev_priv, GT_PARITY_ERROR(dev_priv));
1455
- spin_unlock(&dev_priv->irq_lock);
1456
-
1457
- iir &= GT_PARITY_ERROR(dev_priv);
1458
- if (iir & GT_RENDER_L3_PARITY_ERROR_INTERRUPT_S1)
1459
- dev_priv->l3_parity.which_slice |= 1 << 1;
1460
-
1461
- if (iir & GT_RENDER_L3_PARITY_ERROR_INTERRUPT)
1462
- dev_priv->l3_parity.which_slice |= 1 << 0;
1463
-
1464
- queue_work(dev_priv->wq, &dev_priv->l3_parity.error_work);
1465
-}
1466
-
1467
-static void ilk_gt_irq_handler(struct drm_i915_private *dev_priv,
1468
- u32 gt_iir)
1469
-{
1470
- if (gt_iir & GT_RENDER_USER_INTERRUPT)
1471
- notify_ring(dev_priv->engine[RCS]);
1472
- if (gt_iir & ILK_BSD_USER_INTERRUPT)
1473
- notify_ring(dev_priv->engine[VCS]);
1474
-}
1475
-
1476
-static void snb_gt_irq_handler(struct drm_i915_private *dev_priv,
1477
- u32 gt_iir)
1478
-{
1479
- if (gt_iir & GT_RENDER_USER_INTERRUPT)
1480
- notify_ring(dev_priv->engine[RCS]);
1481
- if (gt_iir & GT_BSD_USER_INTERRUPT)
1482
- notify_ring(dev_priv->engine[VCS]);
1483
- if (gt_iir & GT_BLT_USER_INTERRUPT)
1484
- notify_ring(dev_priv->engine[BCS]);
1485
-
1486
- if (gt_iir & (GT_BLT_CS_ERROR_INTERRUPT |
1487
- GT_BSD_CS_ERROR_INTERRUPT |
1488
- GT_RENDER_CS_MASTER_ERROR_INTERRUPT))
1489
- DRM_DEBUG("Command parser error, gt_iir 0x%08x\n", gt_iir);
1490
-
1491
- if (gt_iir & GT_PARITY_ERROR(dev_priv))
1492
- ivybridge_parity_error_irq_handler(dev_priv, gt_iir);
1493
-}
1494
-
1495
-static void
1496
-gen8_cs_irq_handler(struct intel_engine_cs *engine, u32 iir)
1497
-{
1498
- bool tasklet = false;
1499
-
1500
- if (iir & GT_CONTEXT_SWITCH_INTERRUPT)
1501
- tasklet = true;
1502
-
1503
- if (iir & GT_RENDER_USER_INTERRUPT) {
1504
- notify_ring(engine);
1505
- tasklet |= USES_GUC_SUBMISSION(engine->i915);
1506
- }
1507
-
1508
- if (tasklet)
1509
- tasklet_hi_schedule(&engine->execlists.tasklet);
1510
-}
1511
-
1512
-static void gen8_gt_irq_ack(struct drm_i915_private *i915,
1513
- u32 master_ctl, u32 gt_iir[4])
1514
-{
1515
- void __iomem * const regs = i915->regs;
1516
-
1517
-#define GEN8_GT_IRQS (GEN8_GT_RCS_IRQ | \
1518
- GEN8_GT_BCS_IRQ | \
1519
- GEN8_GT_VCS1_IRQ | \
1520
- GEN8_GT_VCS2_IRQ | \
1521
- GEN8_GT_VECS_IRQ | \
1522
- GEN8_GT_PM_IRQ | \
1523
- GEN8_GT_GUC_IRQ)
1524
-
1525
- if (master_ctl & (GEN8_GT_RCS_IRQ | GEN8_GT_BCS_IRQ)) {
1526
- gt_iir[0] = raw_reg_read(regs, GEN8_GT_IIR(0));
1527
- if (likely(gt_iir[0]))
1528
- raw_reg_write(regs, GEN8_GT_IIR(0), gt_iir[0]);
1529
- }
1530
-
1531
- if (master_ctl & (GEN8_GT_VCS1_IRQ | GEN8_GT_VCS2_IRQ)) {
1532
- gt_iir[1] = raw_reg_read(regs, GEN8_GT_IIR(1));
1533
- if (likely(gt_iir[1]))
1534
- raw_reg_write(regs, GEN8_GT_IIR(1), gt_iir[1]);
1535
- }
1536
-
1537
- if (master_ctl & (GEN8_GT_PM_IRQ | GEN8_GT_GUC_IRQ)) {
1538
- gt_iir[2] = raw_reg_read(regs, GEN8_GT_IIR(2));
1539
- if (likely(gt_iir[2] & (i915->pm_rps_events |
1540
- i915->pm_guc_events)))
1541
- raw_reg_write(regs, GEN8_GT_IIR(2),
1542
- gt_iir[2] & (i915->pm_rps_events |
1543
- i915->pm_guc_events));
1544
- }
1545
-
1546
- if (master_ctl & GEN8_GT_VECS_IRQ) {
1547
- gt_iir[3] = raw_reg_read(regs, GEN8_GT_IIR(3));
1548
- if (likely(gt_iir[3]))
1549
- raw_reg_write(regs, GEN8_GT_IIR(3), gt_iir[3]);
1550
- }
1551
-}
1552
-
1553
-static void gen8_gt_irq_handler(struct drm_i915_private *i915,
1554
- u32 master_ctl, u32 gt_iir[4])
1555
-{
1556
- if (master_ctl & (GEN8_GT_RCS_IRQ | GEN8_GT_BCS_IRQ)) {
1557
- gen8_cs_irq_handler(i915->engine[RCS],
1558
- gt_iir[0] >> GEN8_RCS_IRQ_SHIFT);
1559
- gen8_cs_irq_handler(i915->engine[BCS],
1560
- gt_iir[0] >> GEN8_BCS_IRQ_SHIFT);
1561
- }
1562
-
1563
- if (master_ctl & (GEN8_GT_VCS1_IRQ | GEN8_GT_VCS2_IRQ)) {
1564
- gen8_cs_irq_handler(i915->engine[VCS],
1565
- gt_iir[1] >> GEN8_VCS1_IRQ_SHIFT);
1566
- gen8_cs_irq_handler(i915->engine[VCS2],
1567
- gt_iir[1] >> GEN8_VCS2_IRQ_SHIFT);
1568
- }
1569
-
1570
- if (master_ctl & GEN8_GT_VECS_IRQ) {
1571
- gen8_cs_irq_handler(i915->engine[VECS],
1572
- gt_iir[3] >> GEN8_VECS_IRQ_SHIFT);
1573
- }
1574
-
1575
- if (master_ctl & (GEN8_GT_PM_IRQ | GEN8_GT_GUC_IRQ)) {
1576
- gen6_rps_irq_handler(i915, gt_iir[2]);
1577
- gen9_guc_irq_handler(i915, gt_iir[2]);
1578
- }
15791030 }
15801031
15811032 static bool gen11_port_hotplug_long_detect(enum hpd_pin pin, u32 val)
15821033 {
15831034 switch (pin) {
1584
- case HPD_PORT_C:
1035
+ case HPD_PORT_TC1:
15851036 return val & GEN11_HOTPLUG_CTL_LONG_DETECT(PORT_TC1);
1586
- case HPD_PORT_D:
1037
+ case HPD_PORT_TC2:
15871038 return val & GEN11_HOTPLUG_CTL_LONG_DETECT(PORT_TC2);
1588
- case HPD_PORT_E:
1039
+ case HPD_PORT_TC3:
15891040 return val & GEN11_HOTPLUG_CTL_LONG_DETECT(PORT_TC3);
1590
- case HPD_PORT_F:
1041
+ case HPD_PORT_TC4:
15911042 return val & GEN11_HOTPLUG_CTL_LONG_DETECT(PORT_TC4);
1043
+ case HPD_PORT_TC5:
1044
+ return val & GEN11_HOTPLUG_CTL_LONG_DETECT(PORT_TC5);
1045
+ case HPD_PORT_TC6:
1046
+ return val & GEN11_HOTPLUG_CTL_LONG_DETECT(PORT_TC6);
15921047 default:
15931048 return false;
15941049 }
....@@ -1612,9 +1067,11 @@
16121067 {
16131068 switch (pin) {
16141069 case HPD_PORT_A:
1615
- return val & ICP_DDIA_HPD_LONG_DETECT;
1070
+ return val & SHOTPLUG_CTL_DDI_HPD_LONG_DETECT(PORT_A);
16161071 case HPD_PORT_B:
1617
- return val & ICP_DDIB_HPD_LONG_DETECT;
1072
+ return val & SHOTPLUG_CTL_DDI_HPD_LONG_DETECT(PORT_B);
1073
+ case HPD_PORT_C:
1074
+ return val & SHOTPLUG_CTL_DDI_HPD_LONG_DETECT(PORT_C);
16181075 default:
16191076 return false;
16201077 }
....@@ -1623,14 +1080,18 @@
16231080 static bool icp_tc_port_hotplug_long_detect(enum hpd_pin pin, u32 val)
16241081 {
16251082 switch (pin) {
1626
- case HPD_PORT_C:
1083
+ case HPD_PORT_TC1:
16271084 return val & ICP_TC_HPD_LONG_DETECT(PORT_TC1);
1628
- case HPD_PORT_D:
1085
+ case HPD_PORT_TC2:
16291086 return val & ICP_TC_HPD_LONG_DETECT(PORT_TC2);
1630
- case HPD_PORT_E:
1087
+ case HPD_PORT_TC3:
16311088 return val & ICP_TC_HPD_LONG_DETECT(PORT_TC3);
1632
- case HPD_PORT_F:
1089
+ case HPD_PORT_TC4:
16331090 return val & ICP_TC_HPD_LONG_DETECT(PORT_TC4);
1091
+ case HPD_PORT_TC5:
1092
+ return val & ICP_TC_HPD_LONG_DETECT(PORT_TC5);
1093
+ case HPD_PORT_TC6:
1094
+ return val & ICP_TC_HPD_LONG_DETECT(PORT_TC6);
16341095 default:
16351096 return false;
16361097 }
....@@ -1715,6 +1176,8 @@
17151176 {
17161177 enum hpd_pin pin;
17171178
1179
+ BUILD_BUG_ON(BITS_PER_TYPE(*pin_mask) < HPD_NUM_PINS);
1180
+
17181181 for_each_hpd_pin(pin) {
17191182 if ((hpd[pin] & hotplug_trigger) == 0)
17201183 continue;
....@@ -1725,8 +1188,9 @@
17251188 *long_mask |= BIT(pin);
17261189 }
17271190
1728
- DRM_DEBUG_DRIVER("hotplug event received, stat 0x%08x, dig 0x%08x, pins 0x%08x, long 0x%08x\n",
1729
- hotplug_trigger, dig_hotplug_reg, *pin_mask, *long_mask);
1191
+ drm_dbg(&dev_priv->drm,
1192
+ "hotplug event received, stat 0x%08x, dig 0x%08x, pins 0x%08x, long 0x%08x\n",
1193
+ hotplug_trigger, dig_hotplug_reg, *pin_mask, *long_mask);
17301194
17311195 }
17321196
....@@ -1743,13 +1207,15 @@
17431207 #if defined(CONFIG_DEBUG_FS)
17441208 static void display_pipe_crc_irq_handler(struct drm_i915_private *dev_priv,
17451209 enum pipe pipe,
1746
- uint32_t crc0, uint32_t crc1,
1747
- uint32_t crc2, uint32_t crc3,
1748
- uint32_t crc4)
1210
+ u32 crc0, u32 crc1,
1211
+ u32 crc2, u32 crc3,
1212
+ u32 crc4)
17491213 {
1750
- struct intel_pipe_crc *pipe_crc = &dev_priv->pipe_crc[pipe];
17511214 struct intel_crtc *crtc = intel_get_crtc_for_pipe(dev_priv, pipe);
1752
- uint32_t crcs[5];
1215
+ struct intel_pipe_crc *pipe_crc = &crtc->pipe_crc;
1216
+ u32 crcs[5] = { crc0, crc1, crc2, crc3, crc4 };
1217
+
1218
+ trace_intel_pipe_crc(crtc, crcs);
17531219
17541220 spin_lock(&pipe_crc->lock);
17551221 /*
....@@ -1768,11 +1234,6 @@
17681234 }
17691235 spin_unlock(&pipe_crc->lock);
17701236
1771
- crcs[0] = crc0;
1772
- crcs[1] = crc1;
1773
- crcs[2] = crc2;
1774
- crcs[3] = crc3;
1775
- crcs[4] = crc4;
17761237 drm_crtc_add_crc_entry(&crtc->base, true,
17771238 drm_crtc_accurate_vblank_count(&crtc->base),
17781239 crcs);
....@@ -1781,9 +1242,9 @@
17811242 static inline void
17821243 display_pipe_crc_irq_handler(struct drm_i915_private *dev_priv,
17831244 enum pipe pipe,
1784
- uint32_t crc0, uint32_t crc1,
1785
- uint32_t crc2, uint32_t crc3,
1786
- uint32_t crc4) {}
1245
+ u32 crc0, u32 crc1,
1246
+ u32 crc2, u32 crc3,
1247
+ u32 crc4) {}
17871248 #endif
17881249
17891250
....@@ -1809,7 +1270,7 @@
18091270 static void i9xx_pipe_crc_irq_handler(struct drm_i915_private *dev_priv,
18101271 enum pipe pipe)
18111272 {
1812
- uint32_t res1, res2;
1273
+ u32 res1, res2;
18131274
18141275 if (INTEL_GEN(dev_priv) >= 3)
18151276 res1 = I915_READ(PIPE_CRC_RES_RES1_I915(pipe));
....@@ -1828,41 +1289,6 @@
18281289 res1, res2);
18291290 }
18301291
1831
-/* The RPS events need forcewake, so we add them to a work queue and mask their
1832
- * IMR bits until the work is done. Other interrupts can be processed without
1833
- * the work queue. */
1834
-static void gen6_rps_irq_handler(struct drm_i915_private *dev_priv, u32 pm_iir)
1835
-{
1836
- struct intel_rps *rps = &dev_priv->gt_pm.rps;
1837
-
1838
- if (pm_iir & dev_priv->pm_rps_events) {
1839
- spin_lock(&dev_priv->irq_lock);
1840
- gen6_mask_pm_irq(dev_priv, pm_iir & dev_priv->pm_rps_events);
1841
- if (rps->interrupts_enabled) {
1842
- rps->pm_iir |= pm_iir & dev_priv->pm_rps_events;
1843
- schedule_work(&rps->work);
1844
- }
1845
- spin_unlock(&dev_priv->irq_lock);
1846
- }
1847
-
1848
- if (INTEL_GEN(dev_priv) >= 8)
1849
- return;
1850
-
1851
- if (HAS_VEBOX(dev_priv)) {
1852
- if (pm_iir & PM_VEBOX_USER_INTERRUPT)
1853
- notify_ring(dev_priv->engine[VECS]);
1854
-
1855
- if (pm_iir & PM_VEBOX_CS_ERROR_INTERRUPT)
1856
- DRM_DEBUG("Command parser error, pm_iir 0x%08x\n", pm_iir);
1857
- }
1858
-}
1859
-
1860
-static void gen9_guc_irq_handler(struct drm_i915_private *dev_priv, u32 gt_iir)
1861
-{
1862
- if (gt_iir & GEN9_GUC_TO_HOST_INT_EVENT)
1863
- intel_guc_to_host_event_handler(&dev_priv->guc);
1864
-}
1865
-
18661292 static void i9xx_pipestat_irq_reset(struct drm_i915_private *dev_priv)
18671293 {
18681294 enum pipe pipe;
....@@ -1879,7 +1305,7 @@
18791305 static void i9xx_pipestat_irq_ack(struct drm_i915_private *dev_priv,
18801306 u32 iir, u32 pipe_stats[I915_MAX_PIPES])
18811307 {
1882
- int pipe;
1308
+ enum pipe pipe;
18831309
18841310 spin_lock(&dev_priv->irq_lock);
18851311
....@@ -1904,6 +1330,7 @@
19041330 status_mask = PIPE_FIFO_UNDERRUN_STATUS;
19051331
19061332 switch (pipe) {
1333
+ default:
19071334 case PIPE_A:
19081335 iir_bit = I915_DISPLAY_PIPE_A_EVENT_INTERRUPT;
19091336 break;
....@@ -1948,7 +1375,7 @@
19481375
19491376 for_each_pipe(dev_priv, pipe) {
19501377 if (pipe_stats[pipe] & PIPE_VBLANK_INTERRUPT_STATUS)
1951
- drm_handle_vblank(&dev_priv->drm, pipe);
1378
+ intel_handle_vblank(dev_priv, pipe);
19521379
19531380 if (pipe_stats[pipe] & PIPE_CRC_DONE_INTERRUPT_STATUS)
19541381 i9xx_pipe_crc_irq_handler(dev_priv, pipe);
....@@ -1966,7 +1393,7 @@
19661393
19671394 for_each_pipe(dev_priv, pipe) {
19681395 if (pipe_stats[pipe] & PIPE_VBLANK_INTERRUPT_STATUS)
1969
- drm_handle_vblank(&dev_priv->drm, pipe);
1396
+ intel_handle_vblank(dev_priv, pipe);
19701397
19711398 if (pipe_stats[pipe] & PIPE_LEGACY_BLC_EVENT_STATUS)
19721399 blc_event = true;
....@@ -1990,7 +1417,7 @@
19901417
19911418 for_each_pipe(dev_priv, pipe) {
19921419 if (pipe_stats[pipe] & PIPE_START_VBLANK_INTERRUPT_STATUS)
1993
- drm_handle_vblank(&dev_priv->drm, pipe);
1420
+ intel_handle_vblank(dev_priv, pipe);
19941421
19951422 if (pipe_stats[pipe] & PIPE_LEGACY_BLC_EVENT_STATUS)
19961423 blc_event = true;
....@@ -2016,7 +1443,7 @@
20161443
20171444 for_each_pipe(dev_priv, pipe) {
20181445 if (pipe_stats[pipe] & PIPE_START_VBLANK_INTERRUPT_STATUS)
2019
- drm_handle_vblank(&dev_priv->drm, pipe);
1446
+ intel_handle_vblank(dev_priv, pipe);
20201447
20211448 if (pipe_stats[pipe] & PIPE_CRC_DONE_INTERRUPT_STATUS)
20221449 i9xx_pipe_crc_irq_handler(dev_priv, pipe);
....@@ -2060,9 +1487,9 @@
20601487 I915_WRITE(PORT_HOTPLUG_STAT, hotplug_status);
20611488 }
20621489
2063
- WARN_ONCE(1,
2064
- "PORT_HOTPLUG_STAT did not clear (0x%08x)\n",
2065
- I915_READ(PORT_HOTPLUG_STAT));
1490
+ drm_WARN_ONCE(&dev_priv->drm, 1,
1491
+ "PORT_HOTPLUG_STAT did not clear (0x%08x)\n",
1492
+ I915_READ(PORT_HOTPLUG_STAT));
20661493
20671494 return hotplug_status;
20681495 }
....@@ -2071,46 +1498,39 @@
20711498 u32 hotplug_status)
20721499 {
20731500 u32 pin_mask = 0, long_mask = 0;
1501
+ u32 hotplug_trigger;
20741502
2075
- if (IS_G4X(dev_priv) || IS_VALLEYVIEW(dev_priv) ||
2076
- IS_CHERRYVIEW(dev_priv)) {
2077
- u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_G4X;
1503
+ if (IS_G4X(dev_priv) ||
1504
+ IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
1505
+ hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_G4X;
1506
+ else
1507
+ hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_I915;
20781508
2079
- if (hotplug_trigger) {
2080
- intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
2081
- hotplug_trigger, hotplug_trigger,
2082
- hpd_status_g4x,
2083
- i9xx_port_hotplug_long_detect);
1509
+ if (hotplug_trigger) {
1510
+ intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
1511
+ hotplug_trigger, hotplug_trigger,
1512
+ dev_priv->hotplug.hpd,
1513
+ i9xx_port_hotplug_long_detect);
20841514
2085
- intel_hpd_irq_handler(dev_priv, pin_mask, long_mask);
2086
- }
2087
-
2088
- if (hotplug_status & DP_AUX_CHANNEL_MASK_INT_STATUS_G4X)
2089
- dp_aux_irq_handler(dev_priv);
2090
- } else {
2091
- u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_I915;
2092
-
2093
- if (hotplug_trigger) {
2094
- intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
2095
- hotplug_trigger, hotplug_trigger,
2096
- hpd_status_i915,
2097
- i9xx_port_hotplug_long_detect);
2098
- intel_hpd_irq_handler(dev_priv, pin_mask, long_mask);
2099
- }
1515
+ intel_hpd_irq_handler(dev_priv, pin_mask, long_mask);
21001516 }
1517
+
1518
+ if ((IS_G4X(dev_priv) ||
1519
+ IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) &&
1520
+ hotplug_status & DP_AUX_CHANNEL_MASK_INT_STATUS_G4X)
1521
+ dp_aux_irq_handler(dev_priv);
21011522 }
21021523
21031524 static irqreturn_t valleyview_irq_handler(int irq, void *arg)
21041525 {
2105
- struct drm_device *dev = arg;
2106
- struct drm_i915_private *dev_priv = to_i915(dev);
1526
+ struct drm_i915_private *dev_priv = arg;
21071527 irqreturn_t ret = IRQ_NONE;
21081528
21091529 if (!intel_irqs_enabled(dev_priv))
21101530 return IRQ_NONE;
21111531
21121532 /* IRQs are synced during runtime_suspend, we don't require a wakeref */
2113
- disable_rpm_wakeref_asserts(dev_priv);
1533
+ disable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
21141534
21151535 do {
21161536 u32 iir, gt_iir, pm_iir;
....@@ -2171,9 +1591,9 @@
21711591 I915_WRITE(VLV_MASTER_IER, MASTER_INTERRUPT_ENABLE);
21721592
21731593 if (gt_iir)
2174
- snb_gt_irq_handler(dev_priv, gt_iir);
1594
+ gen6_gt_irq_handler(&dev_priv->gt, gt_iir);
21751595 if (pm_iir)
2176
- gen6_rps_irq_handler(dev_priv, pm_iir);
1596
+ gen6_rps_irq_handler(&dev_priv->gt.rps, pm_iir);
21771597
21781598 if (hotplug_status)
21791599 i9xx_hpd_irq_handler(dev_priv, hotplug_status);
....@@ -2181,28 +1601,26 @@
21811601 valleyview_pipestat_irq_handler(dev_priv, pipe_stats);
21821602 } while (0);
21831603
2184
- enable_rpm_wakeref_asserts(dev_priv);
1604
+ enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
21851605
21861606 return ret;
21871607 }
21881608
21891609 static irqreturn_t cherryview_irq_handler(int irq, void *arg)
21901610 {
2191
- struct drm_device *dev = arg;
2192
- struct drm_i915_private *dev_priv = to_i915(dev);
1611
+ struct drm_i915_private *dev_priv = arg;
21931612 irqreturn_t ret = IRQ_NONE;
21941613
21951614 if (!intel_irqs_enabled(dev_priv))
21961615 return IRQ_NONE;
21971616
21981617 /* IRQs are synced during runtime_suspend, we don't require a wakeref */
2199
- disable_rpm_wakeref_asserts(dev_priv);
1618
+ disable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
22001619
22011620 do {
22021621 u32 master_ctl, iir;
22031622 u32 pipe_stats[I915_MAX_PIPES] = {};
22041623 u32 hotplug_status = 0;
2205
- u32 gt_iir[4];
22061624 u32 ier = 0;
22071625
22081626 master_ctl = I915_READ(GEN8_MASTER_IRQ) & ~GEN8_MASTER_IRQ_CONTROL;
....@@ -2230,7 +1648,7 @@
22301648 ier = I915_READ(VLV_IER);
22311649 I915_WRITE(VLV_IER, 0);
22321650
2233
- gen8_gt_irq_ack(dev_priv, master_ctl, gt_iir);
1651
+ gen8_gt_irq_handler(&dev_priv->gt, master_ctl);
22341652
22351653 if (iir & I915_DISPLAY_PORT_INTERRUPT)
22361654 hotplug_status = i9xx_hpd_irq_ack(dev_priv);
....@@ -2254,22 +1672,19 @@
22541672 I915_WRITE(VLV_IER, ier);
22551673 I915_WRITE(GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL);
22561674
2257
- gen8_gt_irq_handler(dev_priv, master_ctl, gt_iir);
2258
-
22591675 if (hotplug_status)
22601676 i9xx_hpd_irq_handler(dev_priv, hotplug_status);
22611677
22621678 valleyview_pipestat_irq_handler(dev_priv, pipe_stats);
22631679 } while (0);
22641680
2265
- enable_rpm_wakeref_asserts(dev_priv);
1681
+ enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
22661682
22671683 return ret;
22681684 }
22691685
22701686 static void ibx_hpd_irq_handler(struct drm_i915_private *dev_priv,
2271
- u32 hotplug_trigger,
2272
- const u32 hpd[HPD_NUM_PINS])
1687
+ u32 hotplug_trigger)
22731688 {
22741689 u32 dig_hotplug_reg, pin_mask = 0, long_mask = 0;
22751690
....@@ -2292,8 +1707,9 @@
22921707 if (!hotplug_trigger)
22931708 return;
22941709
2295
- intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, hotplug_trigger,
2296
- dig_hotplug_reg, hpd,
1710
+ intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
1711
+ hotplug_trigger, dig_hotplug_reg,
1712
+ dev_priv->hotplug.pch_hpd,
22971713 pch_port_hotplug_long_detect);
22981714
22991715 intel_hpd_irq_handler(dev_priv, pin_mask, long_mask);
....@@ -2301,16 +1717,16 @@
23011717
23021718 static void ibx_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir)
23031719 {
2304
- int pipe;
1720
+ enum pipe pipe;
23051721 u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK;
23061722
2307
- ibx_hpd_irq_handler(dev_priv, hotplug_trigger, hpd_ibx);
1723
+ ibx_hpd_irq_handler(dev_priv, hotplug_trigger);
23081724
23091725 if (pch_iir & SDE_AUDIO_POWER_MASK) {
23101726 int port = ffs((pch_iir & SDE_AUDIO_POWER_MASK) >>
23111727 SDE_AUDIO_POWER_SHIFT);
2312
- DRM_DEBUG_DRIVER("PCH audio power change on port %d\n",
2313
- port_name(port));
1728
+ drm_dbg(&dev_priv->drm, "PCH audio power change on port %d\n",
1729
+ port_name(port));
23141730 }
23151731
23161732 if (pch_iir & SDE_AUX_MASK)
....@@ -2320,25 +1736,27 @@
23201736 gmbus_irq_handler(dev_priv);
23211737
23221738 if (pch_iir & SDE_AUDIO_HDCP_MASK)
2323
- DRM_DEBUG_DRIVER("PCH HDCP audio interrupt\n");
1739
+ drm_dbg(&dev_priv->drm, "PCH HDCP audio interrupt\n");
23241740
23251741 if (pch_iir & SDE_AUDIO_TRANS_MASK)
2326
- DRM_DEBUG_DRIVER("PCH transcoder audio interrupt\n");
1742
+ drm_dbg(&dev_priv->drm, "PCH transcoder audio interrupt\n");
23271743
23281744 if (pch_iir & SDE_POISON)
2329
- DRM_ERROR("PCH poison interrupt\n");
1745
+ drm_err(&dev_priv->drm, "PCH poison interrupt\n");
23301746
2331
- if (pch_iir & SDE_FDI_MASK)
1747
+ if (pch_iir & SDE_FDI_MASK) {
23321748 for_each_pipe(dev_priv, pipe)
2333
- DRM_DEBUG_DRIVER(" pipe %c FDI IIR: 0x%08x\n",
2334
- pipe_name(pipe),
2335
- I915_READ(FDI_RX_IIR(pipe)));
1749
+ drm_dbg(&dev_priv->drm, " pipe %c FDI IIR: 0x%08x\n",
1750
+ pipe_name(pipe),
1751
+ I915_READ(FDI_RX_IIR(pipe)));
1752
+ }
23361753
23371754 if (pch_iir & (SDE_TRANSB_CRC_DONE | SDE_TRANSA_CRC_DONE))
2338
- DRM_DEBUG_DRIVER("PCH transcoder CRC done interrupt\n");
1755
+ drm_dbg(&dev_priv->drm, "PCH transcoder CRC done interrupt\n");
23391756
23401757 if (pch_iir & (SDE_TRANSB_CRC_ERR | SDE_TRANSA_CRC_ERR))
2341
- DRM_DEBUG_DRIVER("PCH transcoder CRC error interrupt\n");
1758
+ drm_dbg(&dev_priv->drm,
1759
+ "PCH transcoder CRC error interrupt\n");
23421760
23431761 if (pch_iir & SDE_TRANSA_FIFO_UNDER)
23441762 intel_pch_fifo_underrun_irq_handler(dev_priv, PIPE_A);
....@@ -2353,7 +1771,7 @@
23531771 enum pipe pipe;
23541772
23551773 if (err_int & ERR_INT_POISON)
2356
- DRM_ERROR("Poison interrupt\n");
1774
+ drm_err(&dev_priv->drm, "Poison interrupt\n");
23571775
23581776 for_each_pipe(dev_priv, pipe) {
23591777 if (err_int & ERR_INT_FIFO_UNDERRUN(pipe))
....@@ -2376,7 +1794,7 @@
23761794 enum pipe pipe;
23771795
23781796 if (serr_int & SERR_INT_POISON)
2379
- DRM_ERROR("PCH poison interrupt\n");
1797
+ drm_err(&dev_priv->drm, "PCH poison interrupt\n");
23801798
23811799 for_each_pipe(dev_priv, pipe)
23821800 if (serr_int & SERR_INT_TRANS_FIFO_UNDERRUN(pipe))
....@@ -2387,16 +1805,16 @@
23871805
23881806 static void cpt_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir)
23891807 {
2390
- int pipe;
1808
+ enum pipe pipe;
23911809 u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK_CPT;
23921810
2393
- ibx_hpd_irq_handler(dev_priv, hotplug_trigger, hpd_cpt);
1811
+ ibx_hpd_irq_handler(dev_priv, hotplug_trigger);
23941812
23951813 if (pch_iir & SDE_AUDIO_POWER_MASK_CPT) {
23961814 int port = ffs((pch_iir & SDE_AUDIO_POWER_MASK_CPT) >>
23971815 SDE_AUDIO_POWER_SHIFT_CPT);
2398
- DRM_DEBUG_DRIVER("PCH audio power change on port %c\n",
2399
- port_name(port));
1816
+ drm_dbg(&dev_priv->drm, "PCH audio power change on port %c\n",
1817
+ port_name(port));
24001818 }
24011819
24021820 if (pch_iir & SDE_AUX_MASK_CPT)
....@@ -2406,16 +1824,17 @@
24061824 gmbus_irq_handler(dev_priv);
24071825
24081826 if (pch_iir & SDE_AUDIO_CP_REQ_CPT)
2409
- DRM_DEBUG_DRIVER("Audio CP request interrupt\n");
1827
+ drm_dbg(&dev_priv->drm, "Audio CP request interrupt\n");
24101828
24111829 if (pch_iir & SDE_AUDIO_CP_CHG_CPT)
2412
- DRM_DEBUG_DRIVER("Audio CP change interrupt\n");
1830
+ drm_dbg(&dev_priv->drm, "Audio CP change interrupt\n");
24131831
2414
- if (pch_iir & SDE_FDI_MASK_CPT)
1832
+ if (pch_iir & SDE_FDI_MASK_CPT) {
24151833 for_each_pipe(dev_priv, pipe)
2416
- DRM_DEBUG_DRIVER(" pipe %c FDI IIR: 0x%08x\n",
2417
- pipe_name(pipe),
2418
- I915_READ(FDI_RX_IIR(pipe)));
1834
+ drm_dbg(&dev_priv->drm, " pipe %c FDI IIR: 0x%08x\n",
1835
+ pipe_name(pipe),
1836
+ I915_READ(FDI_RX_IIR(pipe)));
1837
+ }
24191838
24201839 if (pch_iir & SDE_ERROR_CPT)
24211840 cpt_serr_int_handler(dev_priv);
....@@ -2423,9 +1842,26 @@
24231842
24241843 static void icp_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir)
24251844 {
2426
- u32 ddi_hotplug_trigger = pch_iir & SDE_DDI_MASK_ICP;
2427
- u32 tc_hotplug_trigger = pch_iir & SDE_TC_MASK_ICP;
1845
+ u32 ddi_hotplug_trigger, tc_hotplug_trigger;
24281846 u32 pin_mask = 0, long_mask = 0;
1847
+
1848
+ if (HAS_PCH_TGP(dev_priv)) {
1849
+ ddi_hotplug_trigger = pch_iir & SDE_DDI_MASK_TGP;
1850
+ tc_hotplug_trigger = pch_iir & SDE_TC_MASK_TGP;
1851
+ } else if (HAS_PCH_JSP(dev_priv)) {
1852
+ ddi_hotplug_trigger = pch_iir & SDE_DDI_MASK_TGP;
1853
+ tc_hotplug_trigger = 0;
1854
+ } else if (HAS_PCH_MCC(dev_priv)) {
1855
+ ddi_hotplug_trigger = pch_iir & SDE_DDI_MASK_ICP;
1856
+ tc_hotplug_trigger = pch_iir & SDE_TC_HOTPLUG_ICP(PORT_TC1);
1857
+ } else {
1858
+ drm_WARN(&dev_priv->drm, !HAS_PCH_ICP(dev_priv),
1859
+ "Unrecognized PCH type 0x%x\n",
1860
+ INTEL_PCH_TYPE(dev_priv));
1861
+
1862
+ ddi_hotplug_trigger = pch_iir & SDE_DDI_MASK_ICP;
1863
+ tc_hotplug_trigger = pch_iir & SDE_TC_MASK_ICP;
1864
+ }
24291865
24301866 if (ddi_hotplug_trigger) {
24311867 u32 dig_hotplug_reg;
....@@ -2434,8 +1870,8 @@
24341870 I915_WRITE(SHOTPLUG_CTL_DDI, dig_hotplug_reg);
24351871
24361872 intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
2437
- ddi_hotplug_trigger,
2438
- dig_hotplug_reg, hpd_icp,
1873
+ ddi_hotplug_trigger, dig_hotplug_reg,
1874
+ dev_priv->hotplug.pch_hpd,
24391875 icp_ddi_port_hotplug_long_detect);
24401876 }
24411877
....@@ -2446,8 +1882,8 @@
24461882 I915_WRITE(SHOTPLUG_CTL_TC, dig_hotplug_reg);
24471883
24481884 intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
2449
- tc_hotplug_trigger,
2450
- dig_hotplug_reg, hpd_icp,
1885
+ tc_hotplug_trigger, dig_hotplug_reg,
1886
+ dev_priv->hotplug.pch_hpd,
24511887 icp_tc_port_hotplug_long_detect);
24521888 }
24531889
....@@ -2472,7 +1908,8 @@
24721908 I915_WRITE(PCH_PORT_HOTPLUG, dig_hotplug_reg);
24731909
24741910 intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
2475
- hotplug_trigger, dig_hotplug_reg, hpd_spt,
1911
+ hotplug_trigger, dig_hotplug_reg,
1912
+ dev_priv->hotplug.pch_hpd,
24761913 spt_port_hotplug_long_detect);
24771914 }
24781915
....@@ -2483,7 +1920,8 @@
24831920 I915_WRITE(PCH_PORT_HOTPLUG2, dig_hotplug_reg);
24841921
24851922 intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
2486
- hotplug2_trigger, dig_hotplug_reg, hpd_spt,
1923
+ hotplug2_trigger, dig_hotplug_reg,
1924
+ dev_priv->hotplug.pch_hpd,
24871925 spt_port_hotplug2_long_detect);
24881926 }
24891927
....@@ -2495,16 +1933,16 @@
24951933 }
24961934
24971935 static void ilk_hpd_irq_handler(struct drm_i915_private *dev_priv,
2498
- u32 hotplug_trigger,
2499
- const u32 hpd[HPD_NUM_PINS])
1936
+ u32 hotplug_trigger)
25001937 {
25011938 u32 dig_hotplug_reg, pin_mask = 0, long_mask = 0;
25021939
25031940 dig_hotplug_reg = I915_READ(DIGITAL_PORT_HOTPLUG_CNTRL);
25041941 I915_WRITE(DIGITAL_PORT_HOTPLUG_CNTRL, dig_hotplug_reg);
25051942
2506
- intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, hotplug_trigger,
2507
- dig_hotplug_reg, hpd,
1943
+ intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
1944
+ hotplug_trigger, dig_hotplug_reg,
1945
+ dev_priv->hotplug.hpd,
25081946 ilk_port_hotplug_long_detect);
25091947
25101948 intel_hpd_irq_handler(dev_priv, pin_mask, long_mask);
....@@ -2517,7 +1955,7 @@
25171955 u32 hotplug_trigger = de_iir & DE_DP_A_HOTPLUG;
25181956
25191957 if (hotplug_trigger)
2520
- ilk_hpd_irq_handler(dev_priv, hotplug_trigger, hpd_ilk);
1958
+ ilk_hpd_irq_handler(dev_priv, hotplug_trigger);
25211959
25221960 if (de_iir & DE_AUX_CHANNEL_A)
25231961 dp_aux_irq_handler(dev_priv);
....@@ -2526,11 +1964,11 @@
25261964 intel_opregion_asle_intr(dev_priv);
25271965
25281966 if (de_iir & DE_POISON)
2529
- DRM_ERROR("Poison interrupt\n");
1967
+ drm_err(&dev_priv->drm, "Poison interrupt\n");
25301968
25311969 for_each_pipe(dev_priv, pipe) {
25321970 if (de_iir & DE_PIPE_VBLANK(pipe))
2533
- drm_handle_vblank(&dev_priv->drm, pipe);
1971
+ intel_handle_vblank(dev_priv, pipe);
25341972
25351973 if (de_iir & DE_PIPE_FIFO_UNDERRUN(pipe))
25361974 intel_cpu_fifo_underrun_irq_handler(dev_priv, pipe);
....@@ -2552,8 +1990,8 @@
25521990 I915_WRITE(SDEIIR, pch_iir);
25531991 }
25541992
2555
- if (IS_GEN5(dev_priv) && de_iir & DE_PCU_EVENT)
2556
- ironlake_rps_change_irq_handler(dev_priv);
1993
+ if (IS_GEN(dev_priv, 5) && de_iir & DE_PCU_EVENT)
1994
+ gen5_rps_irq_handler(&dev_priv->gt.rps);
25571995 }
25581996
25591997 static void ivb_display_irq_handler(struct drm_i915_private *dev_priv,
....@@ -2563,7 +2001,7 @@
25632001 u32 hotplug_trigger = de_iir & DE_DP_A_HOTPLUG_IVB;
25642002
25652003 if (hotplug_trigger)
2566
- ilk_hpd_irq_handler(dev_priv, hotplug_trigger, hpd_ivb);
2004
+ ilk_hpd_irq_handler(dev_priv, hotplug_trigger);
25672005
25682006 if (de_iir & DE_ERR_INT_IVB)
25692007 ivb_err_int_handler(dev_priv);
....@@ -2583,7 +2021,7 @@
25832021
25842022 for_each_pipe(dev_priv, pipe) {
25852023 if (de_iir & (DE_PIPE_VBLANK_IVB(pipe)))
2586
- drm_handle_vblank(&dev_priv->drm, pipe);
2024
+ intel_handle_vblank(dev_priv, pipe);
25872025 }
25882026
25892027 /* check event from PCH */
....@@ -2605,85 +2043,85 @@
26052043 * 4 - Process the interrupt(s) that had bits set in the IIRs.
26062044 * 5 - Re-enable Master Interrupt Control.
26072045 */
2608
-static irqreturn_t ironlake_irq_handler(int irq, void *arg)
2046
+static irqreturn_t ilk_irq_handler(int irq, void *arg)
26092047 {
2610
- struct drm_device *dev = arg;
2611
- struct drm_i915_private *dev_priv = to_i915(dev);
2048
+ struct drm_i915_private *i915 = arg;
2049
+ void __iomem * const regs = i915->uncore.regs;
26122050 u32 de_iir, gt_iir, de_ier, sde_ier = 0;
26132051 irqreturn_t ret = IRQ_NONE;
26142052
2615
- if (!intel_irqs_enabled(dev_priv))
2053
+ if (unlikely(!intel_irqs_enabled(i915)))
26162054 return IRQ_NONE;
26172055
26182056 /* IRQs are synced during runtime_suspend, we don't require a wakeref */
2619
- disable_rpm_wakeref_asserts(dev_priv);
2057
+ disable_rpm_wakeref_asserts(&i915->runtime_pm);
26202058
26212059 /* disable master interrupt before clearing iir */
2622
- de_ier = I915_READ(DEIER);
2623
- I915_WRITE(DEIER, de_ier & ~DE_MASTER_IRQ_CONTROL);
2060
+ de_ier = raw_reg_read(regs, DEIER);
2061
+ raw_reg_write(regs, DEIER, de_ier & ~DE_MASTER_IRQ_CONTROL);
26242062
26252063 /* Disable south interrupts. We'll only write to SDEIIR once, so further
26262064 * interrupts will will be stored on its back queue, and then we'll be
26272065 * able to process them after we restore SDEIER (as soon as we restore
26282066 * it, we'll get an interrupt if SDEIIR still has something to process
26292067 * due to its back queue). */
2630
- if (!HAS_PCH_NOP(dev_priv)) {
2631
- sde_ier = I915_READ(SDEIER);
2632
- I915_WRITE(SDEIER, 0);
2068
+ if (!HAS_PCH_NOP(i915)) {
2069
+ sde_ier = raw_reg_read(regs, SDEIER);
2070
+ raw_reg_write(regs, SDEIER, 0);
26332071 }
26342072
26352073 /* Find, clear, then process each source of interrupt */
26362074
2637
- gt_iir = I915_READ(GTIIR);
2075
+ gt_iir = raw_reg_read(regs, GTIIR);
26382076 if (gt_iir) {
2639
- I915_WRITE(GTIIR, gt_iir);
2640
- ret = IRQ_HANDLED;
2641
- if (INTEL_GEN(dev_priv) >= 6)
2642
- snb_gt_irq_handler(dev_priv, gt_iir);
2077
+ raw_reg_write(regs, GTIIR, gt_iir);
2078
+ if (INTEL_GEN(i915) >= 6)
2079
+ gen6_gt_irq_handler(&i915->gt, gt_iir);
26432080 else
2644
- ilk_gt_irq_handler(dev_priv, gt_iir);
2081
+ gen5_gt_irq_handler(&i915->gt, gt_iir);
2082
+ ret = IRQ_HANDLED;
26452083 }
26462084
2647
- de_iir = I915_READ(DEIIR);
2085
+ de_iir = raw_reg_read(regs, DEIIR);
26482086 if (de_iir) {
2649
- I915_WRITE(DEIIR, de_iir);
2650
- ret = IRQ_HANDLED;
2651
- if (INTEL_GEN(dev_priv) >= 7)
2652
- ivb_display_irq_handler(dev_priv, de_iir);
2087
+ raw_reg_write(regs, DEIIR, de_iir);
2088
+ if (INTEL_GEN(i915) >= 7)
2089
+ ivb_display_irq_handler(i915, de_iir);
26532090 else
2654
- ilk_display_irq_handler(dev_priv, de_iir);
2091
+ ilk_display_irq_handler(i915, de_iir);
2092
+ ret = IRQ_HANDLED;
26552093 }
26562094
2657
- if (INTEL_GEN(dev_priv) >= 6) {
2658
- u32 pm_iir = I915_READ(GEN6_PMIIR);
2095
+ if (INTEL_GEN(i915) >= 6) {
2096
+ u32 pm_iir = raw_reg_read(regs, GEN6_PMIIR);
26592097 if (pm_iir) {
2660
- I915_WRITE(GEN6_PMIIR, pm_iir);
2098
+ raw_reg_write(regs, GEN6_PMIIR, pm_iir);
2099
+ gen6_rps_irq_handler(&i915->gt.rps, pm_iir);
26612100 ret = IRQ_HANDLED;
2662
- gen6_rps_irq_handler(dev_priv, pm_iir);
26632101 }
26642102 }
26652103
2666
- I915_WRITE(DEIER, de_ier);
2667
- if (!HAS_PCH_NOP(dev_priv))
2668
- I915_WRITE(SDEIER, sde_ier);
2104
+ raw_reg_write(regs, DEIER, de_ier);
2105
+ if (sde_ier)
2106
+ raw_reg_write(regs, SDEIER, sde_ier);
26692107
26702108 /* IRQs are synced during runtime_suspend, we don't require a wakeref */
2671
- enable_rpm_wakeref_asserts(dev_priv);
2109
+ enable_rpm_wakeref_asserts(&i915->runtime_pm);
26722110
26732111 return ret;
26742112 }
26752113
26762114 static void bxt_hpd_irq_handler(struct drm_i915_private *dev_priv,
2677
- u32 hotplug_trigger,
2678
- const u32 hpd[HPD_NUM_PINS])
2115
+ u32 hotplug_trigger)
26792116 {
26802117 u32 dig_hotplug_reg, pin_mask = 0, long_mask = 0;
26812118
26822119 dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG);
26832120 I915_WRITE(PCH_PORT_HOTPLUG, dig_hotplug_reg);
26842121
2685
- intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, hotplug_trigger,
2686
- dig_hotplug_reg, hpd,
2122
+ intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
2123
+ hotplug_trigger, dig_hotplug_reg,
2124
+ dev_priv->hotplug.hpd,
26872125 bxt_port_hotplug_long_detect);
26882126
26892127 intel_hpd_irq_handler(dev_priv, pin_mask, long_mask);
....@@ -2701,8 +2139,9 @@
27012139 dig_hotplug_reg = I915_READ(GEN11_TC_HOTPLUG_CTL);
27022140 I915_WRITE(GEN11_TC_HOTPLUG_CTL, dig_hotplug_reg);
27032141
2704
- intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, trigger_tc,
2705
- dig_hotplug_reg, hpd_gen11,
2142
+ intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
2143
+ trigger_tc, dig_hotplug_reg,
2144
+ dev_priv->hotplug.hpd,
27062145 gen11_port_hotplug_long_detect);
27072146 }
27082147
....@@ -2712,15 +2151,92 @@
27122151 dig_hotplug_reg = I915_READ(GEN11_TBT_HOTPLUG_CTL);
27132152 I915_WRITE(GEN11_TBT_HOTPLUG_CTL, dig_hotplug_reg);
27142153
2715
- intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, trigger_tbt,
2716
- dig_hotplug_reg, hpd_gen11,
2154
+ intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
2155
+ trigger_tbt, dig_hotplug_reg,
2156
+ dev_priv->hotplug.hpd,
27172157 gen11_port_hotplug_long_detect);
27182158 }
27192159
27202160 if (pin_mask)
27212161 intel_hpd_irq_handler(dev_priv, pin_mask, long_mask);
27222162 else
2723
- DRM_ERROR("Unexpected DE HPD interrupt 0x%08x\n", iir);
2163
+ drm_err(&dev_priv->drm,
2164
+ "Unexpected DE HPD interrupt 0x%08x\n", iir);
2165
+}
2166
+
2167
+static u32 gen8_de_port_aux_mask(struct drm_i915_private *dev_priv)
2168
+{
2169
+ u32 mask;
2170
+
2171
+ if (INTEL_GEN(dev_priv) >= 12)
2172
+ return TGL_DE_PORT_AUX_DDIA |
2173
+ TGL_DE_PORT_AUX_DDIB |
2174
+ TGL_DE_PORT_AUX_DDIC |
2175
+ TGL_DE_PORT_AUX_USBC1 |
2176
+ TGL_DE_PORT_AUX_USBC2 |
2177
+ TGL_DE_PORT_AUX_USBC3 |
2178
+ TGL_DE_PORT_AUX_USBC4 |
2179
+ TGL_DE_PORT_AUX_USBC5 |
2180
+ TGL_DE_PORT_AUX_USBC6;
2181
+
2182
+
2183
+ mask = GEN8_AUX_CHANNEL_A;
2184
+ if (INTEL_GEN(dev_priv) >= 9)
2185
+ mask |= GEN9_AUX_CHANNEL_B |
2186
+ GEN9_AUX_CHANNEL_C |
2187
+ GEN9_AUX_CHANNEL_D;
2188
+
2189
+ if (IS_CNL_WITH_PORT_F(dev_priv) || IS_GEN(dev_priv, 11))
2190
+ mask |= CNL_AUX_CHANNEL_F;
2191
+
2192
+ if (IS_GEN(dev_priv, 11))
2193
+ mask |= ICL_AUX_CHANNEL_E;
2194
+
2195
+ return mask;
2196
+}
2197
+
2198
+static u32 gen8_de_pipe_fault_mask(struct drm_i915_private *dev_priv)
2199
+{
2200
+ if (IS_ROCKETLAKE(dev_priv))
2201
+ return RKL_DE_PIPE_IRQ_FAULT_ERRORS;
2202
+ else if (INTEL_GEN(dev_priv) >= 11)
2203
+ return GEN11_DE_PIPE_IRQ_FAULT_ERRORS;
2204
+ else if (INTEL_GEN(dev_priv) >= 9)
2205
+ return GEN9_DE_PIPE_IRQ_FAULT_ERRORS;
2206
+ else
2207
+ return GEN8_DE_PIPE_IRQ_FAULT_ERRORS;
2208
+}
2209
+
2210
+static void
2211
+gen8_de_misc_irq_handler(struct drm_i915_private *dev_priv, u32 iir)
2212
+{
2213
+ bool found = false;
2214
+
2215
+ if (iir & GEN8_DE_MISC_GSE) {
2216
+ intel_opregion_asle_intr(dev_priv);
2217
+ found = true;
2218
+ }
2219
+
2220
+ if (iir & GEN8_DE_EDP_PSR) {
2221
+ u32 psr_iir;
2222
+ i915_reg_t iir_reg;
2223
+
2224
+ if (INTEL_GEN(dev_priv) >= 12)
2225
+ iir_reg = TRANS_PSR_IIR(dev_priv->psr.transcoder);
2226
+ else
2227
+ iir_reg = EDP_PSR_IIR;
2228
+
2229
+ psr_iir = I915_READ(iir_reg);
2230
+ I915_WRITE(iir_reg, psr_iir);
2231
+
2232
+ if (psr_iir)
2233
+ found = true;
2234
+
2235
+ intel_psr_irq_handler(dev_priv, psr_iir);
2236
+ }
2237
+
2238
+ if (!found)
2239
+ drm_err(&dev_priv->drm, "Unexpected DE Misc interrupt\n");
27242240 }
27252241
27262242 static irqreturn_t
....@@ -2733,29 +2249,13 @@
27332249 if (master_ctl & GEN8_DE_MISC_IRQ) {
27342250 iir = I915_READ(GEN8_DE_MISC_IIR);
27352251 if (iir) {
2736
- bool found = false;
2737
-
27382252 I915_WRITE(GEN8_DE_MISC_IIR, iir);
27392253 ret = IRQ_HANDLED;
2740
-
2741
- if (iir & GEN8_DE_MISC_GSE) {
2742
- intel_opregion_asle_intr(dev_priv);
2743
- found = true;
2744
- }
2745
-
2746
- if (iir & GEN8_DE_EDP_PSR) {
2747
- u32 psr_iir = I915_READ(EDP_PSR_IIR);
2748
-
2749
- intel_psr_irq_handler(dev_priv, psr_iir);
2750
- I915_WRITE(EDP_PSR_IIR, psr_iir);
2751
- found = true;
2752
- }
2753
-
2754
- if (!found)
2755
- DRM_ERROR("Unexpected DE Misc interrupt\n");
2254
+ gen8_de_misc_irq_handler(dev_priv, iir);
2255
+ } else {
2256
+ drm_err(&dev_priv->drm,
2257
+ "The master control interrupt lied (DE MISC)!\n");
27562258 }
2757
- else
2758
- DRM_ERROR("The master control interrupt lied (DE MISC)!\n");
27592259 }
27602260
27612261 if (INTEL_GEN(dev_priv) >= 11 && (master_ctl & GEN11_DE_HPD_IRQ)) {
....@@ -2765,7 +2265,8 @@
27652265 ret = IRQ_HANDLED;
27662266 gen11_hpd_irq_handler(dev_priv, iir);
27672267 } else {
2768
- DRM_ERROR("The master control interrupt lied, (DE HPD)!\n");
2268
+ drm_err(&dev_priv->drm,
2269
+ "The master control interrupt lied, (DE HPD)!\n");
27692270 }
27702271 }
27712272
....@@ -2778,20 +2279,7 @@
27782279 I915_WRITE(GEN8_DE_PORT_IIR, iir);
27792280 ret = IRQ_HANDLED;
27802281
2781
- tmp_mask = GEN8_AUX_CHANNEL_A;
2782
- if (INTEL_GEN(dev_priv) >= 9)
2783
- tmp_mask |= GEN9_AUX_CHANNEL_B |
2784
- GEN9_AUX_CHANNEL_C |
2785
- GEN9_AUX_CHANNEL_D;
2786
-
2787
- if (INTEL_GEN(dev_priv) >= 11)
2788
- tmp_mask |= ICL_AUX_CHANNEL_E;
2789
-
2790
- if (IS_CNL_WITH_PORT_F(dev_priv) ||
2791
- INTEL_GEN(dev_priv) >= 11)
2792
- tmp_mask |= CNL_AUX_CHANNEL_F;
2793
-
2794
- if (iir & tmp_mask) {
2282
+ if (iir & gen8_de_port_aux_mask(dev_priv)) {
27952283 dp_aux_irq_handler(dev_priv);
27962284 found = true;
27972285 }
....@@ -2799,15 +2287,13 @@
27992287 if (IS_GEN9_LP(dev_priv)) {
28002288 tmp_mask = iir & BXT_DE_PORT_HOTPLUG_MASK;
28012289 if (tmp_mask) {
2802
- bxt_hpd_irq_handler(dev_priv, tmp_mask,
2803
- hpd_bxt);
2290
+ bxt_hpd_irq_handler(dev_priv, tmp_mask);
28042291 found = true;
28052292 }
28062293 } else if (IS_BROADWELL(dev_priv)) {
28072294 tmp_mask = iir & GEN8_PORT_DP_A_HOTPLUG;
28082295 if (tmp_mask) {
2809
- ilk_hpd_irq_handler(dev_priv,
2810
- tmp_mask, hpd_bdw);
2296
+ ilk_hpd_irq_handler(dev_priv, tmp_mask);
28112297 found = true;
28122298 }
28132299 }
....@@ -2818,10 +2304,12 @@
28182304 }
28192305
28202306 if (!found)
2821
- DRM_ERROR("Unexpected DE Port interrupt\n");
2307
+ drm_err(&dev_priv->drm,
2308
+ "Unexpected DE Port interrupt\n");
28222309 }
28232310 else
2824
- DRM_ERROR("The master control interrupt lied (DE PORT)!\n");
2311
+ drm_err(&dev_priv->drm,
2312
+ "The master control interrupt lied (DE PORT)!\n");
28252313 }
28262314
28272315 for_each_pipe(dev_priv, pipe) {
....@@ -2832,7 +2320,8 @@
28322320
28332321 iir = I915_READ(GEN8_DE_PIPE_IIR(pipe));
28342322 if (!iir) {
2835
- DRM_ERROR("The master control interrupt lied (DE PIPE)!\n");
2323
+ drm_err(&dev_priv->drm,
2324
+ "The master control interrupt lied (DE PIPE)!\n");
28362325 continue;
28372326 }
28382327
....@@ -2840,7 +2329,7 @@
28402329 I915_WRITE(GEN8_DE_PIPE_IIR(pipe), iir);
28412330
28422331 if (iir & GEN8_PIPE_VBLANK)
2843
- drm_handle_vblank(&dev_priv->drm, pipe);
2332
+ intel_handle_vblank(dev_priv, pipe);
28442333
28452334 if (iir & GEN8_PIPE_CDCLK_CRC_DONE)
28462335 hsw_pipe_crc_irq_handler(dev_priv, pipe);
....@@ -2848,16 +2337,12 @@
28482337 if (iir & GEN8_PIPE_FIFO_UNDERRUN)
28492338 intel_cpu_fifo_underrun_irq_handler(dev_priv, pipe);
28502339
2851
- fault_errors = iir;
2852
- if (INTEL_GEN(dev_priv) >= 9)
2853
- fault_errors &= GEN9_DE_PIPE_IRQ_FAULT_ERRORS;
2854
- else
2855
- fault_errors &= GEN8_DE_PIPE_IRQ_FAULT_ERRORS;
2856
-
2340
+ fault_errors = iir & gen8_de_pipe_fault_mask(dev_priv);
28572341 if (fault_errors)
2858
- DRM_ERROR("Fault errors on pipe %c: 0x%08x\n",
2859
- pipe_name(pipe),
2860
- fault_errors);
2342
+ drm_err(&dev_priv->drm,
2343
+ "Fault errors on pipe %c: 0x%08x\n",
2344
+ pipe_name(pipe),
2345
+ fault_errors);
28612346 }
28622347
28632348 if (HAS_PCH_SPLIT(dev_priv) && !HAS_PCH_NOP(dev_priv) &&
....@@ -2872,11 +2357,9 @@
28722357 I915_WRITE(SDEIIR, iir);
28732358 ret = IRQ_HANDLED;
28742359
2875
- if (HAS_PCH_ICP(dev_priv))
2360
+ if (INTEL_PCH_TYPE(dev_priv) >= PCH_ICP)
28762361 icp_irq_handler(dev_priv, iir);
2877
- else if (HAS_PCH_SPT(dev_priv) ||
2878
- HAS_PCH_KBP(dev_priv) ||
2879
- HAS_PCH_CNP(dev_priv))
2362
+ else if (INTEL_PCH_TYPE(dev_priv) >= PCH_SPT)
28802363 spt_irq_handler(dev_priv, iir);
28812364 else
28822365 cpt_irq_handler(dev_priv, iir);
....@@ -2885,218 +2368,66 @@
28852368 * Like on previous PCH there seems to be something
28862369 * fishy going on with forwarding PCH interrupts.
28872370 */
2888
- DRM_DEBUG_DRIVER("The master control interrupt lied (SDE)!\n");
2371
+ drm_dbg(&dev_priv->drm,
2372
+ "The master control interrupt lied (SDE)!\n");
28892373 }
28902374 }
28912375
28922376 return ret;
28932377 }
28942378
2379
+static inline u32 gen8_master_intr_disable(void __iomem * const regs)
2380
+{
2381
+ raw_reg_write(regs, GEN8_MASTER_IRQ, 0);
2382
+
2383
+ /*
2384
+ * Now with master disabled, get a sample of level indications
2385
+ * for this interrupt. Indications will be cleared on related acks.
2386
+ * New indications can and will light up during processing,
2387
+ * and will generate new interrupt after enabling master.
2388
+ */
2389
+ return raw_reg_read(regs, GEN8_MASTER_IRQ);
2390
+}
2391
+
2392
+static inline void gen8_master_intr_enable(void __iomem * const regs)
2393
+{
2394
+ raw_reg_write(regs, GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL);
2395
+}
2396
+
28952397 static irqreturn_t gen8_irq_handler(int irq, void *arg)
28962398 {
2897
- struct drm_i915_private *dev_priv = to_i915(arg);
2399
+ struct drm_i915_private *dev_priv = arg;
2400
+ void __iomem * const regs = dev_priv->uncore.regs;
28982401 u32 master_ctl;
2899
- u32 gt_iir[4];
29002402
29012403 if (!intel_irqs_enabled(dev_priv))
29022404 return IRQ_NONE;
29032405
2904
- master_ctl = I915_READ_FW(GEN8_MASTER_IRQ);
2905
- master_ctl &= ~GEN8_MASTER_IRQ_CONTROL;
2906
- if (!master_ctl)
2406
+ master_ctl = gen8_master_intr_disable(regs);
2407
+ if (!master_ctl) {
2408
+ gen8_master_intr_enable(regs);
29072409 return IRQ_NONE;
2410
+ }
29082411
2909
- I915_WRITE_FW(GEN8_MASTER_IRQ, 0);
2910
-
2911
- /* Find, clear, then process each source of interrupt */
2912
- gen8_gt_irq_ack(dev_priv, master_ctl, gt_iir);
2412
+ /* Find, queue (onto bottom-halves), then clear each source */
2413
+ gen8_gt_irq_handler(&dev_priv->gt, master_ctl);
29132414
29142415 /* IRQs are synced during runtime_suspend, we don't require a wakeref */
29152416 if (master_ctl & ~GEN8_GT_IRQS) {
2916
- disable_rpm_wakeref_asserts(dev_priv);
2417
+ disable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
29172418 gen8_de_irq_handler(dev_priv, master_ctl);
2918
- enable_rpm_wakeref_asserts(dev_priv);
2419
+ enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
29192420 }
29202421
2921
- I915_WRITE_FW(GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL);
2922
-
2923
- gen8_gt_irq_handler(dev_priv, master_ctl, gt_iir);
2422
+ gen8_master_intr_enable(regs);
29242423
29252424 return IRQ_HANDLED;
29262425 }
29272426
2928
-struct wedge_me {
2929
- struct delayed_work work;
2930
- struct drm_i915_private *i915;
2931
- const char *name;
2932
-};
2933
-
2934
-static void wedge_me(struct work_struct *work)
2935
-{
2936
- struct wedge_me *w = container_of(work, typeof(*w), work.work);
2937
-
2938
- dev_err(w->i915->drm.dev,
2939
- "%s timed out, cancelling all in-flight rendering.\n",
2940
- w->name);
2941
- i915_gem_set_wedged(w->i915);
2942
-}
2943
-
2944
-static void __init_wedge(struct wedge_me *w,
2945
- struct drm_i915_private *i915,
2946
- long timeout,
2947
- const char *name)
2948
-{
2949
- w->i915 = i915;
2950
- w->name = name;
2951
-
2952
- INIT_DELAYED_WORK_ONSTACK(&w->work, wedge_me);
2953
- schedule_delayed_work(&w->work, timeout);
2954
-}
2955
-
2956
-static void __fini_wedge(struct wedge_me *w)
2957
-{
2958
- cancel_delayed_work_sync(&w->work);
2959
- destroy_delayed_work_on_stack(&w->work);
2960
- w->i915 = NULL;
2961
-}
2962
-
2963
-#define i915_wedge_on_timeout(W, DEV, TIMEOUT) \
2964
- for (__init_wedge((W), (DEV), (TIMEOUT), __func__); \
2965
- (W)->i915; \
2966
- __fini_wedge((W)))
2967
-
29682427 static u32
2969
-gen11_gt_engine_identity(struct drm_i915_private * const i915,
2970
- const unsigned int bank, const unsigned int bit)
2428
+gen11_gu_misc_irq_ack(struct intel_gt *gt, const u32 master_ctl)
29712429 {
2972
- void __iomem * const regs = i915->regs;
2973
- u32 timeout_ts;
2974
- u32 ident;
2975
-
2976
- lockdep_assert_held(&i915->irq_lock);
2977
-
2978
- raw_reg_write(regs, GEN11_IIR_REG_SELECTOR(bank), BIT(bit));
2979
-
2980
- /*
2981
- * NB: Specs do not specify how long to spin wait,
2982
- * so we do ~100us as an educated guess.
2983
- */
2984
- timeout_ts = (local_clock() >> 10) + 100;
2985
- do {
2986
- ident = raw_reg_read(regs, GEN11_INTR_IDENTITY_REG(bank));
2987
- } while (!(ident & GEN11_INTR_DATA_VALID) &&
2988
- !time_after32(local_clock() >> 10, timeout_ts));
2989
-
2990
- if (unlikely(!(ident & GEN11_INTR_DATA_VALID))) {
2991
- DRM_ERROR("INTR_IDENTITY_REG%u:%u 0x%08x not valid!\n",
2992
- bank, bit, ident);
2993
- return 0;
2994
- }
2995
-
2996
- raw_reg_write(regs, GEN11_INTR_IDENTITY_REG(bank),
2997
- GEN11_INTR_DATA_VALID);
2998
-
2999
- return ident;
3000
-}
3001
-
3002
-static void
3003
-gen11_other_irq_handler(struct drm_i915_private * const i915,
3004
- const u8 instance, const u16 iir)
3005
-{
3006
- if (instance == OTHER_GTPM_INSTANCE)
3007
- return gen6_rps_irq_handler(i915, iir);
3008
-
3009
- WARN_ONCE(1, "unhandled other interrupt instance=0x%x, iir=0x%x\n",
3010
- instance, iir);
3011
-}
3012
-
3013
-static void
3014
-gen11_engine_irq_handler(struct drm_i915_private * const i915,
3015
- const u8 class, const u8 instance, const u16 iir)
3016
-{
3017
- struct intel_engine_cs *engine;
3018
-
3019
- if (instance <= MAX_ENGINE_INSTANCE)
3020
- engine = i915->engine_class[class][instance];
3021
- else
3022
- engine = NULL;
3023
-
3024
- if (likely(engine))
3025
- return gen8_cs_irq_handler(engine, iir);
3026
-
3027
- WARN_ONCE(1, "unhandled engine interrupt class=0x%x, instance=0x%x\n",
3028
- class, instance);
3029
-}
3030
-
3031
-static void
3032
-gen11_gt_identity_handler(struct drm_i915_private * const i915,
3033
- const u32 identity)
3034
-{
3035
- const u8 class = GEN11_INTR_ENGINE_CLASS(identity);
3036
- const u8 instance = GEN11_INTR_ENGINE_INSTANCE(identity);
3037
- const u16 intr = GEN11_INTR_ENGINE_INTR(identity);
3038
-
3039
- if (unlikely(!intr))
3040
- return;
3041
-
3042
- if (class <= COPY_ENGINE_CLASS)
3043
- return gen11_engine_irq_handler(i915, class, instance, intr);
3044
-
3045
- if (class == OTHER_CLASS)
3046
- return gen11_other_irq_handler(i915, instance, intr);
3047
-
3048
- WARN_ONCE(1, "unknown interrupt class=0x%x, instance=0x%x, intr=0x%x\n",
3049
- class, instance, intr);
3050
-}
3051
-
3052
-static void
3053
-gen11_gt_bank_handler(struct drm_i915_private * const i915,
3054
- const unsigned int bank)
3055
-{
3056
- void __iomem * const regs = i915->regs;
3057
- unsigned long intr_dw;
3058
- unsigned int bit;
3059
-
3060
- lockdep_assert_held(&i915->irq_lock);
3061
-
3062
- intr_dw = raw_reg_read(regs, GEN11_GT_INTR_DW(bank));
3063
-
3064
- if (unlikely(!intr_dw)) {
3065
- DRM_ERROR("GT_INTR_DW%u blank!\n", bank);
3066
- return;
3067
- }
3068
-
3069
- for_each_set_bit(bit, &intr_dw, 32) {
3070
- const u32 ident = gen11_gt_engine_identity(i915,
3071
- bank, bit);
3072
-
3073
- gen11_gt_identity_handler(i915, ident);
3074
- }
3075
-
3076
- /* Clear must be after shared has been served for engine */
3077
- raw_reg_write(regs, GEN11_GT_INTR_DW(bank), intr_dw);
3078
-}
3079
-
3080
-static void
3081
-gen11_gt_irq_handler(struct drm_i915_private * const i915,
3082
- const u32 master_ctl)
3083
-{
3084
- unsigned int bank;
3085
-
3086
- spin_lock(&i915->irq_lock);
3087
-
3088
- for (bank = 0; bank < 2; bank++) {
3089
- if (master_ctl & GEN11_GT_DW_IRQ(bank))
3090
- gen11_gt_bank_handler(i915, bank);
3091
- }
3092
-
3093
- spin_unlock(&i915->irq_lock);
3094
-}
3095
-
3096
-static u32
3097
-gen11_gu_misc_irq_ack(struct drm_i915_private *dev_priv, const u32 master_ctl)
3098
-{
3099
- void __iomem * const regs = dev_priv->regs;
2430
+ void __iomem * const regs = gt->uncore->regs;
31002431 u32 iir;
31012432
31022433 if (!(master_ctl & GEN11_GU_MISC_IRQ))
....@@ -3110,242 +2441,138 @@
31102441 }
31112442
31122443 static void
3113
-gen11_gu_misc_irq_handler(struct drm_i915_private *dev_priv, const u32 iir)
2444
+gen11_gu_misc_irq_handler(struct intel_gt *gt, const u32 iir)
31142445 {
31152446 if (iir & GEN11_GU_MISC_GSE)
3116
- intel_opregion_asle_intr(dev_priv);
2447
+ intel_opregion_asle_intr(gt->i915);
31172448 }
31182449
3119
-static irqreturn_t gen11_irq_handler(int irq, void *arg)
2450
+static inline u32 gen11_master_intr_disable(void __iomem * const regs)
31202451 {
3121
- struct drm_i915_private * const i915 = to_i915(arg);
3122
- void __iomem * const regs = i915->regs;
2452
+ raw_reg_write(regs, GEN11_GFX_MSTR_IRQ, 0);
2453
+
2454
+ /*
2455
+ * Now with master disabled, get a sample of level indications
2456
+ * for this interrupt. Indications will be cleared on related acks.
2457
+ * New indications can and will light up during processing,
2458
+ * and will generate new interrupt after enabling master.
2459
+ */
2460
+ return raw_reg_read(regs, GEN11_GFX_MSTR_IRQ);
2461
+}
2462
+
2463
+static inline void gen11_master_intr_enable(void __iomem * const regs)
2464
+{
2465
+ raw_reg_write(regs, GEN11_GFX_MSTR_IRQ, GEN11_MASTER_IRQ);
2466
+}
2467
+
2468
+static void
2469
+gen11_display_irq_handler(struct drm_i915_private *i915)
2470
+{
2471
+ void __iomem * const regs = i915->uncore.regs;
2472
+ const u32 disp_ctl = raw_reg_read(regs, GEN11_DISPLAY_INT_CTL);
2473
+
2474
+ disable_rpm_wakeref_asserts(&i915->runtime_pm);
2475
+ /*
2476
+ * GEN11_DISPLAY_INT_CTL has same format as GEN8_MASTER_IRQ
2477
+ * for the display related bits.
2478
+ */
2479
+ raw_reg_write(regs, GEN11_DISPLAY_INT_CTL, 0x0);
2480
+ gen8_de_irq_handler(i915, disp_ctl);
2481
+ raw_reg_write(regs, GEN11_DISPLAY_INT_CTL,
2482
+ GEN11_DISPLAY_IRQ_ENABLE);
2483
+
2484
+ enable_rpm_wakeref_asserts(&i915->runtime_pm);
2485
+}
2486
+
2487
+static __always_inline irqreturn_t
2488
+__gen11_irq_handler(struct drm_i915_private * const i915,
2489
+ u32 (*intr_disable)(void __iomem * const regs),
2490
+ void (*intr_enable)(void __iomem * const regs))
2491
+{
2492
+ void __iomem * const regs = i915->uncore.regs;
2493
+ struct intel_gt *gt = &i915->gt;
31232494 u32 master_ctl;
31242495 u32 gu_misc_iir;
31252496
31262497 if (!intel_irqs_enabled(i915))
31272498 return IRQ_NONE;
31282499
3129
- master_ctl = raw_reg_read(regs, GEN11_GFX_MSTR_IRQ);
3130
- master_ctl &= ~GEN11_MASTER_IRQ;
3131
- if (!master_ctl)
2500
+ master_ctl = intr_disable(regs);
2501
+ if (!master_ctl) {
2502
+ intr_enable(regs);
31322503 return IRQ_NONE;
3133
-
3134
- /* Disable interrupts. */
3135
- raw_reg_write(regs, GEN11_GFX_MSTR_IRQ, 0);
3136
-
3137
- /* Find, clear, then process each source of interrupt. */
3138
- gen11_gt_irq_handler(i915, master_ctl);
3139
-
3140
- /* IRQs are synced during runtime_suspend, we don't require a wakeref */
3141
- if (master_ctl & GEN11_DISPLAY_IRQ) {
3142
- const u32 disp_ctl = raw_reg_read(regs, GEN11_DISPLAY_INT_CTL);
3143
-
3144
- disable_rpm_wakeref_asserts(i915);
3145
- /*
3146
- * GEN11_DISPLAY_INT_CTL has same format as GEN8_MASTER_IRQ
3147
- * for the display related bits.
3148
- */
3149
- gen8_de_irq_handler(i915, disp_ctl);
3150
- enable_rpm_wakeref_asserts(i915);
31512504 }
31522505
3153
- gu_misc_iir = gen11_gu_misc_irq_ack(i915, master_ctl);
2506
+ /* Find, queue (onto bottom-halves), then clear each source */
2507
+ gen11_gt_irq_handler(gt, master_ctl);
31542508
3155
- /* Acknowledge and enable interrupts. */
3156
- raw_reg_write(regs, GEN11_GFX_MSTR_IRQ, GEN11_MASTER_IRQ | master_ctl);
2509
+ /* IRQs are synced during runtime_suspend, we don't require a wakeref */
2510
+ if (master_ctl & GEN11_DISPLAY_IRQ)
2511
+ gen11_display_irq_handler(i915);
31572512
3158
- gen11_gu_misc_irq_handler(i915, gu_misc_iir);
2513
+ gu_misc_iir = gen11_gu_misc_irq_ack(gt, master_ctl);
2514
+
2515
+ intr_enable(regs);
2516
+
2517
+ gen11_gu_misc_irq_handler(gt, gu_misc_iir);
31592518
31602519 return IRQ_HANDLED;
31612520 }
31622521
3163
-static void i915_reset_device(struct drm_i915_private *dev_priv,
3164
- u32 engine_mask,
3165
- const char *reason)
2522
+static irqreturn_t gen11_irq_handler(int irq, void *arg)
31662523 {
3167
- struct i915_gpu_error *error = &dev_priv->gpu_error;
3168
- struct kobject *kobj = &dev_priv->drm.primary->kdev->kobj;
3169
- char *error_event[] = { I915_ERROR_UEVENT "=1", NULL };
3170
- char *reset_event[] = { I915_RESET_UEVENT "=1", NULL };
3171
- char *reset_done_event[] = { I915_ERROR_UEVENT "=0", NULL };
3172
- struct wedge_me w;
3173
-
3174
- kobject_uevent_env(kobj, KOBJ_CHANGE, error_event);
3175
-
3176
- DRM_DEBUG_DRIVER("resetting chip\n");
3177
- kobject_uevent_env(kobj, KOBJ_CHANGE, reset_event);
3178
-
3179
- /* Use a watchdog to ensure that our reset completes */
3180
- i915_wedge_on_timeout(&w, dev_priv, 5*HZ) {
3181
- intel_prepare_reset(dev_priv);
3182
-
3183
- error->reason = reason;
3184
- error->stalled_mask = engine_mask;
3185
-
3186
- /* Signal that locked waiters should reset the GPU */
3187
- smp_mb__before_atomic();
3188
- set_bit(I915_RESET_HANDOFF, &error->flags);
3189
- wake_up_all(&error->wait_queue);
3190
-
3191
- /* Wait for anyone holding the lock to wakeup, without
3192
- * blocking indefinitely on struct_mutex.
3193
- */
3194
- do {
3195
- if (mutex_trylock(&dev_priv->drm.struct_mutex)) {
3196
- i915_reset(dev_priv, engine_mask, reason);
3197
- mutex_unlock(&dev_priv->drm.struct_mutex);
3198
- }
3199
- } while (wait_on_bit_timeout(&error->flags,
3200
- I915_RESET_HANDOFF,
3201
- TASK_UNINTERRUPTIBLE,
3202
- 1));
3203
-
3204
- error->stalled_mask = 0;
3205
- error->reason = NULL;
3206
-
3207
- intel_finish_reset(dev_priv);
3208
- }
3209
-
3210
- if (!test_bit(I915_WEDGED, &error->flags))
3211
- kobject_uevent_env(kobj, KOBJ_CHANGE, reset_done_event);
2524
+ return __gen11_irq_handler(arg,
2525
+ gen11_master_intr_disable,
2526
+ gen11_master_intr_enable);
32122527 }
32132528
3214
-static void i915_clear_error_registers(struct drm_i915_private *dev_priv)
2529
+static u32 dg1_master_intr_disable_and_ack(void __iomem * const regs)
32152530 {
3216
- u32 eir;
2531
+ u32 val;
32172532
3218
- if (!IS_GEN2(dev_priv))
3219
- I915_WRITE(PGTBL_ER, I915_READ(PGTBL_ER));
2533
+ /* First disable interrupts */
2534
+ raw_reg_write(regs, DG1_MSTR_UNIT_INTR, 0);
32202535
3221
- if (INTEL_GEN(dev_priv) < 4)
3222
- I915_WRITE(IPEIR, I915_READ(IPEIR));
3223
- else
3224
- I915_WRITE(IPEIR_I965, I915_READ(IPEIR_I965));
2536
+ /* Get the indication levels and ack the master unit */
2537
+ val = raw_reg_read(regs, DG1_MSTR_UNIT_INTR);
2538
+ if (unlikely(!val))
2539
+ return 0;
32252540
3226
- I915_WRITE(EIR, I915_READ(EIR));
3227
- eir = I915_READ(EIR);
3228
- if (eir) {
3229
- /*
3230
- * some errors might have become stuck,
3231
- * mask them.
3232
- */
3233
- DRM_DEBUG_DRIVER("EIR stuck: 0x%08x, masking\n", eir);
3234
- I915_WRITE(EMR, I915_READ(EMR) | eir);
3235
- I915_WRITE(IIR, I915_MASTER_ERROR_INTERRUPT);
3236
- }
2541
+ raw_reg_write(regs, DG1_MSTR_UNIT_INTR, val);
2542
+
2543
+ /*
2544
+ * Now with master disabled, get a sample of level indications
2545
+ * for this interrupt and ack them right away - we keep GEN11_MASTER_IRQ
2546
+ * out as this bit doesn't exist anymore for DG1
2547
+ */
2548
+ val = raw_reg_read(regs, GEN11_GFX_MSTR_IRQ) & ~GEN11_MASTER_IRQ;
2549
+ if (unlikely(!val))
2550
+ return 0;
2551
+
2552
+ raw_reg_write(regs, GEN11_GFX_MSTR_IRQ, val);
2553
+
2554
+ return val;
32372555 }
32382556
3239
-/**
3240
- * i915_handle_error - handle a gpu error
3241
- * @dev_priv: i915 device private
3242
- * @engine_mask: mask representing engines that are hung
3243
- * @flags: control flags
3244
- * @fmt: Error message format string
3245
- *
3246
- * Do some basic checking of register state at error time and
3247
- * dump it to the syslog. Also call i915_capture_error_state() to make
3248
- * sure we get a record and make it available in debugfs. Fire a uevent
3249
- * so userspace knows something bad happened (should trigger collection
3250
- * of a ring dump etc.).
3251
- */
3252
-void i915_handle_error(struct drm_i915_private *dev_priv,
3253
- u32 engine_mask,
3254
- unsigned long flags,
3255
- const char *fmt, ...)
2557
+static inline void dg1_master_intr_enable(void __iomem * const regs)
32562558 {
3257
- struct intel_engine_cs *engine;
3258
- unsigned int tmp;
3259
- char error_msg[80];
3260
- char *msg = NULL;
2559
+ raw_reg_write(regs, DG1_MSTR_UNIT_INTR, DG1_MSTR_IRQ);
2560
+}
32612561
3262
- if (fmt) {
3263
- va_list args;
3264
-
3265
- va_start(args, fmt);
3266
- vscnprintf(error_msg, sizeof(error_msg), fmt, args);
3267
- va_end(args);
3268
-
3269
- msg = error_msg;
3270
- }
3271
-
3272
- /*
3273
- * In most cases it's guaranteed that we get here with an RPM
3274
- * reference held, for example because there is a pending GPU
3275
- * request that won't finish until the reset is done. This
3276
- * isn't the case at least when we get here by doing a
3277
- * simulated reset via debugfs, so get an RPM reference.
3278
- */
3279
- intel_runtime_pm_get(dev_priv);
3280
-
3281
- engine_mask &= INTEL_INFO(dev_priv)->ring_mask;
3282
-
3283
- if (flags & I915_ERROR_CAPTURE) {
3284
- i915_capture_error_state(dev_priv, engine_mask, msg);
3285
- i915_clear_error_registers(dev_priv);
3286
- }
3287
-
3288
- /*
3289
- * Try engine reset when available. We fall back to full reset if
3290
- * single reset fails.
3291
- */
3292
- if (intel_has_reset_engine(dev_priv)) {
3293
- for_each_engine_masked(engine, dev_priv, engine_mask, tmp) {
3294
- BUILD_BUG_ON(I915_RESET_MODESET >= I915_RESET_ENGINE);
3295
- if (test_and_set_bit(I915_RESET_ENGINE + engine->id,
3296
- &dev_priv->gpu_error.flags))
3297
- continue;
3298
-
3299
- if (i915_reset_engine(engine, msg) == 0)
3300
- engine_mask &= ~intel_engine_flag(engine);
3301
-
3302
- clear_bit(I915_RESET_ENGINE + engine->id,
3303
- &dev_priv->gpu_error.flags);
3304
- wake_up_bit(&dev_priv->gpu_error.flags,
3305
- I915_RESET_ENGINE + engine->id);
3306
- }
3307
- }
3308
-
3309
- if (!engine_mask)
3310
- goto out;
3311
-
3312
- /* Full reset needs the mutex, stop any other user trying to do so. */
3313
- if (test_and_set_bit(I915_RESET_BACKOFF, &dev_priv->gpu_error.flags)) {
3314
- wait_event(dev_priv->gpu_error.reset_queue,
3315
- !test_bit(I915_RESET_BACKOFF,
3316
- &dev_priv->gpu_error.flags));
3317
- goto out;
3318
- }
3319
-
3320
- /* Prevent any other reset-engine attempt. */
3321
- for_each_engine(engine, dev_priv, tmp) {
3322
- while (test_and_set_bit(I915_RESET_ENGINE + engine->id,
3323
- &dev_priv->gpu_error.flags))
3324
- wait_on_bit(&dev_priv->gpu_error.flags,
3325
- I915_RESET_ENGINE + engine->id,
3326
- TASK_UNINTERRUPTIBLE);
3327
- }
3328
-
3329
- i915_reset_device(dev_priv, engine_mask, msg);
3330
-
3331
- for_each_engine(engine, dev_priv, tmp) {
3332
- clear_bit(I915_RESET_ENGINE + engine->id,
3333
- &dev_priv->gpu_error.flags);
3334
- }
3335
-
3336
- clear_bit(I915_RESET_BACKOFF, &dev_priv->gpu_error.flags);
3337
- wake_up_all(&dev_priv->gpu_error.reset_queue);
3338
-
3339
-out:
3340
- intel_runtime_pm_put(dev_priv);
2562
+static irqreturn_t dg1_irq_handler(int irq, void *arg)
2563
+{
2564
+ return __gen11_irq_handler(arg,
2565
+ dg1_master_intr_disable_and_ack,
2566
+ dg1_master_intr_enable);
33412567 }
33422568
33432569 /* Called from drm generic code, passed 'crtc' which
33442570 * we use as a pipe index
33452571 */
3346
-static int i8xx_enable_vblank(struct drm_device *dev, unsigned int pipe)
2572
+int i8xx_enable_vblank(struct drm_crtc *crtc)
33472573 {
3348
- struct drm_i915_private *dev_priv = to_i915(dev);
2574
+ struct drm_i915_private *dev_priv = to_i915(crtc->dev);
2575
+ enum pipe pipe = to_intel_crtc(crtc)->pipe;
33492576 unsigned long irqflags;
33502577
33512578 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
....@@ -3355,9 +2582,26 @@
33552582 return 0;
33562583 }
33572584
3358
-static int i965_enable_vblank(struct drm_device *dev, unsigned int pipe)
2585
+int i915gm_enable_vblank(struct drm_crtc *crtc)
33592586 {
3360
- struct drm_i915_private *dev_priv = to_i915(dev);
2587
+ struct drm_i915_private *dev_priv = to_i915(crtc->dev);
2588
+
2589
+ /*
2590
+ * Vblank interrupts fail to wake the device up from C2+.
2591
+ * Disabling render clock gating during C-states avoids
2592
+ * the problem. There is a small power cost so we do this
2593
+ * only when vblank interrupts are actually enabled.
2594
+ */
2595
+ if (dev_priv->vblank_enabled++ == 0)
2596
+ I915_WRITE(SCPD0, _MASKED_BIT_ENABLE(CSTATE_RENDER_CLOCK_GATE_DISABLE));
2597
+
2598
+ return i8xx_enable_vblank(crtc);
2599
+}
2600
+
2601
+int i965_enable_vblank(struct drm_crtc *crtc)
2602
+{
2603
+ struct drm_i915_private *dev_priv = to_i915(crtc->dev);
2604
+ enum pipe pipe = to_intel_crtc(crtc)->pipe;
33612605 unsigned long irqflags;
33622606
33632607 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
....@@ -3368,11 +2612,12 @@
33682612 return 0;
33692613 }
33702614
3371
-static int ironlake_enable_vblank(struct drm_device *dev, unsigned int pipe)
2615
+int ilk_enable_vblank(struct drm_crtc *crtc)
33722616 {
3373
- struct drm_i915_private *dev_priv = to_i915(dev);
2617
+ struct drm_i915_private *dev_priv = to_i915(crtc->dev);
2618
+ enum pipe pipe = to_intel_crtc(crtc)->pipe;
33742619 unsigned long irqflags;
3375
- uint32_t bit = INTEL_GEN(dev_priv) >= 7 ?
2620
+ u32 bit = INTEL_GEN(dev_priv) >= 7 ?
33762621 DE_PIPE_VBLANK_IVB(pipe) : DE_PIPE_VBLANK(pipe);
33772622
33782623 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
....@@ -3383,14 +2628,15 @@
33832628 * PSR is active as no frames are generated.
33842629 */
33852630 if (HAS_PSR(dev_priv))
3386
- drm_vblank_restore(dev, pipe);
2631
+ drm_crtc_vblank_restore(crtc);
33872632
33882633 return 0;
33892634 }
33902635
3391
-static int gen8_enable_vblank(struct drm_device *dev, unsigned int pipe)
2636
+int bdw_enable_vblank(struct drm_crtc *crtc)
33922637 {
3393
- struct drm_i915_private *dev_priv = to_i915(dev);
2638
+ struct drm_i915_private *dev_priv = to_i915(crtc->dev);
2639
+ enum pipe pipe = to_intel_crtc(crtc)->pipe;
33942640 unsigned long irqflags;
33952641
33962642 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
....@@ -3401,7 +2647,7 @@
34012647 * PSR is active as no frames are generated, so check only for PSR.
34022648 */
34032649 if (HAS_PSR(dev_priv))
3404
- drm_vblank_restore(dev, pipe);
2650
+ drm_crtc_vblank_restore(crtc);
34052651
34062652 return 0;
34072653 }
....@@ -3409,9 +2655,10 @@
34092655 /* Called from drm generic code, passed 'crtc' which
34102656 * we use as a pipe index
34112657 */
3412
-static void i8xx_disable_vblank(struct drm_device *dev, unsigned int pipe)
2658
+void i8xx_disable_vblank(struct drm_crtc *crtc)
34132659 {
3414
- struct drm_i915_private *dev_priv = to_i915(dev);
2660
+ struct drm_i915_private *dev_priv = to_i915(crtc->dev);
2661
+ enum pipe pipe = to_intel_crtc(crtc)->pipe;
34152662 unsigned long irqflags;
34162663
34172664 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
....@@ -3419,9 +2666,20 @@
34192666 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
34202667 }
34212668
3422
-static void i965_disable_vblank(struct drm_device *dev, unsigned int pipe)
2669
+void i915gm_disable_vblank(struct drm_crtc *crtc)
34232670 {
3424
- struct drm_i915_private *dev_priv = to_i915(dev);
2671
+ struct drm_i915_private *dev_priv = to_i915(crtc->dev);
2672
+
2673
+ i8xx_disable_vblank(crtc);
2674
+
2675
+ if (--dev_priv->vblank_enabled == 0)
2676
+ I915_WRITE(SCPD0, _MASKED_BIT_DISABLE(CSTATE_RENDER_CLOCK_GATE_DISABLE));
2677
+}
2678
+
2679
+void i965_disable_vblank(struct drm_crtc *crtc)
2680
+{
2681
+ struct drm_i915_private *dev_priv = to_i915(crtc->dev);
2682
+ enum pipe pipe = to_intel_crtc(crtc)->pipe;
34252683 unsigned long irqflags;
34262684
34272685 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
....@@ -3430,11 +2688,12 @@
34302688 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
34312689 }
34322690
3433
-static void ironlake_disable_vblank(struct drm_device *dev, unsigned int pipe)
2691
+void ilk_disable_vblank(struct drm_crtc *crtc)
34342692 {
3435
- struct drm_i915_private *dev_priv = to_i915(dev);
2693
+ struct drm_i915_private *dev_priv = to_i915(crtc->dev);
2694
+ enum pipe pipe = to_intel_crtc(crtc)->pipe;
34362695 unsigned long irqflags;
3437
- uint32_t bit = INTEL_GEN(dev_priv) >= 7 ?
2696
+ u32 bit = INTEL_GEN(dev_priv) >= 7 ?
34382697 DE_PIPE_VBLANK_IVB(pipe) : DE_PIPE_VBLANK(pipe);
34392698
34402699 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
....@@ -3442,9 +2701,10 @@
34422701 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
34432702 }
34442703
3445
-static void gen8_disable_vblank(struct drm_device *dev, unsigned int pipe)
2704
+void bdw_disable_vblank(struct drm_crtc *crtc)
34462705 {
3447
- struct drm_i915_private *dev_priv = to_i915(dev);
2706
+ struct drm_i915_private *dev_priv = to_i915(crtc->dev);
2707
+ enum pipe pipe = to_intel_crtc(crtc)->pipe;
34482708 unsigned long irqflags;
34492709
34502710 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
....@@ -3454,10 +2714,12 @@
34542714
34552715 static void ibx_irq_reset(struct drm_i915_private *dev_priv)
34562716 {
2717
+ struct intel_uncore *uncore = &dev_priv->uncore;
2718
+
34572719 if (HAS_PCH_NOP(dev_priv))
34582720 return;
34592721
3460
- GEN3_IRQ_RESET(SDE);
2722
+ GEN3_IRQ_RESET(uncore, SDE);
34612723
34622724 if (HAS_PCH_CPT(dev_priv) || HAS_PCH_LPT(dev_priv))
34632725 I915_WRITE(SERR_INT, 0xffffffff);
....@@ -3471,43 +2733,38 @@
34712733 *
34722734 * This function needs to be called before interrupts are enabled.
34732735 */
3474
-static void ibx_irq_pre_postinstall(struct drm_device *dev)
2736
+static void ibx_irq_pre_postinstall(struct drm_i915_private *dev_priv)
34752737 {
3476
- struct drm_i915_private *dev_priv = to_i915(dev);
3477
-
34782738 if (HAS_PCH_NOP(dev_priv))
34792739 return;
34802740
3481
- WARN_ON(I915_READ(SDEIER) != 0);
2741
+ drm_WARN_ON(&dev_priv->drm, I915_READ(SDEIER) != 0);
34822742 I915_WRITE(SDEIER, 0xffffffff);
34832743 POSTING_READ(SDEIER);
34842744 }
34852745
3486
-static void gen5_gt_irq_reset(struct drm_i915_private *dev_priv)
3487
-{
3488
- GEN3_IRQ_RESET(GT);
3489
- if (INTEL_GEN(dev_priv) >= 6)
3490
- GEN3_IRQ_RESET(GEN6_PM);
3491
-}
3492
-
34932746 static void vlv_display_irq_reset(struct drm_i915_private *dev_priv)
34942747 {
2748
+ struct intel_uncore *uncore = &dev_priv->uncore;
2749
+
34952750 if (IS_CHERRYVIEW(dev_priv))
3496
- I915_WRITE(DPINVGTT, DPINVGTT_STATUS_MASK_CHV);
2751
+ intel_uncore_write(uncore, DPINVGTT, DPINVGTT_STATUS_MASK_CHV);
34972752 else
3498
- I915_WRITE(DPINVGTT, DPINVGTT_STATUS_MASK);
2753
+ intel_uncore_write(uncore, DPINVGTT, DPINVGTT_STATUS_MASK);
34992754
35002755 i915_hotplug_interrupt_update_locked(dev_priv, 0xffffffff, 0);
3501
- I915_WRITE(PORT_HOTPLUG_STAT, I915_READ(PORT_HOTPLUG_STAT));
2756
+ intel_uncore_write(uncore, PORT_HOTPLUG_STAT, I915_READ(PORT_HOTPLUG_STAT));
35022757
35032758 i9xx_pipestat_irq_reset(dev_priv);
35042759
3505
- GEN3_IRQ_RESET(VLV_);
2760
+ GEN3_IRQ_RESET(uncore, VLV_);
35062761 dev_priv->irq_mask = ~0u;
35072762 }
35082763
35092764 static void vlv_display_irq_postinstall(struct drm_i915_private *dev_priv)
35102765 {
2766
+ struct intel_uncore *uncore = &dev_priv->uncore;
2767
+
35112768 u32 pipestat_mask;
35122769 u32 enable_mask;
35132770 enum pipe pipe;
....@@ -3528,44 +2785,39 @@
35282785 enable_mask |= I915_DISPLAY_PIPE_C_EVENT_INTERRUPT |
35292786 I915_LPE_PIPE_C_INTERRUPT;
35302787
3531
- WARN_ON(dev_priv->irq_mask != ~0u);
2788
+ drm_WARN_ON(&dev_priv->drm, dev_priv->irq_mask != ~0u);
35322789
35332790 dev_priv->irq_mask = ~enable_mask;
35342791
3535
- GEN3_IRQ_INIT(VLV_, dev_priv->irq_mask, enable_mask);
2792
+ GEN3_IRQ_INIT(uncore, VLV_, dev_priv->irq_mask, enable_mask);
35362793 }
35372794
35382795 /* drm_dma.h hooks
35392796 */
3540
-static void ironlake_irq_reset(struct drm_device *dev)
2797
+static void ilk_irq_reset(struct drm_i915_private *dev_priv)
35412798 {
3542
- struct drm_i915_private *dev_priv = to_i915(dev);
2799
+ struct intel_uncore *uncore = &dev_priv->uncore;
35432800
3544
- if (IS_GEN5(dev_priv))
3545
- I915_WRITE(HWSTAM, 0xffffffff);
3546
-
3547
- GEN3_IRQ_RESET(DE);
3548
- if (IS_GEN7(dev_priv))
3549
- I915_WRITE(GEN7_ERR_INT, 0xffffffff);
2801
+ GEN3_IRQ_RESET(uncore, DE);
2802
+ if (IS_GEN(dev_priv, 7))
2803
+ intel_uncore_write(uncore, GEN7_ERR_INT, 0xffffffff);
35502804
35512805 if (IS_HASWELL(dev_priv)) {
3552
- I915_WRITE(EDP_PSR_IMR, 0xffffffff);
3553
- I915_WRITE(EDP_PSR_IIR, 0xffffffff);
2806
+ intel_uncore_write(uncore, EDP_PSR_IMR, 0xffffffff);
2807
+ intel_uncore_write(uncore, EDP_PSR_IIR, 0xffffffff);
35542808 }
35552809
3556
- gen5_gt_irq_reset(dev_priv);
2810
+ gen5_gt_irq_reset(&dev_priv->gt);
35572811
35582812 ibx_irq_reset(dev_priv);
35592813 }
35602814
3561
-static void valleyview_irq_reset(struct drm_device *dev)
2815
+static void valleyview_irq_reset(struct drm_i915_private *dev_priv)
35622816 {
3563
- struct drm_i915_private *dev_priv = to_i915(dev);
3564
-
35652817 I915_WRITE(VLV_MASTER_IER, 0);
35662818 POSTING_READ(VLV_MASTER_IER);
35672819
3568
- gen5_gt_irq_reset(dev_priv);
2820
+ gen5_gt_irq_reset(&dev_priv->gt);
35692821
35702822 spin_lock_irq(&dev_priv->irq_lock);
35712823 if (dev_priv->display_irqs_enabled)
....@@ -3573,88 +2825,101 @@
35732825 spin_unlock_irq(&dev_priv->irq_lock);
35742826 }
35752827
3576
-static void gen8_gt_irq_reset(struct drm_i915_private *dev_priv)
2828
+static void gen8_irq_reset(struct drm_i915_private *dev_priv)
35772829 {
3578
- GEN8_IRQ_RESET_NDX(GT, 0);
3579
- GEN8_IRQ_RESET_NDX(GT, 1);
3580
- GEN8_IRQ_RESET_NDX(GT, 2);
3581
- GEN8_IRQ_RESET_NDX(GT, 3);
3582
-}
2830
+ struct intel_uncore *uncore = &dev_priv->uncore;
2831
+ enum pipe pipe;
35832832
3584
-static void gen8_irq_reset(struct drm_device *dev)
3585
-{
3586
- struct drm_i915_private *dev_priv = to_i915(dev);
3587
- int pipe;
2833
+ gen8_master_intr_disable(dev_priv->uncore.regs);
35882834
3589
- I915_WRITE(GEN8_MASTER_IRQ, 0);
3590
- POSTING_READ(GEN8_MASTER_IRQ);
2835
+ gen8_gt_irq_reset(&dev_priv->gt);
35912836
3592
- gen8_gt_irq_reset(dev_priv);
3593
-
3594
- I915_WRITE(EDP_PSR_IMR, 0xffffffff);
3595
- I915_WRITE(EDP_PSR_IIR, 0xffffffff);
2837
+ intel_uncore_write(uncore, EDP_PSR_IMR, 0xffffffff);
2838
+ intel_uncore_write(uncore, EDP_PSR_IIR, 0xffffffff);
35962839
35972840 for_each_pipe(dev_priv, pipe)
35982841 if (intel_display_power_is_enabled(dev_priv,
35992842 POWER_DOMAIN_PIPE(pipe)))
3600
- GEN8_IRQ_RESET_NDX(DE_PIPE, pipe);
2843
+ GEN8_IRQ_RESET_NDX(uncore, DE_PIPE, pipe);
36012844
3602
- GEN3_IRQ_RESET(GEN8_DE_PORT_);
3603
- GEN3_IRQ_RESET(GEN8_DE_MISC_);
3604
- GEN3_IRQ_RESET(GEN8_PCU_);
2845
+ GEN3_IRQ_RESET(uncore, GEN8_DE_PORT_);
2846
+ GEN3_IRQ_RESET(uncore, GEN8_DE_MISC_);
2847
+ GEN3_IRQ_RESET(uncore, GEN8_PCU_);
36052848
36062849 if (HAS_PCH_SPLIT(dev_priv))
36072850 ibx_irq_reset(dev_priv);
36082851 }
36092852
3610
-static void gen11_gt_irq_reset(struct drm_i915_private *dev_priv)
2853
+static void gen11_display_irq_reset(struct drm_i915_private *dev_priv)
36112854 {
3612
- /* Disable RCS, BCS, VCS and VECS class engines. */
3613
- I915_WRITE(GEN11_RENDER_COPY_INTR_ENABLE, 0);
3614
- I915_WRITE(GEN11_VCS_VECS_INTR_ENABLE, 0);
2855
+ struct intel_uncore *uncore = &dev_priv->uncore;
2856
+ enum pipe pipe;
2857
+ u32 trans_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) |
2858
+ BIT(TRANSCODER_C) | BIT(TRANSCODER_D);
36152859
3616
- /* Restore masks irqs on RCS, BCS, VCS and VECS engines. */
3617
- I915_WRITE(GEN11_RCS0_RSVD_INTR_MASK, ~0);
3618
- I915_WRITE(GEN11_BCS_RSVD_INTR_MASK, ~0);
3619
- I915_WRITE(GEN11_VCS0_VCS1_INTR_MASK, ~0);
3620
- I915_WRITE(GEN11_VCS2_VCS3_INTR_MASK, ~0);
3621
- I915_WRITE(GEN11_VECS0_VECS1_INTR_MASK, ~0);
2860
+ intel_uncore_write(uncore, GEN11_DISPLAY_INT_CTL, 0);
36222861
3623
- I915_WRITE(GEN11_GPM_WGBOXPERF_INTR_ENABLE, 0);
3624
- I915_WRITE(GEN11_GPM_WGBOXPERF_INTR_MASK, ~0);
3625
-}
2862
+ if (INTEL_GEN(dev_priv) >= 12) {
2863
+ enum transcoder trans;
36262864
3627
-static void gen11_irq_reset(struct drm_device *dev)
3628
-{
3629
- struct drm_i915_private *dev_priv = dev->dev_private;
3630
- int pipe;
2865
+ for_each_cpu_transcoder_masked(dev_priv, trans, trans_mask) {
2866
+ enum intel_display_power_domain domain;
36312867
3632
- I915_WRITE(GEN11_GFX_MSTR_IRQ, 0);
3633
- POSTING_READ(GEN11_GFX_MSTR_IRQ);
2868
+ domain = POWER_DOMAIN_TRANSCODER(trans);
2869
+ if (!intel_display_power_is_enabled(dev_priv, domain))
2870
+ continue;
36342871
3635
- gen11_gt_irq_reset(dev_priv);
3636
-
3637
- I915_WRITE(GEN11_DISPLAY_INT_CTL, 0);
2872
+ intel_uncore_write(uncore, TRANS_PSR_IMR(trans), 0xffffffff);
2873
+ intel_uncore_write(uncore, TRANS_PSR_IIR(trans), 0xffffffff);
2874
+ }
2875
+ } else {
2876
+ intel_uncore_write(uncore, EDP_PSR_IMR, 0xffffffff);
2877
+ intel_uncore_write(uncore, EDP_PSR_IIR, 0xffffffff);
2878
+ }
36382879
36392880 for_each_pipe(dev_priv, pipe)
36402881 if (intel_display_power_is_enabled(dev_priv,
36412882 POWER_DOMAIN_PIPE(pipe)))
3642
- GEN8_IRQ_RESET_NDX(DE_PIPE, pipe);
2883
+ GEN8_IRQ_RESET_NDX(uncore, DE_PIPE, pipe);
36432884
3644
- GEN3_IRQ_RESET(GEN8_DE_PORT_);
3645
- GEN3_IRQ_RESET(GEN8_DE_MISC_);
3646
- GEN3_IRQ_RESET(GEN11_DE_HPD_);
3647
- GEN3_IRQ_RESET(GEN11_GU_MISC_);
3648
- GEN3_IRQ_RESET(GEN8_PCU_);
2885
+ GEN3_IRQ_RESET(uncore, GEN8_DE_PORT_);
2886
+ GEN3_IRQ_RESET(uncore, GEN8_DE_MISC_);
2887
+ GEN3_IRQ_RESET(uncore, GEN11_DE_HPD_);
36492888
3650
- if (HAS_PCH_ICP(dev_priv))
3651
- GEN3_IRQ_RESET(SDE);
2889
+ if (INTEL_PCH_TYPE(dev_priv) >= PCH_ICP)
2890
+ GEN3_IRQ_RESET(uncore, SDE);
2891
+
2892
+ /* Wa_14010685332:icl,jsl,ehl,tgl,rkl */
2893
+ if (INTEL_PCH_TYPE(dev_priv) >= PCH_ICP) {
2894
+ intel_uncore_rmw(uncore, SOUTH_CHICKEN1,
2895
+ SBCLK_RUN_REFCLK_DIS, SBCLK_RUN_REFCLK_DIS);
2896
+ intel_uncore_rmw(uncore, SOUTH_CHICKEN1,
2897
+ SBCLK_RUN_REFCLK_DIS, 0);
2898
+ }
2899
+}
2900
+
2901
+static void gen11_irq_reset(struct drm_i915_private *dev_priv)
2902
+{
2903
+ struct intel_uncore *uncore = &dev_priv->uncore;
2904
+
2905
+ if (HAS_MASTER_UNIT_IRQ(dev_priv))
2906
+ dg1_master_intr_disable_and_ack(dev_priv->uncore.regs);
2907
+ else
2908
+ gen11_master_intr_disable(dev_priv->uncore.regs);
2909
+
2910
+ gen11_gt_irq_reset(&dev_priv->gt);
2911
+ gen11_display_irq_reset(dev_priv);
2912
+
2913
+ GEN3_IRQ_RESET(uncore, GEN11_GU_MISC_);
2914
+ GEN3_IRQ_RESET(uncore, GEN8_PCU_);
36522915 }
36532916
36542917 void gen8_irq_power_well_post_enable(struct drm_i915_private *dev_priv,
36552918 u8 pipe_mask)
36562919 {
3657
- uint32_t extra_ier = GEN8_PIPE_VBLANK | GEN8_PIPE_FIFO_UNDERRUN;
2920
+ struct intel_uncore *uncore = &dev_priv->uncore;
2921
+
2922
+ u32 extra_ier = GEN8_PIPE_VBLANK | GEN8_PIPE_FIFO_UNDERRUN;
36582923 enum pipe pipe;
36592924
36602925 spin_lock_irq(&dev_priv->irq_lock);
....@@ -3665,7 +2930,7 @@
36652930 }
36662931
36672932 for_each_pipe_masked(dev_priv, pipe, pipe_mask)
3668
- GEN8_IRQ_INIT_NDX(DE_PIPE, pipe,
2933
+ GEN8_IRQ_INIT_NDX(uncore, DE_PIPE, pipe,
36692934 dev_priv->de_irq_mask[pipe],
36702935 ~dev_priv->de_irq_mask[pipe] | extra_ier);
36712936
....@@ -3675,6 +2940,7 @@
36752940 void gen8_irq_power_well_pre_disable(struct drm_i915_private *dev_priv,
36762941 u8 pipe_mask)
36772942 {
2943
+ struct intel_uncore *uncore = &dev_priv->uncore;
36782944 enum pipe pipe;
36792945
36802946 spin_lock_irq(&dev_priv->irq_lock);
....@@ -3685,24 +2951,24 @@
36852951 }
36862952
36872953 for_each_pipe_masked(dev_priv, pipe, pipe_mask)
3688
- GEN8_IRQ_RESET_NDX(DE_PIPE, pipe);
2954
+ GEN8_IRQ_RESET_NDX(uncore, DE_PIPE, pipe);
36892955
36902956 spin_unlock_irq(&dev_priv->irq_lock);
36912957
36922958 /* make sure we're done processing display irqs */
3693
- synchronize_irq(dev_priv->drm.irq);
2959
+ intel_synchronize_irq(dev_priv);
36942960 }
36952961
3696
-static void cherryview_irq_reset(struct drm_device *dev)
2962
+static void cherryview_irq_reset(struct drm_i915_private *dev_priv)
36972963 {
3698
- struct drm_i915_private *dev_priv = to_i915(dev);
2964
+ struct intel_uncore *uncore = &dev_priv->uncore;
36992965
37002966 I915_WRITE(GEN8_MASTER_IRQ, 0);
37012967 POSTING_READ(GEN8_MASTER_IRQ);
37022968
3703
- gen8_gt_irq_reset(dev_priv);
2969
+ gen8_gt_irq_reset(&dev_priv->gt);
37042970
3705
- GEN3_IRQ_RESET(GEN8_PCU_);
2971
+ GEN3_IRQ_RESET(uncore, GEN8_PCU_);
37062972
37072973 spin_lock_irq(&dev_priv->irq_lock);
37082974 if (dev_priv->display_irqs_enabled)
....@@ -3721,6 +2987,18 @@
37212987 enabled_irqs |= hpd[encoder->hpd_pin];
37222988
37232989 return enabled_irqs;
2990
+}
2991
+
2992
+static u32 intel_hpd_hotplug_irqs(struct drm_i915_private *dev_priv,
2993
+ const u32 hpd[HPD_NUM_PINS])
2994
+{
2995
+ struct intel_encoder *encoder;
2996
+ u32 hotplug_irqs = 0;
2997
+
2998
+ for_each_intel_encoder(&dev_priv->drm, encoder)
2999
+ hotplug_irqs |= hpd[encoder->hpd_pin];
3000
+
3001
+ return hotplug_irqs;
37243002 }
37253003
37263004 static void ibx_hpd_detection_setup(struct drm_i915_private *dev_priv)
....@@ -3752,46 +3030,71 @@
37523030 {
37533031 u32 hotplug_irqs, enabled_irqs;
37543032
3755
- if (HAS_PCH_IBX(dev_priv)) {
3756
- hotplug_irqs = SDE_HOTPLUG_MASK;
3757
- enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_ibx);
3758
- } else {
3759
- hotplug_irqs = SDE_HOTPLUG_MASK_CPT;
3760
- enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_cpt);
3761
- }
3033
+ enabled_irqs = intel_hpd_enabled_irqs(dev_priv, dev_priv->hotplug.pch_hpd);
3034
+ hotplug_irqs = intel_hpd_hotplug_irqs(dev_priv, dev_priv->hotplug.pch_hpd);
37623035
37633036 ibx_display_interrupt_update(dev_priv, hotplug_irqs, enabled_irqs);
37643037
37653038 ibx_hpd_detection_setup(dev_priv);
37663039 }
37673040
3768
-static void icp_hpd_detection_setup(struct drm_i915_private *dev_priv)
3041
+static void icp_ddi_hpd_detection_setup(struct drm_i915_private *dev_priv,
3042
+ u32 enable_mask)
37693043 {
37703044 u32 hotplug;
37713045
37723046 hotplug = I915_READ(SHOTPLUG_CTL_DDI);
3773
- hotplug |= ICP_DDIA_HPD_ENABLE |
3774
- ICP_DDIB_HPD_ENABLE;
3047
+ hotplug |= enable_mask;
37753048 I915_WRITE(SHOTPLUG_CTL_DDI, hotplug);
3049
+}
3050
+
3051
+static void icp_tc_hpd_detection_setup(struct drm_i915_private *dev_priv,
3052
+ u32 enable_mask)
3053
+{
3054
+ u32 hotplug;
37763055
37773056 hotplug = I915_READ(SHOTPLUG_CTL_TC);
3778
- hotplug |= ICP_TC_HPD_ENABLE(PORT_TC1) |
3779
- ICP_TC_HPD_ENABLE(PORT_TC2) |
3780
- ICP_TC_HPD_ENABLE(PORT_TC3) |
3781
- ICP_TC_HPD_ENABLE(PORT_TC4);
3057
+ hotplug |= enable_mask;
37823058 I915_WRITE(SHOTPLUG_CTL_TC, hotplug);
37833059 }
37843060
3785
-static void icp_hpd_irq_setup(struct drm_i915_private *dev_priv)
3061
+static void icp_hpd_irq_setup(struct drm_i915_private *dev_priv,
3062
+ u32 ddi_enable_mask, u32 tc_enable_mask)
37863063 {
37873064 u32 hotplug_irqs, enabled_irqs;
37883065
3789
- hotplug_irqs = SDE_DDI_MASK_ICP | SDE_TC_MASK_ICP;
3790
- enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_icp);
3066
+ enabled_irqs = intel_hpd_enabled_irqs(dev_priv, dev_priv->hotplug.pch_hpd);
3067
+ hotplug_irqs = intel_hpd_hotplug_irqs(dev_priv, dev_priv->hotplug.pch_hpd);
3068
+
3069
+ if (INTEL_PCH_TYPE(dev_priv) <= PCH_TGP)
3070
+ I915_WRITE(SHPD_FILTER_CNT, SHPD_FILTER_CNT_500_ADJ);
37913071
37923072 ibx_display_interrupt_update(dev_priv, hotplug_irqs, enabled_irqs);
37933073
3794
- icp_hpd_detection_setup(dev_priv);
3074
+ icp_ddi_hpd_detection_setup(dev_priv, ddi_enable_mask);
3075
+ if (tc_enable_mask)
3076
+ icp_tc_hpd_detection_setup(dev_priv, tc_enable_mask);
3077
+}
3078
+
3079
+/*
3080
+ * EHL doesn't need most of gen11_hpd_irq_setup, it's handling only the
3081
+ * equivalent of SDE.
3082
+ */
3083
+static void mcc_hpd_irq_setup(struct drm_i915_private *dev_priv)
3084
+{
3085
+ icp_hpd_irq_setup(dev_priv,
3086
+ ICP_DDI_HPD_ENABLE_MASK, ICP_TC_HPD_ENABLE(PORT_TC1));
3087
+}
3088
+
3089
+/*
3090
+ * JSP behaves exactly the same as MCC above except that port C is mapped to
3091
+ * the DDI-C pins instead of the TC1 pins. This means we should follow TGP's
3092
+ * masks & tables rather than ICP's masks & tables.
3093
+ */
3094
+static void jsp_hpd_irq_setup(struct drm_i915_private *dev_priv)
3095
+{
3096
+ icp_hpd_irq_setup(dev_priv,
3097
+ TGP_DDI_HPD_ENABLE_MASK, 0);
37953098 }
37963099
37973100 static void gen11_hpd_detection_setup(struct drm_i915_private *dev_priv)
....@@ -3802,14 +3105,18 @@
38023105 hotplug |= GEN11_HOTPLUG_CTL_ENABLE(PORT_TC1) |
38033106 GEN11_HOTPLUG_CTL_ENABLE(PORT_TC2) |
38043107 GEN11_HOTPLUG_CTL_ENABLE(PORT_TC3) |
3805
- GEN11_HOTPLUG_CTL_ENABLE(PORT_TC4);
3108
+ GEN11_HOTPLUG_CTL_ENABLE(PORT_TC4) |
3109
+ GEN11_HOTPLUG_CTL_ENABLE(PORT_TC5) |
3110
+ GEN11_HOTPLUG_CTL_ENABLE(PORT_TC6);
38063111 I915_WRITE(GEN11_TC_HOTPLUG_CTL, hotplug);
38073112
38083113 hotplug = I915_READ(GEN11_TBT_HOTPLUG_CTL);
38093114 hotplug |= GEN11_HOTPLUG_CTL_ENABLE(PORT_TC1) |
38103115 GEN11_HOTPLUG_CTL_ENABLE(PORT_TC2) |
38113116 GEN11_HOTPLUG_CTL_ENABLE(PORT_TC3) |
3812
- GEN11_HOTPLUG_CTL_ENABLE(PORT_TC4);
3117
+ GEN11_HOTPLUG_CTL_ENABLE(PORT_TC4) |
3118
+ GEN11_HOTPLUG_CTL_ENABLE(PORT_TC5) |
3119
+ GEN11_HOTPLUG_CTL_ENABLE(PORT_TC6);
38133120 I915_WRITE(GEN11_TBT_HOTPLUG_CTL, hotplug);
38143121 }
38153122
....@@ -3818,8 +3125,8 @@
38183125 u32 hotplug_irqs, enabled_irqs;
38193126 u32 val;
38203127
3821
- enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_gen11);
3822
- hotplug_irqs = GEN11_DE_TC_HOTPLUG_MASK | GEN11_DE_TBT_HOTPLUG_MASK;
3128
+ enabled_irqs = intel_hpd_enabled_irqs(dev_priv, dev_priv->hotplug.hpd);
3129
+ hotplug_irqs = intel_hpd_hotplug_irqs(dev_priv, dev_priv->hotplug.hpd);
38233130
38243131 val = I915_READ(GEN11_DE_HPD_IMR);
38253132 val &= ~hotplug_irqs;
....@@ -3829,8 +3136,12 @@
38293136
38303137 gen11_hpd_detection_setup(dev_priv);
38313138
3832
- if (HAS_PCH_ICP(dev_priv))
3833
- icp_hpd_irq_setup(dev_priv);
3139
+ if (INTEL_PCH_TYPE(dev_priv) >= PCH_TGP)
3140
+ icp_hpd_irq_setup(dev_priv,
3141
+ TGP_DDI_HPD_ENABLE_MASK, TGP_TC_HPD_ENABLE_MASK);
3142
+ else if (INTEL_PCH_TYPE(dev_priv) >= PCH_ICP)
3143
+ icp_hpd_irq_setup(dev_priv,
3144
+ ICP_DDI_HPD_ENABLE_MASK, ICP_TC_HPD_ENABLE_MASK);
38343145 }
38353146
38363147 static void spt_hpd_detection_setup(struct drm_i915_private *dev_priv)
....@@ -3862,8 +3173,11 @@
38623173 {
38633174 u32 hotplug_irqs, enabled_irqs;
38643175
3865
- hotplug_irqs = SDE_HOTPLUG_MASK_SPT;
3866
- enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_spt);
3176
+ if (INTEL_PCH_TYPE(dev_priv) >= PCH_CNP)
3177
+ I915_WRITE(SHPD_FILTER_CNT, SHPD_FILTER_CNT_500_ADJ);
3178
+
3179
+ enabled_irqs = intel_hpd_enabled_irqs(dev_priv, dev_priv->hotplug.pch_hpd);
3180
+ hotplug_irqs = intel_hpd_hotplug_irqs(dev_priv, dev_priv->hotplug.pch_hpd);
38673181
38683182 ibx_display_interrupt_update(dev_priv, hotplug_irqs, enabled_irqs);
38693183
....@@ -3890,22 +3204,13 @@
38903204 {
38913205 u32 hotplug_irqs, enabled_irqs;
38923206
3893
- if (INTEL_GEN(dev_priv) >= 8) {
3894
- hotplug_irqs = GEN8_PORT_DP_A_HOTPLUG;
3895
- enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_bdw);
3207
+ enabled_irqs = intel_hpd_enabled_irqs(dev_priv, dev_priv->hotplug.hpd);
3208
+ hotplug_irqs = intel_hpd_hotplug_irqs(dev_priv, dev_priv->hotplug.hpd);
38963209
3210
+ if (INTEL_GEN(dev_priv) >= 8)
38973211 bdw_update_port_irq(dev_priv, hotplug_irqs, enabled_irqs);
3898
- } else if (INTEL_GEN(dev_priv) >= 7) {
3899
- hotplug_irqs = DE_DP_A_HOTPLUG_IVB;
3900
- enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_ivb);
3901
-
3212
+ else
39023213 ilk_update_display_irq(dev_priv, hotplug_irqs, enabled_irqs);
3903
- } else {
3904
- hotplug_irqs = DE_DP_A_HOTPLUG;
3905
- enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_ilk);
3906
-
3907
- ilk_update_display_irq(dev_priv, hotplug_irqs, enabled_irqs);
3908
- }
39093214
39103215 ilk_hpd_detection_setup(dev_priv);
39113216
....@@ -3922,8 +3227,9 @@
39223227 PORTB_HOTPLUG_ENABLE |
39233228 PORTC_HOTPLUG_ENABLE;
39243229
3925
- DRM_DEBUG_KMS("Invert bit setting: hp_ctl:%x hp_port:%x\n",
3926
- hotplug, enabled_irqs);
3230
+ drm_dbg_kms(&dev_priv->drm,
3231
+ "Invert bit setting: hp_ctl:%x hp_port:%x\n",
3232
+ hotplug, enabled_irqs);
39273233 hotplug &= ~BXT_DDI_HPD_INVERT_MASK;
39283234
39293235 /*
....@@ -3952,17 +3258,16 @@
39523258 {
39533259 u32 hotplug_irqs, enabled_irqs;
39543260
3955
- enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_bxt);
3956
- hotplug_irqs = BXT_DE_PORT_HOTPLUG_MASK;
3261
+ enabled_irqs = intel_hpd_enabled_irqs(dev_priv, dev_priv->hotplug.hpd);
3262
+ hotplug_irqs = intel_hpd_hotplug_irqs(dev_priv, dev_priv->hotplug.hpd);
39573263
39583264 bdw_update_port_irq(dev_priv, hotplug_irqs, enabled_irqs);
39593265
39603266 __bxt_hpd_detection_setup(dev_priv, enabled_irqs);
39613267 }
39623268
3963
-static void ibx_irq_postinstall(struct drm_device *dev)
3269
+static void ibx_irq_postinstall(struct drm_i915_private *dev_priv)
39643270 {
3965
- struct drm_i915_private *dev_priv = to_i915(dev);
39663271 u32 mask;
39673272
39683273 if (HAS_PCH_NOP(dev_priv))
....@@ -3975,7 +3280,7 @@
39753280 else
39763281 mask = SDE_GMBUS_CPT;
39773282
3978
- gen3_assert_iir_is_zero(dev_priv, SDEIIR);
3283
+ gen3_assert_iir_is_zero(&dev_priv->uncore, SDEIIR);
39793284 I915_WRITE(SDEIMR, ~mask);
39803285
39813286 if (HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv) ||
....@@ -3985,47 +3290,9 @@
39853290 spt_hpd_detection_setup(dev_priv);
39863291 }
39873292
3988
-static void gen5_gt_irq_postinstall(struct drm_device *dev)
3293
+static void ilk_irq_postinstall(struct drm_i915_private *dev_priv)
39893294 {
3990
- struct drm_i915_private *dev_priv = to_i915(dev);
3991
- u32 pm_irqs, gt_irqs;
3992
-
3993
- pm_irqs = gt_irqs = 0;
3994
-
3995
- dev_priv->gt_irq_mask = ~0;
3996
- if (HAS_L3_DPF(dev_priv)) {
3997
- /* L3 parity interrupt is always unmasked. */
3998
- dev_priv->gt_irq_mask = ~GT_PARITY_ERROR(dev_priv);
3999
- gt_irqs |= GT_PARITY_ERROR(dev_priv);
4000
- }
4001
-
4002
- gt_irqs |= GT_RENDER_USER_INTERRUPT;
4003
- if (IS_GEN5(dev_priv)) {
4004
- gt_irqs |= ILK_BSD_USER_INTERRUPT;
4005
- } else {
4006
- gt_irqs |= GT_BLT_USER_INTERRUPT | GT_BSD_USER_INTERRUPT;
4007
- }
4008
-
4009
- GEN3_IRQ_INIT(GT, dev_priv->gt_irq_mask, gt_irqs);
4010
-
4011
- if (INTEL_GEN(dev_priv) >= 6) {
4012
- /*
4013
- * RPS interrupts will get enabled/disabled on demand when RPS
4014
- * itself is enabled/disabled.
4015
- */
4016
- if (HAS_VEBOX(dev_priv)) {
4017
- pm_irqs |= PM_VEBOX_USER_INTERRUPT;
4018
- dev_priv->pm_ier |= PM_VEBOX_USER_INTERRUPT;
4019
- }
4020
-
4021
- dev_priv->pm_imr = 0xffffffff;
4022
- GEN3_IRQ_INIT(GEN6_PM, dev_priv->pm_imr, pm_irqs);
4023
- }
4024
-}
4025
-
4026
-static int ironlake_irq_postinstall(struct drm_device *dev)
4027
-{
4028
- struct drm_i915_private *dev_priv = to_i915(dev);
3295
+ struct intel_uncore *uncore = &dev_priv->uncore;
40293296 u32 display_mask, extra_mask;
40303297
40313298 if (INTEL_GEN(dev_priv) >= 7) {
....@@ -4044,22 +3311,22 @@
40443311 }
40453312
40463313 if (IS_HASWELL(dev_priv)) {
4047
- gen3_assert_iir_is_zero(dev_priv, EDP_PSR_IIR);
4048
- intel_psr_irq_control(dev_priv, dev_priv->psr.debug);
3314
+ gen3_assert_iir_is_zero(uncore, EDP_PSR_IIR);
40493315 display_mask |= DE_EDP_PSR_INT_HSW;
40503316 }
40513317
40523318 dev_priv->irq_mask = ~display_mask;
40533319
4054
- ibx_irq_pre_postinstall(dev);
3320
+ ibx_irq_pre_postinstall(dev_priv);
40553321
4056
- GEN3_IRQ_INIT(DE, dev_priv->irq_mask, display_mask | extra_mask);
3322
+ GEN3_IRQ_INIT(uncore, DE, dev_priv->irq_mask,
3323
+ display_mask | extra_mask);
40573324
4058
- gen5_gt_irq_postinstall(dev);
3325
+ gen5_gt_irq_postinstall(&dev_priv->gt);
40593326
40603327 ilk_hpd_detection_setup(dev_priv);
40613328
4062
- ibx_irq_postinstall(dev);
3329
+ ibx_irq_postinstall(dev_priv);
40633330
40643331 if (IS_IRONLAKE_M(dev_priv)) {
40653332 /* Enable PCU event interrupts
....@@ -4071,8 +3338,6 @@
40713338 ilk_enable_display_irq(dev_priv, DE_PCU_EVENT);
40723339 spin_unlock_irq(&dev_priv->irq_lock);
40733340 }
4074
-
4075
- return 0;
40763341 }
40773342
40783343 void valleyview_enable_display_irqs(struct drm_i915_private *dev_priv)
....@@ -4104,11 +3369,9 @@
41043369 }
41053370
41063371
4107
-static int valleyview_irq_postinstall(struct drm_device *dev)
3372
+static void valleyview_irq_postinstall(struct drm_i915_private *dev_priv)
41083373 {
4109
- struct drm_i915_private *dev_priv = to_i915(dev);
4110
-
4111
- gen5_gt_irq_postinstall(dev);
3374
+ gen5_gt_irq_postinstall(&dev_priv->gt);
41123375
41133376 spin_lock_irq(&dev_priv->irq_lock);
41143377 if (dev_priv->display_irqs_enabled)
....@@ -4117,69 +3380,27 @@
41173380
41183381 I915_WRITE(VLV_MASTER_IER, MASTER_INTERRUPT_ENABLE);
41193382 POSTING_READ(VLV_MASTER_IER);
4120
-
4121
- return 0;
4122
-}
4123
-
4124
-static void gen8_gt_irq_postinstall(struct drm_i915_private *dev_priv)
4125
-{
4126
- /* These are interrupts we'll toggle with the ring mask register */
4127
- uint32_t gt_interrupts[] = {
4128
- GT_RENDER_USER_INTERRUPT << GEN8_RCS_IRQ_SHIFT |
4129
- GT_CONTEXT_SWITCH_INTERRUPT << GEN8_RCS_IRQ_SHIFT |
4130
- GT_RENDER_USER_INTERRUPT << GEN8_BCS_IRQ_SHIFT |
4131
- GT_CONTEXT_SWITCH_INTERRUPT << GEN8_BCS_IRQ_SHIFT,
4132
- GT_RENDER_USER_INTERRUPT << GEN8_VCS1_IRQ_SHIFT |
4133
- GT_CONTEXT_SWITCH_INTERRUPT << GEN8_VCS1_IRQ_SHIFT |
4134
- GT_RENDER_USER_INTERRUPT << GEN8_VCS2_IRQ_SHIFT |
4135
- GT_CONTEXT_SWITCH_INTERRUPT << GEN8_VCS2_IRQ_SHIFT,
4136
- 0,
4137
- GT_RENDER_USER_INTERRUPT << GEN8_VECS_IRQ_SHIFT |
4138
- GT_CONTEXT_SWITCH_INTERRUPT << GEN8_VECS_IRQ_SHIFT
4139
- };
4140
-
4141
- if (HAS_L3_DPF(dev_priv))
4142
- gt_interrupts[0] |= GT_RENDER_L3_PARITY_ERROR_INTERRUPT;
4143
-
4144
- dev_priv->pm_ier = 0x0;
4145
- dev_priv->pm_imr = ~dev_priv->pm_ier;
4146
- GEN8_IRQ_INIT_NDX(GT, 0, ~gt_interrupts[0], gt_interrupts[0]);
4147
- GEN8_IRQ_INIT_NDX(GT, 1, ~gt_interrupts[1], gt_interrupts[1]);
4148
- /*
4149
- * RPS interrupts will get enabled/disabled on demand when RPS itself
4150
- * is enabled/disabled. Same wil be the case for GuC interrupts.
4151
- */
4152
- GEN8_IRQ_INIT_NDX(GT, 2, dev_priv->pm_imr, dev_priv->pm_ier);
4153
- GEN8_IRQ_INIT_NDX(GT, 3, ~gt_interrupts[3], gt_interrupts[3]);
41543383 }
41553384
41563385 static void gen8_de_irq_postinstall(struct drm_i915_private *dev_priv)
41573386 {
4158
- uint32_t de_pipe_masked = GEN8_PIPE_CDCLK_CRC_DONE;
4159
- uint32_t de_pipe_enables;
4160
- u32 de_port_masked = GEN8_AUX_CHANNEL_A;
3387
+ struct intel_uncore *uncore = &dev_priv->uncore;
3388
+
3389
+ u32 de_pipe_masked = gen8_de_pipe_fault_mask(dev_priv) |
3390
+ GEN8_PIPE_CDCLK_CRC_DONE;
3391
+ u32 de_pipe_enables;
3392
+ u32 de_port_masked = gen8_de_port_aux_mask(dev_priv);
41613393 u32 de_port_enables;
41623394 u32 de_misc_masked = GEN8_DE_EDP_PSR;
3395
+ u32 trans_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) |
3396
+ BIT(TRANSCODER_C) | BIT(TRANSCODER_D);
41633397 enum pipe pipe;
41643398
41653399 if (INTEL_GEN(dev_priv) <= 10)
41663400 de_misc_masked |= GEN8_DE_MISC_GSE;
41673401
4168
- if (INTEL_GEN(dev_priv) >= 9) {
4169
- de_pipe_masked |= GEN9_DE_PIPE_IRQ_FAULT_ERRORS;
4170
- de_port_masked |= GEN9_AUX_CHANNEL_B | GEN9_AUX_CHANNEL_C |
4171
- GEN9_AUX_CHANNEL_D;
4172
- if (IS_GEN9_LP(dev_priv))
4173
- de_port_masked |= BXT_DE_PORT_GMBUS;
4174
- } else {
4175
- de_pipe_masked |= GEN8_DE_PIPE_IRQ_FAULT_ERRORS;
4176
- }
4177
-
4178
- if (INTEL_GEN(dev_priv) >= 11)
4179
- de_port_masked |= ICL_AUX_CHANNEL_E;
4180
-
4181
- if (IS_CNL_WITH_PORT_F(dev_priv) || INTEL_GEN(dev_priv) >= 11)
4182
- de_port_masked |= CNL_AUX_CHANNEL_F;
3402
+ if (IS_GEN9_LP(dev_priv))
3403
+ de_port_masked |= BXT_DE_PORT_GMBUS;
41833404
41843405 de_pipe_enables = de_pipe_masked | GEN8_PIPE_VBLANK |
41853406 GEN8_PIPE_FIFO_UNDERRUN;
....@@ -4190,28 +3411,42 @@
41903411 else if (IS_BROADWELL(dev_priv))
41913412 de_port_enables |= GEN8_PORT_DP_A_HOTPLUG;
41923413
4193
- gen3_assert_iir_is_zero(dev_priv, EDP_PSR_IIR);
4194
- intel_psr_irq_control(dev_priv, dev_priv->psr.debug);
3414
+ if (INTEL_GEN(dev_priv) >= 12) {
3415
+ enum transcoder trans;
3416
+
3417
+ for_each_cpu_transcoder_masked(dev_priv, trans, trans_mask) {
3418
+ enum intel_display_power_domain domain;
3419
+
3420
+ domain = POWER_DOMAIN_TRANSCODER(trans);
3421
+ if (!intel_display_power_is_enabled(dev_priv, domain))
3422
+ continue;
3423
+
3424
+ gen3_assert_iir_is_zero(uncore, TRANS_PSR_IIR(trans));
3425
+ }
3426
+ } else {
3427
+ gen3_assert_iir_is_zero(uncore, EDP_PSR_IIR);
3428
+ }
41953429
41963430 for_each_pipe(dev_priv, pipe) {
41973431 dev_priv->de_irq_mask[pipe] = ~de_pipe_masked;
41983432
41993433 if (intel_display_power_is_enabled(dev_priv,
42003434 POWER_DOMAIN_PIPE(pipe)))
4201
- GEN8_IRQ_INIT_NDX(DE_PIPE, pipe,
3435
+ GEN8_IRQ_INIT_NDX(uncore, DE_PIPE, pipe,
42023436 dev_priv->de_irq_mask[pipe],
42033437 de_pipe_enables);
42043438 }
42053439
4206
- GEN3_IRQ_INIT(GEN8_DE_PORT_, ~de_port_masked, de_port_enables);
4207
- GEN3_IRQ_INIT(GEN8_DE_MISC_, ~de_misc_masked, de_misc_masked);
3440
+ GEN3_IRQ_INIT(uncore, GEN8_DE_PORT_, ~de_port_masked, de_port_enables);
3441
+ GEN3_IRQ_INIT(uncore, GEN8_DE_MISC_, ~de_misc_masked, de_misc_masked);
42083442
42093443 if (INTEL_GEN(dev_priv) >= 11) {
42103444 u32 de_hpd_masked = 0;
42113445 u32 de_hpd_enables = GEN11_DE_TC_HOTPLUG_MASK |
42123446 GEN11_DE_TBT_HOTPLUG_MASK;
42133447
4214
- GEN3_IRQ_INIT(GEN11_DE_HPD_, ~de_hpd_masked, de_hpd_enables);
3448
+ GEN3_IRQ_INIT(uncore, GEN11_DE_HPD_, ~de_hpd_masked,
3449
+ de_hpd_enables);
42153450 gen11_hpd_detection_setup(dev_priv);
42163451 } else if (IS_GEN9_LP(dev_priv)) {
42173452 bxt_hpd_detection_setup(dev_priv);
....@@ -4220,93 +3455,72 @@
42203455 }
42213456 }
42223457
4223
-static int gen8_irq_postinstall(struct drm_device *dev)
3458
+static void gen8_irq_postinstall(struct drm_i915_private *dev_priv)
42243459 {
4225
- struct drm_i915_private *dev_priv = to_i915(dev);
4226
-
42273460 if (HAS_PCH_SPLIT(dev_priv))
4228
- ibx_irq_pre_postinstall(dev);
3461
+ ibx_irq_pre_postinstall(dev_priv);
42293462
4230
- gen8_gt_irq_postinstall(dev_priv);
3463
+ gen8_gt_irq_postinstall(&dev_priv->gt);
42313464 gen8_de_irq_postinstall(dev_priv);
42323465
42333466 if (HAS_PCH_SPLIT(dev_priv))
4234
- ibx_irq_postinstall(dev);
3467
+ ibx_irq_postinstall(dev_priv);
42353468
4236
- I915_WRITE(GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL);
4237
- POSTING_READ(GEN8_MASTER_IRQ);
4238
-
4239
- return 0;
3469
+ gen8_master_intr_enable(dev_priv->uncore.regs);
42403470 }
42413471
4242
-static void gen11_gt_irq_postinstall(struct drm_i915_private *dev_priv)
3472
+static void icp_irq_postinstall(struct drm_i915_private *dev_priv)
42433473 {
4244
- const u32 irqs = GT_RENDER_USER_INTERRUPT | GT_CONTEXT_SWITCH_INTERRUPT;
4245
-
4246
- BUILD_BUG_ON(irqs & 0xffff0000);
4247
-
4248
- /* Enable RCS, BCS, VCS and VECS class interrupts. */
4249
- I915_WRITE(GEN11_RENDER_COPY_INTR_ENABLE, irqs << 16 | irqs);
4250
- I915_WRITE(GEN11_VCS_VECS_INTR_ENABLE, irqs << 16 | irqs);
4251
-
4252
- /* Unmask irqs on RCS, BCS, VCS and VECS engines. */
4253
- I915_WRITE(GEN11_RCS0_RSVD_INTR_MASK, ~(irqs << 16));
4254
- I915_WRITE(GEN11_BCS_RSVD_INTR_MASK, ~(irqs << 16));
4255
- I915_WRITE(GEN11_VCS0_VCS1_INTR_MASK, ~(irqs | irqs << 16));
4256
- I915_WRITE(GEN11_VCS2_VCS3_INTR_MASK, ~(irqs | irqs << 16));
4257
- I915_WRITE(GEN11_VECS0_VECS1_INTR_MASK, ~(irqs | irqs << 16));
4258
-
4259
- /*
4260
- * RPS interrupts will get enabled/disabled on demand when RPS itself
4261
- * is enabled/disabled.
4262
- */
4263
- dev_priv->pm_ier = 0x0;
4264
- dev_priv->pm_imr = ~dev_priv->pm_ier;
4265
- I915_WRITE(GEN11_GPM_WGBOXPERF_INTR_ENABLE, 0);
4266
- I915_WRITE(GEN11_GPM_WGBOXPERF_INTR_MASK, ~0);
4267
-}
4268
-
4269
-static void icp_irq_postinstall(struct drm_device *dev)
4270
-{
4271
- struct drm_i915_private *dev_priv = to_i915(dev);
42723474 u32 mask = SDE_GMBUS_ICP;
42733475
4274
- WARN_ON(I915_READ(SDEIER) != 0);
3476
+ drm_WARN_ON(&dev_priv->drm, I915_READ(SDEIER) != 0);
42753477 I915_WRITE(SDEIER, 0xffffffff);
42763478 POSTING_READ(SDEIER);
42773479
4278
- gen3_assert_iir_is_zero(dev_priv, SDEIIR);
3480
+ gen3_assert_iir_is_zero(&dev_priv->uncore, SDEIIR);
42793481 I915_WRITE(SDEIMR, ~mask);
42803482
4281
- icp_hpd_detection_setup(dev_priv);
3483
+ if (HAS_PCH_TGP(dev_priv)) {
3484
+ icp_ddi_hpd_detection_setup(dev_priv, TGP_DDI_HPD_ENABLE_MASK);
3485
+ icp_tc_hpd_detection_setup(dev_priv, TGP_TC_HPD_ENABLE_MASK);
3486
+ } else if (HAS_PCH_JSP(dev_priv)) {
3487
+ icp_ddi_hpd_detection_setup(dev_priv, TGP_DDI_HPD_ENABLE_MASK);
3488
+ } else if (HAS_PCH_MCC(dev_priv)) {
3489
+ icp_ddi_hpd_detection_setup(dev_priv, ICP_DDI_HPD_ENABLE_MASK);
3490
+ icp_tc_hpd_detection_setup(dev_priv, ICP_TC_HPD_ENABLE(PORT_TC1));
3491
+ } else {
3492
+ icp_ddi_hpd_detection_setup(dev_priv, ICP_DDI_HPD_ENABLE_MASK);
3493
+ icp_tc_hpd_detection_setup(dev_priv, ICP_TC_HPD_ENABLE_MASK);
3494
+ }
42823495 }
42833496
4284
-static int gen11_irq_postinstall(struct drm_device *dev)
3497
+static void gen11_irq_postinstall(struct drm_i915_private *dev_priv)
42853498 {
4286
- struct drm_i915_private *dev_priv = dev->dev_private;
3499
+ struct intel_uncore *uncore = &dev_priv->uncore;
42873500 u32 gu_misc_masked = GEN11_GU_MISC_GSE;
42883501
4289
- if (HAS_PCH_ICP(dev_priv))
4290
- icp_irq_postinstall(dev);
3502
+ if (INTEL_PCH_TYPE(dev_priv) >= PCH_ICP)
3503
+ icp_irq_postinstall(dev_priv);
42913504
4292
- gen11_gt_irq_postinstall(dev_priv);
3505
+ gen11_gt_irq_postinstall(&dev_priv->gt);
42933506 gen8_de_irq_postinstall(dev_priv);
42943507
4295
- GEN3_IRQ_INIT(GEN11_GU_MISC_, ~gu_misc_masked, gu_misc_masked);
3508
+ GEN3_IRQ_INIT(uncore, GEN11_GU_MISC_, ~gu_misc_masked, gu_misc_masked);
42963509
42973510 I915_WRITE(GEN11_DISPLAY_INT_CTL, GEN11_DISPLAY_IRQ_ENABLE);
42983511
4299
- I915_WRITE(GEN11_GFX_MSTR_IRQ, GEN11_MASTER_IRQ);
4300
- POSTING_READ(GEN11_GFX_MSTR_IRQ);
4301
-
4302
- return 0;
3512
+ if (HAS_MASTER_UNIT_IRQ(dev_priv)) {
3513
+ dg1_master_intr_enable(uncore->regs);
3514
+ POSTING_READ(DG1_MSTR_UNIT_INTR);
3515
+ } else {
3516
+ gen11_master_intr_enable(uncore->regs);
3517
+ POSTING_READ(GEN11_GFX_MSTR_IRQ);
3518
+ }
43033519 }
43043520
4305
-static int cherryview_irq_postinstall(struct drm_device *dev)
3521
+static void cherryview_irq_postinstall(struct drm_i915_private *dev_priv)
43063522 {
4307
- struct drm_i915_private *dev_priv = to_i915(dev);
4308
-
4309
- gen8_gt_irq_postinstall(dev_priv);
3523
+ gen8_gt_irq_postinstall(&dev_priv->gt);
43103524
43113525 spin_lock_irq(&dev_priv->irq_lock);
43123526 if (dev_priv->display_irqs_enabled)
....@@ -4315,28 +3529,26 @@
43153529
43163530 I915_WRITE(GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL);
43173531 POSTING_READ(GEN8_MASTER_IRQ);
4318
-
4319
- return 0;
43203532 }
43213533
4322
-static void i8xx_irq_reset(struct drm_device *dev)
3534
+static void i8xx_irq_reset(struct drm_i915_private *dev_priv)
43233535 {
4324
- struct drm_i915_private *dev_priv = to_i915(dev);
3536
+ struct intel_uncore *uncore = &dev_priv->uncore;
43253537
43263538 i9xx_pipestat_irq_reset(dev_priv);
43273539
4328
- I915_WRITE16(HWSTAM, 0xffff);
4329
-
4330
- GEN2_IRQ_RESET();
3540
+ GEN2_IRQ_RESET(uncore);
43313541 }
43323542
4333
-static int i8xx_irq_postinstall(struct drm_device *dev)
3543
+static void i8xx_irq_postinstall(struct drm_i915_private *dev_priv)
43343544 {
4335
- struct drm_i915_private *dev_priv = to_i915(dev);
3545
+ struct intel_uncore *uncore = &dev_priv->uncore;
43363546 u16 enable_mask;
43373547
4338
- I915_WRITE16(EMR, ~(I915_ERROR_PAGE_TABLE |
4339
- I915_ERROR_MEMORY_REFRESH));
3548
+ intel_uncore_write16(uncore,
3549
+ EMR,
3550
+ ~(I915_ERROR_PAGE_TABLE |
3551
+ I915_ERROR_MEMORY_REFRESH));
43403552
43413553 /* Unmask the interrupts that we always want on. */
43423554 dev_priv->irq_mask =
....@@ -4350,7 +3562,7 @@
43503562 I915_MASTER_ERROR_INTERRUPT |
43513563 I915_USER_INTERRUPT;
43523564
4353
- GEN2_IRQ_INIT(, dev_priv->irq_mask, enable_mask);
3565
+ GEN2_IRQ_INIT(uncore, dev_priv->irq_mask, enable_mask);
43543566
43553567 /* Interrupt setup is already guaranteed to be single-threaded, this is
43563568 * just to make the assert_spin_locked check happy. */
....@@ -4358,21 +3570,20 @@
43583570 i915_enable_pipestat(dev_priv, PIPE_A, PIPE_CRC_DONE_INTERRUPT_STATUS);
43593571 i915_enable_pipestat(dev_priv, PIPE_B, PIPE_CRC_DONE_INTERRUPT_STATUS);
43603572 spin_unlock_irq(&dev_priv->irq_lock);
4361
-
4362
- return 0;
43633573 }
43643574
4365
-static void i8xx_error_irq_ack(struct drm_i915_private *dev_priv,
3575
+static void i8xx_error_irq_ack(struct drm_i915_private *i915,
43663576 u16 *eir, u16 *eir_stuck)
43673577 {
3578
+ struct intel_uncore *uncore = &i915->uncore;
43683579 u16 emr;
43693580
4370
- *eir = I915_READ16(EIR);
3581
+ *eir = intel_uncore_read16(uncore, EIR);
43713582
43723583 if (*eir)
4373
- I915_WRITE16(EIR, *eir);
3584
+ intel_uncore_write16(uncore, EIR, *eir);
43743585
4375
- *eir_stuck = I915_READ16(EIR);
3586
+ *eir_stuck = intel_uncore_read16(uncore, EIR);
43763587 if (*eir_stuck == 0)
43773588 return;
43783589
....@@ -4386,9 +3597,9 @@
43863597 * (or by a GPU reset) so we mask any bit that
43873598 * remains set.
43883599 */
4389
- emr = I915_READ16(EMR);
4390
- I915_WRITE16(EMR, 0xffff);
4391
- I915_WRITE16(EMR, emr | *eir_stuck);
3600
+ emr = intel_uncore_read16(uncore, EMR);
3601
+ intel_uncore_write16(uncore, EMR, 0xffff);
3602
+ intel_uncore_write16(uncore, EMR, emr | *eir_stuck);
43923603 }
43933604
43943605 static void i8xx_error_irq_handler(struct drm_i915_private *dev_priv,
....@@ -4397,7 +3608,8 @@
43973608 DRM_DEBUG("Master Error: EIR 0x%04x\n", eir);
43983609
43993610 if (eir_stuck)
4400
- DRM_DEBUG_DRIVER("EIR stuck: 0x%04x, masked\n", eir_stuck);
3611
+ drm_dbg(&dev_priv->drm, "EIR stuck: 0x%04x, masked\n",
3612
+ eir_stuck);
44013613 }
44023614
44033615 static void i9xx_error_irq_ack(struct drm_i915_private *dev_priv,
....@@ -4434,27 +3646,27 @@
44343646 DRM_DEBUG("Master Error, EIR 0x%08x\n", eir);
44353647
44363648 if (eir_stuck)
4437
- DRM_DEBUG_DRIVER("EIR stuck: 0x%08x, masked\n", eir_stuck);
3649
+ drm_dbg(&dev_priv->drm, "EIR stuck: 0x%08x, masked\n",
3650
+ eir_stuck);
44383651 }
44393652
44403653 static irqreturn_t i8xx_irq_handler(int irq, void *arg)
44413654 {
4442
- struct drm_device *dev = arg;
4443
- struct drm_i915_private *dev_priv = to_i915(dev);
3655
+ struct drm_i915_private *dev_priv = arg;
44443656 irqreturn_t ret = IRQ_NONE;
44453657
44463658 if (!intel_irqs_enabled(dev_priv))
44473659 return IRQ_NONE;
44483660
44493661 /* IRQs are synced during runtime_suspend, we don't require a wakeref */
4450
- disable_rpm_wakeref_asserts(dev_priv);
3662
+ disable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
44513663
44523664 do {
44533665 u32 pipe_stats[I915_MAX_PIPES] = {};
44543666 u16 eir = 0, eir_stuck = 0;
44553667 u16 iir;
44563668
4457
- iir = I915_READ16(IIR);
3669
+ iir = intel_uncore_read16(&dev_priv->uncore, GEN2_IIR);
44583670 if (iir == 0)
44593671 break;
44603672
....@@ -4467,10 +3679,10 @@
44673679 if (iir & I915_MASTER_ERROR_INTERRUPT)
44683680 i8xx_error_irq_ack(dev_priv, &eir, &eir_stuck);
44693681
4470
- I915_WRITE16(IIR, iir);
3682
+ intel_uncore_write16(&dev_priv->uncore, GEN2_IIR, iir);
44713683
44723684 if (iir & I915_USER_INTERRUPT)
4473
- notify_ring(dev_priv->engine[RCS]);
3685
+ intel_engine_signal_breadcrumbs(dev_priv->gt.engine[RCS0]);
44743686
44753687 if (iir & I915_MASTER_ERROR_INTERRUPT)
44763688 i8xx_error_irq_handler(dev_priv, eir, eir_stuck);
....@@ -4478,14 +3690,14 @@
44783690 i8xx_pipestat_irq_handler(dev_priv, iir, pipe_stats);
44793691 } while (0);
44803692
4481
- enable_rpm_wakeref_asserts(dev_priv);
3693
+ enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
44823694
44833695 return ret;
44843696 }
44853697
4486
-static void i915_irq_reset(struct drm_device *dev)
3698
+static void i915_irq_reset(struct drm_i915_private *dev_priv)
44873699 {
4488
- struct drm_i915_private *dev_priv = to_i915(dev);
3700
+ struct intel_uncore *uncore = &dev_priv->uncore;
44893701
44903702 if (I915_HAS_HOTPLUG(dev_priv)) {
44913703 i915_hotplug_interrupt_update(dev_priv, 0xffffffff, 0);
....@@ -4494,14 +3706,12 @@
44943706
44953707 i9xx_pipestat_irq_reset(dev_priv);
44963708
4497
- I915_WRITE(HWSTAM, 0xffffffff);
4498
-
4499
- GEN3_IRQ_RESET();
3709
+ GEN3_IRQ_RESET(uncore, GEN2_);
45003710 }
45013711
4502
-static int i915_irq_postinstall(struct drm_device *dev)
3712
+static void i915_irq_postinstall(struct drm_i915_private *dev_priv)
45033713 {
4504
- struct drm_i915_private *dev_priv = to_i915(dev);
3714
+ struct intel_uncore *uncore = &dev_priv->uncore;
45053715 u32 enable_mask;
45063716
45073717 I915_WRITE(EMR, ~(I915_ERROR_PAGE_TABLE |
....@@ -4528,7 +3738,7 @@
45283738 dev_priv->irq_mask &= ~I915_DISPLAY_PORT_INTERRUPT;
45293739 }
45303740
4531
- GEN3_IRQ_INIT(, dev_priv->irq_mask, enable_mask);
3741
+ GEN3_IRQ_INIT(uncore, GEN2_, dev_priv->irq_mask, enable_mask);
45323742
45333743 /* Interrupt setup is already guaranteed to be single-threaded, this is
45343744 * just to make the assert_spin_locked check happy. */
....@@ -4538,21 +3748,18 @@
45383748 spin_unlock_irq(&dev_priv->irq_lock);
45393749
45403750 i915_enable_asle_pipestat(dev_priv);
4541
-
4542
- return 0;
45433751 }
45443752
45453753 static irqreturn_t i915_irq_handler(int irq, void *arg)
45463754 {
4547
- struct drm_device *dev = arg;
4548
- struct drm_i915_private *dev_priv = to_i915(dev);
3755
+ struct drm_i915_private *dev_priv = arg;
45493756 irqreturn_t ret = IRQ_NONE;
45503757
45513758 if (!intel_irqs_enabled(dev_priv))
45523759 return IRQ_NONE;
45533760
45543761 /* IRQs are synced during runtime_suspend, we don't require a wakeref */
4555
- disable_rpm_wakeref_asserts(dev_priv);
3762
+ disable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
45563763
45573764 do {
45583765 u32 pipe_stats[I915_MAX_PIPES] = {};
....@@ -4560,7 +3767,7 @@
45603767 u32 hotplug_status = 0;
45613768 u32 iir;
45623769
4563
- iir = I915_READ(IIR);
3770
+ iir = I915_READ(GEN2_IIR);
45643771 if (iir == 0)
45653772 break;
45663773
....@@ -4577,10 +3784,10 @@
45773784 if (iir & I915_MASTER_ERROR_INTERRUPT)
45783785 i9xx_error_irq_ack(dev_priv, &eir, &eir_stuck);
45793786
4580
- I915_WRITE(IIR, iir);
3787
+ I915_WRITE(GEN2_IIR, iir);
45813788
45823789 if (iir & I915_USER_INTERRUPT)
4583
- notify_ring(dev_priv->engine[RCS]);
3790
+ intel_engine_signal_breadcrumbs(dev_priv->gt.engine[RCS0]);
45843791
45853792 if (iir & I915_MASTER_ERROR_INTERRUPT)
45863793 i9xx_error_irq_handler(dev_priv, eir, eir_stuck);
....@@ -4591,28 +3798,26 @@
45913798 i915_pipestat_irq_handler(dev_priv, iir, pipe_stats);
45923799 } while (0);
45933800
4594
- enable_rpm_wakeref_asserts(dev_priv);
3801
+ enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
45953802
45963803 return ret;
45973804 }
45983805
4599
-static void i965_irq_reset(struct drm_device *dev)
3806
+static void i965_irq_reset(struct drm_i915_private *dev_priv)
46003807 {
4601
- struct drm_i915_private *dev_priv = to_i915(dev);
3808
+ struct intel_uncore *uncore = &dev_priv->uncore;
46023809
46033810 i915_hotplug_interrupt_update(dev_priv, 0xffffffff, 0);
46043811 I915_WRITE(PORT_HOTPLUG_STAT, I915_READ(PORT_HOTPLUG_STAT));
46053812
46063813 i9xx_pipestat_irq_reset(dev_priv);
46073814
4608
- I915_WRITE(HWSTAM, 0xffffffff);
4609
-
4610
- GEN3_IRQ_RESET();
3815
+ GEN3_IRQ_RESET(uncore, GEN2_);
46113816 }
46123817
4613
-static int i965_irq_postinstall(struct drm_device *dev)
3818
+static void i965_irq_postinstall(struct drm_i915_private *dev_priv)
46143819 {
4615
- struct drm_i915_private *dev_priv = to_i915(dev);
3820
+ struct intel_uncore *uncore = &dev_priv->uncore;
46163821 u32 enable_mask;
46173822 u32 error_mask;
46183823
....@@ -4650,7 +3855,7 @@
46503855 if (IS_G4X(dev_priv))
46513856 enable_mask |= I915_BSD_USER_INTERRUPT;
46523857
4653
- GEN3_IRQ_INIT(, dev_priv->irq_mask, enable_mask);
3858
+ GEN3_IRQ_INIT(uncore, GEN2_, dev_priv->irq_mask, enable_mask);
46543859
46553860 /* Interrupt setup is already guaranteed to be single-threaded, this is
46563861 * just to make the assert_spin_locked check happy. */
....@@ -4661,8 +3866,6 @@
46613866 spin_unlock_irq(&dev_priv->irq_lock);
46623867
46633868 i915_enable_asle_pipestat(dev_priv);
4664
-
4665
- return 0;
46663869 }
46673870
46683871 static void i915_hpd_irq_setup(struct drm_i915_private *dev_priv)
....@@ -4692,15 +3895,14 @@
46923895
46933896 static irqreturn_t i965_irq_handler(int irq, void *arg)
46943897 {
4695
- struct drm_device *dev = arg;
4696
- struct drm_i915_private *dev_priv = to_i915(dev);
3898
+ struct drm_i915_private *dev_priv = arg;
46973899 irqreturn_t ret = IRQ_NONE;
46983900
46993901 if (!intel_irqs_enabled(dev_priv))
47003902 return IRQ_NONE;
47013903
47023904 /* IRQs are synced during runtime_suspend, we don't require a wakeref */
4703
- disable_rpm_wakeref_asserts(dev_priv);
3905
+ disable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
47043906
47053907 do {
47063908 u32 pipe_stats[I915_MAX_PIPES] = {};
....@@ -4708,7 +3910,7 @@
47083910 u32 hotplug_status = 0;
47093911 u32 iir;
47103912
4711
- iir = I915_READ(IIR);
3913
+ iir = I915_READ(GEN2_IIR);
47123914 if (iir == 0)
47133915 break;
47143916
....@@ -4724,13 +3926,13 @@
47243926 if (iir & I915_MASTER_ERROR_INTERRUPT)
47253927 i9xx_error_irq_ack(dev_priv, &eir, &eir_stuck);
47263928
4727
- I915_WRITE(IIR, iir);
3929
+ I915_WRITE(GEN2_IIR, iir);
47283930
47293931 if (iir & I915_USER_INTERRUPT)
4730
- notify_ring(dev_priv->engine[RCS]);
3932
+ intel_engine_signal_breadcrumbs(dev_priv->gt.engine[RCS0]);
47313933
47323934 if (iir & I915_BSD_USER_INTERRUPT)
4733
- notify_ring(dev_priv->engine[VCS]);
3935
+ intel_engine_signal_breadcrumbs(dev_priv->gt.engine[VCS0]);
47343936
47353937 if (iir & I915_MASTER_ERROR_INTERRUPT)
47363938 i9xx_error_irq_handler(dev_priv, eir, eir_stuck);
....@@ -4741,7 +3943,7 @@
47413943 i965_pipestat_irq_handler(dev_priv, iir, pipe_stats);
47423944 } while (0);
47433945
4744
- enable_rpm_wakeref_asserts(dev_priv);
3946
+ enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
47453947
47463948 return ret;
47473949 }
....@@ -4756,59 +3958,21 @@
47563958 void intel_irq_init(struct drm_i915_private *dev_priv)
47573959 {
47583960 struct drm_device *dev = &dev_priv->drm;
4759
- struct intel_rps *rps = &dev_priv->gt_pm.rps;
47603961 int i;
3962
+
3963
+ intel_hpd_init_pins(dev_priv);
47613964
47623965 intel_hpd_init_work(dev_priv);
47633966
4764
- INIT_WORK(&rps->work, gen6_pm_rps_work);
4765
-
4766
- INIT_WORK(&dev_priv->l3_parity.error_work, ivybridge_parity_work);
3967
+ INIT_WORK(&dev_priv->l3_parity.error_work, ivb_parity_work);
47673968 for (i = 0; i < MAX_L3_SLICES; ++i)
47683969 dev_priv->l3_parity.remap_info[i] = NULL;
47693970
4770
- if (HAS_GUC_SCHED(dev_priv))
4771
- dev_priv->pm_guc_events = GEN9_GUC_TO_HOST_INT_EVENT;
3971
+ /* pre-gen11 the guc irqs bits are in the upper 16 bits of the pm reg */
3972
+ if (HAS_GT_UC(dev_priv) && INTEL_GEN(dev_priv) < 11)
3973
+ dev_priv->gt.pm_guc_events = GUC_INTR_GUC2HOST << 16;
47723974
4773
- /* Let's track the enabled rps events */
4774
- if (IS_VALLEYVIEW(dev_priv))
4775
- /* WaGsvRC0ResidencyMethod:vlv */
4776
- dev_priv->pm_rps_events = GEN6_PM_RP_UP_EI_EXPIRED;
4777
- else
4778
- dev_priv->pm_rps_events = GEN6_PM_RPS_EVENTS;
4779
-
4780
- rps->pm_intrmsk_mbz = 0;
4781
-
4782
- /*
4783
- * SNB,IVB,HSW can while VLV,CHV may hard hang on looping batchbuffer
4784
- * if GEN6_PM_UP_EI_EXPIRED is masked.
4785
- *
4786
- * TODO: verify if this can be reproduced on VLV,CHV.
4787
- */
4788
- if (INTEL_GEN(dev_priv) <= 7)
4789
- rps->pm_intrmsk_mbz |= GEN6_PM_RP_UP_EI_EXPIRED;
4790
-
4791
- if (INTEL_GEN(dev_priv) >= 8)
4792
- rps->pm_intrmsk_mbz |= GEN8_PMINTR_DISABLE_REDIRECT_TO_GUC;
4793
-
4794
- if (IS_GEN2(dev_priv)) {
4795
- /* Gen2 doesn't have a hardware frame counter */
4796
- dev->max_vblank_count = 0;
4797
- } else if (IS_G4X(dev_priv) || INTEL_GEN(dev_priv) >= 5) {
4798
- dev->max_vblank_count = 0xffffffff; /* full 32 bit counter */
4799
- dev->driver->get_vblank_counter = g4x_get_vblank_counter;
4800
- } else {
4801
- dev->driver->get_vblank_counter = i915_get_vblank_counter;
4802
- dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */
4803
- }
4804
-
4805
- /*
4806
- * Opt out of the vblank disable timer on everything except gen2.
4807
- * Gen2 doesn't have a hardware frame counter and so depends on
4808
- * vblank interrupts to produce sane vblank seuquence numbers.
4809
- */
4810
- if (!IS_GEN2(dev_priv))
4811
- dev->vblank_disable_immediate = true;
3975
+ dev->vblank_disable_immediate = true;
48123976
48133977 /* Most platforms treat the display irq block as an always-on
48143978 * power domain. vlv/chv can disable it at runtime and need
....@@ -4821,81 +3985,30 @@
48213985 dev_priv->display_irqs_enabled = false;
48223986
48233987 dev_priv->hotplug.hpd_storm_threshold = HPD_STORM_DEFAULT_THRESHOLD;
3988
+ /* If we have MST support, we want to avoid doing short HPD IRQ storm
3989
+ * detection, as short HPD storms will occur as a natural part of
3990
+ * sideband messaging with MST.
3991
+ * On older platforms however, IRQ storms can occur with both long and
3992
+ * short pulses, as seen on some G4x systems.
3993
+ */
3994
+ dev_priv->hotplug.hpd_short_storm_enabled = !HAS_DP_MST(dev_priv);
48243995
4825
- dev->driver->get_vblank_timestamp = drm_calc_vbltimestamp_from_scanoutpos;
4826
- dev->driver->get_scanout_position = i915_get_crtc_scanoutpos;
4827
-
4828
- if (IS_CHERRYVIEW(dev_priv)) {
4829
- dev->driver->irq_handler = cherryview_irq_handler;
4830
- dev->driver->irq_preinstall = cherryview_irq_reset;
4831
- dev->driver->irq_postinstall = cherryview_irq_postinstall;
4832
- dev->driver->irq_uninstall = cherryview_irq_reset;
4833
- dev->driver->enable_vblank = i965_enable_vblank;
4834
- dev->driver->disable_vblank = i965_disable_vblank;
4835
- dev_priv->display.hpd_irq_setup = i915_hpd_irq_setup;
4836
- } else if (IS_VALLEYVIEW(dev_priv)) {
4837
- dev->driver->irq_handler = valleyview_irq_handler;
4838
- dev->driver->irq_preinstall = valleyview_irq_reset;
4839
- dev->driver->irq_postinstall = valleyview_irq_postinstall;
4840
- dev->driver->irq_uninstall = valleyview_irq_reset;
4841
- dev->driver->enable_vblank = i965_enable_vblank;
4842
- dev->driver->disable_vblank = i965_disable_vblank;
4843
- dev_priv->display.hpd_irq_setup = i915_hpd_irq_setup;
4844
- } else if (INTEL_GEN(dev_priv) >= 11) {
4845
- dev->driver->irq_handler = gen11_irq_handler;
4846
- dev->driver->irq_preinstall = gen11_irq_reset;
4847
- dev->driver->irq_postinstall = gen11_irq_postinstall;
4848
- dev->driver->irq_uninstall = gen11_irq_reset;
4849
- dev->driver->enable_vblank = gen8_enable_vblank;
4850
- dev->driver->disable_vblank = gen8_disable_vblank;
4851
- dev_priv->display.hpd_irq_setup = gen11_hpd_irq_setup;
4852
- } else if (INTEL_GEN(dev_priv) >= 8) {
4853
- dev->driver->irq_handler = gen8_irq_handler;
4854
- dev->driver->irq_preinstall = gen8_irq_reset;
4855
- dev->driver->irq_postinstall = gen8_irq_postinstall;
4856
- dev->driver->irq_uninstall = gen8_irq_reset;
4857
- dev->driver->enable_vblank = gen8_enable_vblank;
4858
- dev->driver->disable_vblank = gen8_disable_vblank;
4859
- if (IS_GEN9_LP(dev_priv))
3996
+ if (HAS_GMCH(dev_priv)) {
3997
+ if (I915_HAS_HOTPLUG(dev_priv))
3998
+ dev_priv->display.hpd_irq_setup = i915_hpd_irq_setup;
3999
+ } else {
4000
+ if (HAS_PCH_JSP(dev_priv))
4001
+ dev_priv->display.hpd_irq_setup = jsp_hpd_irq_setup;
4002
+ else if (HAS_PCH_MCC(dev_priv))
4003
+ dev_priv->display.hpd_irq_setup = mcc_hpd_irq_setup;
4004
+ else if (INTEL_GEN(dev_priv) >= 11)
4005
+ dev_priv->display.hpd_irq_setup = gen11_hpd_irq_setup;
4006
+ else if (IS_GEN9_LP(dev_priv))
48604007 dev_priv->display.hpd_irq_setup = bxt_hpd_irq_setup;
4861
- else if (HAS_PCH_SPT(dev_priv) || HAS_PCH_KBP(dev_priv) ||
4862
- HAS_PCH_CNP(dev_priv))
4008
+ else if (INTEL_PCH_TYPE(dev_priv) >= PCH_SPT)
48634009 dev_priv->display.hpd_irq_setup = spt_hpd_irq_setup;
48644010 else
48654011 dev_priv->display.hpd_irq_setup = ilk_hpd_irq_setup;
4866
- } else if (HAS_PCH_SPLIT(dev_priv)) {
4867
- dev->driver->irq_handler = ironlake_irq_handler;
4868
- dev->driver->irq_preinstall = ironlake_irq_reset;
4869
- dev->driver->irq_postinstall = ironlake_irq_postinstall;
4870
- dev->driver->irq_uninstall = ironlake_irq_reset;
4871
- dev->driver->enable_vblank = ironlake_enable_vblank;
4872
- dev->driver->disable_vblank = ironlake_disable_vblank;
4873
- dev_priv->display.hpd_irq_setup = ilk_hpd_irq_setup;
4874
- } else {
4875
- if (IS_GEN2(dev_priv)) {
4876
- dev->driver->irq_preinstall = i8xx_irq_reset;
4877
- dev->driver->irq_postinstall = i8xx_irq_postinstall;
4878
- dev->driver->irq_handler = i8xx_irq_handler;
4879
- dev->driver->irq_uninstall = i8xx_irq_reset;
4880
- dev->driver->enable_vblank = i8xx_enable_vblank;
4881
- dev->driver->disable_vblank = i8xx_disable_vblank;
4882
- } else if (IS_GEN3(dev_priv)) {
4883
- dev->driver->irq_preinstall = i915_irq_reset;
4884
- dev->driver->irq_postinstall = i915_irq_postinstall;
4885
- dev->driver->irq_uninstall = i915_irq_reset;
4886
- dev->driver->irq_handler = i915_irq_handler;
4887
- dev->driver->enable_vblank = i8xx_enable_vblank;
4888
- dev->driver->disable_vblank = i8xx_disable_vblank;
4889
- } else {
4890
- dev->driver->irq_preinstall = i965_irq_reset;
4891
- dev->driver->irq_postinstall = i965_irq_postinstall;
4892
- dev->driver->irq_uninstall = i965_irq_reset;
4893
- dev->driver->irq_handler = i965_irq_handler;
4894
- dev->driver->enable_vblank = i965_enable_vblank;
4895
- dev->driver->disable_vblank = i965_disable_vblank;
4896
- }
4897
- if (I915_HAS_HOTPLUG(dev_priv))
4898
- dev_priv->display.hpd_irq_setup = i915_hpd_irq_setup;
48994012 }
49004013 }
49014014
....@@ -4913,6 +4026,77 @@
49134026 kfree(i915->l3_parity.remap_info[i]);
49144027 }
49154028
4029
+static irq_handler_t intel_irq_handler(struct drm_i915_private *dev_priv)
4030
+{
4031
+ if (HAS_GMCH(dev_priv)) {
4032
+ if (IS_CHERRYVIEW(dev_priv))
4033
+ return cherryview_irq_handler;
4034
+ else if (IS_VALLEYVIEW(dev_priv))
4035
+ return valleyview_irq_handler;
4036
+ else if (IS_GEN(dev_priv, 4))
4037
+ return i965_irq_handler;
4038
+ else if (IS_GEN(dev_priv, 3))
4039
+ return i915_irq_handler;
4040
+ else
4041
+ return i8xx_irq_handler;
4042
+ } else {
4043
+ if (HAS_MASTER_UNIT_IRQ(dev_priv))
4044
+ return dg1_irq_handler;
4045
+ if (INTEL_GEN(dev_priv) >= 11)
4046
+ return gen11_irq_handler;
4047
+ else if (INTEL_GEN(dev_priv) >= 8)
4048
+ return gen8_irq_handler;
4049
+ else
4050
+ return ilk_irq_handler;
4051
+ }
4052
+}
4053
+
4054
+static void intel_irq_reset(struct drm_i915_private *dev_priv)
4055
+{
4056
+ if (HAS_GMCH(dev_priv)) {
4057
+ if (IS_CHERRYVIEW(dev_priv))
4058
+ cherryview_irq_reset(dev_priv);
4059
+ else if (IS_VALLEYVIEW(dev_priv))
4060
+ valleyview_irq_reset(dev_priv);
4061
+ else if (IS_GEN(dev_priv, 4))
4062
+ i965_irq_reset(dev_priv);
4063
+ else if (IS_GEN(dev_priv, 3))
4064
+ i915_irq_reset(dev_priv);
4065
+ else
4066
+ i8xx_irq_reset(dev_priv);
4067
+ } else {
4068
+ if (INTEL_GEN(dev_priv) >= 11)
4069
+ gen11_irq_reset(dev_priv);
4070
+ else if (INTEL_GEN(dev_priv) >= 8)
4071
+ gen8_irq_reset(dev_priv);
4072
+ else
4073
+ ilk_irq_reset(dev_priv);
4074
+ }
4075
+}
4076
+
4077
+static void intel_irq_postinstall(struct drm_i915_private *dev_priv)
4078
+{
4079
+ if (HAS_GMCH(dev_priv)) {
4080
+ if (IS_CHERRYVIEW(dev_priv))
4081
+ cherryview_irq_postinstall(dev_priv);
4082
+ else if (IS_VALLEYVIEW(dev_priv))
4083
+ valleyview_irq_postinstall(dev_priv);
4084
+ else if (IS_GEN(dev_priv, 4))
4085
+ i965_irq_postinstall(dev_priv);
4086
+ else if (IS_GEN(dev_priv, 3))
4087
+ i915_irq_postinstall(dev_priv);
4088
+ else
4089
+ i8xx_irq_postinstall(dev_priv);
4090
+ } else {
4091
+ if (INTEL_GEN(dev_priv) >= 11)
4092
+ gen11_irq_postinstall(dev_priv);
4093
+ else if (INTEL_GEN(dev_priv) >= 8)
4094
+ gen8_irq_postinstall(dev_priv);
4095
+ else
4096
+ ilk_irq_postinstall(dev_priv);
4097
+ }
4098
+}
4099
+
49164100 /**
49174101 * intel_irq_install - enables the hardware interrupt
49184102 * @dev_priv: i915 device instance
....@@ -4926,6 +4110,9 @@
49264110 */
49274111 int intel_irq_install(struct drm_i915_private *dev_priv)
49284112 {
4113
+ int irq = dev_priv->drm.pdev->irq;
4114
+ int ret;
4115
+
49294116 /*
49304117 * We enable some interrupt sources in our postinstall hooks, so mark
49314118 * interrupts as enabled _before_ actually enabling them to avoid
....@@ -4933,7 +4120,20 @@
49334120 */
49344121 dev_priv->runtime_pm.irqs_enabled = true;
49354122
4936
- return drm_irq_install(&dev_priv->drm, dev_priv->drm.pdev->irq);
4123
+ dev_priv->drm.irq_enabled = true;
4124
+
4125
+ intel_irq_reset(dev_priv);
4126
+
4127
+ ret = request_irq(irq, intel_irq_handler(dev_priv),
4128
+ IRQF_SHARED, DRIVER_NAME, dev_priv);
4129
+ if (ret < 0) {
4130
+ dev_priv->drm.irq_enabled = false;
4131
+ return ret;
4132
+ }
4133
+
4134
+ intel_irq_postinstall(dev_priv);
4135
+
4136
+ return ret;
49374137 }
49384138
49394139 /**
....@@ -4945,7 +4145,23 @@
49454145 */
49464146 void intel_irq_uninstall(struct drm_i915_private *dev_priv)
49474147 {
4948
- drm_irq_uninstall(&dev_priv->drm);
4148
+ int irq = dev_priv->drm.pdev->irq;
4149
+
4150
+ /*
4151
+ * FIXME we can get called twice during driver probe
4152
+ * error handling as well as during driver remove due to
4153
+ * intel_modeset_driver_remove() calling us out of sequence.
4154
+ * Would be nice if it didn't do that...
4155
+ */
4156
+ if (!dev_priv->drm.irq_enabled)
4157
+ return;
4158
+
4159
+ dev_priv->drm.irq_enabled = false;
4160
+
4161
+ intel_irq_reset(dev_priv);
4162
+
4163
+ free_irq(irq, dev_priv);
4164
+
49494165 intel_hpd_cancel_work(dev_priv);
49504166 dev_priv->runtime_pm.irqs_enabled = false;
49514167 }
....@@ -4959,9 +4175,9 @@
49594175 */
49604176 void intel_runtime_pm_disable_interrupts(struct drm_i915_private *dev_priv)
49614177 {
4962
- dev_priv->drm.driver->irq_uninstall(&dev_priv->drm);
4178
+ intel_irq_reset(dev_priv);
49634179 dev_priv->runtime_pm.irqs_enabled = false;
4964
- synchronize_irq(dev_priv->drm.irq);
4180
+ intel_synchronize_irq(dev_priv);
49654181 }
49664182
49674183 /**
....@@ -4974,6 +4190,20 @@
49744190 void intel_runtime_pm_enable_interrupts(struct drm_i915_private *dev_priv)
49754191 {
49764192 dev_priv->runtime_pm.irqs_enabled = true;
4977
- dev_priv->drm.driver->irq_preinstall(&dev_priv->drm);
4978
- dev_priv->drm.driver->irq_postinstall(&dev_priv->drm);
4193
+ intel_irq_reset(dev_priv);
4194
+ intel_irq_postinstall(dev_priv);
4195
+}
4196
+
4197
+bool intel_irqs_enabled(struct drm_i915_private *dev_priv)
4198
+{
4199
+ /*
4200
+ * We only use drm_irq_uninstall() at unload and VT switch, so
4201
+ * this is the only thing we need to check.
4202
+ */
4203
+ return dev_priv->runtime_pm.irqs_enabled;
4204
+}
4205
+
4206
+void intel_synchronize_irq(struct drm_i915_private *i915)
4207
+{
4208
+ synchronize_irq(i915->drm.pdev->irq);
49794209 }