From: Archit Taneja <architt@codeaurora.org>
To: Rob Clark <robdclark@gmail.com>
Cc: freedreno@lists.freedesktop.org,
"dri-devel@lists.freedesktop.org"
<dri-devel@lists.freedesktop.org>
Subject: Re: [PATCH] drm/msm/mdp5: handle non-fullscreen base plane case
Date: Sat, 15 Oct 2016 18:27:20 +0530 [thread overview]
Message-ID: <267ac955-6290-ccdb-cd7d-da8da4b43350@codeaurora.org> (raw)
In-Reply-To: <CAF6AEGsb2ASQ4w8ODBc18iRW--8g57RxQvQ2N0oUeeqOvyB46Q@mail.gmail.com>
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
next prev parent reply other threads:[~2016-10-15 12:57 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
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 [this message]
2016-10-15 13:08 ` Rob Clark
[not found] ` <CAF6AEGuukfacj7G+j3496tLSBMJA44Yt14NTxpT9kCX5kJftPw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-10-15 13:22 ` Archit Taneja
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=267ac955-6290-ccdb-cd7d-da8da4b43350@codeaurora.org \
--to=architt@codeaurora.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=freedreno@lists.freedesktop.org \
--cc=robdclark@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox