aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_irq.c
diff options
context:
space:
mode:
authorPaulo Zanoni <paulo.r.zanoni@intel.com>2013-04-12 16:57:57 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-04-19 03:33:11 -0400
commit8664281b64c457705db72fc60143d03827e75ca9 (patch)
treeafe46a87c518c13636a05c25744e3b1f49c0aeec /drivers/gpu/drm/i915/i915_irq.c
parent89b667f86a62a99a7b484a7e1b3f8f7a108a7dee (diff)
drm/i915: report Gen5+ CPU and PCH FIFO underruns
In this commit we enable both CPU and PCH FIFO underrun reporting and start reporting them. We follow a few rules: - after we receive one of these errors, we mask the interrupt, so we won't get an "interrupt storm" and we also won't flood dmesg; - at each mode set we enable the interrupts again, so we'll see each message at most once per mode set; - in the specific places where we need to ignore the errors, we completely mask the interrupts. The downside of this patch is that since we're completely disabling (masking) the interrupts instead of just not printing error messages, we will mask more than just what we want on IVB/HSW CPU interrupts (due to GEN7_ERR_INT) and on CPT/PPT/LPT PCHs (due to SERR_INT). So when we decide to mask PCH FIFO underruns for pipe A on CPT, we'll also be masking PCH FIFO underruns for pipe B, because both are reported by SERR_INT, which has to be either completely enabled or completely disabled (in othe words, there's no way to disable/enable specific bits of GEN7_ERR_INT and SERR_INT). V2: Rename some functions and variables, downgrade messages to DRM_DEBUG_DRIVER and rebase. Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Reviewed-by: Imre Deak <imre.deak@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_irq.c')
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c315
1 files changed, 306 insertions, 9 deletions
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 932e7f8b6d5c..c79793ee868b 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -112,6 +112,213 @@ ironlake_disable_display_irq(drm_i915_private_t *dev_priv, u32 mask)
112 } 112 }
113} 113}
114 114
115static bool ivb_can_enable_err_int(struct drm_device *dev)
116{
117 struct drm_i915_private *dev_priv = dev->dev_private;
118 struct intel_crtc *crtc;
119 enum pipe pipe;
120
121 for_each_pipe(pipe) {
122 crtc = to_intel_crtc(dev_priv->pipe_to_crtc_mapping[pipe]);
123
124 if (crtc->cpu_fifo_underrun_disabled)
125 return false;
126 }
127
128 return true;
129}
130
131static bool cpt_can_enable_serr_int(struct drm_device *dev)
132{
133 struct drm_i915_private *dev_priv = dev->dev_private;
134 enum pipe pipe;
135 struct intel_crtc *crtc;
136
137 for_each_pipe(pipe) {
138 crtc = to_intel_crtc(dev_priv->pipe_to_crtc_mapping[pipe]);
139
140 if (crtc->pch_fifo_underrun_disabled)
141 return false;
142 }
143
144 return true;
145}
146
147static void ironlake_set_fifo_underrun_reporting(struct drm_device *dev,
148 enum pipe pipe, bool enable)
149{
150 struct drm_i915_private *dev_priv = dev->dev_private;
151 uint32_t bit = (pipe == PIPE_A) ? DE_PIPEA_FIFO_UNDERRUN :
152 DE_PIPEB_FIFO_UNDERRUN;
153
154 if (enable)
155 ironlake_enable_display_irq(dev_priv, bit);
156 else
157 ironlake_disable_display_irq(dev_priv, bit);
158}
159
160static void ivybridge_set_fifo_underrun_reporting(struct drm_device *dev,
161 bool enable)
162{
163 struct drm_i915_private *dev_priv = dev->dev_private;
164
165 if (enable) {
166 if (!ivb_can_enable_err_int(dev))
167 return;
168
169 I915_WRITE(GEN7_ERR_INT, ERR_INT_FIFO_UNDERRUN_A |
170 ERR_INT_FIFO_UNDERRUN_B |
171 ERR_INT_FIFO_UNDERRUN_C);
172
173 ironlake_enable_display_irq(dev_priv, DE_ERR_INT_IVB);
174 } else {
175 ironlake_disable_display_irq(dev_priv, DE_ERR_INT_IVB);
176 }
177}
178
179static void ibx_set_fifo_underrun_reporting(struct intel_crtc *crtc,
180 bool enable)
181{
182 struct drm_device *dev = crtc->base.dev;
183 struct drm_i915_private *dev_priv = dev->dev_private;
184 uint32_t bit = (crtc->pipe == PIPE_A) ? SDE_TRANSA_FIFO_UNDER :
185 SDE_TRANSB_FIFO_UNDER;
186
187 if (enable)
188 I915_WRITE(SDEIMR, I915_READ(SDEIMR) & ~bit);
189 else
190 I915_WRITE(SDEIMR, I915_READ(SDEIMR) | bit);
191
192 POSTING_READ(SDEIMR);
193}
194
195static void cpt_set_fifo_underrun_reporting(struct drm_device *dev,
196 enum transcoder pch_transcoder,
197 bool enable)
198{
199 struct drm_i915_private *dev_priv = dev->dev_private;
200
201 if (enable) {
202 if (!cpt_can_enable_serr_int(dev))
203 return;
204
205 I915_WRITE(SERR_INT, SERR_INT_TRANS_A_FIFO_UNDERRUN |
206 SERR_INT_TRANS_B_FIFO_UNDERRUN |
207 SERR_INT_TRANS_C_FIFO_UNDERRUN);
208
209 I915_WRITE(SDEIMR, I915_READ(SDEIMR) & ~SDE_ERROR_CPT);
210 } else {
211 I915_WRITE(SDEIMR, I915_READ(SDEIMR) | SDE_ERROR_CPT);
212 }
213
214 POSTING_READ(SDEIMR);
215}
216
217/**
218 * intel_set_cpu_fifo_underrun_reporting - enable/disable FIFO underrun messages
219 * @dev: drm device
220 * @pipe: pipe
221 * @enable: true if we want to report FIFO underrun errors, false otherwise
222 *
223 * This function makes us disable or enable CPU fifo underruns for a specific
224 * pipe. Notice that on some Gens (e.g. IVB, HSW), disabling FIFO underrun
225 * reporting for one pipe may also disable all the other CPU error interruts for
226 * the other pipes, due to the fact that there's just one interrupt mask/enable
227 * bit for all the pipes.
228 *
229 * Returns the previous state of underrun reporting.
230 */
231bool intel_set_cpu_fifo_underrun_reporting(struct drm_device *dev,
232 enum pipe pipe, bool enable)
233{
234 struct drm_i915_private *dev_priv = dev->dev_private;
235 struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[pipe];
236 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
237 unsigned long flags;
238 bool ret;
239
240 spin_lock_irqsave(&dev_priv->irq_lock, flags);
241
242 ret = !intel_crtc->cpu_fifo_underrun_disabled;
243
244 if (enable == ret)
245 goto done;
246
247 intel_crtc->cpu_fifo_underrun_disabled = !enable;
248
249 if (IS_GEN5(dev) || IS_GEN6(dev))
250 ironlake_set_fifo_underrun_reporting(dev, pipe, enable);
251 else if (IS_GEN7(dev))
252 ivybridge_set_fifo_underrun_reporting(dev, enable);
253
254done:
255 spin_unlock_irqrestore(&dev_priv->irq_lock, flags);
256 return ret;
257}
258
259/**
260 * intel_set_pch_fifo_underrun_reporting - enable/disable FIFO underrun messages
261 * @dev: drm device
262 * @pch_transcoder: the PCH transcoder (same as pipe on IVB and older)
263 * @enable: true if we want to report FIFO underrun errors, false otherwise
264 *
265 * This function makes us disable or enable PCH fifo underruns for a specific
266 * PCH transcoder. Notice that on some PCHs (e.g. CPT/PPT), disabling FIFO
267 * underrun reporting for one transcoder may also disable all the other PCH
268 * error interruts for the other transcoders, due to the fact that there's just
269 * one interrupt mask/enable bit for all the transcoders.
270 *
271 * Returns the previous state of underrun reporting.
272 */
273bool intel_set_pch_fifo_underrun_reporting(struct drm_device *dev,
274 enum transcoder pch_transcoder,
275 bool enable)
276{
277 struct drm_i915_private *dev_priv = dev->dev_private;
278 enum pipe p;
279 struct drm_crtc *crtc;
280 struct intel_crtc *intel_crtc;
281 unsigned long flags;
282 bool ret;
283
284 if (HAS_PCH_LPT(dev)) {
285 crtc = NULL;
286 for_each_pipe(p) {
287 struct drm_crtc *c = dev_priv->pipe_to_crtc_mapping[p];
288 if (intel_pipe_has_type(c, INTEL_OUTPUT_ANALOG)) {
289 crtc = c;
290 break;
291 }
292 }
293 if (!crtc) {
294 DRM_ERROR("PCH FIFO underrun, but no CRTC using the PCH found\n");
295 return false;
296 }
297 } else {
298 crtc = dev_priv->pipe_to_crtc_mapping[pch_transcoder];
299 }
300 intel_crtc = to_intel_crtc(crtc);
301
302 spin_lock_irqsave(&dev_priv->irq_lock, flags);
303
304 ret = !intel_crtc->pch_fifo_underrun_disabled;
305
306 if (enable == ret)
307 goto done;
308
309 intel_crtc->pch_fifo_underrun_disabled = !enable;
310
311 if (HAS_PCH_IBX(dev))
312 ibx_set_fifo_underrun_reporting(intel_crtc, enable);
313 else
314 cpt_set_fifo_underrun_reporting(dev, pch_transcoder, enable);
315
316done:
317 spin_unlock_irqrestore(&dev_priv->irq_lock, flags);
318 return ret;
319}
320
321
115void 322void
116i915_enable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask) 323i915_enable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask)
117{ 324{
@@ -800,10 +1007,58 @@ static void ibx_irq_handler(struct drm_device *dev, u32 pch_iir)
800 if (pch_iir & (SDE_TRANSB_CRC_ERR | SDE_TRANSA_CRC_ERR)) 1007 if (pch_iir & (SDE_TRANSB_CRC_ERR | SDE_TRANSA_CRC_ERR))
801 DRM_DEBUG_DRIVER("PCH transcoder CRC error interrupt\n"); 1008 DRM_DEBUG_DRIVER("PCH transcoder CRC error interrupt\n");
802 1009
803 if (pch_iir & SDE_TRANSB_FIFO_UNDER)
804 DRM_DEBUG_DRIVER("PCH transcoder B underrun interrupt\n");
805 if (pch_iir & SDE_TRANSA_FIFO_UNDER) 1010 if (pch_iir & SDE_TRANSA_FIFO_UNDER)
806 DRM_DEBUG_DRIVER("PCH transcoder A underrun interrupt\n"); 1011 if (intel_set_pch_fifo_underrun_reporting(dev, TRANSCODER_A,
1012 false))
1013 DRM_DEBUG_DRIVER("PCH transcoder A FIFO underrun\n");
1014
1015 if (pch_iir & SDE_TRANSB_FIFO_UNDER)
1016 if (intel_set_pch_fifo_underrun_reporting(dev, TRANSCODER_B,
1017 false))
1018 DRM_DEBUG_DRIVER("PCH transcoder B FIFO underrun\n");
1019}
1020
1021static void ivb_err_int_handler(struct drm_device *dev)
1022{
1023 struct drm_i915_private *dev_priv = dev->dev_private;
1024 u32 err_int = I915_READ(GEN7_ERR_INT);
1025
1026 if (err_int & ERR_INT_FIFO_UNDERRUN_A)
1027 if (intel_set_cpu_fifo_underrun_reporting(dev, PIPE_A, false))
1028 DRM_DEBUG_DRIVER("Pipe A FIFO underrun\n");
1029
1030 if (err_int & ERR_INT_FIFO_UNDERRUN_B)
1031 if (intel_set_cpu_fifo_underrun_reporting(dev, PIPE_B, false))
1032 DRM_DEBUG_DRIVER("Pipe B FIFO underrun\n");
1033
1034 if (err_int & ERR_INT_FIFO_UNDERRUN_C)
1035 if (intel_set_cpu_fifo_underrun_reporting(dev, PIPE_C, false))
1036 DRM_DEBUG_DRIVER("Pipe C FIFO underrun\n");
1037
1038 I915_WRITE(GEN7_ERR_INT, err_int);
1039}
1040
1041static void cpt_serr_int_handler(struct drm_device *dev)
1042{
1043 struct drm_i915_private *dev_priv = dev->dev_private;
1044 u32 serr_int = I915_READ(SERR_INT);
1045
1046 if (serr_int & SERR_INT_TRANS_A_FIFO_UNDERRUN)
1047 if (intel_set_pch_fifo_underrun_reporting(dev, TRANSCODER_A,
1048 false))
1049 DRM_DEBUG_DRIVER("PCH transcoder A FIFO underrun\n");
1050
1051 if (serr_int & SERR_INT_TRANS_B_FIFO_UNDERRUN)
1052 if (intel_set_pch_fifo_underrun_reporting(dev, TRANSCODER_B,
1053 false))
1054 DRM_DEBUG_DRIVER("PCH transcoder B FIFO underrun\n");
1055
1056 if (serr_int & SERR_INT_TRANS_C_FIFO_UNDERRUN)
1057 if (intel_set_pch_fifo_underrun_reporting(dev, TRANSCODER_C,
1058 false))
1059 DRM_DEBUG_DRIVER("PCH transcoder C FIFO underrun\n");
1060
1061 I915_WRITE(SERR_INT, serr_int);
807} 1062}
808 1063
809static void cpt_irq_handler(struct drm_device *dev, u32 pch_iir) 1064static void cpt_irq_handler(struct drm_device *dev, u32 pch_iir)
@@ -841,6 +1096,9 @@ static void cpt_irq_handler(struct drm_device *dev, u32 pch_iir)
841 DRM_DEBUG_DRIVER(" pipe %c FDI IIR: 0x%08x\n", 1096 DRM_DEBUG_DRIVER(" pipe %c FDI IIR: 0x%08x\n",
842 pipe_name(pipe), 1097 pipe_name(pipe),
843 I915_READ(FDI_RX_IIR(pipe))); 1098 I915_READ(FDI_RX_IIR(pipe)));
1099
1100 if (pch_iir & SDE_ERROR_CPT)
1101 cpt_serr_int_handler(dev);
844} 1102}
845 1103
846static irqreturn_t ivybridge_irq_handler(int irq, void *arg) 1104static irqreturn_t ivybridge_irq_handler(int irq, void *arg)
@@ -853,6 +1111,14 @@ static irqreturn_t ivybridge_irq_handler(int irq, void *arg)
853 1111
854 atomic_inc(&dev_priv->irq_received); 1112 atomic_inc(&dev_priv->irq_received);
855 1113
1114 /* We get interrupts on unclaimed registers, so check for this before we
1115 * do any I915_{READ,WRITE}. */
1116 if (IS_HASWELL(dev) &&
1117 (I915_READ_NOTRACE(FPGA_DBG) & FPGA_DBG_RM_NOCLAIM)) {
1118 DRM_ERROR("Unclaimed register before interrupt\n");
1119 I915_WRITE_NOTRACE(FPGA_DBG, FPGA_DBG_RM_NOCLAIM);
1120 }
1121
856 /* disable master interrupt before clearing iir */ 1122 /* disable master interrupt before clearing iir */
857 de_ier = I915_READ(DEIER); 1123 de_ier = I915_READ(DEIER);
858 I915_WRITE(DEIER, de_ier & ~DE_MASTER_IRQ_CONTROL); 1124 I915_WRITE(DEIER, de_ier & ~DE_MASTER_IRQ_CONTROL);
@@ -868,6 +1134,12 @@ static irqreturn_t ivybridge_irq_handler(int irq, void *arg)
868 POSTING_READ(SDEIER); 1134 POSTING_READ(SDEIER);
869 } 1135 }
870 1136
1137 /* On Haswell, also mask ERR_INT because we don't want to risk
1138 * generating "unclaimed register" interrupts from inside the interrupt
1139 * handler. */
1140 if (IS_HASWELL(dev))
1141 ironlake_disable_display_irq(dev_priv, DE_ERR_INT_IVB);
1142
871 gt_iir = I915_READ(GTIIR); 1143 gt_iir = I915_READ(GTIIR);
872 if (gt_iir) { 1144 if (gt_iir) {
873 snb_gt_irq_handler(dev, dev_priv, gt_iir); 1145 snb_gt_irq_handler(dev, dev_priv, gt_iir);
@@ -877,6 +1149,9 @@ static irqreturn_t ivybridge_irq_handler(int irq, void *arg)
877 1149
878 de_iir = I915_READ(DEIIR); 1150 de_iir = I915_READ(DEIIR);
879 if (de_iir) { 1151 if (de_iir) {
1152 if (de_iir & DE_ERR_INT_IVB)
1153 ivb_err_int_handler(dev);
1154
880 if (de_iir & DE_AUX_CHANNEL_A_IVB) 1155 if (de_iir & DE_AUX_CHANNEL_A_IVB)
881 dp_aux_irq_handler(dev); 1156 dp_aux_irq_handler(dev);
882 1157
@@ -914,6 +1189,9 @@ static irqreturn_t ivybridge_irq_handler(int irq, void *arg)
914 ret = IRQ_HANDLED; 1189 ret = IRQ_HANDLED;
915 } 1190 }
916 1191
1192 if (IS_HASWELL(dev) && ivb_can_enable_err_int(dev))
1193 ironlake_enable_display_irq(dev_priv, DE_ERR_INT_IVB);
1194
917 I915_WRITE(DEIER, de_ier); 1195 I915_WRITE(DEIER, de_ier);
918 POSTING_READ(DEIER); 1196 POSTING_READ(DEIER);
919 if (!HAS_PCH_NOP(dev)) { 1197 if (!HAS_PCH_NOP(dev)) {
@@ -983,6 +1261,14 @@ static irqreturn_t ironlake_irq_handler(int irq, void *arg)
983 if (de_iir & DE_PIPEB_VBLANK) 1261 if (de_iir & DE_PIPEB_VBLANK)
984 drm_handle_vblank(dev, 1); 1262 drm_handle_vblank(dev, 1);
985 1263
1264 if (de_iir & DE_PIPEA_FIFO_UNDERRUN)
1265 if (intel_set_cpu_fifo_underrun_reporting(dev, PIPE_A, false))
1266 DRM_DEBUG_DRIVER("Pipe A FIFO underrun\n");
1267
1268 if (de_iir & DE_PIPEB_FIFO_UNDERRUN)
1269 if (intel_set_cpu_fifo_underrun_reporting(dev, PIPE_B, false))
1270 DRM_DEBUG_DRIVER("Pipe B FIFO underrun\n");
1271
986 if (de_iir & DE_PLANEA_FLIP_DONE) { 1272 if (de_iir & DE_PLANEA_FLIP_DONE) {
987 intel_prepare_page_flip(dev, 0); 1273 intel_prepare_page_flip(dev, 0);
988 intel_finish_page_flip_plane(dev, 0); 1274 intel_finish_page_flip_plane(dev, 0);
@@ -2208,10 +2494,14 @@ static void ibx_irq_postinstall(struct drm_device *dev)
2208 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 2494 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
2209 u32 mask; 2495 u32 mask;
2210 2496
2211 if (HAS_PCH_IBX(dev)) 2497 if (HAS_PCH_IBX(dev)) {
2212 mask = SDE_GMBUS | SDE_AUX_MASK; 2498 mask = SDE_GMBUS | SDE_AUX_MASK | SDE_TRANSB_FIFO_UNDER |
2213 else 2499 SDE_TRANSA_FIFO_UNDER;
2214 mask = SDE_GMBUS_CPT | SDE_AUX_MASK_CPT; 2500 } else {
2501 mask = SDE_GMBUS_CPT | SDE_AUX_MASK_CPT | SDE_ERROR_CPT;
2502
2503 I915_WRITE(SERR_INT, I915_READ(SERR_INT));
2504 }
2215 2505
2216 if (HAS_PCH_NOP(dev)) 2506 if (HAS_PCH_NOP(dev))
2217 return; 2507 return;
@@ -2226,7 +2516,8 @@ static int ironlake_irq_postinstall(struct drm_device *dev)
2226 /* enable kind of interrupts always enabled */ 2516 /* enable kind of interrupts always enabled */
2227 u32 display_mask = DE_MASTER_IRQ_CONTROL | DE_GSE | DE_PCH_EVENT | 2517 u32 display_mask = DE_MASTER_IRQ_CONTROL | DE_GSE | DE_PCH_EVENT |
2228 DE_PLANEA_FLIP_DONE | DE_PLANEB_FLIP_DONE | 2518 DE_PLANEA_FLIP_DONE | DE_PLANEB_FLIP_DONE |
2229 DE_AUX_CHANNEL_A; 2519 DE_AUX_CHANNEL_A | DE_PIPEB_FIFO_UNDERRUN |
2520 DE_PIPEA_FIFO_UNDERRUN;
2230 u32 render_irqs; 2521 u32 render_irqs;
2231 2522
2232 dev_priv->irq_mask = ~display_mask; 2523 dev_priv->irq_mask = ~display_mask;
@@ -2276,12 +2567,14 @@ static int ivybridge_irq_postinstall(struct drm_device *dev)
2276 DE_PLANEC_FLIP_DONE_IVB | 2567 DE_PLANEC_FLIP_DONE_IVB |
2277 DE_PLANEB_FLIP_DONE_IVB | 2568 DE_PLANEB_FLIP_DONE_IVB |
2278 DE_PLANEA_FLIP_DONE_IVB | 2569 DE_PLANEA_FLIP_DONE_IVB |
2279 DE_AUX_CHANNEL_A_IVB; 2570 DE_AUX_CHANNEL_A_IVB |
2571 DE_ERR_INT_IVB;
2280 u32 render_irqs; 2572 u32 render_irqs;
2281 2573
2282 dev_priv->irq_mask = ~display_mask; 2574 dev_priv->irq_mask = ~display_mask;
2283 2575
2284 /* should always can generate irq */ 2576 /* should always can generate irq */
2577 I915_WRITE(GEN7_ERR_INT, I915_READ(GEN7_ERR_INT));
2285 I915_WRITE(DEIIR, I915_READ(DEIIR)); 2578 I915_WRITE(DEIIR, I915_READ(DEIIR));
2286 I915_WRITE(DEIMR, dev_priv->irq_mask); 2579 I915_WRITE(DEIMR, dev_priv->irq_mask);
2287 I915_WRITE(DEIER, 2580 I915_WRITE(DEIER,
@@ -2409,6 +2702,8 @@ static void ironlake_irq_uninstall(struct drm_device *dev)
2409 I915_WRITE(DEIMR, 0xffffffff); 2702 I915_WRITE(DEIMR, 0xffffffff);
2410 I915_WRITE(DEIER, 0x0); 2703 I915_WRITE(DEIER, 0x0);
2411 I915_WRITE(DEIIR, I915_READ(DEIIR)); 2704 I915_WRITE(DEIIR, I915_READ(DEIIR));
2705 if (IS_GEN7(dev))
2706 I915_WRITE(GEN7_ERR_INT, I915_READ(GEN7_ERR_INT));
2412 2707
2413 I915_WRITE(GTIMR, 0xffffffff); 2708 I915_WRITE(GTIMR, 0xffffffff);
2414 I915_WRITE(GTIER, 0x0); 2709 I915_WRITE(GTIER, 0x0);
@@ -2420,6 +2715,8 @@ static void ironlake_irq_uninstall(struct drm_device *dev)
2420 I915_WRITE(SDEIMR, 0xffffffff); 2715 I915_WRITE(SDEIMR, 0xffffffff);
2421 I915_WRITE(SDEIER, 0x0); 2716 I915_WRITE(SDEIER, 0x0);
2422 I915_WRITE(SDEIIR, I915_READ(SDEIIR)); 2717 I915_WRITE(SDEIIR, I915_READ(SDEIIR));
2718 if (HAS_PCH_CPT(dev) || HAS_PCH_LPT(dev))
2719 I915_WRITE(SERR_INT, I915_READ(SERR_INT));
2423} 2720}
2424 2721
2425static void i8xx_irq_preinstall(struct drm_device * dev) 2722static void i8xx_irq_preinstall(struct drm_device * dev)