Message ID | 1346962175-7356-1-git-send-email-daniel.vetter@ffwll.ch (mailing list archive) |
---|---|
State | Rejected |
Headers | show |
On Thu, 6 Sep 2012 22:09:35 +0200, Daniel Vetter <daniel.vetter@ffwll.ch> wrote: > We need to check whether the _other plane is on our pipe, not whether > our plane is on the other pipe. Otherwise if not both pipes/planes are > active, we won't properly clean up the mess and set up our desired > plane->pipe mapping. > > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=51265 > Tested-by: Vladyslav Shtabovenko <DFEW.Entwickler@googlemail.com> > Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> > --- > drivers/gpu/drm/i915/intel_display.c | 28 ++++++++++++++++++---------- > 1 file changed, 18 insertions(+), 10 deletions(-) > > diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c > index fd9c275..ce9b247 100644 > --- a/drivers/gpu/drm/i915/intel_display.c > +++ b/drivers/gpu/drm/i915/intel_display.c > @@ -7994,11 +7994,27 @@ static void intel_enable_pipe_a(struct drm_device *dev) > > } > > +static bool > +intel_check_plane_mapping(struct intel_crtc *crtc) > +{ > + struct drm_i915_private *dev_priv = crtc->base.dev->dev_private; > + u32 reg, val; > + > + reg = DSPCNTR(!crtc->plane); > + val = I915_READ(reg); > + > + if ((val & DISPLAY_PLANE_ENABLE) == 0 && > + (!!(val & DISPPLANE_SEL_PIPE_MASK) == crtc->pipe)) > + return false; If the other plane is off but has our pipe selected, turn off our plane. Try again. -Chris
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index fd9c275..ce9b247 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -7994,11 +7994,27 @@ static void intel_enable_pipe_a(struct drm_device *dev) } +static bool +intel_check_plane_mapping(struct intel_crtc *crtc) +{ + struct drm_i915_private *dev_priv = crtc->base.dev->dev_private; + u32 reg, val; + + reg = DSPCNTR(!crtc->plane); + val = I915_READ(reg); + + if ((val & DISPLAY_PLANE_ENABLE) == 0 && + (!!(val & DISPPLANE_SEL_PIPE_MASK) == crtc->pipe)) + return false; + + return true; +} + static void intel_sanitize_crtc(struct intel_crtc *crtc) { struct drm_device *dev = crtc->base.dev; struct drm_i915_private *dev_priv = dev->dev_private; - u32 reg, val; + u32 reg; /* Clear any frame start delays used for debugging left by the BIOS */ reg = PIPECONF(crtc->pipe); @@ -8006,17 +8022,10 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc) /* We need to sanitize the plane -> pipe mapping first because this will * disable the crtc (and hence change the state) if it is wrong. */ - if (!HAS_PCH_SPLIT(dev)) { + if (!HAS_PCH_SPLIT(dev) && !intel_check_plane_mapping(crtc)) { struct intel_connector *connector; bool plane; - reg = DSPCNTR(crtc->plane); - val = I915_READ(reg); - - if ((val & DISPLAY_PLANE_ENABLE) == 0 && - (!!(val & DISPPLANE_SEL_PIPE_MASK) == crtc->pipe)) - goto ok; - DRM_DEBUG_KMS("[CRTC:%d] wrong plane connection detected!\n", crtc->base.base.id); @@ -8040,7 +8049,6 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc) WARN_ON(crtc->active); crtc->base.enabled = false; } -ok: if (dev_priv->quirks & QUIRK_PIPEA_FORCE && crtc->pipe == PIPE_A && !crtc->active) {