All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] drm/msm/mdp5: handle non-fullscreen base plane case
@ 2016-10-13 16:48 Rob Clark
       [not found] ` <1476377326-17877-1-git-send-email-robdclark-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  2016-10-15  9:39 ` Archit Taneja
  0 siblings, 2 replies; 9+ messages in thread
From: Rob Clark @ 2016-10-13 16:48 UTC (permalink / raw)
  To: dri-devel; +Cc: freedreno

If the bottom-most layer is not fullscreen, we need to use the BASE
mixer stage for solid fill (ie. MDP5_CTL_BLEND_OP_FLAG_BORDER_OUT).  The
blend_setup() code pretty much handled this already, we just had to
figure this out in _atomic_check() and assign the stages appropriately.

Signed-off-by: Rob Clark <robdclark@gmail.com>
---
TODO mdp4 might need similar treatment?

 drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c | 44 ++++++++++++++++++++------------
 1 file changed, 27 insertions(+), 17 deletions(-)

diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
index fa2be7c..e42f62d 100644
--- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
+++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
@@ -223,11 +223,6 @@ static void blend_setup(struct drm_crtc *crtc)
 		plane_cnt++;
 	}
 
-	/*
-	* If there is no base layer, enable border color.
-	* Although it's not possbile in current blend logic,
-	* put it here as a reminder.
-	*/
 	if (!pstates[STAGE_BASE] && plane_cnt) {
 		ctl_blend_flags |= MDP5_CTL_BLEND_OP_FLAG_BORDER_OUT;
 		DBG("Border Color is enabled");
@@ -365,6 +360,15 @@ static int pstate_cmp(const void *a, const void *b)
 	return pa->state->zpos - pb->state->zpos;
 }
 
+/* is there a helper for this? */
+static bool is_fullscreen(struct drm_crtc_state *cstate,
+		struct drm_plane_state *pstate)
+{
+	return (pstate->crtc_x == 0) && (pstate->crtc_y == 0) &&
+		(pstate->crtc_w == cstate->mode.hdisplay) &&
+		(pstate->crtc_h == cstate->mode.vdisplay);
+}
+
 static int mdp5_crtc_atomic_check(struct drm_crtc *crtc,
 		struct drm_crtc_state *state)
 {
@@ -375,21 +379,11 @@ static int mdp5_crtc_atomic_check(struct drm_crtc *crtc,
 	struct plane_state pstates[STAGE_MAX + 1];
 	const struct mdp5_cfg_hw *hw_cfg;
 	const struct drm_plane_state *pstate;
-	int cnt = 0, i;
+	int cnt = 0, base = 0, i;
 
 	DBG("%s: check", mdp5_crtc->name);
 
-	/* verify that there are not too many planes attached to crtc
-	 * and that we don't have conflicting mixer stages:
-	 */
-	hw_cfg = mdp5_cfg_get_hw_config(mdp5_kms->cfg);
 	drm_atomic_crtc_state_for_each_plane_state(plane, pstate, state) {
-		if (cnt >= (hw_cfg->lm.nb_stages)) {
-			dev_err(dev->dev, "too many planes!\n");
-			return -EINVAL;
-		}
-
-
 		pstates[cnt].plane = plane;
 		pstates[cnt].state = to_mdp5_plane_state(pstate);
 
@@ -399,8 +393,24 @@ static int mdp5_crtc_atomic_check(struct drm_crtc *crtc,
 	/* assign a stage based on sorted zpos property */
 	sort(pstates, cnt, sizeof(pstates[0]), pstate_cmp, NULL);
 
+	/* if the bottom-most layer is not fullscreen, we need to use
+	 * it for solid-color:
+	 */
+	if (!is_fullscreen(state, &pstates[0].state->base))
+		base++;
+
+	/* verify that there are not too many planes attached to crtc
+	 * and that we don't have conflicting mixer stages:
+	 */
+	hw_cfg = mdp5_cfg_get_hw_config(mdp5_kms->cfg);
+
+	if ((cnt + base) >= hw_cfg->lm.nb_stages) {
+		dev_err(dev->dev, "too many planes!\n");
+		return -EINVAL;
+	}
+
 	for (i = 0; i < cnt; i++) {
-		pstates[i].state->stage = STAGE_BASE + i;
+		pstates[i].state->stage = STAGE_BASE + i + base;
 		DBG("%s: assign pipe %s on stage=%d", mdp5_crtc->name,
 				pipe2name(mdp5_plane_pipe(pstates[i].plane)),
 				pstates[i].state->stage);
-- 
2.7.4

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH] drm/msm/mdp5: handle non-fullscreen base plane case
       [not found] ` <1476377326-17877-1-git-send-email-robdclark-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2016-10-14 12:25   ` Archit Taneja
  2016-10-14 12:45   ` Ville Syrjälä
  1 sibling, 0 replies; 9+ messages in thread
From: Archit Taneja @ 2016-10-14 12:25 UTC (permalink / raw)
  To: Rob Clark, dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
  Cc: freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW



On 10/13/2016 10:18 PM, Rob Clark wrote:
> If the bottom-most layer is not fullscreen, we need to use the BASE
> mixer stage for solid fill (ie. MDP5_CTL_BLEND_OP_FLAG_BORDER_OUT).  The
> blend_setup() code pretty much handled this already, we just had to
> figure this out in _atomic_check() and assign the stages appropriately.

The patch looks good. I couldn't test the problematic scenario since I
don't have an easy way to reproduce it, but it doesn't break regular
usage (where base layer is full screen).

Reviewed-by: Archit Taneja <architt@codeaurora.org>

>
> Signed-off-by: Rob Clark <robdclark@gmail.com>
> ---
> TODO mdp4 might need similar treatment?
>
>  drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c | 44 ++++++++++++++++++++------------
>  1 file changed, 27 insertions(+), 17 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
> index fa2be7c..e42f62d 100644
> --- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
> +++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
> @@ -223,11 +223,6 @@ static void blend_setup(struct drm_crtc *crtc)
>  		plane_cnt++;
>  	}
>
> -	/*
> -	* If there is no base layer, enable border color.
> -	* Although it's not possbile in current blend logic,
> -	* put it here as a reminder.
> -	*/
>  	if (!pstates[STAGE_BASE] && plane_cnt) {
>  		ctl_blend_flags |= MDP5_CTL_BLEND_OP_FLAG_BORDER_OUT;
>  		DBG("Border Color is enabled");
> @@ -365,6 +360,15 @@ static int pstate_cmp(const void *a, const void *b)
>  	return pa->state->zpos - pb->state->zpos;
>  }
>
> +/* is there a helper for this? */
> +static bool is_fullscreen(struct drm_crtc_state *cstate,
> +		struct drm_plane_state *pstate)
> +{
> +	return (pstate->crtc_x == 0) && (pstate->crtc_y == 0) &&
> +		(pstate->crtc_w == cstate->mode.hdisplay) &&
> +		(pstate->crtc_h == cstate->mode.vdisplay);
> +}
> +
>  static int mdp5_crtc_atomic_check(struct drm_crtc *crtc,
>  		struct drm_crtc_state *state)
>  {
> @@ -375,21 +379,11 @@ static int mdp5_crtc_atomic_check(struct drm_crtc *crtc,
>  	struct plane_state pstates[STAGE_MAX + 1];
>  	const struct mdp5_cfg_hw *hw_cfg;
>  	const struct drm_plane_state *pstate;
> -	int cnt = 0, i;
> +	int cnt = 0, base = 0, i;
>
>  	DBG("%s: check", mdp5_crtc->name);
>
> -	/* verify that there are not too many planes attached to crtc
> -	 * and that we don't have conflicting mixer stages:
> -	 */
> -	hw_cfg = mdp5_cfg_get_hw_config(mdp5_kms->cfg);
>  	drm_atomic_crtc_state_for_each_plane_state(plane, pstate, state) {
> -		if (cnt >= (hw_cfg->lm.nb_stages)) {
> -			dev_err(dev->dev, "too many planes!\n");
> -			return -EINVAL;
> -		}
> -
> -
>  		pstates[cnt].plane = plane;
>  		pstates[cnt].state = to_mdp5_plane_state(pstate);
>
> @@ -399,8 +393,24 @@ static int mdp5_crtc_atomic_check(struct drm_crtc *crtc,
>  	/* assign a stage based on sorted zpos property */
>  	sort(pstates, cnt, sizeof(pstates[0]), pstate_cmp, NULL);
>
> +	/* if the bottom-most layer is not fullscreen, we need to use
> +	 * it for solid-color:
> +	 */
> +	if (!is_fullscreen(state, &pstates[0].state->base))
> +		base++;
> +
> +	/* verify that there are not too many planes attached to crtc
> +	 * and that we don't have conflicting mixer stages:
> +	 */
> +	hw_cfg = mdp5_cfg_get_hw_config(mdp5_kms->cfg);
> +
> +	if ((cnt + base) >= hw_cfg->lm.nb_stages) {
> +		dev_err(dev->dev, "too many planes!\n");
> +		return -EINVAL;
> +	}
> +
>  	for (i = 0; i < cnt; i++) {
> -		pstates[i].state->stage = STAGE_BASE + i;
> +		pstates[i].state->stage = STAGE_BASE + i + base;
>  		DBG("%s: assign pipe %s on stage=%d", mdp5_crtc->name,
>  				pipe2name(mdp5_plane_pipe(pstates[i].plane)),
>  				pstates[i].state->stage);
>

-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project
_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] drm/msm/mdp5: handle non-fullscreen base plane case
       [not found] ` <1476377326-17877-1-git-send-email-robdclark-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  2016-10-14 12:25   ` Archit Taneja
@ 2016-10-14 12:45   ` Ville Syrjälä
       [not found]     ` <20161014124515.GC4329-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
  1 sibling, 1 reply; 9+ messages in thread
From: Ville Syrjälä @ 2016-10-14 12:45 UTC (permalink / raw)
  To: Rob Clark
  Cc: freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
	dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

On Thu, Oct 13, 2016 at 12:48:46PM -0400, Rob Clark wrote:
> If the bottom-most layer is not fullscreen, we need to use the BASE
> mixer stage for solid fill (ie. MDP5_CTL_BLEND_OP_FLAG_BORDER_OUT).  The
> blend_setup() code pretty much handled this already, we just had to
> figure this out in _atomic_check() and assign the stages appropriately.
> 
> Signed-off-by: Rob Clark <robdclark@gmail.com>
> ---
> TODO mdp4 might need similar treatment?
> 
>  drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c | 44 ++++++++++++++++++++------------
>  1 file changed, 27 insertions(+), 17 deletions(-)
> 
> diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
> index fa2be7c..e42f62d 100644
> --- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
> +++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
> @@ -223,11 +223,6 @@ static void blend_setup(struct drm_crtc *crtc)
>  		plane_cnt++;
>  	}
>  
> -	/*
> -	* If there is no base layer, enable border color.
> -	* Although it's not possbile in current blend logic,
> -	* put it here as a reminder.
> -	*/
>  	if (!pstates[STAGE_BASE] && plane_cnt) {
>  		ctl_blend_flags |= MDP5_CTL_BLEND_OP_FLAG_BORDER_OUT;
>  		DBG("Border Color is enabled");
> @@ -365,6 +360,15 @@ static int pstate_cmp(const void *a, const void *b)
>  	return pa->state->zpos - pb->state->zpos;
>  }
>  
> +/* is there a helper for this? */
> +static bool is_fullscreen(struct drm_crtc_state *cstate,
> +		struct drm_plane_state *pstate)
> +{
> +	return (pstate->crtc_x == 0) && (pstate->crtc_y == 0) &&
> +		(pstate->crtc_w == cstate->mode.hdisplay) &&
> +		(pstate->crtc_h == cstate->mode.vdisplay);
> +}

And what if the plane is larger than the screen size while covering it
fully?

> +
>  static int mdp5_crtc_atomic_check(struct drm_crtc *crtc,
>  		struct drm_crtc_state *state)
>  {
> @@ -375,21 +379,11 @@ static int mdp5_crtc_atomic_check(struct drm_crtc *crtc,
>  	struct plane_state pstates[STAGE_MAX + 1];
>  	const struct mdp5_cfg_hw *hw_cfg;
>  	const struct drm_plane_state *pstate;
> -	int cnt = 0, i;
> +	int cnt = 0, base = 0, i;
>  
>  	DBG("%s: check", mdp5_crtc->name);
>  
> -	/* verify that there are not too many planes attached to crtc
> -	 * and that we don't have conflicting mixer stages:
> -	 */
> -	hw_cfg = mdp5_cfg_get_hw_config(mdp5_kms->cfg);
>  	drm_atomic_crtc_state_for_each_plane_state(plane, pstate, state) {
> -		if (cnt >= (hw_cfg->lm.nb_stages)) {
> -			dev_err(dev->dev, "too many planes!\n");
> -			return -EINVAL;
> -		}
> -
> -
>  		pstates[cnt].plane = plane;
>  		pstates[cnt].state = to_mdp5_plane_state(pstate);
>  
> @@ -399,8 +393,24 @@ static int mdp5_crtc_atomic_check(struct drm_crtc *crtc,
>  	/* assign a stage based on sorted zpos property */
>  	sort(pstates, cnt, sizeof(pstates[0]), pstate_cmp, NULL);
>  
> +	/* if the bottom-most layer is not fullscreen, we need to use
> +	 * it for solid-color:
> +	 */
> +	if (!is_fullscreen(state, &pstates[0].state->base))
> +		base++;
> +
> +	/* verify that there are not too many planes attached to crtc
> +	 * and that we don't have conflicting mixer stages:
> +	 */
> +	hw_cfg = mdp5_cfg_get_hw_config(mdp5_kms->cfg);
> +
> +	if ((cnt + base) >= hw_cfg->lm.nb_stages) {
> +		dev_err(dev->dev, "too many planes!\n");
> +		return -EINVAL;
> +	}
> +
>  	for (i = 0; i < cnt; i++) {
> -		pstates[i].state->stage = STAGE_BASE + i;
> +		pstates[i].state->stage = STAGE_BASE + i + base;
>  		DBG("%s: assign pipe %s on stage=%d", mdp5_crtc->name,
>  				pipe2name(mdp5_plane_pipe(pstates[i].plane)),
>  				pstates[i].state->stage);
> -- 
> 2.7.4
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

-- 
Ville Syrjälä
Intel OTC
_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] drm/msm/mdp5: handle non-fullscreen base plane case
       [not found]     ` <20161014124515.GC4329-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
@ 2016-10-14 14:11       ` Rob Clark
  0 siblings, 0 replies; 9+ messages in thread
From: Rob Clark @ 2016-10-14 14:11 UTC (permalink / raw)
  To: Ville Syrjälä
  Cc: freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
	dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org

On Fri, Oct 14, 2016 at 8:45 AM, Ville Syrjälä
<ville.syrjala@linux.intel.com> wrote:
> On Thu, Oct 13, 2016 at 12:48:46PM -0400, Rob Clark wrote:
>> If the bottom-most layer is not fullscreen, we need to use the BASE
>> mixer stage for solid fill (ie. MDP5_CTL_BLEND_OP_FLAG_BORDER_OUT).  The
>> blend_setup() code pretty much handled this already, we just had to
>> figure this out in _atomic_check() and assign the stages appropriately.
>>
>> Signed-off-by: Rob Clark <robdclark@gmail.com>
>> ---
>> TODO mdp4 might need similar treatment?
>>
>>  drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c | 44 ++++++++++++++++++++------------
>>  1 file changed, 27 insertions(+), 17 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
>> index fa2be7c..e42f62d 100644
>> --- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
>> +++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
>> @@ -223,11 +223,6 @@ static void blend_setup(struct drm_crtc *crtc)
>>               plane_cnt++;
>>       }
>>
>> -     /*
>> -     * If there is no base layer, enable border color.
>> -     * Although it's not possbile in current blend logic,
>> -     * put it here as a reminder.
>> -     */
>>       if (!pstates[STAGE_BASE] && plane_cnt) {
>>               ctl_blend_flags |= MDP5_CTL_BLEND_OP_FLAG_BORDER_OUT;
>>               DBG("Border Color is enabled");
>> @@ -365,6 +360,15 @@ static int pstate_cmp(const void *a, const void *b)
>>       return pa->state->zpos - pb->state->zpos;
>>  }
>>
>> +/* is there a helper for this? */
>> +static bool is_fullscreen(struct drm_crtc_state *cstate,
>> +             struct drm_plane_state *pstate)
>> +{
>> +     return (pstate->crtc_x == 0) && (pstate->crtc_y == 0) &&
>> +             (pstate->crtc_w == cstate->mode.hdisplay) &&
>> +             (pstate->crtc_h == cstate->mode.vdisplay);
>> +}
>
> And what if the plane is larger than the screen size while covering it
> fully?

good question.. if things aren't clipped elsewhere we probably end up
programming hw badly..

fwiw, it doesn't seem to hurt anything to turn on the solid-fill layer
but we'd be burning an extra mixer stage.  I guess I can make this
cover that case easily enough, but probably doesn't mean that case
works

BR,
-R

>> +
>>  static int mdp5_crtc_atomic_check(struct drm_crtc *crtc,
>>               struct drm_crtc_state *state)
>>  {
>> @@ -375,21 +379,11 @@ static int mdp5_crtc_atomic_check(struct drm_crtc *crtc,
>>       struct plane_state pstates[STAGE_MAX + 1];
>>       const struct mdp5_cfg_hw *hw_cfg;
>>       const struct drm_plane_state *pstate;
>> -     int cnt = 0, i;
>> +     int cnt = 0, base = 0, i;
>>
>>       DBG("%s: check", mdp5_crtc->name);
>>
>> -     /* verify that there are not too many planes attached to crtc
>> -      * and that we don't have conflicting mixer stages:
>> -      */
>> -     hw_cfg = mdp5_cfg_get_hw_config(mdp5_kms->cfg);
>>       drm_atomic_crtc_state_for_each_plane_state(plane, pstate, state) {
>> -             if (cnt >= (hw_cfg->lm.nb_stages)) {
>> -                     dev_err(dev->dev, "too many planes!\n");
>> -                     return -EINVAL;
>> -             }
>> -
>> -
>>               pstates[cnt].plane = plane;
>>               pstates[cnt].state = to_mdp5_plane_state(pstate);
>>
>> @@ -399,8 +393,24 @@ static int mdp5_crtc_atomic_check(struct drm_crtc *crtc,
>>       /* assign a stage based on sorted zpos property */
>>       sort(pstates, cnt, sizeof(pstates[0]), pstate_cmp, NULL);
>>
>> +     /* if the bottom-most layer is not fullscreen, we need to use
>> +      * it for solid-color:
>> +      */
>> +     if (!is_fullscreen(state, &pstates[0].state->base))
>> +             base++;
>> +
>> +     /* verify that there are not too many planes attached to crtc
>> +      * and that we don't have conflicting mixer stages:
>> +      */
>> +     hw_cfg = mdp5_cfg_get_hw_config(mdp5_kms->cfg);
>> +
>> +     if ((cnt + base) >= hw_cfg->lm.nb_stages) {
>> +             dev_err(dev->dev, "too many planes!\n");
>> +             return -EINVAL;
>> +     }
>> +
>>       for (i = 0; i < cnt; i++) {
>> -             pstates[i].state->stage = STAGE_BASE + i;
>> +             pstates[i].state->stage = STAGE_BASE + i + base;
>>               DBG("%s: assign pipe %s on stage=%d", mdp5_crtc->name,
>>                               pipe2name(mdp5_plane_pipe(pstates[i].plane)),
>>                               pstates[i].state->stage);
>> --
>> 2.7.4
>>
>> _______________________________________________
>> dri-devel mailing list
>> dri-devel@lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/dri-devel
>
> --
> Ville Syrjälä
> Intel OTC
_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] drm/msm/mdp5: handle non-fullscreen base plane case
  2016-10-13 16:48 [PATCH] drm/msm/mdp5: handle non-fullscreen base plane case Rob Clark
       [not found] ` <1476377326-17877-1-git-send-email-robdclark-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2016-10-15  9:39 ` Archit Taneja
       [not found]   ` <f57272cf-4e42-741d-e4b7-c201f50130ec-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
  1 sibling, 1 reply; 9+ messages in thread
From: Archit Taneja @ 2016-10-15  9:39 UTC (permalink / raw)
  To: Rob Clark, dri-devel; +Cc: freedreno


On 10/13/2016 10:18 PM, Rob Clark wrote:
> If the bottom-most layer is not fullscreen, we need to use the BASE
> mixer stage for solid fill (ie. MDP5_CTL_BLEND_OP_FLAG_BORDER_OUT).  The
> blend_setup() code pretty much handled this already, we just had to
> figure this out in _atomic_check() and assign the stages appropriately.
>
> Signed-off-by: Rob Clark <robdclark@gmail.com>
> ---
> TODO mdp4 might need similar treatment?
>
>  drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c | 44 ++++++++++++++++++++------------
>  1 file changed, 27 insertions(+), 17 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
> index fa2be7c..e42f62d 100644
> --- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
> +++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
> @@ -223,11 +223,6 @@ static void blend_setup(struct drm_crtc *crtc)
>  		plane_cnt++;
>  	}
>
> -	/*
> -	* If there is no base layer, enable border color.
> -	* Although it's not possbile in current blend logic,
> -	* put it here as a reminder.
> -	*/
>  	if (!pstates[STAGE_BASE] && plane_cnt) {
>  		ctl_blend_flags |= MDP5_CTL_BLEND_OP_FLAG_BORDER_OUT;
>  		DBG("Border Color is enabled");
> @@ -365,6 +360,15 @@ static int pstate_cmp(const void *a, const void *b)
>  	return pa->state->zpos - pb->state->zpos;
>  }
>
> +/* is there a helper for this? */
> +static bool is_fullscreen(struct drm_crtc_state *cstate,
> +		struct drm_plane_state *pstate)
> +{
> +	return (pstate->crtc_x == 0) && (pstate->crtc_y == 0) &&
> +		(pstate->crtc_w == cstate->mode.hdisplay) &&
> +		(pstate->crtc_h == cstate->mode.vdisplay);
> +}
> +
>  static int mdp5_crtc_atomic_check(struct drm_crtc *crtc,
>  		struct drm_crtc_state *state)
>  {
> @@ -375,21 +379,11 @@ static int mdp5_crtc_atomic_check(struct drm_crtc *crtc,
>  	struct plane_state pstates[STAGE_MAX + 1];
>  	const struct mdp5_cfg_hw *hw_cfg;
>  	const struct drm_plane_state *pstate;
> -	int cnt = 0, i;
> +	int cnt = 0, base = 0, i;
>
>  	DBG("%s: check", mdp5_crtc->name);
>
> -	/* verify that there are not too many planes attached to crtc
> -	 * and that we don't have conflicting mixer stages:
> -	 */
> -	hw_cfg = mdp5_cfg_get_hw_config(mdp5_kms->cfg);
>  	drm_atomic_crtc_state_for_each_plane_state(plane, pstate, state) {
> -		if (cnt >= (hw_cfg->lm.nb_stages)) {
> -			dev_err(dev->dev, "too many planes!\n");
> -			return -EINVAL;
> -		}
> -
> -
>  		pstates[cnt].plane = plane;
>  		pstates[cnt].state = to_mdp5_plane_state(pstate);
>
> @@ -399,8 +393,24 @@ static int mdp5_crtc_atomic_check(struct drm_crtc *crtc,
>  	/* assign a stage based on sorted zpos property */
>  	sort(pstates, cnt, sizeof(pstates[0]), pstate_cmp, NULL);
>
> +	/* if the bottom-most layer is not fullscreen, we need to use
> +	 * it for solid-color:
> +	 */
> +	if (!is_fullscreen(state, &pstates[0].state->base))
> +		base++;
> +

I get a crash here when fbcon is enabled and there are no connectors
connected. We're trying to refer pstates[0] when there is no plane
connected to the crtc. I guess we could bail out much earlier if cnt
is 0.

Archit

> +	/* verify that there are not too many planes attached to crtc
> +	 * and that we don't have conflicting mixer stages:
> +	 */
> +	hw_cfg = mdp5_cfg_get_hw_config(mdp5_kms->cfg);
> +
> +	if ((cnt + base) >= hw_cfg->lm.nb_stages) {
> +		dev_err(dev->dev, "too many planes!\n");
> +		return -EINVAL;
> +	}
> +
>  	for (i = 0; i < cnt; i++) {
> -		pstates[i].state->stage = STAGE_BASE + i;
> +		pstates[i].state->stage = STAGE_BASE + i + base;
>  		DBG("%s: assign pipe %s on stage=%d", mdp5_crtc->name,
>  				pipe2name(mdp5_plane_pipe(pstates[i].plane)),
>  				pstates[i].state->stage);
>

-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] drm/msm/mdp5: handle non-fullscreen base plane case
       [not found]   ` <f57272cf-4e42-741d-e4b7-c201f50130ec-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
@ 2016-10-15 11:32     ` Rob Clark
  2016-10-15 12:57       ` Archit Taneja
  0 siblings, 1 reply; 9+ messages in thread
From: Rob Clark @ 2016-10-15 11:32 UTC (permalink / raw)
  To: Archit Taneja
  Cc: freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
	dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org

On Sat, Oct 15, 2016 at 5:39 AM, Archit Taneja <architt@codeaurora.org> wrote:
>
> On 10/13/2016 10:18 PM, Rob Clark wrote:
>>
>> If the bottom-most layer is not fullscreen, we need to use the BASE
>> mixer stage for solid fill (ie. MDP5_CTL_BLEND_OP_FLAG_BORDER_OUT).  The
>> blend_setup() code pretty much handled this already, we just had to
>> figure this out in _atomic_check() and assign the stages appropriately.
>>
>> Signed-off-by: Rob Clark <robdclark@gmail.com>
>> ---
>> TODO mdp4 might need similar treatment?
>>
>>  drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c | 44
>> ++++++++++++++++++++------------
>>  1 file changed, 27 insertions(+), 17 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
>> b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
>> index fa2be7c..e42f62d 100644
>> --- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
>> +++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
>> @@ -223,11 +223,6 @@ static void blend_setup(struct drm_crtc *crtc)
>>                 plane_cnt++;
>>         }
>>
>> -       /*
>> -       * If there is no base layer, enable border color.
>> -       * Although it's not possbile in current blend logic,
>> -       * put it here as a reminder.
>> -       */
>>         if (!pstates[STAGE_BASE] && plane_cnt) {
>>                 ctl_blend_flags |= MDP5_CTL_BLEND_OP_FLAG_BORDER_OUT;
>>                 DBG("Border Color is enabled");
>> @@ -365,6 +360,15 @@ static int pstate_cmp(const void *a, const void *b)
>>         return pa->state->zpos - pb->state->zpos;
>>  }
>>
>> +/* is there a helper for this? */
>> +static bool is_fullscreen(struct drm_crtc_state *cstate,
>> +               struct drm_plane_state *pstate)
>> +{
>> +       return (pstate->crtc_x == 0) && (pstate->crtc_y == 0) &&
>> +               (pstate->crtc_w == cstate->mode.hdisplay) &&
>> +               (pstate->crtc_h == cstate->mode.vdisplay);
>> +}
>> +
>>  static int mdp5_crtc_atomic_check(struct drm_crtc *crtc,
>>                 struct drm_crtc_state *state)
>>  {
>> @@ -375,21 +379,11 @@ static int mdp5_crtc_atomic_check(struct drm_crtc
>> *crtc,
>>         struct plane_state pstates[STAGE_MAX + 1];
>>         const struct mdp5_cfg_hw *hw_cfg;
>>         const struct drm_plane_state *pstate;
>> -       int cnt = 0, i;
>> +       int cnt = 0, base = 0, i;
>>
>>         DBG("%s: check", mdp5_crtc->name);
>>
>> -       /* verify that there are not too many planes attached to crtc
>> -        * and that we don't have conflicting mixer stages:
>> -        */
>> -       hw_cfg = mdp5_cfg_get_hw_config(mdp5_kms->cfg);
>>         drm_atomic_crtc_state_for_each_plane_state(plane, pstate, state) {
>> -               if (cnt >= (hw_cfg->lm.nb_stages)) {
>> -                       dev_err(dev->dev, "too many planes!\n");
>> -                       return -EINVAL;
>> -               }
>> -
>> -
>>                 pstates[cnt].plane = plane;
>>                 pstates[cnt].state = to_mdp5_plane_state(pstate);
>>
>> @@ -399,8 +393,24 @@ static int mdp5_crtc_atomic_check(struct drm_crtc
>> *crtc,
>>         /* assign a stage based on sorted zpos property */
>>         sort(pstates, cnt, sizeof(pstates[0]), pstate_cmp, NULL);
>>
>> +       /* if the bottom-most layer is not fullscreen, we need to use
>> +        * it for solid-color:
>> +        */
>> +       if (!is_fullscreen(state, &pstates[0].state->base))
>> +               base++;
>> +
>
>
> I get a crash here when fbcon is enabled and there are no connectors
> connected. We're trying to refer pstates[0] when there is no plane
> connected to the crtc. I guess we could bail out much earlier if cnt
> is 0.

yeah, I hit that last night with no fbcon and killing the UI.. I've
already fixed it up locally with an 'if (pstates[0].state &&
!is_fullscreen())'

BR,
-R

> Archit
>
>> +       /* verify that there are not too many planes attached to crtc
>> +        * and that we don't have conflicting mixer stages:
>> +        */
>> +       hw_cfg = mdp5_cfg_get_hw_config(mdp5_kms->cfg);
>> +
>> +       if ((cnt + base) >= hw_cfg->lm.nb_stages) {
>> +               dev_err(dev->dev, "too many planes!\n");
>> +               return -EINVAL;
>> +       }
>> +
>>         for (i = 0; i < cnt; i++) {
>> -               pstates[i].state->stage = STAGE_BASE + i;
>> +               pstates[i].state->stage = STAGE_BASE + i + base;
>>                 DBG("%s: assign pipe %s on stage=%d", mdp5_crtc->name,
>>
>> pipe2name(mdp5_plane_pipe(pstates[i].plane)),
>>                                 pstates[i].state->stage);
>>
>
> --
> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
> a Linux Foundation Collaborative Project
_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] drm/msm/mdp5: handle non-fullscreen base plane case
  2016-10-15 11:32     ` Rob Clark
@ 2016-10-15 12:57       ` Archit Taneja
  2016-10-15 13:08         ` Rob Clark
  0 siblings, 1 reply; 9+ messages in thread
From: Archit Taneja @ 2016-10-15 12:57 UTC (permalink / raw)
  To: Rob Clark; +Cc: freedreno, dri-devel@lists.freedesktop.org



On 10/15/2016 5:02 PM, Rob Clark wrote:
> On Sat, Oct 15, 2016 at 5:39 AM, Archit Taneja <architt@codeaurora.org> wrote:
>>
>> On 10/13/2016 10:18 PM, Rob Clark wrote:
>>>
>>> If the bottom-most layer is not fullscreen, we need to use the BASE
>>> mixer stage for solid fill (ie. MDP5_CTL_BLEND_OP_FLAG_BORDER_OUT).  The
>>> blend_setup() code pretty much handled this already, we just had to
>>> figure this out in _atomic_check() and assign the stages appropriately.
>>>
>>> Signed-off-by: Rob Clark <robdclark@gmail.com>
>>> ---
>>> TODO mdp4 might need similar treatment?
>>>
>>>  drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c | 44
>>> ++++++++++++++++++++------------
>>>  1 file changed, 27 insertions(+), 17 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
>>> b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
>>> index fa2be7c..e42f62d 100644
>>> --- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
>>> +++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
>>> @@ -223,11 +223,6 @@ static void blend_setup(struct drm_crtc *crtc)
>>>                 plane_cnt++;
>>>         }
>>>
>>> -       /*
>>> -       * If there is no base layer, enable border color.
>>> -       * Although it's not possbile in current blend logic,
>>> -       * put it here as a reminder.
>>> -       */
>>>         if (!pstates[STAGE_BASE] && plane_cnt) {
>>>                 ctl_blend_flags |= MDP5_CTL_BLEND_OP_FLAG_BORDER_OUT;
>>>                 DBG("Border Color is enabled");
>>> @@ -365,6 +360,15 @@ static int pstate_cmp(const void *a, const void *b)
>>>         return pa->state->zpos - pb->state->zpos;
>>>  }
>>>
>>> +/* is there a helper for this? */
>>> +static bool is_fullscreen(struct drm_crtc_state *cstate,
>>> +               struct drm_plane_state *pstate)
>>> +{
>>> +       return (pstate->crtc_x == 0) && (pstate->crtc_y == 0) &&
>>> +               (pstate->crtc_w == cstate->mode.hdisplay) &&
>>> +               (pstate->crtc_h == cstate->mode.vdisplay);
>>> +}
>>> +
>>>  static int mdp5_crtc_atomic_check(struct drm_crtc *crtc,
>>>                 struct drm_crtc_state *state)
>>>  {
>>> @@ -375,21 +379,11 @@ static int mdp5_crtc_atomic_check(struct drm_crtc
>>> *crtc,
>>>         struct plane_state pstates[STAGE_MAX + 1];
>>>         const struct mdp5_cfg_hw *hw_cfg;
>>>         const struct drm_plane_state *pstate;
>>> -       int cnt = 0, i;
>>> +       int cnt = 0, base = 0, i;
>>>
>>>         DBG("%s: check", mdp5_crtc->name);
>>>
>>> -       /* verify that there are not too many planes attached to crtc
>>> -        * and that we don't have conflicting mixer stages:
>>> -        */
>>> -       hw_cfg = mdp5_cfg_get_hw_config(mdp5_kms->cfg);
>>>         drm_atomic_crtc_state_for_each_plane_state(plane, pstate, state) {
>>> -               if (cnt >= (hw_cfg->lm.nb_stages)) {
>>> -                       dev_err(dev->dev, "too many planes!\n");
>>> -                       return -EINVAL;
>>> -               }
>>> -
>>> -
>>>                 pstates[cnt].plane = plane;
>>>                 pstates[cnt].state = to_mdp5_plane_state(pstate);
>>>
>>> @@ -399,8 +393,24 @@ static int mdp5_crtc_atomic_check(struct drm_crtc
>>> *crtc,
>>>         /* assign a stage based on sorted zpos property */
>>>         sort(pstates, cnt, sizeof(pstates[0]), pstate_cmp, NULL);
>>>
>>> +       /* if the bottom-most layer is not fullscreen, we need to use
>>> +        * it for solid-color:
>>> +        */
>>> +       if (!is_fullscreen(state, &pstates[0].state->base))
>>> +               base++;
>>> +
>>
>>
>> I get a crash here when fbcon is enabled and there are no connectors
>> connected. We're trying to refer pstates[0] when there is no plane
>> connected to the crtc. I guess we could bail out much earlier if cnt
>> is 0.
>
> yeah, I hit that last night with no fbcon and killing the UI.. I've
> already fixed it up locally with an 'if (pstates[0].state &&
> !is_fullscreen())'

Okay, I guess we should probably memset pstates array to 0 in case the
stack memory has some older non NULL stuff in it.

Thanks,
Archit

>
> BR,
> -R
>
>> Archit
>>
>>> +       /* verify that there are not too many planes attached to crtc
>>> +        * and that we don't have conflicting mixer stages:
>>> +        */
>>> +       hw_cfg = mdp5_cfg_get_hw_config(mdp5_kms->cfg);
>>> +
>>> +       if ((cnt + base) >= hw_cfg->lm.nb_stages) {
>>> +               dev_err(dev->dev, "too many planes!\n");
>>> +               return -EINVAL;
>>> +       }
>>> +
>>>         for (i = 0; i < cnt; i++) {
>>> -               pstates[i].state->stage = STAGE_BASE + i;
>>> +               pstates[i].state->stage = STAGE_BASE + i + base;
>>>                 DBG("%s: assign pipe %s on stage=%d", mdp5_crtc->name,
>>>
>>> pipe2name(mdp5_plane_pipe(pstates[i].plane)),
>>>                                 pstates[i].state->stage);
>>>
>>
>> --
>> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
>> a Linux Foundation Collaborative Project

-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] drm/msm/mdp5: handle non-fullscreen base plane case
  2016-10-15 12:57       ` Archit Taneja
@ 2016-10-15 13:08         ` Rob Clark
       [not found]           ` <CAF6AEGuukfacj7G+j3496tLSBMJA44Yt14NTxpT9kCX5kJftPw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
  0 siblings, 1 reply; 9+ messages in thread
From: Rob Clark @ 2016-10-15 13:08 UTC (permalink / raw)
  To: Archit Taneja; +Cc: freedreno, dri-devel@lists.freedesktop.org

On Sat, Oct 15, 2016 at 8:57 AM, Archit Taneja <architt@codeaurora.org> wrote:
>
>
> On 10/15/2016 5:02 PM, Rob Clark wrote:
>>
>> On Sat, Oct 15, 2016 at 5:39 AM, Archit Taneja <architt@codeaurora.org>
>> wrote:
>>>
>>>
>>> On 10/13/2016 10:18 PM, Rob Clark wrote:
>>>>
>>>>
>>>> If the bottom-most layer is not fullscreen, we need to use the BASE
>>>> mixer stage for solid fill (ie. MDP5_CTL_BLEND_OP_FLAG_BORDER_OUT).  The
>>>> blend_setup() code pretty much handled this already, we just had to
>>>> figure this out in _atomic_check() and assign the stages appropriately.
>>>>
>>>> Signed-off-by: Rob Clark <robdclark@gmail.com>
>>>> ---
>>>> TODO mdp4 might need similar treatment?
>>>>
>>>>  drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c | 44
>>>> ++++++++++++++++++++------------
>>>>  1 file changed, 27 insertions(+), 17 deletions(-)
>>>>
>>>> diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
>>>> b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
>>>> index fa2be7c..e42f62d 100644
>>>> --- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
>>>> +++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
>>>> @@ -223,11 +223,6 @@ static void blend_setup(struct drm_crtc *crtc)
>>>>                 plane_cnt++;
>>>>         }
>>>>
>>>> -       /*
>>>> -       * If there is no base layer, enable border color.
>>>> -       * Although it's not possbile in current blend logic,
>>>> -       * put it here as a reminder.
>>>> -       */
>>>>         if (!pstates[STAGE_BASE] && plane_cnt) {
>>>>                 ctl_blend_flags |= MDP5_CTL_BLEND_OP_FLAG_BORDER_OUT;
>>>>                 DBG("Border Color is enabled");
>>>> @@ -365,6 +360,15 @@ static int pstate_cmp(const void *a, const void *b)
>>>>         return pa->state->zpos - pb->state->zpos;
>>>>  }
>>>>
>>>> +/* is there a helper for this? */
>>>> +static bool is_fullscreen(struct drm_crtc_state *cstate,
>>>> +               struct drm_plane_state *pstate)
>>>> +{
>>>> +       return (pstate->crtc_x == 0) && (pstate->crtc_y == 0) &&
>>>> +               (pstate->crtc_w == cstate->mode.hdisplay) &&
>>>> +               (pstate->crtc_h == cstate->mode.vdisplay);
>>>> +}
>>>> +
>>>>  static int mdp5_crtc_atomic_check(struct drm_crtc *crtc,
>>>>                 struct drm_crtc_state *state)
>>>>  {
>>>> @@ -375,21 +379,11 @@ static int mdp5_crtc_atomic_check(struct drm_crtc
>>>> *crtc,
>>>>         struct plane_state pstates[STAGE_MAX + 1];
>>>>         const struct mdp5_cfg_hw *hw_cfg;
>>>>         const struct drm_plane_state *pstate;
>>>> -       int cnt = 0, i;
>>>> +       int cnt = 0, base = 0, i;
>>>>
>>>>         DBG("%s: check", mdp5_crtc->name);
>>>>
>>>> -       /* verify that there are not too many planes attached to crtc
>>>> -        * and that we don't have conflicting mixer stages:
>>>> -        */
>>>> -       hw_cfg = mdp5_cfg_get_hw_config(mdp5_kms->cfg);
>>>>         drm_atomic_crtc_state_for_each_plane_state(plane, pstate, state)
>>>> {
>>>> -               if (cnt >= (hw_cfg->lm.nb_stages)) {
>>>> -                       dev_err(dev->dev, "too many planes!\n");
>>>> -                       return -EINVAL;
>>>> -               }
>>>> -
>>>> -
>>>>                 pstates[cnt].plane = plane;
>>>>                 pstates[cnt].state = to_mdp5_plane_state(pstate);
>>>>
>>>> @@ -399,8 +393,24 @@ static int mdp5_crtc_atomic_check(struct drm_crtc
>>>> *crtc,
>>>>         /* assign a stage based on sorted zpos property */
>>>>         sort(pstates, cnt, sizeof(pstates[0]), pstate_cmp, NULL);
>>>>
>>>> +       /* if the bottom-most layer is not fullscreen, we need to use
>>>> +        * it for solid-color:
>>>> +        */
>>>> +       if (!is_fullscreen(state, &pstates[0].state->base))
>>>> +               base++;
>>>> +
>>>
>>>
>>>
>>> I get a crash here when fbcon is enabled and there are no connectors
>>> connected. We're trying to refer pstates[0] when there is no plane
>>> connected to the crtc. I guess we could bail out much earlier if cnt
>>> is 0.
>>
>>
>> yeah, I hit that last night with no fbcon and killing the UI.. I've
>> already fixed it up locally with an 'if (pstates[0].state &&
>> !is_fullscreen())'
>
>
> Okay, I guess we should probably memset pstates array to 0 in case the
> stack memory has some older non NULL stuff in it.

hmm, yeah, you are right.. I wonder how that wasn't already a
problem..  I guess we at least always have an outgoing plane?  I guess
changing the check to '(cnt > 0)' instead of 'pstates[0].state' would
do the trick..

fwiw, I pushed current version of this and the other patches to:

https://github.com/freedreno/kernel-msm/commits/integration-linux-qcomlt-fences-2

BR,
-R

> Thanks,
> Archit
>
>
>>
>> BR,
>> -R
>>
>>> Archit
>>>
>>>> +       /* verify that there are not too many planes attached to crtc
>>>> +        * and that we don't have conflicting mixer stages:
>>>> +        */
>>>> +       hw_cfg = mdp5_cfg_get_hw_config(mdp5_kms->cfg);
>>>> +
>>>> +       if ((cnt + base) >= hw_cfg->lm.nb_stages) {
>>>> +               dev_err(dev->dev, "too many planes!\n");
>>>> +               return -EINVAL;
>>>> +       }
>>>> +
>>>>         for (i = 0; i < cnt; i++) {
>>>> -               pstates[i].state->stage = STAGE_BASE + i;
>>>> +               pstates[i].state->stage = STAGE_BASE + i + base;
>>>>                 DBG("%s: assign pipe %s on stage=%d", mdp5_crtc->name,
>>>>
>>>> pipe2name(mdp5_plane_pipe(pstates[i].plane)),
>>>>                                 pstates[i].state->stage);
>>>>
>>>
>>> --
>>> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
>>> a Linux Foundation Collaborative Project
>
>
> --
> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
> a Linux Foundation Collaborative Project
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] drm/msm/mdp5: handle non-fullscreen base plane case
       [not found]           ` <CAF6AEGuukfacj7G+j3496tLSBMJA44Yt14NTxpT9kCX5kJftPw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
@ 2016-10-15 13:22             ` Archit Taneja
  0 siblings, 0 replies; 9+ messages in thread
From: Archit Taneja @ 2016-10-15 13:22 UTC (permalink / raw)
  To: Rob Clark
  Cc: freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
	dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org



On 10/15/2016 6:38 PM, Rob Clark wrote:
> On Sat, Oct 15, 2016 at 8:57 AM, Archit Taneja <architt@codeaurora.org> wrote:
>>
>>
>> On 10/15/2016 5:02 PM, Rob Clark wrote:
>>>
>>> On Sat, Oct 15, 2016 at 5:39 AM, Archit Taneja <architt@codeaurora.org>
>>> wrote:
>>>>
>>>>
>>>> On 10/13/2016 10:18 PM, Rob Clark wrote:
>>>>>
>>>>>
>>>>> If the bottom-most layer is not fullscreen, we need to use the BASE
>>>>> mixer stage for solid fill (ie. MDP5_CTL_BLEND_OP_FLAG_BORDER_OUT).  The
>>>>> blend_setup() code pretty much handled this already, we just had to
>>>>> figure this out in _atomic_check() and assign the stages appropriately.
>>>>>
>>>>> Signed-off-by: Rob Clark <robdclark@gmail.com>
>>>>> ---
>>>>> TODO mdp4 might need similar treatment?
>>>>>
>>>>>  drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c | 44
>>>>> ++++++++++++++++++++------------
>>>>>  1 file changed, 27 insertions(+), 17 deletions(-)
>>>>>
>>>>> diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
>>>>> b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
>>>>> index fa2be7c..e42f62d 100644
>>>>> --- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
>>>>> +++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
>>>>> @@ -223,11 +223,6 @@ static void blend_setup(struct drm_crtc *crtc)
>>>>>                 plane_cnt++;
>>>>>         }
>>>>>
>>>>> -       /*
>>>>> -       * If there is no base layer, enable border color.
>>>>> -       * Although it's not possbile in current blend logic,
>>>>> -       * put it here as a reminder.
>>>>> -       */
>>>>>         if (!pstates[STAGE_BASE] && plane_cnt) {
>>>>>                 ctl_blend_flags |= MDP5_CTL_BLEND_OP_FLAG_BORDER_OUT;
>>>>>                 DBG("Border Color is enabled");
>>>>> @@ -365,6 +360,15 @@ static int pstate_cmp(const void *a, const void *b)
>>>>>         return pa->state->zpos - pb->state->zpos;
>>>>>  }
>>>>>
>>>>> +/* is there a helper for this? */
>>>>> +static bool is_fullscreen(struct drm_crtc_state *cstate,
>>>>> +               struct drm_plane_state *pstate)
>>>>> +{
>>>>> +       return (pstate->crtc_x == 0) && (pstate->crtc_y == 0) &&
>>>>> +               (pstate->crtc_w == cstate->mode.hdisplay) &&
>>>>> +               (pstate->crtc_h == cstate->mode.vdisplay);
>>>>> +}
>>>>> +
>>>>>  static int mdp5_crtc_atomic_check(struct drm_crtc *crtc,
>>>>>                 struct drm_crtc_state *state)
>>>>>  {
>>>>> @@ -375,21 +379,11 @@ static int mdp5_crtc_atomic_check(struct drm_crtc
>>>>> *crtc,
>>>>>         struct plane_state pstates[STAGE_MAX + 1];
>>>>>         const struct mdp5_cfg_hw *hw_cfg;
>>>>>         const struct drm_plane_state *pstate;
>>>>> -       int cnt = 0, i;
>>>>> +       int cnt = 0, base = 0, i;
>>>>>
>>>>>         DBG("%s: check", mdp5_crtc->name);
>>>>>
>>>>> -       /* verify that there are not too many planes attached to crtc
>>>>> -        * and that we don't have conflicting mixer stages:
>>>>> -        */
>>>>> -       hw_cfg = mdp5_cfg_get_hw_config(mdp5_kms->cfg);
>>>>>         drm_atomic_crtc_state_for_each_plane_state(plane, pstate, state)
>>>>> {
>>>>> -               if (cnt >= (hw_cfg->lm.nb_stages)) {
>>>>> -                       dev_err(dev->dev, "too many planes!\n");
>>>>> -                       return -EINVAL;
>>>>> -               }
>>>>> -
>>>>> -
>>>>>                 pstates[cnt].plane = plane;
>>>>>                 pstates[cnt].state = to_mdp5_plane_state(pstate);
>>>>>
>>>>> @@ -399,8 +393,24 @@ static int mdp5_crtc_atomic_check(struct drm_crtc
>>>>> *crtc,
>>>>>         /* assign a stage based on sorted zpos property */
>>>>>         sort(pstates, cnt, sizeof(pstates[0]), pstate_cmp, NULL);
>>>>>
>>>>> +       /* if the bottom-most layer is not fullscreen, we need to use
>>>>> +        * it for solid-color:
>>>>> +        */
>>>>> +       if (!is_fullscreen(state, &pstates[0].state->base))
>>>>> +               base++;
>>>>> +
>>>>
>>>>
>>>>
>>>> I get a crash here when fbcon is enabled and there are no connectors
>>>> connected. We're trying to refer pstates[0] when there is no plane
>>>> connected to the crtc. I guess we could bail out much earlier if cnt
>>>> is 0.
>>>
>>>
>>> yeah, I hit that last night with no fbcon and killing the UI.. I've
>>> already fixed it up locally with an 'if (pstates[0].state &&
>>> !is_fullscreen())'
>>
>>
>> Okay, I guess we should probably memset pstates array to 0 in case the
>> stack memory has some older non NULL stuff in it.
>
> hmm, yeah, you are right.. I wonder how that wasn't already a
> problem..  I guess we at least always have an outgoing plane?  I guess
> changing the check to '(cnt > 0)' instead of 'pstates[0].state' would
> do the trick..
>
> fwiw, I pushed current version of this and the other patches to:
>
> https://github.com/freedreno/kernel-msm/commits/integration-linux-qcomlt-fences-2

thanks! I'll start using these patches too.

Archit

>
> BR,
> -R
>
>> Thanks,
>> Archit
>>
>>
>>>
>>> BR,
>>> -R
>>>
>>>> Archit
>>>>
>>>>> +       /* verify that there are not too many planes attached to crtc
>>>>> +        * and that we don't have conflicting mixer stages:
>>>>> +        */
>>>>> +       hw_cfg = mdp5_cfg_get_hw_config(mdp5_kms->cfg);
>>>>> +
>>>>> +       if ((cnt + base) >= hw_cfg->lm.nb_stages) {
>>>>> +               dev_err(dev->dev, "too many planes!\n");
>>>>> +               return -EINVAL;
>>>>> +       }
>>>>> +
>>>>>         for (i = 0; i < cnt; i++) {
>>>>> -               pstates[i].state->stage = STAGE_BASE + i;
>>>>> +               pstates[i].state->stage = STAGE_BASE + i + base;
>>>>>                 DBG("%s: assign pipe %s on stage=%d", mdp5_crtc->name,
>>>>>
>>>>> pipe2name(mdp5_plane_pipe(pstates[i].plane)),
>>>>>                                 pstates[i].state->stage);
>>>>>
>>>>
>>>> --
>>>> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
>>>> a Linux Foundation Collaborative Project
>>
>>
>> --
>> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
>> a Linux Foundation Collaborative Project

-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project
_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2016-10-15 13:22 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-10-13 16:48 [PATCH] drm/msm/mdp5: handle non-fullscreen base plane case Rob Clark
     [not found] ` <1476377326-17877-1-git-send-email-robdclark-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-10-14 12:25   ` Archit Taneja
2016-10-14 12:45   ` Ville Syrjälä
     [not found]     ` <20161014124515.GC4329-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2016-10-14 14:11       ` Rob Clark
2016-10-15  9:39 ` Archit Taneja
     [not found]   ` <f57272cf-4e42-741d-e4b7-c201f50130ec-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2016-10-15 11:32     ` Rob Clark
2016-10-15 12:57       ` Archit Taneja
2016-10-15 13:08         ` Rob Clark
     [not found]           ` <CAF6AEGuukfacj7G+j3496tLSBMJA44Yt14NTxpT9kCX5kJftPw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-10-15 13:22             ` Archit Taneja

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.