* [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[parent not found: <1476377326-17877-1-git-send-email-robdclark-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>]
* 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
[parent not found: <20161014124515.GC4329-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>]
* 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
[parent not found: <f57272cf-4e42-741d-e4b7-c201f50130ec-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>]
* 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
[parent not found: <CAF6AEGuukfacj7G+j3496tLSBMJA44Yt14NTxpT9kCX5kJftPw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>]
* 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.