All of lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Vetter <daniel@ffwll.ch>
To: Harry Wentland <hwentlan@amd.com>
Cc: "Leo Li" <sunpeng.li@amd.com>,
	"Michel Dänzer" <michel@daenzer.net>,
	dri-devel@lists.freedesktop.org, amd-gfx@lists.freedesktop.org,
	"Kazlauskas, Nicholas" <nicholas.kazlauskas@amd.com>
Subject: Re: [PATCH] drm/amdgpu/dc: Require primary plane to be enabled whenever the CRTC is
Date: Wed, 2 Sep 2020 09:02:42 +0200	[thread overview]
Message-ID: <20200902070242.GH2352366@phenom.ffwll.local> (raw)
In-Reply-To: <9d8c481f-1b95-cdc3-0d94-2b8292ac6031@amd.com>

On Tue, Sep 01, 2020 at 09:58:43AM -0400, Harry Wentland wrote:
> 
> 
> On 2020-09-01 3:54 a.m., Daniel Vetter wrote:
> > On Wed, Aug 26, 2020 at 11:24:23AM +0300, Pekka Paalanen wrote:
> >> On Tue, 25 Aug 2020 12:58:19 -0400
> >> "Kazlauskas, Nicholas" <nicholas.kazlauskas@amd.com> wrote:
> >>
> >>> On 2020-08-22 5:59 a.m., Michel Dänzer wrote:
> >>>> On 2020-08-21 8:07 p.m., Kazlauskas, Nicholas wrote:  
> >>>>> On 2020-08-21 12:57 p.m., Michel Dänzer wrote:  
> >>>>>> From: Michel Dänzer <mdaenzer@redhat.com>
> >>>>>>
> >>>>>> Don't check drm_crtc_state::active for this either, per its
> >>>>>> documentation in include/drm/drm_crtc.h:
> >>>>>>
> >>>>>>    * Hence drivers must not consult @active in their various
> >>>>>>    * &drm_mode_config_funcs.atomic_check callback to reject an atomic
> >>>>>>    * commit.
> >>>>>>
> >>>>>> The atomic helpers disable the CRTC as needed for disabling the primary
> >>>>>> plane.
> >>>>>>
> >>>>>> This prevents at least the following problems if the primary plane gets
> >>>>>> disabled (e.g. due to destroying the FB assigned to the primary plane,
> >>>>>> as happens e.g. with mutter in Wayland mode):
> >>>>>>
> >>>>>> * Toggling CRTC active to 1 failed if the cursor plane was enabled
> >>>>>>     (e.g. via legacy DPMS property & cursor ioctl).
> >>>>>> * Enabling the cursor plane failed, e.g. via the legacy cursor ioctl.  
> >>>>>
> >>>>> We previously had the requirement that the primary plane must be enabled
> >>>>> but some userspace expects that they can enable just the overlay plane
> >>>>> without anything else.
> >>>>>
> >>>>> I think the chromuiumos atomictest validates that this works as well:
> >>>>>
> >>>>> So is DRM going forward then with the expectation that this is wrong
> >>>>> behavior from userspace?
> >>>>>
> >>>>> We require at least one plane to be enabled to display a cursor, but it
> >>>>> doesn't necessarily need to be the primary.  
> >>>>
> >>>> It's a "pick your poison" situation:
> >>>>
> >>>> 1) Currently the checks are invalid (atomic_check must not decide based
> >>>> on drm_crtc_state::active), and it's easy for legacy KMS userspace to
> >>>> accidentally hit errors trying to enable/move the cursor or switch DPMS
> >>>> off → on.
> >>>>
> >>>> 2) Accurately rejecting only atomic states where the cursor plane is
> >>>> enabled but all other planes are off would break the KMS helper code,
> >>>> which can only deal with the "CRTC on & primary plane off is not
> >>>> allowed" case specifically.
> >>>>
> >>>> 3) This patch addresses 1) & 2) but may break existing atomic userspace
> >>>> which wants to enable an overlay plane while disabling the primary plane.
> >>>>
> >>>>
> >>>> I do think in principle atomic userspace is expected to handle case 3)
> >>>> and leave the primary plane enabled. However, this is not ideal from an
> >>>> energy consumption PoV. Therefore, here's another idea for a possible
> >>>> way out of this quagmire:
> >>>>
> >>>> amdgpu_dm does not reject any atomic states based on which planes are
> >>>> enabled in it. If the cursor plane is enabled but all other planes are
> >>>> off, amdgpu_dm internally either:
> >>>>
> >>>> a) Enables an overlay plane and makes it invisible, e.g. by assigning a
> >>>> minimum size FB with alpha = 0.
> >>>>
> >>>> b) Enables the primary plane and assigns a minimum size FB (scaled up to
> >>>> the required size) containing all black, possibly using compression.
> >>>> (Trying to minimize the memory bandwidth)
> >>>>
> >>>>
> >>>> Does either of these seem feasible? If both do, which one would be
> >>>> preferable?
> >>>>
> >>>>   
> >>>
> >>> It's really the same solution since DCN doesn't make a distinction 
> >>> between primary or overlay planes in hardware. DCE doesn't have overlay 
> >>> planes enabled so this is not relevant there.
> >>>
> >>> The old behavior (pre 5.1?) was to silently accept the commit even 
> >>> though the screen would be completely black instead of outright 
> >>> rejecting the commit.
> >>>
> >>> I almost wonder if that makes more sense in the short term here since 
> >>> the only "userspace" affected here is IGT. We'll fail the CRC checks, 
> >>> but no userspace actually tries to actively use a cursor with no primary 
> >>> plane enabled from my understanding.
> >>
> >> Hi,
> >>
> >> I believe that there exists userspace that will *accidentally* attempt
> >> to update the cursor plane while primary plane or whole CRTC is off.
> >> Some versions of Mutter might do that on racy conditions, I suspect.
> >> These are legacy KMS users, not atomic KMS.
> >>
> >> However, I do not believe there exists any userspace that would
> >> actually expect the display to show the cursor plane alone without a
> >> primary plane. Therefore I'd be ok with legacy cursor ioctls silently
> >> succeeding. Atomic commits not. So the difference has to be in the
> >> translation from legacy UAPI to kernel internal atomic interface.
> >>
> >>> In the long term I think we can work on getting cursor actually on the 
> >>> screen in this case, though I can't say I really like having to reserve 
> >>> some small buffer (eg. 16x16) for allowing lightup on this corner case.
> >>
> >> Why would you bother implementing that?
> >>
> >> Is there really an IGT test that unconditionally demands cursor plane
> >> to be usable without any other planes?
> > 
> > The cursor plane isn't anything else than any other plane, aside from the
> > legacy uapi implication that it's used for the legacy cursor ioctls.
> > 
> > Which means the cursor plane could actually be a full-featured plane, and
> > it's totally legit to use just that without anything else enabled.
> > 
> > So yeah if you allow that, it better show something :-)
> > 
> > Personally I'd lean towards merging this patch to close the gap (oldest
> > regressions wins and all that) and then implement the black plane hack on
> > top.
> 
> Not sure I'm a big fan of the black plane hack. Is there any way we
> could allow the (non-displayed) cursor for the legacy IOCTL but not for
> the atomic IOCTL? I assume that would require a change to core code in
> the atomic helpers that convert legacy IOCTLs to atomic for drivers.

That's the "just dont show the cursor when it's not possible" hack, which
is also rather iffy imo.

The other side is that this is all kinda uapi, or at least we've spent a
lot of attempts trying to needle all this through rmfb and cursor ioctls,
and I'm not sure what exactly you can change without breaking something.
Yeah it's not helper stuff as in the commit message, it's core ioctl code
unfortunately.
-Daniel

> 
> Harry
> 
> > -Daniel
> > 

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

WARNING: multiple messages have this Message-ID (diff)
From: Daniel Vetter <daniel@ffwll.ch>
To: Harry Wentland <hwentlan@amd.com>
Cc: "Leo Li" <sunpeng.li@amd.com>,
	"Michel Dänzer" <michel@daenzer.net>,
	dri-devel@lists.freedesktop.org,
	"Pekka Paalanen" <ppaalanen@gmail.com>,
	amd-gfx@lists.freedesktop.org, "Daniel Vetter" <daniel@ffwll.ch>,
	"Kazlauskas, Nicholas" <nicholas.kazlauskas@amd.com>
Subject: Re: [PATCH] drm/amdgpu/dc: Require primary plane to be enabled whenever the CRTC is
Date: Wed, 2 Sep 2020 09:02:42 +0200	[thread overview]
Message-ID: <20200902070242.GH2352366@phenom.ffwll.local> (raw)
In-Reply-To: <9d8c481f-1b95-cdc3-0d94-2b8292ac6031@amd.com>

On Tue, Sep 01, 2020 at 09:58:43AM -0400, Harry Wentland wrote:
> 
> 
> On 2020-09-01 3:54 a.m., Daniel Vetter wrote:
> > On Wed, Aug 26, 2020 at 11:24:23AM +0300, Pekka Paalanen wrote:
> >> On Tue, 25 Aug 2020 12:58:19 -0400
> >> "Kazlauskas, Nicholas" <nicholas.kazlauskas@amd.com> wrote:
> >>
> >>> On 2020-08-22 5:59 a.m., Michel Dänzer wrote:
> >>>> On 2020-08-21 8:07 p.m., Kazlauskas, Nicholas wrote:  
> >>>>> On 2020-08-21 12:57 p.m., Michel Dänzer wrote:  
> >>>>>> From: Michel Dänzer <mdaenzer@redhat.com>
> >>>>>>
> >>>>>> Don't check drm_crtc_state::active for this either, per its
> >>>>>> documentation in include/drm/drm_crtc.h:
> >>>>>>
> >>>>>>    * Hence drivers must not consult @active in their various
> >>>>>>    * &drm_mode_config_funcs.atomic_check callback to reject an atomic
> >>>>>>    * commit.
> >>>>>>
> >>>>>> The atomic helpers disable the CRTC as needed for disabling the primary
> >>>>>> plane.
> >>>>>>
> >>>>>> This prevents at least the following problems if the primary plane gets
> >>>>>> disabled (e.g. due to destroying the FB assigned to the primary plane,
> >>>>>> as happens e.g. with mutter in Wayland mode):
> >>>>>>
> >>>>>> * Toggling CRTC active to 1 failed if the cursor plane was enabled
> >>>>>>     (e.g. via legacy DPMS property & cursor ioctl).
> >>>>>> * Enabling the cursor plane failed, e.g. via the legacy cursor ioctl.  
> >>>>>
> >>>>> We previously had the requirement that the primary plane must be enabled
> >>>>> but some userspace expects that they can enable just the overlay plane
> >>>>> without anything else.
> >>>>>
> >>>>> I think the chromuiumos atomictest validates that this works as well:
> >>>>>
> >>>>> So is DRM going forward then with the expectation that this is wrong
> >>>>> behavior from userspace?
> >>>>>
> >>>>> We require at least one plane to be enabled to display a cursor, but it
> >>>>> doesn't necessarily need to be the primary.  
> >>>>
> >>>> It's a "pick your poison" situation:
> >>>>
> >>>> 1) Currently the checks are invalid (atomic_check must not decide based
> >>>> on drm_crtc_state::active), and it's easy for legacy KMS userspace to
> >>>> accidentally hit errors trying to enable/move the cursor or switch DPMS
> >>>> off → on.
> >>>>
> >>>> 2) Accurately rejecting only atomic states where the cursor plane is
> >>>> enabled but all other planes are off would break the KMS helper code,
> >>>> which can only deal with the "CRTC on & primary plane off is not
> >>>> allowed" case specifically.
> >>>>
> >>>> 3) This patch addresses 1) & 2) but may break existing atomic userspace
> >>>> which wants to enable an overlay plane while disabling the primary plane.
> >>>>
> >>>>
> >>>> I do think in principle atomic userspace is expected to handle case 3)
> >>>> and leave the primary plane enabled. However, this is not ideal from an
> >>>> energy consumption PoV. Therefore, here's another idea for a possible
> >>>> way out of this quagmire:
> >>>>
> >>>> amdgpu_dm does not reject any atomic states based on which planes are
> >>>> enabled in it. If the cursor plane is enabled but all other planes are
> >>>> off, amdgpu_dm internally either:
> >>>>
> >>>> a) Enables an overlay plane and makes it invisible, e.g. by assigning a
> >>>> minimum size FB with alpha = 0.
> >>>>
> >>>> b) Enables the primary plane and assigns a minimum size FB (scaled up to
> >>>> the required size) containing all black, possibly using compression.
> >>>> (Trying to minimize the memory bandwidth)
> >>>>
> >>>>
> >>>> Does either of these seem feasible? If both do, which one would be
> >>>> preferable?
> >>>>
> >>>>   
> >>>
> >>> It's really the same solution since DCN doesn't make a distinction 
> >>> between primary or overlay planes in hardware. DCE doesn't have overlay 
> >>> planes enabled so this is not relevant there.
> >>>
> >>> The old behavior (pre 5.1?) was to silently accept the commit even 
> >>> though the screen would be completely black instead of outright 
> >>> rejecting the commit.
> >>>
> >>> I almost wonder if that makes more sense in the short term here since 
> >>> the only "userspace" affected here is IGT. We'll fail the CRC checks, 
> >>> but no userspace actually tries to actively use a cursor with no primary 
> >>> plane enabled from my understanding.
> >>
> >> Hi,
> >>
> >> I believe that there exists userspace that will *accidentally* attempt
> >> to update the cursor plane while primary plane or whole CRTC is off.
> >> Some versions of Mutter might do that on racy conditions, I suspect.
> >> These are legacy KMS users, not atomic KMS.
> >>
> >> However, I do not believe there exists any userspace that would
> >> actually expect the display to show the cursor plane alone without a
> >> primary plane. Therefore I'd be ok with legacy cursor ioctls silently
> >> succeeding. Atomic commits not. So the difference has to be in the
> >> translation from legacy UAPI to kernel internal atomic interface.
> >>
> >>> In the long term I think we can work on getting cursor actually on the 
> >>> screen in this case, though I can't say I really like having to reserve 
> >>> some small buffer (eg. 16x16) for allowing lightup on this corner case.
> >>
> >> Why would you bother implementing that?
> >>
> >> Is there really an IGT test that unconditionally demands cursor plane
> >> to be usable without any other planes?
> > 
> > The cursor plane isn't anything else than any other plane, aside from the
> > legacy uapi implication that it's used for the legacy cursor ioctls.
> > 
> > Which means the cursor plane could actually be a full-featured plane, and
> > it's totally legit to use just that without anything else enabled.
> > 
> > So yeah if you allow that, it better show something :-)
> > 
> > Personally I'd lean towards merging this patch to close the gap (oldest
> > regressions wins and all that) and then implement the black plane hack on
> > top.
> 
> Not sure I'm a big fan of the black plane hack. Is there any way we
> could allow the (non-displayed) cursor for the legacy IOCTL but not for
> the atomic IOCTL? I assume that would require a change to core code in
> the atomic helpers that convert legacy IOCTLs to atomic for drivers.

That's the "just dont show the cursor when it's not possible" hack, which
is also rather iffy imo.

The other side is that this is all kinda uapi, or at least we've spent a
lot of attempts trying to needle all this through rmfb and cursor ioctls,
and I'm not sure what exactly you can change without breaking something.
Yeah it's not helper stuff as in the commit message, it's core ioctl code
unfortunately.
-Daniel

> 
> Harry
> 
> > -Daniel
> > 

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

  reply	other threads:[~2020-09-02  7:02 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-08-21 16:57 [PATCH] drm/amdgpu/dc: Require primary plane to be enabled whenever the CRTC is Michel Dänzer
2020-08-21 16:57 ` Michel Dänzer
2020-08-21 18:07 ` Kazlauskas, Nicholas
2020-08-21 18:07   ` Kazlauskas, Nicholas
2020-08-22  9:59   ` Michel Dänzer
2020-08-22  9:59     ` Michel Dänzer
2020-08-24  7:43     ` Pekka Paalanen
2020-08-24  7:43       ` Pekka Paalanen
2020-08-25 14:55       ` Michel Dänzer
2020-08-25 14:55         ` Michel Dänzer
2020-09-01  7:57         ` Daniel Vetter
2020-09-01  7:57           ` Daniel Vetter
2020-09-01  8:56           ` Michel Dänzer
2020-09-01  8:56             ` Michel Dänzer
2020-09-01 10:34             ` Daniel Vetter
2020-09-01 10:34               ` Daniel Vetter
2020-08-25 16:58     ` Kazlauskas, Nicholas
2020-08-25 16:58       ` Kazlauskas, Nicholas
2020-08-26  8:24       ` Pekka Paalanen
2020-08-26  8:24         ` Pekka Paalanen
2020-08-26  8:58         ` Michel Dänzer
2020-08-26  8:58           ` Michel Dänzer
2020-09-01  7:54         ` Daniel Vetter
2020-09-01  7:54           ` Daniel Vetter
2020-09-01 13:58           ` Harry Wentland
2020-09-01 13:58             ` Harry Wentland
2020-09-02  7:02             ` Daniel Vetter [this message]
2020-09-02  7:02               ` Daniel Vetter
2020-09-02  9:26               ` Michel Dänzer
2020-09-02  9:26                 ` Michel Dänzer
2020-09-04 10:43 ` [PATCH v2] " Michel Dänzer
2020-09-04 10:43   ` Michel Dänzer
2020-09-07  7:57   ` Daniel Vetter
2020-09-07  7:57     ` Daniel Vetter
2020-09-14  7:52     ` Michel Dänzer
2020-09-14  7:52       ` Michel Dänzer
2020-09-14 14:37       ` Kazlauskas, Nicholas
2020-09-14 14:37         ` Kazlauskas, Nicholas
2020-09-14 15:22         ` Michel Dänzer
2020-09-14 15:22           ` Michel Dänzer
2020-09-14 15:33           ` Kazlauskas, Nicholas
2020-09-14 15:33             ` Kazlauskas, Nicholas
2020-09-14 15:44             ` Michel Dänzer
2020-09-14 15:44               ` Michel Dänzer
2020-09-15 21:00         ` Alex Deucher
2020-09-15 21:00           ` Alex Deucher

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=20200902070242.GH2352366@phenom.ffwll.local \
    --to=daniel@ffwll.ch \
    --cc=amd-gfx@lists.freedesktop.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=hwentlan@amd.com \
    --cc=michel@daenzer.net \
    --cc=nicholas.kazlauskas@amd.com \
    --cc=sunpeng.li@amd.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.