drm/i915: implement the Haswell mode set sequence workaround
This workaround is described in the mode set sequence documentation. When enabling planes for the second pipe, we need to wait for 2 vblanks on the first pipe. This should solve "a flash of screen corruption if planes are enabled on second/third pipe during the time that big FIFO mode is exiting". Watermarks are fun :) v2: Save indentation levels Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
dda9a66a81
commit
e4916946b8
@ -3494,6 +3494,35 @@ static void haswell_crtc_disable_planes(struct drm_crtc *crtc)
|
|||||||
intel_disable_plane(dev_priv, plane, pipe);
|
intel_disable_plane(dev_priv, plane, pipe);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This implements the workaround described in the "notes" section of the mode
|
||||||
|
* set sequence documentation. When going from no pipes or single pipe to
|
||||||
|
* multiple pipes, and planes are enabled after the pipe, we need to wait at
|
||||||
|
* least 2 vblanks on the first pipe before enabling planes on the second pipe.
|
||||||
|
*/
|
||||||
|
static void haswell_mode_set_planes_workaround(struct intel_crtc *crtc)
|
||||||
|
{
|
||||||
|
struct drm_device *dev = crtc->base.dev;
|
||||||
|
struct intel_crtc *crtc_it, *other_active_crtc = NULL;
|
||||||
|
|
||||||
|
/* We want to get the other_active_crtc only if there's only 1 other
|
||||||
|
* active crtc. */
|
||||||
|
list_for_each_entry(crtc_it, &dev->mode_config.crtc_list, base.head) {
|
||||||
|
if (!crtc_it->active || crtc_it == crtc)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (other_active_crtc)
|
||||||
|
return;
|
||||||
|
|
||||||
|
other_active_crtc = crtc_it;
|
||||||
|
}
|
||||||
|
if (!other_active_crtc)
|
||||||
|
return;
|
||||||
|
|
||||||
|
intel_wait_for_vblank(dev, other_active_crtc->pipe);
|
||||||
|
intel_wait_for_vblank(dev, other_active_crtc->pipe);
|
||||||
|
}
|
||||||
|
|
||||||
static void haswell_crtc_enable(struct drm_crtc *crtc)
|
static void haswell_crtc_enable(struct drm_crtc *crtc)
|
||||||
{
|
{
|
||||||
struct drm_device *dev = crtc->dev;
|
struct drm_device *dev = crtc->dev;
|
||||||
@ -3545,6 +3574,9 @@ static void haswell_crtc_enable(struct drm_crtc *crtc)
|
|||||||
intel_opregion_notify_encoder(encoder, true);
|
intel_opregion_notify_encoder(encoder, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If we change the relative order between pipe/planes enabling, we need
|
||||||
|
* to change the workaround. */
|
||||||
|
haswell_mode_set_planes_workaround(intel_crtc);
|
||||||
haswell_crtc_enable_planes(crtc);
|
haswell_crtc_enable_planes(crtc);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user