Found a couple more problems: 1) MI_DISPLAY_FLIP should take a '1' in the last byte to indicate length on IVB 2) apprently only the BLT ring version of the command actually causes interrupts to be generated
With this patch, modetest -v works on my test platform. Clearly it's in need of more splitting though. The case statement should be split into per-chipset flip command generation. Signed-off-by: Jesse Barnes <jbar...@virtuousgeek.org> --- drivers/gpu/drm/i915/intel_display.c | 21 ++++++++++++++++----- 1 files changed, 16 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 81a9059..37d0087 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -6343,9 +6343,11 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, /* Offset into the new buffer for cases of shared fbs between CRTCs */ offset = crtc->y * fb->pitch + crtc->x * fb->bits_per_pixel/8; - ret = BEGIN_LP_RING(4); - if (ret) - goto cleanup_objs; + if (!IS_IVYBRIDGE(dev)) { + ret = BEGIN_LP_RING(4); + if (ret) + goto cleanup_objs; + } /* Block clients from rendering to the new back buffer until * the flip occurs and the object is no longer visible. @@ -6390,7 +6392,6 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, break; case 6: - case 7: OUT_RING(MI_DISPLAY_FLIP | MI_DISPLAY_FLIP_PLANE(intel_crtc->plane)); OUT_RING(fb->pitch | obj->tiling_mode); @@ -6400,8 +6401,18 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, pipesrc = I915_READ(PIPESRC(pipe)) & 0x0fff0fff; OUT_RING(pf | pipesrc); break; + case 7: + intel_ring_begin(&dev_priv->ring[BCS], 4); + intel_ring_emit(&dev_priv->ring[BCS], (MI_DISPLAY_FLIP_I915 | (intel_crtc->plane << 19))); + intel_ring_emit(&dev_priv->ring[BCS], (fb->pitch | obj->tiling_mode)); + intel_ring_emit(&dev_priv->ring[BCS], (obj->gtt_offset)); + intel_ring_emit(&dev_priv->ring[BCS], (MI_NOOP)); + intel_ring_advance(&dev_priv->ring[BCS]); + break; } - ADVANCE_LP_RING(); + + if (!IS_IVYBRIDGE(dev)) + ADVANCE_LP_RING(); mutex_unlock(&dev->struct_mutex); -- 1.7.4.1 _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/intel-gfx