Re: [PATCH v3 3/7] drm/amd/display: don't check colorop status if its in an inactive pipeline

Melissa Wen <[email protected]>
Newsgroups org.freedesktop.lists.intel-gfx,org.freedesktop.lists.amd-gfx,org.freedesktop.lists.dri-devel,org.freedesktop.lists.intel-xe,org.kernel.vger.linux-arm-msm
Message-ID <[email protected]>

On 26/06/2026 00:52, John Harrison wrote:
> On 6/9/26 13:51, Melissa Wen wrote:
>> If colorop BYPASS property is true, but the colorop isn't part of an
> Should this say 'is false'?

Oops, you are right. I'll fix it in the next version.

>
> John.
>
>> active/transient active color pipeline, this colorop status should not
>> be taken into account when checking if a plane color pipeline is
>> actually active. For example, if the userspace doesn't explicitly set a
>> colorop obj to bypass but deactivates its color pipeline by setting
>> plane COLOR_PIPELINE to bypass, it means that colorop is inactive
>> regardless of its BYPASS property status.
>>
>> Reported-by: Sashiko <[email protected]>
>> Fixes: d3a549f4df78 ("drm/amd/display: Use overlay cursor when color 
>> pipeline is active")
>> Signed-off-by: Melissa Wen <[email protected]>
>> ---
>>   .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 31 +++++++++++++------
>>   1 file changed, 21 insertions(+), 10 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 ba7f98a87808..2edec3e1b838 100644
>> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
>> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
>> @@ -12590,9 +12590,9 @@ static int add_affected_mst_dsc_crtcs(struct 
>> drm_atomic_commit *state, struct dr
>>    * @use_old: if true, inspect the old colorop states; otherwise the 
>> new ones
>>    *
>>    * A color pipeline may be selected (color_pipeline != NULL) but 
>> still is
>> - * inactive if every colorop in the chain is bypassed.  Only return
>> - * true when at least one colorop has bypass == false, meaning the 
>> cursor
>> - * would be subjected to the transformation in native mode.
>> + * inactive if every colorop in the chain is bypassed. Only return 
>> true when at
>> + * least one active colorop has bypass == false, meaning the cursor 
>> would be
>> + * subjected to the transformation in native mode.
>>    *
>>    * Return: true if the pipeline modifies pixels, false otherwise.
>>    */
>> @@ -12600,18 +12600,29 @@ static bool 
>> dm_plane_color_pipeline_active(struct drm_atomic_commit *state,
>>                          struct drm_plane *plane,
>>                          bool use_old)
>>   {
>> -    struct drm_colorop *colorop;
>> -    struct drm_colorop_state *old_colorop_state, *new_colorop_state;
>> -    int i;
>> +    struct drm_plane_state *plane_state = use_old ?
>> +                          drm_atomic_get_old_plane_state(state, 
>> plane) :
>> +                          drm_atomic_get_new_plane_state(state, plane);
>> +    struct drm_colorop *colorop, *pipeline;
>> +    struct drm_colorop_state *cstate;
>>   -    for_each_oldnew_colorop_in_state(state, colorop, 
>> old_colorop_state, new_colorop_state, i) {
>> -        struct drm_colorop_state *cstate = use_old ? 
>> old_colorop_state : new_colorop_state;
>> +    pipeline = plane_state ? plane_state->color_pipeline :
>> +                 plane->state->color_pipeline;
> Why would plane_state be null? And if it is, why is it correct to use 
> plane->state rather than the old or new state as requested by the 
> use_old flag? Seems like there should be a comment to explain this.

Right, about the plane_state, it was a defensive approach for the case 
that we have a colorop change but no changes on plane that make its 
state part of an atomic commit and in this case, there is no difference 
between old/new state, it's just the committed state.
However following the callers of this function, currently plane_state is 
never NULL, so now I think a WARN_ON is enough, instead of handling an 
unreachable case.
>
>
>>   -        if (cstate->colorop->plane != plane)
>> -            continue;
>> +    if (!pipeline)
>> +        return false;
>> +
>> +    drm_for_each_colorop_in_pipeline(colorop, pipeline) {
>> +        cstate = use_old ?
>> +             drm_atomic_get_old_colorop_state(state, colorop) :
>> +             drm_atomic_get_new_colorop_state(state, colorop);
>> +
>> +        if (!cstate)
>> +            cstate = colorop->state;
> Same question as above. Why would there not be a old/new state and if 
> there isn't, why is it correct to use the current state when a check 
> against the old/new state was explicitly requested?

Here is a bit different, there is a situation in which just one or two 
colorops of a given color pipeline changes, but others are not touched. 
In this case only colorops that changed will have a old/new states, but 
others only have the committed state for validation.
To state that a given color pipeline can modify pixels or not, we also 
need to check the commited/current state of all colorop in the selected 
colorop pipeline, not only those that were changed in this atomic commit.
I'll add a comment explaining it better.

Thanks,

Melissa

>
> John.
>
>>           if (!cstate->bypass)
>>               return true;
>>       }
>> +
>>       return false;
>>   }
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.