Message ID | 1447945645-32005-13-git-send-email-maarten.lankhorst@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Thu, 2015-11-19 at 16:07 +0100, Maarten Lankhorst wrote: > When the crtc is configured but not active we currently clip to (0,0)x(0,0). > This results in differences in calculations depending on dpms setting. Is this part of "and fix BAT!"? > When the crtc is enabled but not active run check_plane as if it were on, > but afterwards set plane_state->visible = false for the checks. > > Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> > --- > drivers/gpu/drm/i915/intel_atomic_plane.c | 4 ++-- > drivers/gpu/drm/i915/intel_display.c | 9 +++++++-- > 2 files changed, 9 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/i915/intel_atomic_plane.c > b/drivers/gpu/drm/i915/intel_atomic_plane.c > index a5a336863109..e0b851a0004a 100644 > --- a/drivers/gpu/drm/i915/intel_atomic_plane.c > +++ b/drivers/gpu/drm/i915/intel_atomic_plane.c > @@ -152,9 +152,9 @@ static int intel_plane_atomic_check(struct drm_plane > *plane, > intel_state->clip.x1 = 0; > intel_state->clip.y1 = 0; > intel_state->clip.x2 = > - crtc_state->base.active ? crtc_state->pipe_src_w : 0; > + crtc_state->base.enable ? crtc_state->pipe_src_w : 0; > intel_state->clip.y2 = > - crtc_state->base.active ? crtc_state->pipe_src_h : 0; > + crtc_state->base.enable ? crtc_state->pipe_src_h : 0; > > if (state->fb && intel_rotation_90_or_270(state->rotation)) { > if (!(state->fb->modifier[0] == I915_FORMAT_MOD_Y_TILED || > diff --git a/drivers/gpu/drm/i915/intel_display.c > b/drivers/gpu/drm/i915/intel_display.c > index b2bf92a3b701..9db322182b15 100644 > --- a/drivers/gpu/drm/i915/intel_display.c > +++ b/drivers/gpu/drm/i915/intel_display.c > @@ -11738,8 +11738,13 @@ int intel_plane_atomic_calc_changes(struct > drm_crtc_state *crtc_state, > if (!was_crtc_enabled && WARN_ON(was_visible)) > was_visible = false; > > - if (!is_crtc_enabled && WARN_ON(visible)) > - visible = false; > + /* > + * During visibility is calculated as if the crtc was on, s/During// ? Ander > + * but after scaler setup everything depends on it being off > + * when the crtc isn't active. > + */ > + if (!is_crtc_enabled) > + to_intel_plane_state(plane_state)->visible = visible = false; > > if (!was_visible && !visible) > return 0;
Op 26-11-15 om 14:48 schreef Ander Conselvan De Oliveira: > On Thu, 2015-11-19 at 16:07 +0100, Maarten Lankhorst wrote: >> When the crtc is configured but not active we currently clip to (0,0)x(0,0). >> This results in differences in calculations depending on dpms setting. > Is this part of "and fix BAT!"? I'm not 100% sure if there is a BAT associated with it, but it will fix situations where you can commit a state that's valid while the crtc is inactive, but not when turning it on again. So for example using a state with 4 planes that all require scalers would be valid with dpms off, but attempting to turn dpms on will fail with -EINVAL... If there's no BAT for it there should be one imo.. >> When the crtc is enabled but not active run check_plane as if it were on, >> but afterwards set plane_state->visible = false for the checks. >> >> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> >> --- >> drivers/gpu/drm/i915/intel_atomic_plane.c | 4 ++-- >> drivers/gpu/drm/i915/intel_display.c | 9 +++++++-- >> 2 files changed, 9 insertions(+), 4 deletions(-) >> >> diff --git a/drivers/gpu/drm/i915/intel_atomic_plane.c >> b/drivers/gpu/drm/i915/intel_atomic_plane.c >> index a5a336863109..e0b851a0004a 100644 >> --- a/drivers/gpu/drm/i915/intel_atomic_plane.c >> +++ b/drivers/gpu/drm/i915/intel_atomic_plane.c >> @@ -152,9 +152,9 @@ static int intel_plane_atomic_check(struct drm_plane >> *plane, >> intel_state->clip.x1 = 0; >> intel_state->clip.y1 = 0; >> intel_state->clip.x2 = >> - crtc_state->base.active ? crtc_state->pipe_src_w : 0; >> + crtc_state->base.enable ? crtc_state->pipe_src_w : 0; >> intel_state->clip.y2 = >> - crtc_state->base.active ? crtc_state->pipe_src_h : 0; >> + crtc_state->base.enable ? crtc_state->pipe_src_h : 0; >> >> if (state->fb && intel_rotation_90_or_270(state->rotation)) { >> if (!(state->fb->modifier[0] == I915_FORMAT_MOD_Y_TILED || >> diff --git a/drivers/gpu/drm/i915/intel_display.c >> b/drivers/gpu/drm/i915/intel_display.c >> index b2bf92a3b701..9db322182b15 100644 >> --- a/drivers/gpu/drm/i915/intel_display.c >> +++ b/drivers/gpu/drm/i915/intel_display.c >> @@ -11738,8 +11738,13 @@ int intel_plane_atomic_calc_changes(struct >> drm_crtc_state *crtc_state, >> if (!was_crtc_enabled && WARN_ON(was_visible)) >> was_visible = false; >> >> - if (!is_crtc_enabled && WARN_ON(visible)) >> - visible = false; >> + /* >> + * During visibility is calculated as if the crtc was on, > s/During// ? > > Ander > >> + * but after scaler setup everything depends on it being off >> + * when the crtc isn't active. >> + */ >> + if (!is_crtc_enabled) >> + to_intel_plane_state(plane_state)->visible = visible = false; >> >> if (!was_visible && !visible) >> return 0;
Ander had a comment s/During// Other than this is On Thu, 2015-11-19 at 16:07 +0100, Maarten Lankhorst wrote: > When the crtc is configured but not active we currently clip to (0,0)x(0,0). > This results in differences in calculations depending on dpms setting. > When the crtc is enabled but not active run check_plane as if it were on, > but afterwards set plane_state->visible = false for the checks. > Reviewed-by: Mika Kahola <mika.kahola@intel.com> > Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> > --- > drivers/gpu/drm/i915/intel_atomic_plane.c | 4 ++-- > drivers/gpu/drm/i915/intel_display.c | 9 +++++++-- > 2 files changed, 9 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/i915/intel_atomic_plane.c b/drivers/gpu/drm/i915/intel_atomic_plane.c > index a5a336863109..e0b851a0004a 100644 > --- a/drivers/gpu/drm/i915/intel_atomic_plane.c > +++ b/drivers/gpu/drm/i915/intel_atomic_plane.c > @@ -152,9 +152,9 @@ static int intel_plane_atomic_check(struct drm_plane *plane, > intel_state->clip.x1 = 0; > intel_state->clip.y1 = 0; > intel_state->clip.x2 = > - crtc_state->base.active ? crtc_state->pipe_src_w : 0; > + crtc_state->base.enable ? crtc_state->pipe_src_w : 0; > intel_state->clip.y2 = > - crtc_state->base.active ? crtc_state->pipe_src_h : 0; > + crtc_state->base.enable ? crtc_state->pipe_src_h : 0; > > if (state->fb && intel_rotation_90_or_270(state->rotation)) { > if (!(state->fb->modifier[0] == I915_FORMAT_MOD_Y_TILED || > diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c > index b2bf92a3b701..9db322182b15 100644 > --- a/drivers/gpu/drm/i915/intel_display.c > +++ b/drivers/gpu/drm/i915/intel_display.c > @@ -11738,8 +11738,13 @@ int intel_plane_atomic_calc_changes(struct drm_crtc_state *crtc_state, > if (!was_crtc_enabled && WARN_ON(was_visible)) > was_visible = false; > > - if (!is_crtc_enabled && WARN_ON(visible)) > - visible = false; > + /* > + * During visibility is calculated as if the crtc was on, > + * but after scaler setup everything depends on it being off > + * when the crtc isn't active. > + */ > + if (!is_crtc_enabled) > + to_intel_plane_state(plane_state)->visible = visible = false; > > if (!was_visible && !visible) > return 0;
diff --git a/drivers/gpu/drm/i915/intel_atomic_plane.c b/drivers/gpu/drm/i915/intel_atomic_plane.c index a5a336863109..e0b851a0004a 100644 --- a/drivers/gpu/drm/i915/intel_atomic_plane.c +++ b/drivers/gpu/drm/i915/intel_atomic_plane.c @@ -152,9 +152,9 @@ static int intel_plane_atomic_check(struct drm_plane *plane, intel_state->clip.x1 = 0; intel_state->clip.y1 = 0; intel_state->clip.x2 = - crtc_state->base.active ? crtc_state->pipe_src_w : 0; + crtc_state->base.enable ? crtc_state->pipe_src_w : 0; intel_state->clip.y2 = - crtc_state->base.active ? crtc_state->pipe_src_h : 0; + crtc_state->base.enable ? crtc_state->pipe_src_h : 0; if (state->fb && intel_rotation_90_or_270(state->rotation)) { if (!(state->fb->modifier[0] == I915_FORMAT_MOD_Y_TILED || diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index b2bf92a3b701..9db322182b15 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -11738,8 +11738,13 @@ int intel_plane_atomic_calc_changes(struct drm_crtc_state *crtc_state, if (!was_crtc_enabled && WARN_ON(was_visible)) was_visible = false; - if (!is_crtc_enabled && WARN_ON(visible)) - visible = false; + /* + * During visibility is calculated as if the crtc was on, + * but after scaler setup everything depends on it being off + * when the crtc isn't active. + */ + if (!is_crtc_enabled) + to_intel_plane_state(plane_state)->visible = visible = false; if (!was_visible && !visible) return 0;
When the crtc is configured but not active we currently clip to (0,0)x(0,0). This results in differences in calculations depending on dpms setting. When the crtc is enabled but not active run check_plane as if it were on, but afterwards set plane_state->visible = false for the checks. Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> --- drivers/gpu/drm/i915/intel_atomic_plane.c | 4 ++-- drivers/gpu/drm/i915/intel_display.c | 9 +++++++-- 2 files changed, 9 insertions(+), 4 deletions(-)