[PATCH 03/29] drm/amd/display: Complete TODO item: use new DRM iterator
Andrey Grodzovsky
Andrey.Grodzovsky at amd.com
Mon Oct 30 17:19:12 UTC 2017
On 10/30/2017 01:14 PM, Leo wrote:
>
>
> On 2017-10-30 12:36 PM, Leo wrote:
>>
>>
>> On 2017-10-26 11:06 PM, Andrey Grodzovsky wrote:
>>>
>>>
>>> On 2017-10-26 02:34 PM, Harry Wentland wrote:
>>>> From: "Leo (Sunpeng) Li" <sunpeng.li at amd.com>
>>>>
>>>> Abandon new_crtcs array and use for_each_new iterator to acquire new
>>>> crtcs.
>>>>
>>>> Signed-off-by: Leo (Sunpeng) Li <sunpeng.li at amd.com>
>>>> Reviewed-by: Harry Wentland <Harry.Wentland at amd.com>
>>>> ---
>>>> drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 36
>>>> +++++++++--------------
>>>> 1 file changed, 14 insertions(+), 22 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 442b399a9400..590f80d29b56 100644
>>>> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
>>>> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
>>>> @@ -4013,10 +4013,8 @@ static void
>>>> amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
>>>> struct amdgpu_display_manager *dm = &adev->dm;
>>>> struct dm_atomic_state *dm_state;
>>>> uint32_t i, j;
>>>> - uint32_t new_crtcs_count = 0;
>>>> struct drm_crtc *crtc;
>>>> struct drm_crtc_state *old_crtc_state, *new_crtc_state;
>>>> - struct amdgpu_crtc *new_crtcs[MAX_STREAMS];
>>>> unsigned long flags;
>>>> bool wait_for_vblank = true;
>>>> struct drm_connector *connector;
>>>> @@ -4075,25 +4073,9 @@ static void
>>>> amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
>>>> continue;
>>>> }
>>>> -
>>>> if (dm_old_crtc_state->stream)
>>>> remove_stream(adev, acrtc,
>>>> dm_old_crtc_state->stream);
>>>> -
>>>> - /*
>>>> - * this loop saves set mode crtcs
>>>> - * we needed to enable vblanks once all
>>>> - * resources acquired in dc after dc_commit_streams
>>>> - */
>>>> -
>>>> - /*TODO move all this into dm_crtc_state, get rid of
>>>> - * new_crtcs array and use old and new atomic states
>>>> - * instead
>>>> - */
>>>> - new_crtcs[new_crtcs_count] = acrtc;
>>>> - new_crtcs_count++;
>>>> -
>>>> - new_crtc_state = drm_atomic_get_new_crtc_state(state,
>>>> crtc);
>>>> acrtc->enabled = true;
>>>> acrtc->hw_mode = new_crtc_state->mode;
>>>> crtc->hwmode = new_crtc_state->mode;
>>>> @@ -4221,18 +4203,28 @@ static void
>>>> amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
>>>> dm_error("%s: Failed to update stream scaling!\n",
>>>> __func__);
>>>> }
>>>> - for (i = 0; i < new_crtcs_count; i++) {
>>>> + for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state,
>>>> + new_crtc_state, i) {
>>>> /*
>>>> * loop to enable interrupts on newly arrived crtc
>>>> */
>>>> - struct amdgpu_crtc *acrtc = new_crtcs[i];
>>>> + struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc);
>>>> + bool modeset_needed;
>>>> - new_crtc_state = drm_atomic_get_new_crtc_state(state,
>>>> &acrtc->base);
>>>> dm_new_crtc_state = to_dm_crtc_state(new_crtc_state);
>>>> + dm_old_crtc_state = to_dm_crtc_state(old_crtc_state);
>>>> + modeset_needed = modeset_required(
>>>> + new_crtc_state,
>>>> + dm_new_crtc_state->stream,
>>>> + dm_old_crtc_state->stream);
>>>> +
>>>> + if (dm_new_crtc_state->stream == NULL || !modeset_needed)
>>>> + continue;
>>>
>>> I feel it's a bit future bug prone to repeat the 2 checks above from
>>> the initial
>>> for_each_crtc_in_state loop, somebody makes changes there and forget
>>> about this loop.
>>> The array is ugly but it avoids logic duplication.
>>
>> I think a better fix would be to combine this for_each section with the
>> one above it. The only thing keeping them separate (not shown in the
>> above context) is an `if (adev->dm.freesync_module)` guard, which can be
>> pulled into the first for_each loop. It would also eliminate a lot of
>> duplicated initialization code.
>>
>> Thoughts?
>>
>> Leo
>>
>
> Ignore what I said, It seems I was looking at the wrong context :) The
> fact this blob is being done after dc_commit_state() is annoying...
>
> The maintainability of this duplicated logic is a good point. Although
> I'm not sure if going back to a shared array using custom iterator
> logic is the best approach. Perhapse we can pull this duplicated logic
> into a seperate function?
That actually a good idea.
Thanks,
Andrey
>
> Thanks,
> Leo
>
>
>
>>>
>>> Thanks,
>>> Andrey
>>>
>>>> if (adev->dm.freesync_module)
>>>> mod_freesync_notify_mode_change(
>>>> - adev->dm.freesync_module,
>>>> &dm_new_crtc_state->stream, 1);
>>>> + adev->dm.freesync_module,
>>>> + &dm_new_crtc_state->stream, 1);
>>>> manage_dm_interrupts(adev, acrtc, true);
>>>> }
>>>
>> _______________________________________________
>> amd-gfx mailing list
>> amd-gfx at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
More information about the amd-gfx
mailing list