From: "Borah, Chaitanya Kumar" <chaitanya.kumar.borah@intel.com>
To: Nemesa Garg <nemesa.garg@intel.com>,
<intel-gfx@lists.freedesktop.org>,
<intel-xe@lists.freedesktop.org>
Subject: Re: [PATCH 1/6] drm/i915/cursor: Check joiner cursor commit status
Date: Wed, 1 Jul 2026 21:55:31 +0530 [thread overview]
Message-ID: <4b66cb8f-1df5-4dc8-b32d-fe865ea48114@intel.com> (raw)
In-Reply-To: <20260608062629.820477-2-nemesa.garg@intel.com>
Hello Nemesa,
On 6/8/2026 11:56 AM, Nemesa Garg wrote:
> In joiner mode, secondary cursor commits may still be running
> even when the primary cursor commit is done. Walking the secondary
> pipes also requires holding the secondary planes modeset locks.
> Add intel_cursor_lock_joined_planes() to acquire modeset locks
> for all secondary cursor planes. Check all joined cursor commit
> status before taking the fast path. If any commit is still pending,
> fallback to slow path.
>
> v2: Use intel_crtc_joined_pipe_mask(). [Ville]
> v3: Lock secondary cursor CRTCs and planes. [sashiko]
>
> Assisted-by: Claude:claude-sonnet-4.6
> Signed-off-by: Nemesa Garg <nemesa.garg@intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_cursor.c | 63 +++++++++++++++++++++
> 1 file changed, 63 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_cursor.c b/drivers/gpu/drm/i915/display/intel_cursor.c
> index 88384dea868b..f8b24865c93a 100644
> --- a/drivers/gpu/drm/i915/display/intel_cursor.c
> +++ b/drivers/gpu/drm/i915/display/intel_cursor.c
> @@ -13,6 +13,7 @@
> #include <drm/drm_vblank.h>
>
> #include "intel_atomic.h"
> +#include "intel_crtc.h"
> #include "intel_cursor.h"
> #include "intel_cursor_regs.h"
> #include "intel_de.h"
> @@ -796,6 +797,58 @@ void intel_cursor_unpin_work(struct kthread_work *base)
> intel_plane_destroy_state(&plane->base, &plane_state->uapi);
> }
>
> +static int intel_cursor_lock_joined_planes(struct intel_display *display,
> + const struct intel_crtc_state *crtc_state,
> + struct intel_plane *primary_plane,
> + struct drm_modeset_acquire_ctx *ctx)
> +{
> + struct intel_crtc *pipe_crtc;
> + int ret;
> +
> + for_each_intel_crtc_in_pipe_mask(display, pipe_crtc,
> + intel_crtc_joined_pipe_mask(crtc_state)) {
> + struct intel_plane *pipe_plane =
> + intel_crtc_get_plane(pipe_crtc, PLANE_CURSOR);
> +
> + if (pipe_plane == primary_plane)
> + continue;
...
> +
> + ret = drm_modeset_lock(&pipe_crtc->base.mutex, ctx);
> + if (ret)
> + return ret;
> +
> + ret = drm_modeset_lock(&pipe_plane->base.mutex, ctx);
> + if (ret)
> + return ret;
> + }
> + return 0;
> +}
> +
> +static bool
> +intel_cursor_joiner_commits_idle(struct intel_display *display,
> + const struct intel_crtc_state *crtc_state)
> +{
> + struct intel_crtc *pipe_crtc;
> +
> + for_each_intel_crtc_in_pipe_mask(display, pipe_crtc,
> + intel_crtc_joined_pipe_mask(crtc_state)) {
> + struct intel_plane *pipe_plane;
> + struct intel_plane_state *pipe_plane_state;
> +
> + if (pipe_crtc == to_intel_crtc(crtc_state->uapi.crtc))
> + continue;
> +
Both the helpers have two different ways to skip the primary. I would
suggest, pick one and use it in both.
> + pipe_plane = intel_crtc_get_plane(pipe_crtc, PLANE_CURSOR);
> + pipe_plane_state = to_intel_plane_state(pipe_plane->base.state);
> +
> + if (pipe_plane_state->uapi.commit &&
> + !try_wait_for_completion(&pipe_plane_state->uapi.commit->hw_done))
> + return false;
> + }
> +
> + return true;
> +}
> +
> static int
> intel_legacy_cursor_update(struct drm_plane *_plane,
> struct drm_crtc *_crtc,
> @@ -842,6 +895,16 @@ intel_legacy_cursor_update(struct drm_plane *_plane,
> !try_wait_for_completion(&old_plane_state->uapi.commit->hw_done))
> goto slow;
>
> + ret = intel_cursor_lock_joined_planes(display, crtc_state, plane, ctx);
> + if (ret == -EDEADLK)
> + return ret;
> + if (ret)
> + goto slow;
> +
> + /* Check all joined pipes for pending commits */
> + if (!intel_cursor_joiner_commits_idle(display, crtc_state))
> + goto slow;
> +
The param check right below can be a quick early bail out to the slow
path. Better to move it above the lock so we don't grab every secondary
crtc/plane lock just to drop straight to the slow path.
Rather than special-casing the primary pipe in both helpers (and in two
different ways), can we just iterate the full joined mask uniformly?
Obviously, taking care of any special treatment that the primary pipe needs.
==
Chaitanya
> /*
> * If any parameters change that may affect watermarks,
> * take the slowpath. Only changing fb or position should be
next prev parent reply other threads:[~2026-07-01 16:26 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-08 6:26 [PATCH 0/6] Enable joiner cursor fast updates Nemesa Garg
2026-06-08 6:26 ` [PATCH 1/6] drm/i915/cursor: Check joiner cursor commit status Nemesa Garg
2026-07-01 16:25 ` Borah, Chaitanya Kumar [this message]
2026-06-08 6:26 ` [PATCH 2/6] drm/i915/cursor: Add helper to update cursor plane Nemesa Garg
2026-07-01 16:26 ` Borah, Chaitanya Kumar
2026-06-08 6:26 ` [PATCH 3/6] drm/i915/cursor: Handle secondary cursor state Nemesa Garg
2026-07-01 16:30 ` Borah, Chaitanya Kumar
2026-06-08 6:26 ` [PATCH 4/6] drm/i915/cursor: Sync joiner " Nemesa Garg
2026-07-01 16:32 ` Borah, Chaitanya Kumar
2026-06-08 6:26 ` [PATCH 5/6] drm/i915/cursor: Program secondary cursor planes Nemesa Garg
2026-07-01 16:32 ` Borah, Chaitanya Kumar
2026-06-08 6:26 ` [PATCH 6/6] drm/i915/cursor: Allow joiner cursor fast path update Nemesa Garg
2026-07-01 16:31 ` Borah, Chaitanya Kumar
2026-06-08 11:43 ` ✗ CI.checkpatch: warning for Enable joiner cursor fast updates (rev3) Patchwork
2026-06-08 11:44 ` ✓ CI.KUnit: success " Patchwork
-- strict thread matches above, loose matches on Subject: below --
2026-04-28 14:16 [PATCH 0/6] Enable joiner cursor fast updates Nemesa Garg
2026-04-28 14:16 ` [PATCH 1/6] drm/i915/cursor: Check joiner cursor commit status Nemesa Garg
2026-04-22 7:37 [PATCH 0/6] Enable joiner cursor fast updates Nemesa Garg
2026-04-22 7:37 ` [PATCH 1/6] drm/i915/cursor: Check joiner cursor commit status Nemesa Garg
2026-04-22 9:46 ` Ville Syrjälä
2026-04-27 6:14 ` Garg, Nemesa
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=4b66cb8f-1df5-4dc8-b32d-fe865ea48114@intel.com \
--to=chaitanya.kumar.borah@intel.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=intel-xe@lists.freedesktop.org \
--cc=nemesa.garg@intel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox