From nobody Mon Aug 24 20:40:38 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5DA17442FB2 for ; Wed, 12 Aug 2026 12:57:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786539432; cv=none; b=hl3noyxLh16hKB9VmFVc7Yfy7VJv9D0FsZ543w5tlaJN4C88z8e0au/2Kde8fnS4o9vF1+CFktq5GPiVedPA7RuTmc5ovilpjFvF3lACIvhQ2BE+zAS8yf83qRcUD5y5Ju8oaL8NyLOKEf6D7P7wg8vqRHYzk+fA8qR9UG9j640= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786539432; c=relaxed/simple; bh=LuWbzh4jvd6KbL44oyGtGHIkAPIQ/Ts/75BcQDwl8Yg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ZELKJWEUU3GQrlcc4bEU52e0DNQto4MUo4an+1pyGWjrjb7fCl9QLVXDdhjTC32E0jmy8icaYh+pHC/nBXrt5rsv6CuhDI8BlAX94Hus4A9HDaL1c1ICUVQhvUQcPByWyGYyTHWPi3NYvUDXdQXGz5tHOFCjQtlbyWpQ49PVow4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=FXhgaOHn; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="FXhgaOHn" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3D0761F00A3A; Wed, 12 Aug 2026 12:57:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786539427; bh=PMoNk/GcTEkpHR1lzZrX43WEmMdxk/RTKyxSU/+DwgI=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=FXhgaOHngJ1z2rzObzdK6Iy0XvPU+PxFZtYBkPEMqvLld3uSW9DbArm316nPh09HE vdgL0fvxsmAh0mX9+iQxhNjI7JaDxOG3ws6P3KFAdO4tSWbhzESW7B9N9O+vMRL+Mt 2Q/Er1cBSIOVsqdTEEHJfoP36JOlWgMZw+1/xWkNPfiMEY1A5vrRJCWzPo1HqO6MDj Xv8t2TFQz7bVjgHOVbzhUvrAP3KY9pquTuLwPiGnfqN2dQDbIwmhXvonYpkzM2yi8l 1IoLmk7tfLiax8vqqXGq83avrrllJQtsWXevOLRgnimTK1l0wNE1Hy56EMeAnwPrX1 r0j9SVt2fluKw== From: Maxime Ripard Date: Wed, 12 Aug 2026 14:56:56 +0200 Subject: [PATCH RFC v2 1/9] drm/atomic: colorop: Rename state to state_to_destroy Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260812-drm-reset-state-flag-v2-1-e96ce13317dd@kernel.org> References: <20260812-drm-reset-state-flag-v2-0-e96ce13317dd@kernel.org> In-Reply-To: <20260812-drm-reset-state-flag-v2-0-e96ce13317dd@kernel.org> To: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter Cc: Daniel Stone , Harry Wentland , Jocelyn Falempe , =?utf-8?q?Jonas_=C3=85dahl?= , =?utf-8?q?Michel_D=C3=A4nzer?= , Pekka Paalanen , Sebastian Wick , Simon Ser , Victoria Brekenfeld , Xaver Hugl , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Maxime Ripard X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=3757; i=mripard@kernel.org; h=from:subject:message-id; bh=LuWbzh4jvd6KbL44oyGtGHIkAPIQ/Ts/75BcQDwl8Yg=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDFk1ubOiT6nXMPw7w7m2bFGUEEfy5Q3H38Ut0LnxYIMY/ 9uszidfO6ayMAhzMsiKKbI8kQk7vbx9cZWD/cofMHNYmUCGMHBxCsBEYt8wNizke7O/b6lk8KeU 26osN00E34hUFCj/L+9Mtj+Tskif4/KXmPP8/UxpuanSvyPqDTTkGBvOmYm/WBc6b2VGz4Np+6S KWH7LaxSaKxerz1X52zUz41e7XB/fK44rqWxcblfi/E0OuAMA X-Developer-Key: i=mripard@kernel.org; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D The atomic state tracking structures used to have a generic state field to track the state to free when tearing down the drm_atomic_commit. It has since been renamed to state_to_destroy in __drm_planes_state, __drm_crtcs_state, __drm_connnectors_state, and __drm_private_objs_state to better describe its purpose. The colorop support has been added after that rename, but __drm_colorops_state still uses the old state name. Rename it to state_to_destroy for consistency, and add the matching kerneldoc. Signed-off-by: Maxime Ripard --- drivers/gpu/drm/drm_atomic.c | 6 +++--- drivers/gpu/drm/drm_atomic_helper.c | 2 +- include/drm/drm_atomic.h | 18 +++++++++++++++++- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c index e5c8ef06caed..7aeeeb2fe472 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c @@ -341,13 +341,13 @@ void drm_atomic_commit_default_clear(struct drm_atomi= c_commit *state) =20 if (!colorop) continue; =20 drm_colorop_atomic_destroy_state(colorop, - state->colorops[i].state); + state->colorops[i].state_to_destroy); state->colorops[i].ptr =3D NULL; - state->colorops[i].state =3D NULL; + state->colorops[i].state_to_destroy =3D NULL; state->colorops[i].old_state =3D NULL; state->colorops[i].new_state =3D NULL; } =20 for (i =3D 0; i < state->num_private_objs; i++) { @@ -706,11 +706,11 @@ drm_atomic_get_colorop_state(struct drm_atomic_commit= *state, =20 colorop_state =3D drm_atomic_helper_colorop_duplicate_state(colorop); if (!colorop_state) return ERR_PTR(-ENOMEM); =20 - state->colorops[index].state =3D colorop_state; + state->colorops[index].state_to_destroy =3D colorop_state; state->colorops[index].ptr =3D colorop; state->colorops[index].old_state =3D colorop->state; state->colorops[index].new_state =3D colorop_state; colorop_state->state =3D state; =20 diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atom= ic_helper.c index 285aac3554df..c4752bd7d999 100644 --- a/drivers/gpu/drm/drm_atomic_helper.c +++ b/drivers/gpu/drm/drm_atomic_helper.c @@ -3349,11 +3349,11 @@ int drm_atomic_helper_swap_state(struct drm_atomic_= commit *state, WARN_ON(colorop->state !=3D old_colorop_state); =20 old_colorop_state->state =3D state; new_colorop_state->state =3D NULL; =20 - state->colorops[i].state =3D old_colorop_state; + state->colorops[i].state_to_destroy =3D old_colorop_state; colorop->state =3D new_colorop_state; } =20 drm_panic_lock(state->dev, flags); for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_s= tate, i) { diff --git a/include/drm/drm_atomic.h b/include/drm/drm_atomic.h index 88087910ab1a..00b3e9fc429a 100644 --- a/include/drm/drm_atomic.h +++ b/include/drm/drm_atomic.h @@ -157,11 +157,27 @@ struct drm_crtc_commit { bool abort_completion; }; =20 struct __drm_colorops_state { struct drm_colorop *ptr; - struct drm_colorop_state *state, *old_state, *new_state; + + /** + * @state_to_destroy: + * + * Used to track the @drm_colorop_state we will need to free + * when tearing down the associated &drm_atomic_commit in + * $drm_mode_config_funcs.atomic_state_clear or + * drm_atomic_commit_default_clear(). + * + * Before a commit, and the call to + * drm_atomic_helper_swap_state() in particular, it points to + * the same state than @new_state. After a commit, it points to + * the same state than @old_state. + */ + struct drm_colorop_state *state_to_destroy; + + struct drm_colorop_state *old_state, *new_state; }; =20 struct __drm_planes_state { struct drm_plane *ptr; =20 --=20 2.55.0 From nobody Mon Aug 24 20:40:38 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E04C3442FDB for ; Wed, 12 Aug 2026 12:57:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786539437; cv=none; b=h/Lh8UluKTm+Ez7pPARbTXnkd3ZcD9INu4YYb2HDZtE9FJqbASkRlyWa1A1m0Neuxgy52EX2PN9IgI9lwVDQUdKaEdPP2PGDFHz92A0lMdoPzTPSNZCNMjgwp2J7qqQEOU8HjzfTENK+ArvBeSuEjDloas7rbOxFULisMiAcovY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786539437; c=relaxed/simple; bh=mvC8R3he83Sx8Bn/GijgiPNEqIKrsSdGEmvIcsmc3Z8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=DmhTLwd5+uxLOFnXFXU+AsWYAuPJKf3afOrVPtVRdCr114F/mBRVwxcdiWvBOWvL9KrLqbST3jWEcQ3H+5paYnwUu0RfpbArW9BLVpEq+6jYsm13yBVDJY0q4KX0gMwtOQu7/gjqqI8GdPzXaYvahBVYLzYITQBTaF5ZSRjt1do= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=YPqAbyrX; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="YPqAbyrX" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8D40C1F00A3E; Wed, 12 Aug 2026 12:57:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786539430; bh=o+wRKcqtX8Gem5V41aHQY1Antv1/5gUeTHY9nwMxhfs=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=YPqAbyrXBrn2yc8GkgjP+m7wMG5sqUx7mt1hnMmIlMKFpLVZN9tnI8DE+BwVd5Kwl KAqggiRcxlW+6k6NZWhyfPBSNdTKj4A79vXoD3zm9H9SjoqayQlXv0n77FO3lA8CrH +X1Rfcc3HDRPH0UATztQKxrR4RO+U1PAsiSv79eM0G4dO0InU6K7Fea6TdGn8IsZmz 0PvSLuuIX77W5rUapi32QVlikLWMR9226fKfgoChI0e3HqPrey/GnoEpctA/xth4LH srO7RTV62gyBBPgET/iY5fidN0DbgNYT6B5n9q/3uUiDB9B4Ys4qppAkDq849wJAl9 FQeODHkoClYfg== From: Maxime Ripard Date: Wed, 12 Aug 2026 14:56:57 +0200 Subject: [PATCH RFC v2 2/9] drm/atomic: Create function to insert CRTC state into a commit Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260812-drm-reset-state-flag-v2-2-e96ce13317dd@kernel.org> References: <20260812-drm-reset-state-flag-v2-0-e96ce13317dd@kernel.org> In-Reply-To: <20260812-drm-reset-state-flag-v2-0-e96ce13317dd@kernel.org> To: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter Cc: Daniel Stone , Harry Wentland , Jocelyn Falempe , =?utf-8?q?Jonas_=C3=85dahl?= , =?utf-8?q?Michel_D=C3=A4nzer?= , Pekka Paalanen , Sebastian Wick , Simon Ser , Victoria Brekenfeld , Xaver Hugl , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Maxime Ripard X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2732; i=mripard@kernel.org; h=from:subject:message-id; bh=mvC8R3he83Sx8Bn/GijgiPNEqIKrsSdGEmvIcsmc3Z8=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDFk1ubMnt+xy//zxhd2Xef774nhEOXT/XQ0Pm7DHdwHX5 rPWm99t75jKwiDMySArpsjyRCbs9PL2xVUO9it/wMxhZQIZwsDFKQATOf6GsZr109W0DTu/hfQ8 VrSU/+e7NE/F/leH4a1pt588iNJ2ywq7mVYiMyeXu/9kxqqWVokmP8Y621sx59piHEXOyr8oqz1 1+8N+kS1xO9Lsshic5zGxqkT1TZWQaEk1Xv6zymDO3Gl/G88AAA== X-Developer-Key: i=mripard@kernel.org; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D drm_atomic_get_crtc_state() allocates a new CRTC state by duplicating the current one and inserts it into the atomic commit as a single operation. However, a later change will need to insert a CRTC state into a commit without going through the full allocation and duplication path in drm_atomic_get_crtc_state(). Extract the state insertion logic into a new static drm_atomic_commit_set_crtc_state() helper, and convert drm_atomic_get_crtc_state() to use it. Signed-off-by: Maxime Ripard --- drivers/gpu/drm/drm_atomic.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c index 7aeeeb2fe472..91219c382d14 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c @@ -421,10 +421,27 @@ void __drm_atomic_commit_free(struct kref *ref) =20 drm_dev_put(dev); } EXPORT_SYMBOL(__drm_atomic_commit_free); =20 +static int drm_atomic_commit_set_crtc_state(struct drm_atomic_commit *comm= it, + struct drm_crtc *crtc, + struct drm_crtc_state *crtc_state) +{ + int index =3D drm_crtc_index(crtc); + + drm_modeset_lock_assert_held(&crtc->mutex); + + commit->crtcs[index].state_to_destroy =3D crtc_state; + commit->crtcs[index].old_state =3D crtc->state; + commit->crtcs[index].new_state =3D crtc_state; + commit->crtcs[index].ptr =3D crtc; + crtc_state->state =3D commit; + + return 0; +} + /** * drm_atomic_get_crtc_state - get CRTC state * @state: global atomic state object * @crtc: CRTC to get state object for * @@ -443,11 +460,11 @@ EXPORT_SYMBOL(__drm_atomic_commit_free); */ struct drm_crtc_state * drm_atomic_get_crtc_state(struct drm_atomic_commit *state, struct drm_crtc *crtc) { - int ret, index =3D drm_crtc_index(crtc); + int ret; struct drm_crtc_state *crtc_state; =20 WARN_ON(!state->acquire_ctx); drm_WARN_ON(state->dev, state->checked); =20 @@ -461,15 +478,15 @@ drm_atomic_get_crtc_state(struct drm_atomic_commit *s= tate, =20 crtc_state =3D crtc->funcs->atomic_duplicate_state(crtc); if (!crtc_state) return ERR_PTR(-ENOMEM); =20 - state->crtcs[index].state_to_destroy =3D crtc_state; - state->crtcs[index].old_state =3D crtc->state; - state->crtcs[index].new_state =3D crtc_state; - state->crtcs[index].ptr =3D crtc; - crtc_state->state =3D state; + ret =3D drm_atomic_commit_set_crtc_state(state, crtc, crtc_state); + if (ret) { + crtc->funcs->atomic_destroy_state(crtc, crtc_state); + return ERR_PTR(ret); + } =20 drm_dbg_atomic(state->dev, "Added [CRTC:%d:%s] %p state to %p\n", crtc->base.id, crtc->name, crtc_state, state); =20 return crtc_state; --=20 2.55.0 From nobody Mon Aug 24 20:40:38 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C0B0A4432F2 for ; Wed, 12 Aug 2026 12:57:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786539445; cv=none; b=a11PQRh40P58wgpRDpT7+/hVFW75SXLBoJbt412iVEvDBym3qSfuENv6lY9BB4VD7fq+43gaCXcvc7p1nMsWlgaZYlFld5SnzIQ1IM6xWeoKEEr9WqN0RiBFMQKgsPKF8nc6xFRdPA/RJI7jCOYCf4IB6EJv/sIlKmnoKBagEHg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786539445; c=relaxed/simple; bh=v7jESdL4cHOWjb/Oz/3ZTHuGWO1WGBzHffGrF2n3Bi0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=X4A45J3b9ZldQUNfQv1jWM+x1rPsmuEPhTpV0+zp9hjAMeOMNj/GI+rx42mUWyG+xdvwQyXZksXeRzR95dOqOgNcsgktIC5SNYDCyty6X0acbak+Bz/9fGpbxha/Vcj4JZTgzV6Rues1nRCjQALmzpj5amL6/nf4x74NUsk4MBs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=nbqcEObF; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="nbqcEObF" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E885B1F000E9; Wed, 12 Aug 2026 12:57:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786539432; bh=6DKdJj5MKpM3O0y8X5AkvQk6AWDM1oJJkPw2hvfmZUU=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=nbqcEObFKKHSMqErcO0BKj8aN0Nax6lKBcjUilQlN+3jRD0xAlJGXDhvLuQrkxUY0 Rr/upbaVW1tDqIUSNH3/4BMu/PkGblqExzBmsjyQq1DnJHBN0gS6jSQR8TkYCNmJs3 DO7oKJxu/to2HuPYGDpRFYTIr2jWTtuZb5sHk7a1mNOn9lCQjrZO5H0fEXV8vvtHCQ bGW4lBBqxzzo634Ur7JZ6ewKnChGrMyACqR0bZII7cqymKIxdmDCPgTWqtQ8KKOvQh kA2B6W6lokuA/zALJpPr6KAHYNLnf8kmxmoFJIlcdUwekycgl8pWJgd3mP83dLwJrC sXWDTpN6Vkg3w== From: Maxime Ripard Date: Wed, 12 Aug 2026 14:56:58 +0200 Subject: [PATCH RFC v2 3/9] drm/atomic: Create function to insert plane state into a commit Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260812-drm-reset-state-flag-v2-3-e96ce13317dd@kernel.org> References: <20260812-drm-reset-state-flag-v2-0-e96ce13317dd@kernel.org> In-Reply-To: <20260812-drm-reset-state-flag-v2-0-e96ce13317dd@kernel.org> To: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter Cc: Daniel Stone , Harry Wentland , Jocelyn Falempe , =?utf-8?q?Jonas_=C3=85dahl?= , =?utf-8?q?Michel_D=C3=A4nzer?= , Pekka Paalanen , Sebastian Wick , Simon Ser , Victoria Brekenfeld , Xaver Hugl , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Maxime Ripard X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2806; i=mripard@kernel.org; h=from:subject:message-id; bh=v7jESdL4cHOWjb/Oz/3ZTHuGWO1WGBzHffGrF2n3Bi0=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDFk1ubPPvLheEf5lsfL5JTJv6rcvPu1S/GSTa5X0uy+8d r+9noVf7JjKwiDMySArpsjyRCbs9PL2xVUO9it/wMxhZQIZwsDFKQAT4TRnrC/oVj94UnvtTOb+ 210/FLgVAss5972dqLusLe8+ZxvnppOVoiEzzPbeXnbG/86nl6p1TYwNB2q8Vx1c+OlDl0wU91T rlq8HL9/WPSpYx7e84qPe9pt1P/0+vfkTJbk+MFXSY3L5FiNFAA== X-Developer-Key: i=mripard@kernel.org; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D drm_atomic_get_plane_state() allocates a new plane state by duplicating the current one and inserts it into the atomic commit as a single operation. However, a later change will need to insert a plane state into a commit without going through the full allocation and duplication path in drm_atomic_get_plane_state(). Extract the state insertion logic into a new static drm_atomic_commit_set_plane_state() helper, and convert drm_atomic_get_plane_state() to use it. Signed-off-by: Maxime Ripard --- drivers/gpu/drm/drm_atomic.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c index 91219c382d14..2ac26ed64823 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c @@ -624,10 +624,27 @@ static int drm_atomic_connector_check(struct drm_conn= ector *connector, } =20 return 0; } =20 +static int drm_atomic_commit_set_plane_state(struct drm_atomic_commit *com= mit, + struct drm_plane *plane, + struct drm_plane_state *plane_state) +{ + int index =3D drm_plane_index(plane); + + drm_modeset_lock_assert_held(&plane->mutex); + + commit->planes[index].state_to_destroy =3D plane_state; + commit->planes[index].old_state =3D plane->state; + commit->planes[index].new_state =3D plane_state; + commit->planes[index].ptr =3D plane; + plane_state->state =3D commit; + + return 0; +} + /** * drm_atomic_get_plane_state - get plane state * @state: global atomic state object * @plane: plane to get state object for * @@ -642,11 +659,11 @@ static int drm_atomic_connector_check(struct drm_conn= ector *connector, */ struct drm_plane_state * drm_atomic_get_plane_state(struct drm_atomic_commit *state, struct drm_plane *plane) { - int ret, index =3D drm_plane_index(plane); + int ret; struct drm_plane_state *plane_state; =20 WARN_ON(!state->acquire_ctx); drm_WARN_ON(state->dev, state->checked); =20 @@ -665,15 +682,15 @@ drm_atomic_get_plane_state(struct drm_atomic_commit *= state, =20 plane_state =3D plane->funcs->atomic_duplicate_state(plane); if (!plane_state) return ERR_PTR(-ENOMEM); =20 - state->planes[index].state_to_destroy =3D plane_state; - state->planes[index].ptr =3D plane; - state->planes[index].old_state =3D plane->state; - state->planes[index].new_state =3D plane_state; - plane_state->state =3D state; + ret =3D drm_atomic_commit_set_plane_state(state, plane, plane_state); + if (ret) { + plane->funcs->atomic_destroy_state(plane, plane_state); + return ERR_PTR(ret); + } =20 drm_dbg_atomic(plane->dev, "Added [PLANE:%d:%s] %p state to %p\n", plane->base.id, plane->name, plane_state, state); =20 if (plane_state->crtc) { --=20 2.55.0 From nobody Mon Aug 24 20:40:38 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C00EC43E092 for ; Wed, 12 Aug 2026 12:57:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786539445; cv=none; b=fNmvJnat3uR75zWPlu7xZnlsjO4hghjNfI9w020HrE+L6B7xWlq1Mz93VF9hbT5d57wRLr/1tT8URgSq1necD7YD4yHv5XQh3/J9hW80ZN4PqVKBJpvNgiB90eLn4x3H54V8NYKPlf1oUrxm/qqho+nGJbMB3qepRgCfUhDXy94= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786539445; c=relaxed/simple; bh=pZKlOKaPQ0ZMNJ3wdm+9LLNfg+R0yJMvj0WSw22/NaY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=M45rlbTfDWxIITtT/7CFQC4nMjALr23xO4pMtdOAa8VaGbXLbTMUOoy5y/6HYDV4kDfaNyV6/uV/1sr/2teZNylk9uiGCFYTYpBEBSQ4mXyvzeMksDO0HfCSC4xesAxFCH4ieDe1I3WMCQb97Z9Xgf4+1wTPI9ja9KtbT+mwwkg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=SLwyfRPj; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="SLwyfRPj" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4E6071F00A3A; Wed, 12 Aug 2026 12:57:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786539434; bh=k8ycKUnGwpQ4AwzxzEo1cZNOe6UNyjcDqVjSThLSyEE=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=SLwyfRPj3ehhwkDxBzq9XVgPSFCFDo9zesTEntZ3G0P0Q3lwwcSqJOuA7u5YsL1xI r4mVJhd3yJwyuJHcLrScGbg5d8w7ov6T8BgUQhaseOeZ/zCeIQa1TtmXvprh8sj57Q f/RMDMiNmhT/gXuZpuR7NpBRp7lTCoYGc3KZx7cJz9fU+futqPgN5mmRCJJG1aUBkQ y25OWVxvGJWeFpMe9sLgI04eNeX/XPmcn03Y3O+Iuas54Rr35J1XKCTn4SPnvm7E2I Hnl201m0XFso2hpgpHFeXr8fEX7WLFOdCUGFAR/JfiUY1PyelH5GE14DTQkF3b801K sFvPweca4UBqg== From: Maxime Ripard Date: Wed, 12 Aug 2026 14:56:59 +0200 Subject: [PATCH RFC v2 4/9] drm/atomic: Create function to insert colorop state into a commit Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260812-drm-reset-state-flag-v2-4-e96ce13317dd@kernel.org> References: <20260812-drm-reset-state-flag-v2-0-e96ce13317dd@kernel.org> In-Reply-To: <20260812-drm-reset-state-flag-v2-0-e96ce13317dd@kernel.org> To: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter Cc: Daniel Stone , Harry Wentland , Jocelyn Falempe , =?utf-8?q?Jonas_=C3=85dahl?= , =?utf-8?q?Michel_D=C3=A4nzer?= , Pekka Paalanen , Sebastian Wick , Simon Ser , Victoria Brekenfeld , Xaver Hugl , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Maxime Ripard X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2972; i=mripard@kernel.org; h=from:subject:message-id; bh=pZKlOKaPQ0ZMNJ3wdm+9LLNfg+R0yJMvj0WSw22/NaY=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDFk1uXOUgmOv7Y9xEdHNqIg6ru7732X3puj7ex389Dd8V OwrvCjYMZWFQZiTQVZMkeWJTNjp5e2LqxzsV/6AmcPKBDKEgYtTACbCrM9YK8RztlbqEN9W5pVT pdxyapx2CB/bZr7T8dmusNvhVro9xbrPwvY/aXf6/GLnlIUVfmd3Mza0SQgILln7w4mHafenn0z VUQcY19rcYo6alL7S4tyMdTVhPvur4vbNk7Xrcvh49I1GXCsA X-Developer-Key: i=mripard@kernel.org; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D drm_atomic_get_colorop_state() allocates a new colorop state by duplicating the current one and inserts it into the atomic commit as a single operation. However, a later change will need to insert a colorop state into a commit without going through the full allocation and duplication path in drm_atomic_get_colorop_state(). Extract the state insertion logic into a new static drm_atomic_commit_set_colorop_state() helper, and convert drm_atomic_get_colorop_state() to use it. Signed-off-by: Maxime Ripard --- drivers/gpu/drm/drm_atomic.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c index 2ac26ed64823..e89e1d18c783 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c @@ -704,10 +704,27 @@ drm_atomic_get_plane_state(struct drm_atomic_commit *= state, =20 return plane_state; } EXPORT_SYMBOL(drm_atomic_get_plane_state); =20 +static int drm_atomic_commit_set_colorop_state(struct drm_atomic_commit *c= ommit, + struct drm_colorop *colorop, + struct drm_colorop_state *colorop_state) +{ + int index =3D drm_colorop_index(colorop); + + drm_modeset_lock_assert_held(&colorop->plane->mutex); + + commit->colorops[index].state_to_destroy =3D colorop_state; + commit->colorops[index].old_state =3D colorop->state; + commit->colorops[index].new_state =3D colorop_state; + commit->colorops[index].ptr =3D colorop; + colorop_state->state =3D commit; + + return 0; +} + /** * drm_atomic_get_colorop_state - get colorop state * @state: global atomic state object * @colorop: colorop to get state object for * @@ -723,11 +740,11 @@ EXPORT_SYMBOL(drm_atomic_get_plane_state); */ struct drm_colorop_state * drm_atomic_get_colorop_state(struct drm_atomic_commit *state, struct drm_colorop *colorop) { - int ret, index =3D drm_colorop_index(colorop); + int ret; struct drm_colorop_state *colorop_state; =20 WARN_ON(!state->acquire_ctx); =20 colorop_state =3D drm_atomic_get_new_colorop_state(state, colorop); @@ -740,15 +757,15 @@ drm_atomic_get_colorop_state(struct drm_atomic_commit= *state, =20 colorop_state =3D drm_atomic_helper_colorop_duplicate_state(colorop); if (!colorop_state) return ERR_PTR(-ENOMEM); =20 - state->colorops[index].state_to_destroy =3D colorop_state; - state->colorops[index].ptr =3D colorop; - state->colorops[index].old_state =3D colorop->state; - state->colorops[index].new_state =3D colorop_state; - colorop_state->state =3D state; + ret =3D drm_atomic_commit_set_colorop_state(state, colorop, colorop_state= ); + if (ret) { + drm_colorop_atomic_destroy_state(colorop, colorop_state); + return ERR_PTR(ret); + } =20 drm_dbg_atomic(colorop->dev, "Added [COLOROP:%d:%d] %p state to %p\n", colorop->base.id, colorop->type, colorop_state, state); =20 return colorop_state; --=20 2.55.0 From nobody Mon Aug 24 20:40:38 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0DB3D442369 for ; Wed, 12 Aug 2026 12:57:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786539443; cv=none; b=bELtB2rOKxMggG/1u04OdK9BzhFySvd+q9J+qE6aYp28RRU/F3C6AfxUP8Fm0eQYwbtkOEUMelNd3TwsiL7RCWXqu9jBXKlxpJRf+Yon08spvZLuZYtXx/E6m+oK58ie6c6W4uo3qS4y+O+gOyGKHlIR2sM1TApEigvmE7K8wbM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786539443; c=relaxed/simple; bh=1M1iZwYCM42B/5b+TEDoheVwzzS2oI2EWd1KimgYkYA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=P3yzQ5mTBLCPlL4+5pu6PTGkn+yMZvXToIpO01ArdqIsOKFxwikmrchp2XGkZp806vJcEySBe6+4MhoBhrONC4joFWmOTDYZblU0blktEF73+hzBASMiHsZkit4C1wDcOEX6mta52atC8uGHyM22PuhOaHtD+Isgdfw6QPhcPCc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=YNLv8G1i; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="YNLv8G1i" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A7B1E1F00A3D; Wed, 12 Aug 2026 12:57:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786539437; bh=HIvQR5MYq6m+q3HuqpSbKPtZo6ZGXtxQjlf0GdUe7JU=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=YNLv8G1ivBNOFb7+XKAsTdxWaFsSkvpixrAWrPQtWtTraV1vCbqYhPP9uhCDhdr94 IzuVxlDigxme9wM+2qEEef7yvWyM4PHuNhGOc8lB4nR2rtBzNPhM2YHInSA1/IfE+c 1VLb12tSFZZZ2OSnP8hioRJ4P0Io5BYdQaCh5A8drq8eKWeKkoxBoqhBUWLZQ9TduK YSFuh+fMk87ZjGVEa9JjMRl/wFxS7dsn4Gx45V+y3F2vEQgcZEU8peOtoRpOYKP8RQ C239NHKKqcEwyg2Wofjq/lyUOqq5yMbIGdez0atB9s+7jxwogpe1pDRSt3Zf76iPJP 6BWHCPsxIw/Kg== From: Maxime Ripard Date: Wed, 12 Aug 2026 14:57:00 +0200 Subject: [PATCH RFC v2 5/9] drm/atomic: Create function to insert private obj state into a commit Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260812-drm-reset-state-flag-v2-5-e96ce13317dd@kernel.org> References: <20260812-drm-reset-state-flag-v2-0-e96ce13317dd@kernel.org> In-Reply-To: <20260812-drm-reset-state-flag-v2-0-e96ce13317dd@kernel.org> To: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter Cc: Daniel Stone , Harry Wentland , Jocelyn Falempe , =?utf-8?q?Jonas_=C3=85dahl?= , =?utf-8?q?Michel_D=C3=A4nzer?= , Pekka Paalanen , Sebastian Wick , Simon Ser , Victoria Brekenfeld , Xaver Hugl , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Maxime Ripard X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=3941; i=mripard@kernel.org; h=from:subject:message-id; bh=1M1iZwYCM42B/5b+TEDoheVwzzS2oI2EWd1KimgYkYA=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDFk1uXOqZwq03pB4//bHKaPXV9/k/Gt4n3PRqpy5P+O9x Ve/GxEOHVNZGIQ5GWTFFFmeyISdXt6+uMrBfuUPmDmsTCBDGLg4BWAiPXMZq1kZO7jVGJ4e/6Ke 8MDw+e4PhQ57zxS9i2bkvvbhrbCLtQDr898Gq+1OCRVu6S4uzS47xNjw76Le74jPBvt/tIsGdE8 zZnK8t5WBR2bB5yBt4WlBLBaJr9U+iFrmG8zoenHm3L6yE8cB X-Developer-Key: i=mripard@kernel.org; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D drm_atomic_get_private_obj_state() allocates a new private object state by duplicating the current one and inserts it into the atomic commit as a single operation. However, a later change will need to insert a private object state into a commit without going through the full allocation and duplication path in drm_atomic_get_private_obj_state(). Extract the state insertion logic, including the array reallocation, into a new static drm_atomic_commit_set_private_obj_state() helper, and convert drm_atomic_get_private_obj_state() to use it. Signed-off-by: Maxime Ripard --- drivers/gpu/drm/drm_atomic.c | 57 ++++++++++++++++++++++++++++------------= ---- 1 file changed, 37 insertions(+), 20 deletions(-) diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c index e89e1d18c783..88cdb65698c9 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c @@ -1097,10 +1097,41 @@ drm_atomic_private_obj_fini(struct drm_private_obj = *obj) obj->funcs->atomic_destroy_state(obj, obj->state); drm_modeset_lock_fini(&obj->lock); } EXPORT_SYMBOL(drm_atomic_private_obj_fini); =20 +static int drm_atomic_commit_set_private_obj_state(struct drm_atomic_commi= t *commit, + struct drm_private_obj *obj, + struct drm_private_state *obj_state) +{ + struct __drm_private_objs_state *arr; + int index, num_objs; + size_t size; + + drm_modeset_lock_assert_held(&obj->lock); + + num_objs =3D commit->num_private_objs + 1; + size =3D sizeof(*commit->private_objs) * num_objs; + arr =3D krealloc(commit->private_objs, size, GFP_KERNEL); + if (!arr) + return -ENOMEM; + + commit->private_objs =3D arr; + index =3D commit->num_private_objs; + memset(&commit->private_objs[index], 0, sizeof(*commit->private_objs)); + + commit->private_objs[index].state_to_destroy =3D obj_state; + commit->private_objs[index].old_state =3D obj->state; + commit->private_objs[index].new_state =3D obj_state; + commit->private_objs[index].ptr =3D obj; + obj_state->state =3D commit; + + commit->num_private_objs =3D num_objs; + + return 0; +} + /** * drm_atomic_get_private_obj_state - get private object state * @state: global atomic state * @obj: private object to get the state for * @@ -1113,13 +1144,11 @@ EXPORT_SYMBOL(drm_atomic_private_obj_fini); */ struct drm_private_state * drm_atomic_get_private_obj_state(struct drm_atomic_commit *state, struct drm_private_obj *obj) { - int index, num_objs, ret; - size_t size; - struct __drm_private_objs_state *arr; + int ret; struct drm_private_state *obj_state; =20 WARN_ON(!state->acquire_ctx); drm_WARN_ON(state->dev, state->checked); =20 @@ -1129,31 +1158,19 @@ drm_atomic_get_private_obj_state(struct drm_atomic_= commit *state, =20 ret =3D drm_modeset_lock(&obj->lock, state->acquire_ctx); if (ret) return ERR_PTR(ret); =20 - num_objs =3D state->num_private_objs + 1; - size =3D sizeof(*state->private_objs) * num_objs; - arr =3D krealloc(state->private_objs, size, GFP_KERNEL); - if (!arr) - return ERR_PTR(-ENOMEM); - - state->private_objs =3D arr; - index =3D state->num_private_objs; - memset(&state->private_objs[index], 0, sizeof(*state->private_objs)); - obj_state =3D obj->funcs->atomic_duplicate_state(obj); if (!obj_state) return ERR_PTR(-ENOMEM); =20 - state->private_objs[index].state_to_destroy =3D obj_state; - state->private_objs[index].old_state =3D obj->state; - state->private_objs[index].new_state =3D obj_state; - state->private_objs[index].ptr =3D obj; - obj_state->state =3D state; - - state->num_private_objs =3D num_objs; + ret =3D drm_atomic_commit_set_private_obj_state(state, obj, obj_state); + if (ret) { + obj->funcs->atomic_destroy_state(obj, obj_state); + return ERR_PTR(ret); + } =20 drm_dbg_atomic(state->dev, "Added new private object %p state %p to %p\n", obj, obj_state, state); =20 --=20 2.55.0 From nobody Mon Aug 24 20:40:38 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 08ACF33DEE6 for ; Wed, 12 Aug 2026 12:57:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786539448; cv=none; b=EUnKj8EmFoWfV0Z3vSmtVc4atSJ/mXb+aP0DEwqzwVMwANzZ6w5RKIr1mQ0EtgiO7JJ5aPh7h2HxwX+kdqYbZU8UeP26U/f+vg6NElyTyiA5ceUuccCzPGWTocTd0Y35wfCwOqMlHQciCPM6PXklNmLLIhpGnuFtaW7pf++sXoU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786539448; c=relaxed/simple; bh=wDaUru3PKCxU0DIl/uXL+Fj/EweBL/7abRjPRJwuSBY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=disrbsUQ3Ns9PvxyulKn9jznAbqlKqmDcUMrOLiSMJRzg4R1LVHYqim7WCJz3ixQPICHBo0HiW0E8ijP0NumJApnFSAHzdi7IMU5r2AjMVCV9wppyMJgBz95RJxPzTX5m4Yfafi13YFRlM6zk+5Zi2H0gbvZngiMtYJiK9myfjI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=am2VnvAg; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="am2VnvAg" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0C62C1F00A3E; Wed, 12 Aug 2026 12:57:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786539439; bh=6s13Q+j8wBnnuEdnJ/nL5ccmcNMkL8DlD+sgq0/D/7I=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=am2VnvAgyCIGbMQaX1L3tdBsH5aA9XZTR5Ld7sr1F+fZajZDZc6VhGhaGWeGCxpvM oGhOvXA0iajopp0j7rSvKyd0r3yKIRRfpTAALq9hbaaI3+L8H7+n9rm8eLWDCuDIzl nksvrKuMnWoGk25Se24/jRbiupF203vKRzq07OKoa0BZAd/gVsX53DIQ3xf9K9dSxx S/FtzJRAQOttOLY9CvPmRl8c/7cCoNQq701vNPs3b74nh7KViD+upfUJpAsINxfCLd Us5/k0SaLUY3ktAhkMvG3w1r6/zvaDSNRei+yqpmGMJUHL6ueWHGlLgb6XZWvhMnie p/eGY3PsjpeuA== From: Maxime Ripard Date: Wed, 12 Aug 2026 14:57:01 +0200 Subject: [PATCH RFC v2 6/9] drm/atomic: Create function to insert connector state into a commit Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260812-drm-reset-state-flag-v2-6-e96ce13317dd@kernel.org> References: <20260812-drm-reset-state-flag-v2-0-e96ce13317dd@kernel.org> In-Reply-To: <20260812-drm-reset-state-flag-v2-0-e96ce13317dd@kernel.org> To: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter Cc: Daniel Stone , Harry Wentland , Jocelyn Falempe , =?utf-8?q?Jonas_=C3=85dahl?= , =?utf-8?q?Michel_D=C3=A4nzer?= , Pekka Paalanen , Sebastian Wick , Simon Ser , Victoria Brekenfeld , Xaver Hugl , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Maxime Ripard X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=4467; i=mripard@kernel.org; h=from:subject:message-id; bh=wDaUru3PKCxU0DIl/uXL+Fj/EweBL/7abRjPRJwuSBY=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDFk1uXMyJHOKLsrc2MinxHnme0jW3fkrjwRm3mWO+v0vZ vcR+11ZHVNZGIQ5GWTFFFmeyISdXt6+uMrBfuUPmDmsTCBDGLg4BWAiAsGM9RWM7g0dlrL64TfS P3N3F56xXhuub5uckLPu2FH5VH3tFYFrAxamaH/QeKq0iXH3vN1yjA2rD+zqPLtu8QeT4qIl2/7 Y3XDiYTlYXyQpcKNihfoauRg1qdaeNPmTKemTVu47xdZ+fi0A X-Developer-Key: i=mripard@kernel.org; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D drm_atomic_get_connector_state() allocates a new connector state by duplicating the current one and inserts it into the atomic commit as a single operation. However, a later change will need to insert a connector state into a commit without going through the full allocation and duplication path in drm_atomic_get_connector_state(). Extract the state insertion logic, including the dynamic array reallocation, into a new static drm_atomic_commit_set_connector_state() helper, and convert drm_atomic_get_connector_state() to use it. Signed-off-by: Maxime Ripard --- drivers/gpu/drm/drm_atomic.c | 67 +++++++++++++++++++++++++++-------------= ---- 1 file changed, 42 insertions(+), 25 deletions(-) diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c index 88cdb65698c9..e78f7eb6bfd1 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c @@ -1408,10 +1408,46 @@ drm_atomic_get_new_crtc_for_encoder(struct drm_atom= ic_commit *state, =20 return conn_state->crtc; } EXPORT_SYMBOL(drm_atomic_get_new_crtc_for_encoder); =20 +static int drm_atomic_commit_set_connector_state(struct drm_atomic_commit = *commit, + struct drm_connector *connector, + struct drm_connector_state *connector_state) +{ + struct drm_mode_config *config =3D &connector->dev->mode_config; + int index; + + drm_modeset_lock_assert_held(&config->connection_mutex); + + index =3D drm_connector_index(connector); + if (index >=3D commit->num_connector) { + struct __drm_connnectors_state *c; + int alloc =3D max(index + 1, config->num_connector); + + c =3D krealloc_array(commit->connectors, alloc, + sizeof(*commit->connectors), GFP_KERNEL); + if (!c) + return -ENOMEM; + + commit->connectors =3D c; + memset(&commit->connectors[commit->num_connector], 0, + sizeof(*commit->connectors) * (alloc - commit->num_connector)); + + commit->num_connector =3D alloc; + } + + drm_connector_get(connector); + commit->connectors[index].state_to_destroy =3D connector_state; + commit->connectors[index].old_state =3D connector->state; + commit->connectors[index].new_state =3D connector_state; + commit->connectors[index].ptr =3D connector; + connector_state->state =3D commit; + + return 0; +} + /** * drm_atomic_get_connector_state - get connector state * @state: global atomic state object * @connector: connector to get state object for * @@ -1426,53 +1462,34 @@ EXPORT_SYMBOL(drm_atomic_get_new_crtc_for_encoder); */ struct drm_connector_state * drm_atomic_get_connector_state(struct drm_atomic_commit *state, struct drm_connector *connector) { - int ret, index; + int ret; struct drm_mode_config *config =3D &connector->dev->mode_config; struct drm_connector_state *connector_state; =20 WARN_ON(!state->acquire_ctx); drm_WARN_ON(state->dev, state->checked); =20 ret =3D drm_modeset_lock(&config->connection_mutex, state->acquire_ctx); if (ret) return ERR_PTR(ret); =20 - index =3D drm_connector_index(connector); - - if (index >=3D state->num_connector) { - struct __drm_connnectors_state *c; - int alloc =3D max(index + 1, config->num_connector); - - c =3D krealloc_array(state->connectors, alloc, - sizeof(*state->connectors), GFP_KERNEL); - if (!c) - return ERR_PTR(-ENOMEM); - - state->connectors =3D c; - memset(&state->connectors[state->num_connector], 0, - sizeof(*state->connectors) * (alloc - state->num_connector)); - - state->num_connector =3D alloc; - } - connector_state =3D drm_atomic_get_new_connector_state(state, connector); if (connector_state) return connector_state; =20 connector_state =3D connector->funcs->atomic_duplicate_state(connector); if (!connector_state) return ERR_PTR(-ENOMEM); =20 - drm_connector_get(connector); - state->connectors[index].state_to_destroy =3D connector_state; - state->connectors[index].old_state =3D connector->state; - state->connectors[index].new_state =3D connector_state; - state->connectors[index].ptr =3D connector; - connector_state->state =3D state; + ret =3D drm_atomic_commit_set_connector_state(state, connector, connector= _state); + if (ret) { + connector->funcs->atomic_destroy_state(connector, connector_state); + return ERR_PTR(ret); + } =20 drm_dbg_atomic(connector->dev, "Added [CONNECTOR:%d:%s] %p state to %p\n", connector->base.id, connector->name, connector_state, state); =20 --=20 2.55.0 From nobody Mon Aug 24 20:40:38 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B6D63440A2D for ; Wed, 12 Aug 2026 12:57:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786539447; cv=none; b=sk2uTey/4Iq6GHJ6/ZoU577+g3DvK8++fiWnt6gZVu5HMyLfOYHlhWLN5p3M5C4TS9Qz3TU8luhL+VE6LfXE6ai+61YzN5dIVnDuJBQlH0SL7N+a1WZ6acknTPXlIp7h7VS4KD54uLla8kSrS9QpxP3LFjk1cZXjrKD5+o+H4jw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786539447; c=relaxed/simple; bh=KqroUBF9fy63U0kIpZnbE8J3Xt6EvTVFVK/4HC1fRg0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=SuNRScZ26WsxmursyYGJRi3L7pcPw96cGzA9oJW6fIRz44BbbXiLlIoMWYuQt5kBvkhComPGQsubCKCp8EgZ96GJGHE13EJqUl+or6qlm09K3OyF4FqJaTRWopA+sIzLDSFde2FZubfd3EkBIB0KtiiucNVk3UOjasnZPvGiy18= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=E3ASPS1k; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="E3ASPS1k" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 62F441F00AC4; Wed, 12 Aug 2026 12:57:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786539441; bh=Za4LRzHAXU2RDULMQIs7N/GmIAAtgm2U036qr4uAeQw=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=E3ASPS1kUHKmmc0d/P8SRmaxilezY1EBf7gMhPgnAsOAtFg77hzimjxGQB3ZCqa8p tSSaHHDP7Lcit4m4jwhrZSmpd5CtJSoYDp0/arbKXm/QgYoLcGttSRey5CsoflYURW zv8F88WpU6672FJ9T9Wer46JFIdBvoiKwOpxAFEHkrpk0cNIbFVa6A3faFFf0MgGkL /1MYTIgJGeLBR+o4/1SYIzepo8QUGvxEOzsZmygl5ITmW/oKdrmoK/lxW9WZ+J5Svr YxUGMeOlia60cZgeJpVlax6AEIeGGLQEB8D7BwGhCL+rIjBsYfrCzzoOepRgb8epkV B4Jb7Yk5PKJrA== From: Maxime Ripard Date: Wed, 12 Aug 2026 14:57:02 +0200 Subject: [PATCH RFC v2 7/9] drm/atomic: Add drm_atomic_can_create_state() helper Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260812-drm-reset-state-flag-v2-7-e96ce13317dd@kernel.org> References: <20260812-drm-reset-state-flag-v2-0-e96ce13317dd@kernel.org> In-Reply-To: <20260812-drm-reset-state-flag-v2-0-e96ce13317dd@kernel.org> To: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter Cc: Daniel Stone , Harry Wentland , Jocelyn Falempe , =?utf-8?q?Jonas_=C3=85dahl?= , =?utf-8?q?Michel_D=C3=A4nzer?= , Pekka Paalanen , Sebastian Wick , Simon Ser , Victoria Brekenfeld , Xaver Hugl , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Maxime Ripard X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=3552; i=mripard@kernel.org; h=from:subject:message-id; bh=KqroUBF9fy63U0kIpZnbE8J3Xt6EvTVFVK/4HC1fRg0=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDFk1uXPX3NqX8HrZ/KDQtm/3RWVXJL+20eY42WRt9cn8Y tHnGWLtHVNZGIQ5GWTFFFmeyISdXt6+uMrBfuUPmDmsTCBDGLg4BWAie1YyNpzxfh1Ry1f06bus K4vnPx/52wm7GBeJPwh++nk/k1jtDn2ZedcuRqls3Ji2YKfQFt8VVxlrpbe22d3OkEvkUT8ffCR MkfHFgu3xc7cLTK/baynKfKSM46ZaZnf4taP351n6+r4piXMGAA== X-Developer-Key: i=mripard@kernel.org; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D The atomic reset path will need to create pristine default states from scratch for every plane, CRTC, and connector. This requires all of them to implement the atomic_create_state hook. Introduce a drm_atomic_can_create_state() helper that iterates over all planes, CRTCs, and connectors and returns whether they all provide the hook. Color operations are excluded since they always use drm_atomic_helper_colorop_create_state() directly. This will be used both as a precondition before filling a commit with default states, and to report the device capability to userspace. Signed-off-by: Maxime Ripard --- drivers/gpu/drm/drm_atomic.c | 49 ++++++++++++++++++++++++++++++++++++++++= ++++ include/drm/drm_atomic.h | 2 ++ 2 files changed, 51 insertions(+) diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c index e78f7eb6bfd1..d8251447e44a 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c @@ -1608,10 +1608,59 @@ drm_atomic_get_new_bridge_state(const struct drm_at= omic_commit *state, =20 return drm_priv_to_bridge_state(obj_state); } EXPORT_SYMBOL(drm_atomic_get_new_bridge_state); =20 +/** + * drm_atomic_can_create_state - check if a device supports creating prist= ine states + * @dev: DRM device + * + * Check whether every plane, CRTC, and connector in @dev implements the + * &drm_plane_funcs.atomic_create_state, &drm_crtc_funcs.atomic_create_sta= te, + * and &drm_connector_funcs.atomic_create_state hooks respectively. These = hooks + * are required to create default states from scratch rather than duplicat= ing + * the current state. + * + * Color operations are not checked because they always use + * drm_atomic_helper_colorop_create_state() and do not have a per-driver h= ook. + * + * Returns: + * True if all objects implement atomic_create_state, false otherwise. + */ +bool drm_atomic_can_create_state(struct drm_device *dev) +{ + struct drm_connector_list_iter conn_iter; + struct drm_connector *connector; + struct drm_plane *plane; + struct drm_crtc *crtc; + + /* + * colorops don't have an atomic_create_state hook but + * drm_atomic_helper_colorop_create_state() + */ + + drm_for_each_plane(plane, dev) + if (!plane->funcs->atomic_create_state) + return false; + + drm_for_each_crtc(crtc, dev) + if (!crtc->funcs->atomic_create_state) + return false; + + drm_connector_list_iter_begin(dev, &conn_iter); + drm_for_each_connector_iter(connector, &conn_iter) { + if (!connector->funcs->atomic_create_state) { + drm_connector_list_iter_end(&conn_iter); + return false; + } + } + drm_connector_list_iter_end(&conn_iter); + + return true; +} +EXPORT_SYMBOL(drm_atomic_can_create_state); + /** * drm_atomic_add_encoder_bridges - add bridges attached to an encoder * @state: atomic state * @encoder: DRM encoder * diff --git a/include/drm/drm_atomic.h b/include/drm/drm_atomic.h index 00b3e9fc429a..7dc26e3da65c 100644 --- a/include/drm/drm_atomic.h +++ b/include/drm/drm_atomic.h @@ -700,10 +700,12 @@ int drm_crtc_commit_wait(struct drm_crtc_commit *comm= it); =20 struct drm_atomic_commit * __must_check drm_atomic_commit_alloc(struct drm_device *dev); void drm_atomic_commit_clear(struct drm_atomic_commit *state); =20 +bool drm_atomic_can_create_state(struct drm_device *dev); + /** * drm_atomic_commit_get - acquire a reference to the atomic state * @state: The atomic state * * Returns a new reference to the @state --=20 2.55.0 From nobody Mon Aug 24 20:40:38 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2E24F4446E4 for ; Wed, 12 Aug 2026 12:57:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786539451; cv=none; b=X0KXU7f57zQ4iU6KW5KzAfczBXPBPyS6kdYBs7Ob/aI7QArpYe30+O5ePo12OGedSw6+vGXLPkoqPBbSAWpAqiorPmo2MyI/FM/AwTHBI14Oe0kVcarKq4NVCf8FRjfdmJI5NIUdD+JkpHpUgJFHPOvpAfXfhZPT/WqgpCiqMwo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786539451; c=relaxed/simple; bh=QXo8kfkdi1Va2xyrt9RHIacabxzIOzzz0ldfCjJ0/Xg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=nhh7IjFQ11W+PBQR76sI7523UsEnfOUy0y25/MC3jNg3vtin4Gy2tFoJ32s4NU/sWGeb8x5Bx1+E9Och+2WEzNMQ5AAiDteqNEhyTg98CQH8LUn3BwYcCpK5QL2L+ux+H9Om8OrJZV66wjWe1dPeZdCqd7L1BHhZ8E5JdF+2YyY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=hQVFd6uo; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="hQVFd6uo" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C3A8E1F00A3D; Wed, 12 Aug 2026 12:57:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786539444; bh=nkcKmxiEewcdc/DJ2XJQBChyYlrduVaQIFbAzkQ4qXE=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=hQVFd6uobghDM+OsVo+cN610jiNFQZY3TBWepy9i5fezfLhZIYtFoZIFa6no2Ab79 Owmakq6oXnLGsYQoxq6tNUglXPZzF55QdARd16Y+JVqf8hi1Y+GnGHWPjBz/MT3trl oRYAJAbg84TuYCH6BiszAO+/8UPxnK2Wf4O4fw0by8z7U6qHuvyA9ZOgi/JYqjMaj7 hpMEQxj8KcPjq9jdyOZJJTyekOqaX/1VP1Q7a111TKdLEheFHT7Kl4XkAGtmIsd1Y1 2df2uVRnUeycwdxTbUzIyPDNZfA1tFo28w2XxQf7jC+H7cycykcIoMUfvUzCsGkKNX JKsaZkqjxcL1Q== From: Maxime Ripard Date: Wed, 12 Aug 2026 14:57:03 +0200 Subject: [PATCH RFC v2 8/9] drm/atomic: Allow filling a commit with pristine object states Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260812-drm-reset-state-flag-v2-8-e96ce13317dd@kernel.org> References: <20260812-drm-reset-state-flag-v2-0-e96ce13317dd@kernel.org> In-Reply-To: <20260812-drm-reset-state-flag-v2-0-e96ce13317dd@kernel.org> To: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter Cc: Daniel Stone , Harry Wentland , Jocelyn Falempe , =?utf-8?q?Jonas_=C3=85dahl?= , =?utf-8?q?Michel_D=C3=A4nzer?= , Pekka Paalanen , Sebastian Wick , Simon Ser , Victoria Brekenfeld , Xaver Hugl , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Maxime Ripard X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=6257; i=mripard@kernel.org; h=from:subject:message-id; bh=QXo8kfkdi1Va2xyrt9RHIacabxzIOzzz0ldfCjJ0/Xg=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDFk1uXOZXi9+mBxy4Wvb3iL+y1s2PF3yU5rvt6vblfArd hc6Ytf/6JjKwiDMySArpsjyRCbs9PL2xVUO9it/wMxhZQIZwsDFKQATqS9gbOiqO1q57pvNk+1z nDeY6JX+WZR9W2yD3tvIvqtL7vOv7Xp57nX5tgvir7r8FjAKBn+XqmJsuHAuVG5X6v8O44CviQe uuNkduCA0f9L5jR3hFjpSH1byJHe9Xl0+z3KW6bNvoo2p++WkAA== X-Developer-Key: i=mripard@kernel.org; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D The upcoming DRM_MODE_ATOMIC_RESET flag will need to create an atomic commit that brings the entire device back to a pristine state, as if no configuration had ever been applied. Create drm_atomic_commit_fill_with_defaults() which iterates over all CRTCs, planes, connectors, and color operations in the device and inserts a fresh default state for each one into the commit. This uses the atomic_create_state() hooks rather than atomic_duplicate_state(), since atomic_create_state() provides exactly this pristine state on a per-object basis. Signed-off-by: Maxime Ripard --- drivers/gpu/drm/drm_atomic.c | 121 +++++++++++++++++++++++++++++++++++++++= ++++ drivers/gpu/drm/drm_ioctl.c | 1 + include/drm/drm_atomic.h | 1 + 3 files changed, 123 insertions(+) diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c index d8251447e44a..d5ac10dd3148 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c @@ -1657,10 +1657,131 @@ bool drm_atomic_can_create_state(struct drm_device= *dev) =20 return true; } EXPORT_SYMBOL(drm_atomic_can_create_state); =20 +/** + * drm_atomic_commit_fill_with_defaults - populate a commit with pristine = states + * @commit: atomic commit to fill + * + * Iterate over all CRTCs, planes, connectors, and color operations in + * the device and insert a freshly created default state for each one + * into @commit. The states are created through the atomic_create_state() + * hooks, producing the same initial state the driver starts with rather + * than a copy of the current hardware state. + * + * This is meant to be used with the %DRM_MODE_ATOMIC_RESET flag, which + * needs to bring the device back to a known baseline before applying + * userspace property changes on top. + * + * Returns: + * 0 on success, or a negative error code on failure. + */ +int drm_atomic_commit_fill_with_defaults(struct drm_atomic_commit *commit) +{ + struct drm_device *dev =3D commit->dev; + struct drm_mode_config *config =3D &dev->mode_config; + struct drm_crtc *crtc; + struct drm_plane *plane; + struct drm_connector *connector; + struct drm_connector_list_iter conn_iter; + struct drm_colorop *colorop; + int ret; + + WARN_ON(!commit->acquire_ctx); + + if (!drm_atomic_can_create_state(dev)) + return -EOPNOTSUPP; + + /* + * Private objects are ignored because none have userspace + * properties we might want to reset. atomic_check + * implementations will derive or infer there private obj state + * from the state that will end up being committed anyway. + */ + drm_for_each_colorop(colorop, dev) { + struct drm_colorop_state *colorop_state; + + colorop_state =3D drm_atomic_helper_colorop_create_state(colorop); + if (IS_ERR(colorop_state)) + return PTR_ERR(colorop_state); + + drm_modeset_lock_assert_held(&colorop->plane->mutex); + + ret =3D drm_atomic_commit_set_colorop_state(commit, colorop, colorop_sta= te); + if (ret) { + drm_colorop_atomic_destroy_state(colorop, colorop_state); + return ret; + } + } + + drm_for_each_plane(plane, dev) { + struct drm_plane_state *plane_state; + + ret =3D drm_modeset_lock(&plane->mutex, commit->acquire_ctx); + if (ret) + return ret; + + plane_state =3D plane->funcs->atomic_create_state(plane); + if (IS_ERR(plane_state)) + return PTR_ERR(plane_state); + + ret =3D drm_atomic_commit_set_plane_state(commit, plane, plane_state); + if (ret) { + plane->funcs->atomic_destroy_state(plane, plane_state); + return ret; + } + } + + drm_for_each_crtc(crtc, dev) { + struct drm_crtc_state *crtc_state; + + ret =3D drm_modeset_lock(&crtc->mutex, commit->acquire_ctx); + if (ret) + return ret; + + crtc_state =3D crtc->funcs->atomic_create_state(crtc); + if (IS_ERR(crtc_state)) + return PTR_ERR(crtc_state); + + ret =3D drm_atomic_commit_set_crtc_state(commit, crtc, crtc_state); + if (ret) { + crtc->funcs->atomic_destroy_state(crtc, crtc_state); + return ret; + } + } + + drm_connector_list_iter_begin(dev, &conn_iter); + drm_for_each_connector_iter(connector, &conn_iter) { + struct drm_connector_state *connector_state; + + ret =3D drm_modeset_lock(&config->connection_mutex, commit->acquire_ctx); + if (ret) { + drm_connector_list_iter_end(&conn_iter); + return ret; + } + + connector_state =3D connector->funcs->atomic_create_state(connector); + if (IS_ERR(connector_state)) { + drm_connector_list_iter_end(&conn_iter); + ret =3D PTR_ERR(connector_state); + return ret; + } + + ret =3D drm_atomic_commit_set_connector_state(commit, connector, connect= or_state); + if (ret) { + connector->funcs->atomic_destroy_state(connector, connector_state); + drm_connector_list_iter_end(&conn_iter); + return ret; + } + } + drm_connector_list_iter_end(&conn_iter); + + return 0; +} +EXPORT_SYMBOL(drm_atomic_commit_fill_with_defaults); + /** * drm_atomic_add_encoder_bridges - add bridges attached to an encoder * @state: atomic state * @encoder: DRM encoder * diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c index e2df4becce62..8a1ccb8932bf 100644 --- a/drivers/gpu/drm/drm_ioctl.c +++ b/drivers/gpu/drm/drm_ioctl.c @@ -31,10 +31,11 @@ #include #include #include #include =20 +#include #include #include #include #include #include diff --git a/include/drm/drm_atomic.h b/include/drm/drm_atomic.h index 7dc26e3da65c..b60f67619bfa 100644 --- a/include/drm/drm_atomic.h +++ b/include/drm/drm_atomic.h @@ -701,10 +701,11 @@ int drm_crtc_commit_wait(struct drm_crtc_commit *comm= it); struct drm_atomic_commit * __must_check drm_atomic_commit_alloc(struct drm_device *dev); void drm_atomic_commit_clear(struct drm_atomic_commit *state); =20 bool drm_atomic_can_create_state(struct drm_device *dev); +int drm_atomic_commit_fill_with_defaults(struct drm_atomic_commit *commit); =20 /** * drm_atomic_commit_get - acquire a reference to the atomic state * @state: The atomic state * --=20 2.55.0 From nobody Mon Aug 24 20:40:38 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 272ED446052 for ; Wed, 12 Aug 2026 12:57:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786539450; cv=none; b=i9Olns8Jo3VzDzSV5orDpfGUP70T8YEbq/r1mpAa4KL4LUBYcgQjgkoZDCUjmBpUmLtir82vgN4vazt2n7d94nT9qFqGPPzsRzhZ2lw/sYZ4z9i+/44x3i6EwXD7tF9u/buJm7msvCVM7yNyivY1EFVbRTz2J/g9abSc0YEtcX0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786539450; c=relaxed/simple; bh=Ub0XVyTsCEW6p5sLqcnyzHN1/fhjxjvpt306j2KiEOg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kq5yIYcwfELSTGo3APo9TI1DbIhzTu2YcplWFYcqeOhxR5SswaXNVwpZhTxRgT8XJOakYceCb7lAW/Wz+s7MjL5/Rj3/OtgTcRFNIjX5himEOVFyLQvIyQRjZ2gQtIwoKUsWs3BqXCzYz3hR+uzO/Jdl65TMA2/eFRTC3aIhT6U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=AhE8Illd; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="AhE8Illd" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2C9151F00A3A; Wed, 12 Aug 2026 12:57:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786539446; bh=DnPFTOt0tndqJDX1gz+DDeONsWROJPsH75wddqa7RwE=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=AhE8IlldKPWV8wmAlP9LNl6q+UXdgkL4LfooF/o9f4COcN5NssI+cg7e1DABDIi9o jfFOWHCPJ/VVbqRuqdhcVsyk5tUx4r/dqIFB4bAIm243VMWZukErIyrP+yv78PY5kQ 4uXA4g3g8DDi7hEZZ3ZrZUeaN2TFL3mAoUOyUDKApCtopKwpLyCBAMMNEXYgoyz6NK 7m4Rmq5ucx5LbvrGNGxtBt9XrqWsTXtnw6JECh2t5cEHRRruT4Q46xr3+mNtp5G0wg mxA7JBwdpX/F5h3rCwWGrLY/jZHxPu7HKS88LttYdGZMsmLlUy4RCZ+jrdRDWKLqlS asKF29Y0IlMpw== From: Maxime Ripard Date: Wed, 12 Aug 2026 14:57:04 +0200 Subject: [PATCH RFC v2 9/9] drm/atomic-uapi: Add DRM_MODE_ATOMIC_RESET flag Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260812-drm-reset-state-flag-v2-9-e96ce13317dd@kernel.org> References: <20260812-drm-reset-state-flag-v2-0-e96ce13317dd@kernel.org> In-Reply-To: <20260812-drm-reset-state-flag-v2-0-e96ce13317dd@kernel.org> To: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter Cc: Daniel Stone , Harry Wentland , Jocelyn Falempe , =?utf-8?q?Jonas_=C3=85dahl?= , =?utf-8?q?Michel_D=C3=A4nzer?= , Pekka Paalanen , Sebastian Wick , Simon Ser , Victoria Brekenfeld , Xaver Hugl , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Maxime Ripard X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=6104; i=mripard@kernel.org; h=from:subject:message-id; bh=hKVb0fz+IZAsP57og4Z9AHoGfiNKGsvTwQ0y/0S8x3o=; b=kA0DAAkTJ1/OGaI9vnYByyZiAGp8bZ6gcIOsDGJsQTwFWthw/+RfYJkX6TUphRlC3lfwHyBX1 4iVBAATCQAdFiEE5BxWy6eHo3pAP6n4J1/OGaI9vnYFAmp8bZ4ACgkQJ1/OGaI9vna+KAF/bVLg HKpEf2b6cxggrUhs1riyDkZ7qL9wcysOQJBEK34Qa/hviS1gKN4JN+Rqly5MAX9KFJbWQpBg4Sw z8QLlcWzfJCarkwz4DyA1rRRZ2JdFJOrs/0fOtYsI4loAxv+X0jk= X-Developer-Key: i=mripard@kernel.org; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D From: Sebastian Wick Userspace currently has no atomic way to reset all KMS object states to their defaults. To bring a display pipeline to a known state, a compositor must explicitly set every property on every object, which requires tracking which properties exist and what their defaults are. Introduce DRM_MODE_ATOMIC_RESET (0x0800) which, when passed to the atomic ioctl, fills the commit with default states for all KMS objects before applying the properties supplied in the request. Properties not explicitly included in the commit remain at their defaults (CRTCs inactive, planes disabled, connectors unbound, and so on). The flag cannot be combined with DRM_MODE_PAGE_FLIP_ASYNC, since a full state reset is incompatible with an async flip. Signed-off-by: Sebastian Wick Co-developed-by: Maxime Ripard Signed-off-by: Maxime Ripard --- drivers/gpu/drm/drm_atomic.c | 3 +++ drivers/gpu/drm/drm_atomic_uapi.c | 13 +++++++++++++ drivers/gpu/drm/drm_ioctl.c | 3 +++ include/uapi/drm/drm.h | 10 ++++++++++ include/uapi/drm/drm_mode.h | 14 +++++++++++++- 5 files changed, 42 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c index d5ac10dd3148..848917bea75e 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c @@ -1621,10 +1621,13 @@ EXPORT_SYMBOL(drm_atomic_get_new_bridge_state); * the current state. * * Color operations are not checked because they always use * drm_atomic_helper_colorop_create_state() and do not have a per-driver h= ook. * + * This is used to report the %DRM_CAP_ATOMIC_RESET capability to userspac= e, + * and as a precondition in drm_atomic_commit_fill_with_defaults(). + * * Returns: * True if all objects implement atomic_create_state, false otherwise. */ bool drm_atomic_can_create_state(struct drm_device *dev) { diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic= _uapi.c index 1050dddadb17..cdcc6efb9a00 100644 --- a/drivers/gpu/drm/drm_atomic_uapi.c +++ b/drivers/gpu/drm/drm_atomic_uapi.c @@ -1658,10 +1658,17 @@ int drm_mode_atomic_ioctl(struct drm_device *dev, drm_dbg_atomic(dev, "commit failed: page-flip event requested with test-only commit\= n"); return -EINVAL; } =20 + if ((arg->flags & DRM_MODE_ATOMIC_RESET) && + (arg->flags & DRM_MODE_PAGE_FLIP_ASYNC)) { + drm_dbg_atomic(dev, + "commit failed: reset cannot be combined with async flip\n"); + return -EINVAL; + } + state =3D drm_atomic_commit_alloc(dev); if (!state) return -ENOMEM; =20 drm_modeset_acquire_init(&ctx, DRM_MODESET_ACQUIRE_INTERRUPTIBLE); @@ -1673,10 +1680,16 @@ int drm_mode_atomic_ioctl(struct drm_device *dev, copied_objs =3D 0; copied_props =3D 0; fence_state =3D NULL; num_fences =3D 0; =20 + if (arg->flags & DRM_MODE_ATOMIC_RESET) { + ret =3D drm_atomic_commit_fill_with_defaults(state); + if (ret) + goto out; + } + for (i =3D 0; i < arg->count_objs; i++) { uint32_t obj_id, count_props; struct drm_mode_object *obj; =20 if (get_user(obj_id, objs_ptr + copied_objs)) { diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c index 8a1ccb8932bf..31e5c42bb020 100644 --- a/drivers/gpu/drm/drm_ioctl.c +++ b/drivers/gpu/drm/drm_ioctl.c @@ -303,10 +303,13 @@ static int drm_getcap(struct drm_device *dev, void *d= ata, struct drm_file *file_ break; case DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP: req->value =3D drm_core_check_feature(dev, DRIVER_ATOMIC) && dev->mode_config.async_page_flip; break; + case DRM_CAP_ATOMIC_RESET: + req->value =3D drm_atomic_can_create_state(dev); + break; default: return -EINVAL; } return 0; } diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h index bc7ef7684099..b6e2f2edd122 100644 --- a/include/uapi/drm/drm.h +++ b/include/uapi/drm/drm.h @@ -793,10 +793,20 @@ struct drm_gem_change_handle { * If set to 1, the driver supports &DRM_MODE_PAGE_FLIP_ASYNC for atomic * commits. */ #define DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP 0x15 =20 +/** + * DRM_CAP_ATOMIC_RESET + * + * If set to 1, the driver supports the &DRM_MODE_ATOMIC_RESET flag in + * &DRM_IOCTL_MODE_ATOMIC commits. When supported, userspace can pass that + * flag to reset all KMS object states to their defaults before applying + * property changes. + */ +#define DRM_CAP_ATOMIC_RESET 0x16 + /* DRM_IOCTL_GET_CAP ioctl argument type */ struct drm_get_cap { __u64 capability; __u64 value; }; diff --git a/include/uapi/drm/drm_mode.h b/include/uapi/drm/drm_mode.h index bd435effdcee..43024028f695 100644 --- a/include/uapi/drm/drm_mode.h +++ b/include/uapi/drm/drm_mode.h @@ -1314,10 +1314,21 @@ struct drm_mode_destroy_dumb { * To the best of the driver's knowledge, visual artifacts are guaranteed = to * not appear when this flag is not set. Some sinks might display visual * artifacts outside of the driver's control. */ #define DRM_MODE_ATOMIC_ALLOW_MODESET 0x0400 +/** + * DRM_MODE_ATOMIC_RESET + * + * Reset all KMS object states (CRTCs, planes, connectors, color operation= s) + * to their default values before applying the properties in this commit. + * Properties not explicitly included in the commit will remain at their + * defaults (CRTCs inactive, planes disabled, connectors unbound, etc.). + * + * This flag cannot be combined with &DRM_MODE_PAGE_FLIP_ASYNC. + */ +#define DRM_MODE_ATOMIC_RESET 0x0800 =20 /** * DRM_MODE_ATOMIC_FLAGS * * Bitfield of flags accepted by the &DRM_IOCTL_MODE_ATOMIC IOCTL in @@ -1326,11 +1337,12 @@ struct drm_mode_destroy_dumb { #define DRM_MODE_ATOMIC_FLAGS (\ DRM_MODE_PAGE_FLIP_EVENT |\ DRM_MODE_PAGE_FLIP_ASYNC |\ DRM_MODE_ATOMIC_TEST_ONLY |\ DRM_MODE_ATOMIC_NONBLOCK |\ - DRM_MODE_ATOMIC_ALLOW_MODESET) + DRM_MODE_ATOMIC_ALLOW_MODESET |\ + DRM_MODE_ATOMIC_RESET) =20 struct drm_mode_atomic { __u32 flags; __u32 count_objs; __u64 objs_ptr; --=20 2.55.0