diff mbox

[12/12] drm/i915: Calculate visibility in check_plane correctly regardless of dpms.

Message ID 1447945645-32005-13-git-send-email-maarten.lankhorst@linux.intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Maarten Lankhorst Nov. 19, 2015, 3:07 p.m. UTC
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(-)

Comments

Ander Conselvan de Oliveira Nov. 26, 2015, 1:48 p.m. UTC | #1
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;
Maarten Lankhorst Nov. 30, 2015, 9:45 a.m. UTC | #2
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;
Kahola, Mika Dec. 21, 2015, 1:27 p.m. UTC | #3
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 mbox

Patch

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;