[PATCH] drm/msm/mdp5: handle non-fullscreen base plane case

Rob Clark robdclark at gmail.com
Fri Oct 14 14:11:52 UTC 2016


On Fri, Oct 14, 2016 at 8:45 AM, Ville Syrjälä
<ville.syrjala at 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 at 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 at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/dri-devel
>
> --
> Ville Syrjälä
> Intel OTC


More information about the dri-devel mailing list