It seems it needs a rebase... I couldn't figure out where exactly you will put the wait_for_pending so I'm going to wait a v2.
But this is my fault that took a century to review it... I'm sorry... On Tue, Apr 15, 2014 at 11:41 AM, <[email protected]> wrote: > From: Ville Syrjälä <[email protected]> > > We have to write to the primary plane base address registrer when we > enable/disable the primary plane in response to sprite coverage. Those > writes will cause the flip counter to increment which could interfere > with the detection of CS flip completion. We could end up completing > CS flips before the CS has even executed the commands from the ring. > > To avoid such issues, wait for CS flips to finish before we toggle the > primary plane on/off. > > Testcase: igt/kms_mmio_vs_cs_flip/setplane_vs_cs_flip > Signed-off-by: Ville Syrjälä <[email protected]> > --- > drivers/gpu/drm/i915/intel_display.c | 2 +- > drivers/gpu/drm/i915/intel_drv.h | 1 + > drivers/gpu/drm/i915/intel_sprite.c | 4 ++++ > 3 files changed, 6 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/i915/intel_display.c > b/drivers/gpu/drm/i915/intel_display.c > index 9b181fc..c0fe5dd 100644 > --- a/drivers/gpu/drm/i915/intel_display.c > +++ b/drivers/gpu/drm/i915/intel_display.c > @@ -3096,7 +3096,7 @@ bool intel_has_pending_fb_unpin(struct drm_device > *dev) > return false; > } > > -static void intel_crtc_wait_for_pending_flips(struct drm_crtc *crtc) > +void intel_crtc_wait_for_pending_flips(struct drm_crtc *crtc) > { > struct drm_device *dev = crtc->dev; > struct drm_i915_private *dev_priv = dev->dev_private; > diff --git a/drivers/gpu/drm/i915/intel_drv.h > b/drivers/gpu/drm/i915/intel_drv.h > index edef34e..f578e42 100644 > --- a/drivers/gpu/drm/i915/intel_drv.h > +++ b/drivers/gpu/drm/i915/intel_drv.h > @@ -775,6 +775,7 @@ int valleyview_get_vco(struct drm_i915_private > *dev_priv); > void intel_mode_from_pipe_config(struct drm_display_mode *mode, > struct intel_crtc_config *pipe_config); > int intel_format_to_fourcc(int format); > +void intel_crtc_wait_for_pending_flips(struct drm_crtc *crtc); > > /* intel_dp.c */ > void intel_dp_init(struct drm_device *dev, int output_reg, enum port > port); > diff --git a/drivers/gpu/drm/i915/intel_sprite.c > b/drivers/gpu/drm/i915/intel_sprite.c > index 4df7245..36a8f5e 100644 > --- a/drivers/gpu/drm/i915/intel_sprite.c > +++ b/drivers/gpu/drm/i915/intel_sprite.c > @@ -529,6 +529,8 @@ intel_enable_primary(struct drm_crtc *crtc) > if (intel_crtc->primary_enabled) > return; > > + intel_crtc_wait_for_pending_flips(crtc); > + > intel_crtc->primary_enabled = true; > > I915_WRITE(reg, I915_READ(reg) | DISPLAY_PLANE_ENABLE); > @@ -558,6 +560,8 @@ intel_disable_primary(struct drm_crtc *crtc) > if (!intel_crtc->primary_enabled) > return; > > + intel_crtc_wait_for_pending_flips(crtc); > + > intel_crtc->primary_enabled = false; > > mutex_lock(&dev->struct_mutex); > -- > 1.8.3.2 > > _______________________________________________ > Intel-gfx mailing list > [email protected] > http://lists.freedesktop.org/mailman/listinfo/intel-gfx > -- Rodrigo Vivi Blog: http://blog.vivi.eng.br
_______________________________________________ Intel-gfx mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/intel-gfx
