[PATCH] drm/amd/display: remove need of modeset flag for overlay planes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 5/4/2018 6:27 PM, Andrey Grodzovsky wrote:
>
>
> On 05/03/2018 02:11 PM, Harry Wentland wrote:
>> On 2018-05-03 04:00 AM, S, Shirish wrote:
>>>
>>> On 5/2/2018 7:21 PM, Harry Wentland wrote:
>>>> On 2018-04-27 06:27 AM, Shirish S wrote:
>>>>> This patch is in continuation to the
>>>>> "843e3c7 drm/amd/display: defer modeset check in 
>>>>> dm_update_planes_state"
>>>>> where we started to eliminate the dependency on
>>>>> DRM_MODE_ATOMIC_ALLOW_MODESET to be set by the user space,
>>>>> which as such is not mandatory.
>>>>>
>>>>> After deferring, this patch eliminates the dependency on the flag
>>>>> for overlay planes.
>>>>>
>>>> Apologies for the late response. I had to think about this patch 
>>>> for a long time since I'm not quite comfortable with it.
>>>>
>>>>> This has to be done in stages as its a pretty complex and requires 
>>>>> thorough
>>>>> testing before we free primary planes as well from dependency on 
>>>>> modeset
>>>>> flag.
>>>>>
>>>>> Signed-off-by: Shirish S <shirish.s at amd.com>
>>>>> ---
>>>>>    drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 8 +++++---
>>>>>    1 file changed, 5 insertions(+), 3 deletions(-)
>>>>>
>>>>> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
>>>>> b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
>>>>> index 1a63c04..87b661d 100644
>>>>> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
>>>>> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
>>>>> @@ -4174,7 +4174,7 @@ static void amdgpu_dm_commit_planes(struct 
>>>>> drm_atomic_state *state,
>>>>>            }
>>>>> spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
>>>>>    -        if (!pflip_needed) {
>>>>> +        if (!pflip_needed || plane->type == 
>>>>> DRM_PLANE_TYPE_OVERLAY) {
>>>> Does this mean that whenever we have an overlay plane we won't do 
>>>> amdgpu_dm_do_flip but commit_planes_to_stream instead? Is this 
>>>> really the behavior we want?
>>>>
>>>> commit_planes_to_stream was intended to program a new surface on a 
>>>> modeset whereas amdgpu_dm_do_flip was intended for pageflips.
>>> Need of "modeset" flag to program new surface is what we want to fix 
>>> in this patch for underlay plane and in next stages, fix 
>>> manifestations caused by this approach as and when seen.
>>> Since the user space doesn't send modeset flag for new surface, 
>>> hence to program it, this patch checks the plane type to construct 
>>> planes_count before calling commit_planes_to_stream().
>>>
>> Looking at the allow_modeset flag was never quite right and we 
>> anticipated having to rework this when having to deal with things 
>> like multiple planes. What really has to happen is that we determine 
>> the surface_update_type in atomic_check and then use that in 
>> atomic_commit to either program the surface only (UPDATE_TYPE_FAST) 
>> without having to lock all pipes or to lock all pipes (see 
>> lock_and_validation_needed in amdgpu_dm_atomic_check) if we need to 
>> reprogram mode (UPDATE_TYPE_FULL). I don't remember exactly what 
>> UPDATE_TYPE_MED is used for.
>>
True, any suggestions on what needs to be check to decide if the surface 
update has  to be FAST?
Like plane_count, format or dc_state etc?
>> I don't feel comfortable taking a shortcut for DRM_PLANE_TYPE_OVERLAY 
>> without first having a plan and patches for how to deal with the 
>> above-mentioned.
>>
>> Bhawan and Andrey had a look at this before but it was never quite 
>> ready. The work was non-trivial and potentially impacts lots of 
>> configurations and scenarios if we don't get it right. If you're 
>> curious you can look at this change (apologies to everyone else for 
>> posting AMD-internal link): http://git.amd.com:8080/#/c/103931/11
>>
>>>   If we use commit_planes_to_stream we end up losing things like the 
>>> immediate_flip flag, as well as the wait for the right moment to 
>>> program the flip that amdgpu_dm_do_flip does.
>>>
>>>  From the code, amdgpu_dm_do_flip does what you mentioned only for 
>>> primary plane and hence either way its not set for underlay.
>> The code wasn't designed with underlay in mind, so it will need work.
>>
>> Harry
>
> I support Harry's comments, we definitely need to strive to remove 
> dependency on page_fleep needed flag, AFAIK we are the only ATOMIC KMS 
> driver which makes a distinction between page fleep and other
> surface updates, but it's better to sit and create a general plan of 
> how to address it for all type of planes instead of patching for 
> overlay only.
>
> Andrey
>
Is anybody working on removing the dependency on page_flip_needed flag ?
Since am working on stoney for chrome os, i have limited visibility or 
knowledge of its implications on other asics,
hence to avoid regressions to other users i patched only the overlay 
path of it.

Some one who knows its inter-dependency on dc would be right to do it.
If you think its a long shot please re-consider my proposal of doing it 
in stages, i.e., removing overlay planes from dependency and then the 
primary since cursor updates is a but tricky and tied to primary plane.
Regards,
Shirish S
>>
>>> Regards,
>>> Shirish S
>>>>    Even more importantly we won't wait for fences 
>>>> (reservation_object_wait_timeout_rcu).
>>>>
>>>> Harry
>>>>
>>>>> WARN_ON(!dm_new_plane_state->dc_state);
>>>>>                  plane_states_constructed[planes_count] = 
>>>>> dm_new_plane_state->dc_state;
>>>>> @@ -4884,7 +4884,8 @@ static int dm_update_planes_state(struct dc 
>>>>> *dc,
>>>>>              /* Remove any changed/removed planes */
>>>>>            if (!enable) {
>>>>> -            if (pflip_needed)
>>>>> +            if (pflip_needed &&
>>>>> +                plane && plane->type != DRM_PLANE_TYPE_OVERLAY)
>>>>>                    continue;
>>>>>                  if (!old_plane_crtc)
>>>>> @@ -4931,7 +4932,8 @@ static int dm_update_planes_state(struct dc 
>>>>> *dc,
>>>>>                if (!dm_new_crtc_state->stream)
>>>>>                    continue;
>>>>>    -            if (pflip_needed)
>>>>> +            if (pflip_needed &&
>>>>> +                plane && plane->type != DRM_PLANE_TYPE_OVERLAY)
>>>>>                    continue;
>>>>>                  WARN_ON(dm_new_plane_state->dc_state);
>>>>>
>

-- 
Regards,
Shirish S



[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux