2023-07-07 22:57:24

by André Almeida

[permalink] [raw]
Subject: [PATCH v5 0/6] drm: Add support for atomic async page-flip

Hi,

This work from me and Simon adds support for DRM_MODE_PAGE_FLIP_ASYNC through
the atomic API. This feature is already available via the legacy API. The use
case is to be able to present a new frame immediately (or as soon as
possible), even if after missing a vblank. This might result in tearing, but
it's useful when a high framerate is desired, such as for gaming.

Differently from earlier versions, this one refuses to flip if any prop changes
for async flips. The idea is that the fast path of immediate page flips doesn't
play well with modeset changes, so only the fb_id can be changed. The exception
is for mode_id changes, that might be referring to an identical mode (which
would skip a modeset). This is done to make the async API more similar to the
normal API.

Thanks,
André

- User-space patch: https://github.com/Plagman/gamescope/pull/595
- IGT tests: https://gitlab.freedesktop.org/andrealmeid/igt-gpu-tools/-/tree/atomic_async_page_flip

Changes from v4:
- Documentation rewrote by Pekka Paalanen

v4: https://lore.kernel.org/dri-devel/[email protected]/

Changes from v3:
- Add new patch to reject prop changes
- Add a documentation clarifying the KMS atomic state set

v3: https://lore.kernel.org/dri-devel/[email protected]/

André Almeida (1):
drm: Refuse to async flip with atomic prop changes

Pekka Paalanen (1):
drm/doc: Define KMS atomic state set

Simon Ser (4):
drm: allow DRM_MODE_PAGE_FLIP_ASYNC for atomic commits
drm: introduce DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP
drm: introduce drm_mode_config.atomic_async_page_flip_not_supported
amd/display: indicate support for atomic async page-flips on DC

Documentation/gpu/drm-uapi.rst | 41 ++++++++++
drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c | 1 +
drivers/gpu/drm/drm_atomic_helper.c | 5 ++
drivers/gpu/drm/drm_atomic_uapi.c | 80 ++++++++++++++++++--
drivers/gpu/drm/drm_crtc_internal.h | 2 +-
drivers/gpu/drm/drm_ioctl.c | 5 ++
drivers/gpu/drm/drm_mode_object.c | 2 +-
drivers/gpu/drm/i915/display/intel_display.c | 1 +
drivers/gpu/drm/nouveau/nouveau_display.c | 1 +
include/drm/drm_mode_config.h | 11 +++
include/uapi/drm/drm.h | 10 ++-
include/uapi/drm/drm_mode.h | 9 +++
12 files changed, 159 insertions(+), 9 deletions(-)

--
2.41.0



2023-07-07 22:57:47

by André Almeida

[permalink] [raw]
Subject: [PATCH v5 6/6] drm/doc: Define KMS atomic state set

From: Pekka Paalanen <[email protected]>

Specify how the atomic state is maintained between userspace and
kernel, plus the special case for async flips.

Signed-off-by: Pekka Paalanen <[email protected]>
Signed-off-by: André Almeida <[email protected]>
---
v4: total rework by Pekka
---
Documentation/gpu/drm-uapi.rst | 41 ++++++++++++++++++++++++++++++++++
1 file changed, 41 insertions(+)

diff --git a/Documentation/gpu/drm-uapi.rst b/Documentation/gpu/drm-uapi.rst
index 65fb3036a580..6a1662c08901 100644
--- a/Documentation/gpu/drm-uapi.rst
+++ b/Documentation/gpu/drm-uapi.rst
@@ -486,3 +486,44 @@ and the CRTC index is its position in this array.

.. kernel-doc:: include/uapi/drm/drm_mode.h
:internal:
+
+KMS atomic state
+================
+
+An atomic commit can change multiple KMS properties in an atomic fashion,
+without ever applying intermediate or partial state changes. Either the whole
+commit succeeds or fails, and it will never be applied partially. This is the
+fundamental improvement of the atomic API over the older non-atomic API which is
+referred to as the "legacy API". Applying intermediate state could unexpectedly
+fail, cause visible glitches, or delay reaching the final state.
+
+An atomic commit can be flagged with DRM_MODE_ATOMIC_TEST_ONLY, which means the
+complete state change is validated but not applied. Userspace should use this
+flag to validate any state change before asking to apply it. If validation fails
+for any reason, userspace should attempt to fall back to another, perhaps
+simpler, final state. This allows userspace to probe for various configurations
+without causing visible glitches on screen and without the need to undo a
+probing change.
+
+The changes recorded in an atomic commit apply on top the current KMS state in
+the kernel. Hence, the complete new KMS state is the complete old KMS state with
+the committed property settings done on top. The kernel will automatically avoid
+no-operation changes, so it is safe and even expected for userspace to send
+redundant property settings. No-operation changes do not count towards actually
+needed changes, e.g. setting MODE_ID to a different blob with identical
+contents as the current KMS state shall not be a modeset on its own.
+
+A "modeset" is a change in KMS state that might enable, disable, or temporarily
+disrupt the emitted video signal, possibly causing visible glitches on screen. A
+modeset may also take considerably more time to complete than other kinds of
+changes, and the video sink might also need time to adapt to the new signal
+properties. Therefore a modeset must be explicitly allowed with the flag
+DRM_MODE_ATOMIC_ALLOW_MODESET. This in combination with
+DRM_MODE_ATOMIC_TEST_ONLY allows userspace to determine if a state change is
+likely to cause visible disruption on screen and avoid such changes when end
+users do not expect them.
+
+An atomic commit with the flag DRM_MODE_PAGE_FLIP_ASYNC is allowed to
+effectively change only the FB_ID property on any planes. No-operation changes
+are ignored as always. Changing any other property will cause the commit to be
+rejected.
--
2.41.0


2023-07-10 08:47:57

by Pekka Paalanen

[permalink] [raw]
Subject: Re: [PATCH v5 6/6] drm/doc: Define KMS atomic state set

On Fri, 7 Jul 2023 19:40:59 -0300
André Almeida <[email protected]> wrote:

> From: Pekka Paalanen <[email protected]>
>
> Specify how the atomic state is maintained between userspace and
> kernel, plus the special case for async flips.
>
> Signed-off-by: Pekka Paalanen <[email protected]>
> Signed-off-by: André Almeida <[email protected]>
> ---
> v4: total rework by Pekka
> ---
> Documentation/gpu/drm-uapi.rst | 41 ++++++++++++++++++++++++++++++++++
> 1 file changed, 41 insertions(+)

Thank you for polishing that email into a proper patch!

For patches 1 and 2:
Acked-by: Pekka Paalanen <[email protected]>


Thanks,
pq

> diff --git a/Documentation/gpu/drm-uapi.rst b/Documentation/gpu/drm-uapi.rst
> index 65fb3036a580..6a1662c08901 100644
> --- a/Documentation/gpu/drm-uapi.rst
> +++ b/Documentation/gpu/drm-uapi.rst
> @@ -486,3 +486,44 @@ and the CRTC index is its position in this array.
>
> .. kernel-doc:: include/uapi/drm/drm_mode.h
> :internal:
> +
> +KMS atomic state
> +================
> +
> +An atomic commit can change multiple KMS properties in an atomic fashion,
> +without ever applying intermediate or partial state changes. Either the whole
> +commit succeeds or fails, and it will never be applied partially. This is the
> +fundamental improvement of the atomic API over the older non-atomic API which is
> +referred to as the "legacy API". Applying intermediate state could unexpectedly
> +fail, cause visible glitches, or delay reaching the final state.
> +
> +An atomic commit can be flagged with DRM_MODE_ATOMIC_TEST_ONLY, which means the
> +complete state change is validated but not applied. Userspace should use this
> +flag to validate any state change before asking to apply it. If validation fails
> +for any reason, userspace should attempt to fall back to another, perhaps
> +simpler, final state. This allows userspace to probe for various configurations
> +without causing visible glitches on screen and without the need to undo a
> +probing change.
> +
> +The changes recorded in an atomic commit apply on top the current KMS state in
> +the kernel. Hence, the complete new KMS state is the complete old KMS state with
> +the committed property settings done on top. The kernel will automatically avoid
> +no-operation changes, so it is safe and even expected for userspace to send
> +redundant property settings. No-operation changes do not count towards actually
> +needed changes, e.g. setting MODE_ID to a different blob with identical
> +contents as the current KMS state shall not be a modeset on its own.
> +
> +A "modeset" is a change in KMS state that might enable, disable, or temporarily
> +disrupt the emitted video signal, possibly causing visible glitches on screen. A
> +modeset may also take considerably more time to complete than other kinds of
> +changes, and the video sink might also need time to adapt to the new signal
> +properties. Therefore a modeset must be explicitly allowed with the flag
> +DRM_MODE_ATOMIC_ALLOW_MODESET. This in combination with
> +DRM_MODE_ATOMIC_TEST_ONLY allows userspace to determine if a state change is
> +likely to cause visible disruption on screen and avoid such changes when end
> +users do not expect them.
> +
> +An atomic commit with the flag DRM_MODE_PAGE_FLIP_ASYNC is allowed to
> +effectively change only the FB_ID property on any planes. No-operation changes
> +are ignored as always. Changing any other property will cause the commit to be
> +rejected.


Attachments:
(No filename) (849.00 B)
OpenPGP digital signature

2023-07-11 09:16:10

by Daniel Vetter

[permalink] [raw]
Subject: Re: [PATCH v5 6/6] drm/doc: Define KMS atomic state set

On Fri, Jul 07, 2023 at 07:40:59PM -0300, Andr? Almeida wrote:
> From: Pekka Paalanen <[email protected]>
>
> Specify how the atomic state is maintained between userspace and
> kernel, plus the special case for async flips.
>
> Signed-off-by: Pekka Paalanen <[email protected]>
> Signed-off-by: Andr? Almeida <[email protected]>
> ---
> v4: total rework by Pekka
> ---
> Documentation/gpu/drm-uapi.rst | 41 ++++++++++++++++++++++++++++++++++
> 1 file changed, 41 insertions(+)
>
> diff --git a/Documentation/gpu/drm-uapi.rst b/Documentation/gpu/drm-uapi.rst
> index 65fb3036a580..6a1662c08901 100644
> --- a/Documentation/gpu/drm-uapi.rst
> +++ b/Documentation/gpu/drm-uapi.rst
> @@ -486,3 +486,44 @@ and the CRTC index is its position in this array.
>
> .. kernel-doc:: include/uapi/drm/drm_mode.h
> :internal:
> +
> +KMS atomic state
> +================
> +
> +An atomic commit can change multiple KMS properties in an atomic fashion,
> +without ever applying intermediate or partial state changes. Either the whole
> +commit succeeds or fails, and it will never be applied partially. This is the
> +fundamental improvement of the atomic API over the older non-atomic API which is
> +referred to as the "legacy API". Applying intermediate state could unexpectedly
> +fail, cause visible glitches, or delay reaching the final state.
> +
> +An atomic commit can be flagged with DRM_MODE_ATOMIC_TEST_ONLY, which means the
> +complete state change is validated but not applied. Userspace should use this
> +flag to validate any state change before asking to apply it. If validation fails
> +for any reason, userspace should attempt to fall back to another, perhaps
> +simpler, final state. This allows userspace to probe for various configurations
> +without causing visible glitches on screen and without the need to undo a
> +probing change.
> +
> +The changes recorded in an atomic commit apply on top the current KMS state in
> +the kernel. Hence, the complete new KMS state is the complete old KMS state with
> +the committed property settings done on top. The kernel will automatically avoid
> +no-operation changes, so it is safe and even expected for userspace to send
> +redundant property settings. No-operation changes do not count towards actually
> +needed changes, e.g. setting MODE_ID to a different blob with identical
> +contents as the current KMS state shall not be a modeset on its own.

Small clarification: The kernel indeed tries very hard to make redundant
changes a no-op, and I think we should consider any issues here bugs. But
it still has to check, which means it needs to acquire the right locks and
put in the right (cross-crtc) synchronization points, and due to
implmentation challenges it's very hard to try to avoid that in all cases.
So adding redundant changes especially across crtc (and their connected
planes/connectors) might result in some oversynchronization issues, and
userspace should therefore avoid them if feasible.

With some sentences added to clarify this:

Reviewed-by: Daniel Vetter <[email protected]>

> +
> +A "modeset" is a change in KMS state that might enable, disable, or temporarily
> +disrupt the emitted video signal, possibly causing visible glitches on screen. A
> +modeset may also take considerably more time to complete than other kinds of
> +changes, and the video sink might also need time to adapt to the new signal
> +properties. Therefore a modeset must be explicitly allowed with the flag
> +DRM_MODE_ATOMIC_ALLOW_MODESET. This in combination with
> +DRM_MODE_ATOMIC_TEST_ONLY allows userspace to determine if a state change is
> +likely to cause visible disruption on screen and avoid such changes when end
> +users do not expect them.
> +
> +An atomic commit with the flag DRM_MODE_PAGE_FLIP_ASYNC is allowed to
> +effectively change only the FB_ID property on any planes. No-operation changes
> +are ignored as always. Changing any other property will cause the commit to be
> +rejected.
> --
> 2.41.0
>

--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch

2023-07-12 14:04:10

by Simon Ser

[permalink] [raw]
Subject: Re: [PATCH v5 6/6] drm/doc: Define KMS atomic state set

On Saturday, July 8th, 2023 at 00:40, André Almeida <[email protected]> wrote:

> +KMS atomic state
> +================
> +
> +An atomic commit can change multiple KMS properties in an atomic fashion,
> +without ever applying intermediate or partial state changes. Either the whole
> +commit succeeds or fails, and it will never be applied partially. This is the
> +fundamental improvement of the atomic API over the older non-atomic API which is
> +referred to as the "legacy API". Applying intermediate state could unexpectedly
> +fail, cause visible glitches, or delay reaching the final state.
> +
> +An atomic commit can be flagged with DRM_MODE_ATOMIC_TEST_ONLY, which means the

Can we linkify these #defines? This can be done like so:

… flagged with :c:macro:`DRM_MODE_ATOMIC_TEST_ONLY`, which means …

This should create a link to the docs for this flag.

2023-07-13 07:56:15

by Pekka Paalanen

[permalink] [raw]
Subject: Re: [PATCH v5 6/6] drm/doc: Define KMS atomic state set

On Tue, 11 Jul 2023 10:57:57 +0200
Daniel Vetter <[email protected]> wrote:

> On Fri, Jul 07, 2023 at 07:40:59PM -0300, André Almeida wrote:
> > From: Pekka Paalanen <[email protected]>
> >
> > Specify how the atomic state is maintained between userspace and
> > kernel, plus the special case for async flips.
> >
> > Signed-off-by: Pekka Paalanen <[email protected]>
> > Signed-off-by: André Almeida <[email protected]>
> > ---
> > v4: total rework by Pekka
> > ---
> > Documentation/gpu/drm-uapi.rst | 41 ++++++++++++++++++++++++++++++++++
> > 1 file changed, 41 insertions(+)
> >
> > diff --git a/Documentation/gpu/drm-uapi.rst b/Documentation/gpu/drm-uapi.rst
> > index 65fb3036a580..6a1662c08901 100644
> > --- a/Documentation/gpu/drm-uapi.rst
> > +++ b/Documentation/gpu/drm-uapi.rst
> > @@ -486,3 +486,44 @@ and the CRTC index is its position in this array.
> >
> > .. kernel-doc:: include/uapi/drm/drm_mode.h
> > :internal:
> > +
> > +KMS atomic state
> > +================
> > +
> > +An atomic commit can change multiple KMS properties in an atomic fashion,
> > +without ever applying intermediate or partial state changes. Either the whole
> > +commit succeeds or fails, and it will never be applied partially. This is the
> > +fundamental improvement of the atomic API over the older non-atomic API which is
> > +referred to as the "legacy API". Applying intermediate state could unexpectedly
> > +fail, cause visible glitches, or delay reaching the final state.
> > +
> > +An atomic commit can be flagged with DRM_MODE_ATOMIC_TEST_ONLY, which means the
> > +complete state change is validated but not applied. Userspace should use this
> > +flag to validate any state change before asking to apply it. If validation fails
> > +for any reason, userspace should attempt to fall back to another, perhaps
> > +simpler, final state. This allows userspace to probe for various configurations
> > +without causing visible glitches on screen and without the need to undo a
> > +probing change.
> > +
> > +The changes recorded in an atomic commit apply on top the current KMS state in
> > +the kernel. Hence, the complete new KMS state is the complete old KMS state with
> > +the committed property settings done on top. The kernel will automatically avoid
> > +no-operation changes, so it is safe and even expected for userspace to send
> > +redundant property settings. No-operation changes do not count towards actually
> > +needed changes, e.g. setting MODE_ID to a different blob with identical
> > +contents as the current KMS state shall not be a modeset on its own.
>
> Small clarification: The kernel indeed tries very hard to make redundant
> changes a no-op, and I think we should consider any issues here bugs. But
> it still has to check, which means it needs to acquire the right locks and
> put in the right (cross-crtc) synchronization points, and due to
> implmentation challenges it's very hard to try to avoid that in all cases.
> So adding redundant changes especially across crtc (and their connected
> planes/connectors) might result in some oversynchronization issues, and
> userspace should therefore avoid them if feasible.
>
> With some sentences added to clarify this:
>
> Reviewed-by: Daniel Vetter <[email protected]>

After talking on IRC yesterday, we realized that the no-op rule is
nowhere near as generic as I have believed. Roughly:
https://oftc.irclog.whitequark.org/dri-devel/2023-07-12#1689152446-1689157291;


Thanks,
pq

> > +
> > +A "modeset" is a change in KMS state that might enable, disable, or temporarily
> > +disrupt the emitted video signal, possibly causing visible glitches on screen. A
> > +modeset may also take considerably more time to complete than other kinds of
> > +changes, and the video sink might also need time to adapt to the new signal
> > +properties. Therefore a modeset must be explicitly allowed with the flag
> > +DRM_MODE_ATOMIC_ALLOW_MODESET. This in combination with
> > +DRM_MODE_ATOMIC_TEST_ONLY allows userspace to determine if a state change is
> > +likely to cause visible disruption on screen and avoid such changes when end
> > +users do not expect them.
> > +
> > +An atomic commit with the flag DRM_MODE_PAGE_FLIP_ASYNC is allowed to
> > +effectively change only the FB_ID property on any planes. No-operation changes
> > +are ignored as always. Changing any other property will cause the commit to be
> > +rejected.
> > --
> > 2.41.0
> >
>


Attachments:
(No filename) (849.00 B)
OpenPGP digital signature

2023-07-31 02:24:37

by André Almeida

[permalink] [raw]
Subject: Re: [PATCH v5 6/6] drm/doc: Define KMS atomic state set

Em 13/07/2023 04:51, Pekka Paalanen escreveu:
> On Tue, 11 Jul 2023 10:57:57 +0200
> Daniel Vetter <[email protected]> wrote:
>
>> On Fri, Jul 07, 2023 at 07:40:59PM -0300, André Almeida wrote:
>>> From: Pekka Paalanen <[email protected]>
>>>
>>> Specify how the atomic state is maintained between userspace and
>>> kernel, plus the special case for async flips.
>>>
>>> Signed-off-by: Pekka Paalanen <[email protected]>
>>> Signed-off-by: André Almeida <[email protected]>
>>> ---
>>> v4: total rework by Pekka
>>> ---
>>> Documentation/gpu/drm-uapi.rst | 41 ++++++++++++++++++++++++++++++++++
>>> 1 file changed, 41 insertions(+)
>>>
>>> diff --git a/Documentation/gpu/drm-uapi.rst b/Documentation/gpu/drm-uapi.rst
>>> index 65fb3036a580..6a1662c08901 100644
>>> --- a/Documentation/gpu/drm-uapi.rst
>>> +++ b/Documentation/gpu/drm-uapi.rst
>>> @@ -486,3 +486,44 @@ and the CRTC index is its position in this array.
>>>
>>> .. kernel-doc:: include/uapi/drm/drm_mode.h
>>> :internal:
>>> +
>>> +KMS atomic state
>>> +================
>>> +
>>> +An atomic commit can change multiple KMS properties in an atomic fashion,
>>> +without ever applying intermediate or partial state changes. Either the whole
>>> +commit succeeds or fails, and it will never be applied partially. This is the
>>> +fundamental improvement of the atomic API over the older non-atomic API which is
>>> +referred to as the "legacy API". Applying intermediate state could unexpectedly
>>> +fail, cause visible glitches, or delay reaching the final state.
>>> +
>>> +An atomic commit can be flagged with DRM_MODE_ATOMIC_TEST_ONLY, which means the
>>> +complete state change is validated but not applied. Userspace should use this
>>> +flag to validate any state change before asking to apply it. If validation fails
>>> +for any reason, userspace should attempt to fall back to another, perhaps
>>> +simpler, final state. This allows userspace to probe for various configurations
>>> +without causing visible glitches on screen and without the need to undo a
>>> +probing change.
>>> +
>>> +The changes recorded in an atomic commit apply on top the current KMS state in
>>> +the kernel. Hence, the complete new KMS state is the complete old KMS state with
>>> +the committed property settings done on top. The kernel will automatically avoid
>>> +no-operation changes, so it is safe and even expected for userspace to send
>>> +redundant property settings. No-operation changes do not count towards actually
>>> +needed changes, e.g. setting MODE_ID to a different blob with identical
>>> +contents as the current KMS state shall not be a modeset on its own.
>>
>> Small clarification: The kernel indeed tries very hard to make redundant
>> changes a no-op, and I think we should consider any issues here bugs. But
>> it still has to check, which means it needs to acquire the right locks and
>> put in the right (cross-crtc) synchronization points, and due to
>> implmentation challenges it's very hard to try to avoid that in all cases.
>> So adding redundant changes especially across crtc (and their connected
>> planes/connectors) might result in some oversynchronization issues, and
>> userspace should therefore avoid them if feasible.
>>
>> With some sentences added to clarify this:
>>
>> Reviewed-by: Daniel Vetter <[email protected]>
>
> After talking on IRC yesterday, we realized that the no-op rule is
> nowhere near as generic as I have believed. Roughly:
> https://oftc.irclog.whitequark.org/dri-devel/2023-07-12#1689152446-1689157291;
>
>

How about:

The changes recorded in an atomic commit apply on top the current KMS
state in the kernel. Hence, the complete new KMS state is the complete
old KMS state with the committed property settings done on top. The
kernel will try to avoid no-operation changes, so it is safe for
userspace to send redundant property settings. However, the kernel can
not assure that every redundant information will always result in a
no-op, giving the need to take locks to check par of the state. Giving
that, some redundant information can lead to a full damage path. This is
not something bad by itself, but userspace need to be aware of that side
effect.

> Thanks,
> pq
>
>>> +
>>> +A "modeset" is a change in KMS state that might enable, disable, or temporarily
>>> +disrupt the emitted video signal, possibly causing visible glitches on screen. A
>>> +modeset may also take considerably more time to complete than other kinds of
>>> +changes, and the video sink might also need time to adapt to the new signal
>>> +properties. Therefore a modeset must be explicitly allowed with the flag
>>> +DRM_MODE_ATOMIC_ALLOW_MODESET. This in combination with
>>> +DRM_MODE_ATOMIC_TEST_ONLY allows userspace to determine if a state change is
>>> +likely to cause visible disruption on screen and avoid such changes when end
>>> +users do not expect them.
>>> +
>>> +An atomic commit with the flag DRM_MODE_PAGE_FLIP_ASYNC is allowed to
>>> +effectively change only the FB_ID property on any planes. No-operation changes
>>> +are ignored as always. Changing any other property will cause the commit to be
>>> +rejected.
>>> --
>>> 2.41.0
>>>
>>
>

2023-08-02 15:48:47

by Daniel Vetter

[permalink] [raw]
Subject: Re: [PATCH v5 6/6] drm/doc: Define KMS atomic state set

On Mon, 31 Jul 2023 at 04:01, André Almeida <[email protected]> wrote:
>
> Em 13/07/2023 04:51, Pekka Paalanen escreveu:
> > On Tue, 11 Jul 2023 10:57:57 +0200
> > Daniel Vetter <[email protected]> wrote:
> >
> >> On Fri, Jul 07, 2023 at 07:40:59PM -0300, André Almeida wrote:
> >>> From: Pekka Paalanen <[email protected]>
> >>>
> >>> Specify how the atomic state is maintained between userspace and
> >>> kernel, plus the special case for async flips.
> >>>
> >>> Signed-off-by: Pekka Paalanen <[email protected]>
> >>> Signed-off-by: André Almeida <[email protected]>
> >>> ---
> >>> v4: total rework by Pekka
> >>> ---
> >>> Documentation/gpu/drm-uapi.rst | 41 ++++++++++++++++++++++++++++++++++
> >>> 1 file changed, 41 insertions(+)
> >>>
> >>> diff --git a/Documentation/gpu/drm-uapi.rst b/Documentation/gpu/drm-uapi.rst
> >>> index 65fb3036a580..6a1662c08901 100644
> >>> --- a/Documentation/gpu/drm-uapi.rst
> >>> +++ b/Documentation/gpu/drm-uapi.rst
> >>> @@ -486,3 +486,44 @@ and the CRTC index is its position in this array.
> >>>
> >>> .. kernel-doc:: include/uapi/drm/drm_mode.h
> >>> :internal:
> >>> +
> >>> +KMS atomic state
> >>> +================
> >>> +
> >>> +An atomic commit can change multiple KMS properties in an atomic fashion,
> >>> +without ever applying intermediate or partial state changes. Either the whole
> >>> +commit succeeds or fails, and it will never be applied partially. This is the
> >>> +fundamental improvement of the atomic API over the older non-atomic API which is
> >>> +referred to as the "legacy API". Applying intermediate state could unexpectedly
> >>> +fail, cause visible glitches, or delay reaching the final state.
> >>> +
> >>> +An atomic commit can be flagged with DRM_MODE_ATOMIC_TEST_ONLY, which means the
> >>> +complete state change is validated but not applied. Userspace should use this
> >>> +flag to validate any state change before asking to apply it. If validation fails
> >>> +for any reason, userspace should attempt to fall back to another, perhaps
> >>> +simpler, final state. This allows userspace to probe for various configurations
> >>> +without causing visible glitches on screen and without the need to undo a
> >>> +probing change.
> >>> +
> >>> +The changes recorded in an atomic commit apply on top the current KMS state in
> >>> +the kernel. Hence, the complete new KMS state is the complete old KMS state with
> >>> +the committed property settings done on top. The kernel will automatically avoid
> >>> +no-operation changes, so it is safe and even expected for userspace to send
> >>> +redundant property settings. No-operation changes do not count towards actually
> >>> +needed changes, e.g. setting MODE_ID to a different blob with identical
> >>> +contents as the current KMS state shall not be a modeset on its own.
> >>
> >> Small clarification: The kernel indeed tries very hard to make redundant
> >> changes a no-op, and I think we should consider any issues here bugs. But
> >> it still has to check, which means it needs to acquire the right locks and
> >> put in the right (cross-crtc) synchronization points, and due to
> >> implmentation challenges it's very hard to try to avoid that in all cases.
> >> So adding redundant changes especially across crtc (and their connected
> >> planes/connectors) might result in some oversynchronization issues, and
> >> userspace should therefore avoid them if feasible.
> >>
> >> With some sentences added to clarify this:
> >>
> >> Reviewed-by: Daniel Vetter <[email protected]>
> >
> > After talking on IRC yesterday, we realized that the no-op rule is
> > nowhere near as generic as I have believed. Roughly:
> > https://oftc.irclog.whitequark.org/dri-devel/2023-07-12#1689152446-1689157291;
> >
> >
>
> How about:
>
> The changes recorded in an atomic commit apply on top the current KMS
> state in the kernel. Hence, the complete new KMS state is the complete
> old KMS state with the committed property settings done on top. The
> kernel will try to avoid no-operation changes, so it is safe for
> userspace to send redundant property settings. However, the kernel can
> not assure that every redundant information will always result in a
> no-op, giving the need to take locks to check par of the state. Giving
> that, some redundant information can lead to a full damage path. This is
> not something bad by itself, but userspace need to be aware of that side
> effect.

I think the addition about damage tracking should be a separate
paragraph, and not mixed in with the general explanation that no-op
updates might lead to oversync/overlocking issues. Because the damage
tracking issue is more a question of efficiency/power usage, but
should not (for most drivers/hw at least) result in delays and missed
updates due to oversynchronization of updates.

Also in my opinion the exact damage update rules are more a plane
property issue, and should probably be clarified there if the current
documentation is not clear enough. Since it's not about whether no-op
updates get avoided by the kernel, but what exact damage is implied in
various cases (and that implied damage has to exist, otherwise
backwards compatibility is broken, but userspace can avoid these
issues by setting an empty damage property for that plane update
explicitly).

So I think for this doc part here the discussed text is still good
enough, but we might need more in other places.
-Sima


>
> > Thanks,
> > pq
> >
> >>> +
> >>> +A "modeset" is a change in KMS state that might enable, disable, or temporarily
> >>> +disrupt the emitted video signal, possibly causing visible glitches on screen. A
> >>> +modeset may also take considerably more time to complete than other kinds of
> >>> +changes, and the video sink might also need time to adapt to the new signal
> >>> +properties. Therefore a modeset must be explicitly allowed with the flag
> >>> +DRM_MODE_ATOMIC_ALLOW_MODESET. This in combination with
> >>> +DRM_MODE_ATOMIC_TEST_ONLY allows userspace to determine if a state change is
> >>> +likely to cause visible disruption on screen and avoid such changes when end
> >>> +users do not expect them.
> >>> +
> >>> +An atomic commit with the flag DRM_MODE_PAGE_FLIP_ASYNC is allowed to
> >>> +effectively change only the FB_ID property on any planes. No-operation changes
> >>> +are ignored as always. Changing any other property will cause the commit to be
> >>> +rejected.
> >>> --
> >>> 2.41.0
> >>>
> >>
> >



--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch