|
@@ -5098,14 +5098,16 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
|
|
|
work->pending_flip_obj = obj;
|
|
|
|
|
|
if (intel_crtc->plane)
|
|
|
- flip_mask = I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT;
|
|
|
+ flip_mask = MI_WAIT_FOR_PLANE_B_FLIP;
|
|
|
else
|
|
|
- flip_mask = I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT;
|
|
|
+ flip_mask = MI_WAIT_FOR_PLANE_A_FLIP;
|
|
|
|
|
|
- /* Wait for any previous flip to finish */
|
|
|
- if (IS_GEN3(dev))
|
|
|
- while (I915_READ(ISR) & flip_mask)
|
|
|
- ;
|
|
|
+ if (IS_GEN3(dev) || IS_GEN2(dev)) {
|
|
|
+ BEGIN_LP_RING(2);
|
|
|
+ OUT_RING(MI_WAIT_FOR_EVENT | flip_mask);
|
|
|
+ OUT_RING(0);
|
|
|
+ ADVANCE_LP_RING();
|
|
|
+ }
|
|
|
|
|
|
/* Offset into the new buffer for cases of shared fbs between CRTCs */
|
|
|
offset = obj_priv->gtt_offset;
|