On 2026. augusztus 19., szerda 9:27:20 közép-európai nyári idő Michel Dänzer 
wrote:
> [ Adding Timur ]

Thank you for your consideration!

> 
> On 8/18/26 22:14, [email protected] wrote:
> > From: James Lin <[email protected]>
> > 
> > [why]
> > amdgpu_dm_crtc_get_cursor_mode() returns DM_CURSOR_NATIVE_MODE early and
> > unconditionally for dcn4.x. That early return was added because these
> > ASICs no longer have the cursor-on-scaled-plane or cursor-on-yuv-plane
> > restrictions of older DCN, so native cursor is fine in those cases.
> > However, it also bypasses the "does the top plane fill the CRTC?" (hole)
> > evaluation further down. When the top/primary plane does not cover the
> > whole CRTC, the cursor must fall back to an overlay plane so it is
> > composited over the uncovered region; keeping the native cursor there
> > produces an incorrect result. As a consequence
> > igt@amdgpu/amd_cursor_overlay@non-full, which verifies exactly this
> > native->overlay fallback, fails on dcn42.
> > 
> > [how]
> > Change unconditional early return with a skip_fmt_scale_restrictions flag.
> > For dcn4.x keep skipping the YUV / active-color-pipeline / different-scale
> > overlay triggers (genuinely unnecessary on this hardware), but fall
> > through to the existing entire_crtc_covered check so a top plane that does
> > not fill the CRTC still selects DM_CURSOR_OVERLAY_MODE. Native mode is
> > still chosen when the plane covers the whole CRTC.
> > 
> > Update the amdgpu_dm_cursor KUnit tests accordingly: exercise the dcn4x
> > path with a full atomic state fixture (full coverage -> native) and add a
> > dcn4x hole case (top plane does not fill the CRTC -> overlay).
> > 
> > Reviewed-by: Tom Chung <[email protected]>
> > Signed-off-by: James Lin <[email protected]>
> > Signed-off-by: Ivan Lipski <[email protected]>
> > ---
> > 
> >  .../amd/display/amdgpu_dm/amdgpu_dm_cursor.c  | 28 ++++++++--------
> >  .../amdgpu_dm/tests/amdgpu_dm_cursor_test.c   | 32 +++++++++++++------
> >  2 files changed, 38 insertions(+), 22 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_cursor.c
> > b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_cursor.c index
> > 9534848ed240c..c41fce07b8fa8 100644
> > --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_cursor.c
> > +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_cursor.c
> > [...]
> > @@ -300,15 +297,17 @@ int amdgpu_dm_crtc_get_cursor_mode(struct
> > amdgpu_device *adev,> 
> >      */
> >     
> >     if (amdgpu_ip_version(adev, DCE_HWIP, 0) == IP_VERSION(4, 0, 1) ||
> >     
> >         amdgpu_ip_version(adev, DCE_HWIP, 0) == IP_VERSION(4, 2, 0) ||
> > 
> > -#if defined(CONFIG_DRM_AMD_DC_DCN6_0)
> > 
> >         amdgpu_ip_version(adev, DCE_HWIP, 0) == IP_VERSION(4, 2, 1) ||
> >         amdgpu_ip_version(adev, DCE_HWIP, 0) == IP_VERSION(6, 0, 0) ||
> > 
> > -#else
> > -       amdgpu_ip_version(adev, DCE_HWIP, 0) == IP_VERSION(4, 2, 1) ||
> > -#endif
> > 
> >         !dm_crtc_state->base.enable) {
> > 
> > -           *cursor_mode = DM_CURSOR_NATIVE_MODE;
> > -           return 0;
> > +           /*
> > +            * Newer DCN has no cursor-on-scaled/yuv-plane 
restriction, so
> > +            * skip those overlay triggers below. A plane that does 
not fill
> > +            * the CRTC still needs overlay mode so the cursor 
renders over
> > +            * the hole, so fall through to the coverage check 
instead of
> > +            * unconditionally forcing native mode here.
> > +            */
> > +           skip_fmt_scale_restrictions = true;
> > 
> >     }
> 
> Timur, looks like this might break your fix in cea54c52d82d
> ("drm/amd/display: Set native cursor mode for disabled CRTCs") again.
> 
> Maybe the CRTC disabled case should be handled separately from the DCE cases
> after all.

I think the cleanest solution may be to just move this check:
!dm_crtc_state->base.enable
into a separate if statement above this one.

What do you think, would that fix it?

Thanks,
Timur


Reply via email to