From nobody Mon Jul 27 19:39:21 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 AC9A2409286 for ; Wed, 8 Jul 2026 16:08:54 +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=1783526936; cv=none; b=LEjfzxrqNJGh6v+FGNA0Ui8ROTGlGHn8V0tWB6OGCP3SfubLQb2REJKmjivNv31ojIymLqAYzZfxweShs3vWsVfteUKHLbEmLgQqUVfA9arYmtY1m3xTBPLKRcdInTNw1SGgvOERAK8hEh2P/ChldiSmiT/eHpeu2eTA6HsEJyE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783526936; c=relaxed/simple; bh=9PtCPj01wJRDN2U3FHhpuJ1zKvRXV7fetbVHLeFTn/Q=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=iOce0Dchh26X14njQPUQ4QvTcu4Br2AqIWxNa00Lt/1IGRzeJD9p/6jjpw+MitVco+Qtm59LQFA2RtBEriDy0dLrr0nx9phjtAIWbDmTQmo7sRFiCvl2YfcF2QqaX1gll2TvGH6A8wWMnBPQfhRvoeINu2GdLZq+P3hzefvlPcc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=XiBgQMro; 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="XiBgQMro" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 12CEB1F000E9; Wed, 8 Jul 2026 16:08:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783526933; bh=e9LVHQLg2+1ZYF7HK39eNc1XiMoRnpg1/B77Df6e5F4=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=XiBgQMrocfSxsEfqZYfNFTXjSDqS3eoO7P3sXs6lH1ayX47oXUH5ZuJDVzhYY21oY h/Ch5zuBUTXJv3vvCini4F3+aTDJ04/H7Ea55o80Eqn/vjwxkdRnKobx/3u0dFEzUu MK9R+Og/tETuE/9zliyfdZlgaHfx+jgGWgO9/A/3AnlulAjSx/Gss6CFBWlNabwpOw ZvRh1Edvjo7yWdUrS8LEvLvf2TU+8aCBAXfI+4boAsBetgrHaeeSyINa+TuzCjBZ8g ukBMYdVU3INDqUS+6JOY5nl1dmwUAdWymvmgjyjhZ7SARyNMEKTplcOAOQ9DGBxC2w 2MQeFLa82MFow== From: Maxime Ripard Date: Wed, 08 Jul 2026 18:08:38 +0200 Subject: [PATCH RFC 1/8] 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: <20260708-drm-reset-state-flag-v1-1-c37dc985485d@kernel.org> References: <20260708-drm-reset-state-flag-v1-0-c37dc985485d@kernel.org> In-Reply-To: <20260708-drm-reset-state-flag-v1-0-c37dc985485d@kernel.org> To: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter Cc: Daniel Stone , Harry Wentland , =?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=3248; i=mripard@kernel.org; h=from:subject:message-id; bh=9PtCPj01wJRDN2U3FHhpuJ1zKvRXV7fetbVHLeFTn/Q=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDFl+Zby9IWs7uYQPGPfLfZftsHeR6M8Sd7teuUX4qERO0 74VItM6prIwCHMyyIopsjyRCTu9vH1xlYP9yh8wc1iZQIYwcHEKwERSNzJWs6w6MX/r/cJ/Ra+f eYavCDm4nHnhQYMfwh7bVkUbXOU+0bNjAwujRRtb+4y/T3a2cwgyMjYsjWZS1F1zvOSqKpdNQ6j oeZOChYsW2U9w27Ah5l2RbMO7gAWPvCSUJpRwuWUUTZE8nAEA 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 | 4 ++-- drivers/gpu/drm/drm_atomic_helper.c | 2 +- include/drm/drm_atomic.h | 18 +++++++++++++++++- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c index 735ab7badc2e..4bc6bdfb6f1f 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++) { 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.54.0 From nobody Mon Jul 27 19:39:21 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 E8F73409266 for ; Wed, 8 Jul 2026 16:08:56 +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=1783526939; cv=none; b=uFzcMMU/WDPfx7ENREmI3bm326tU4+MjpKLNbrIRuOyDcu+Lm40Ydw3oqAsx+obnYoAHspOq9/pdhPTXaofl61kFq5sccKKS72/knZF4uPsW6N5j547PzqAnW4UHWstaJZq5MQDJeD0vaFnRPqmRGYqfUWi3yjOjea3f0/LKWwE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783526939; c=relaxed/simple; bh=wOVtouWGdtNmWGRK3f216LfqS94uyTD5akEfZ5+fI2E=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=K26z1zPsgWyhHF/e9jhlOMswWk/5AvxMp3hYf56fNOllmdF37EeYp+onbtsITJBDxfi+4Fru9OcAl1TT4NioPUY+npZyojZXtY8oIJ9B9DfdxXVo9r0Io4pNtERXLkcs9W2NrVJOWUUAjT2D+C5iJANkm5wUSKnyAiiub3cvUdU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=c0SW3IKI; 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="c0SW3IKI" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 68C101F00A3A; Wed, 8 Jul 2026 16:08:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783526935; bh=E9Sam0F4kzLWsvElF0u6Eym/SDV5PThJcikxmfCmf6I=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=c0SW3IKIGPT4FdQb7gKYt8ACj6t1bvj3i812dH2JZMAxSjBBR00bjSlMheT4KtKk9 PDmRCGkH25FtjhelzEZ6oM+NJQzVng+ig6s4LaAxUjLhg8CwTl/heIfI6G0n5Bo3b3 gWuXwgJmgb2r4faTmULdvB1YBb6LX3ZWfUP8lt1K5z27n48Pn1IhyOjBpDrbSAcNht foEiiEHsas5OoJ8IuBkmRGiLw6gSJxxVxb7kHj1CixAshi5slVGTHquaQ8MnpnkZXr PCXQoO3NGGJxBJ9vVek0x4VQk0dRDGedh4HBtQWc3r1Kn6cbGQeF7E6RKDmO5sZIcH lM490lRTgyScA== From: Maxime Ripard Date: Wed, 08 Jul 2026 18:08:39 +0200 Subject: [PATCH RFC 2/8] 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: <20260708-drm-reset-state-flag-v1-2-c37dc985485d@kernel.org> References: <20260708-drm-reset-state-flag-v1-0-c37dc985485d@kernel.org> In-Reply-To: <20260708-drm-reset-state-flag-v1-0-c37dc985485d@kernel.org> To: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter Cc: Daniel Stone , Harry Wentland , =?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=wOVtouWGdtNmWGRK3f216LfqS94uyTD5akEfZ5+fI2E=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDFl+Zbz88eVf/BwdWBp2T263jP3wVZrr7NL29ABXJ6YFz 7Skzj7rmMrCIMzJICumyPJEJuz08vbFVQ72K3/AzGFlAhnCwMUpABPRPMdYp/NyW45Z45bb19ev 0pvk8WJ3errT6ceqr4yms8zsNGY8JNEqKO3CGct0xdt+wcn3N0NfMlYx+/hfCbkY8KpsefzHxtu i254+8p779LdPpnOTyf+0Y6o/4pyvbEgw6np1/iDPgpfzPx4AAA== 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 4bc6bdfb6f1f..4ffe5147ab16 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.54.0 From nobody Mon Jul 27 19:39:21 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 A941741CB55 for ; Wed, 8 Jul 2026 16:08:58 +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=1783526940; cv=none; b=VjeXs5fT1ONm24p7ZP85zbTlD0BPVNGSdNtaa1huet+cKuOMVv2wxbDhnI7JVoiti9YokHD/BGG8iWUIHNhqKFj1CuAPuD4Jnpl/s2iVxuo8au926mVcAsNq4yIFex5VjLwnjnsrK/YPGspOdwR5jLR8QsFu7EIsXahyGKcTLhw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783526940; c=relaxed/simple; bh=+m3EkhPCSKnDM62Sj8VCyS0IMXT5OeoiJOPJ7/JI43k=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=YRrx+UelXPIFHHJrkWF9m7fLz1/gmY8osrZoHF9ij4smXH6ahGRKXgg4iSmkDjUD6wpcFg55dS4Z1XYtCqMvKDWjDFWyNxRDAkZ2B0xgvbKBLBRI9BwFP7pVUUpa0ID/BuaNBoU3qypOzMhWJCT/JE3oJ1plUbOwlpWFbWCwIh0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=aICbbck2; 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="aICbbck2" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C0A251F000E9; Wed, 8 Jul 2026 16:08:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783526938; bh=gKSeSbYXgSfM92sgbcX2oAZv75cRfJIEeGO45LS1JR4=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=aICbbck2G1ogn4pOF0EQLv0ASmJTLd3TQEwWdDD/zf3LKbjwoKYhEcNmgeNE0zGFg 77AowNjgTCYW/lu/lFnmrhTDMBw+SUeRq8Ja+T03VA2aN4r7cpkPOVZPjnCxGdExBd AsIGUzwGNWtjBlzLFXtpJ0k4gIUnK5TPyInNFflk54XCk61u7E1sH+/ReUHU7m4F9h iK60u80ccIADb1CYMjiHY11uLKXGZ4XYaI+q5IHvA8PI3Y2C+A0p7/jNI0amO4Isgo Eg7W2WD0Ndc2fjA9bdLwyaPep5chjPmOSP4g9qIVuvsnWTkJ6wi9Iz/fAX9ILhYwi7 W/E6yMmzBMqEA== From: Maxime Ripard Date: Wed, 08 Jul 2026 18:08:40 +0200 Subject: [PATCH RFC 3/8] 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: <20260708-drm-reset-state-flag-v1-3-c37dc985485d@kernel.org> References: <20260708-drm-reset-state-flag-v1-0-c37dc985485d@kernel.org> In-Reply-To: <20260708-drm-reset-state-flag-v1-0-c37dc985485d@kernel.org> To: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter Cc: Daniel Stone , Harry Wentland , =?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=+m3EkhPCSKnDM62Sj8VCyS0IMXT5OeoiJOPJ7/JI43k=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDFl+ZXyiq4z59y8u3Pbe5H9PyfXvU7Yp/L/+5Qan4+aMo +F3rv5Z1TGVhUGYk0FWTJHliUzY6eXti6sc7Ff+gJnDygQyhIGLUwAmsqGMseHYtfqJ97v7ciue b1h7VFTxQtakadf6q/bqHjt66ZnenX/X1Vpulq5mKtW4funo6r7T7i8YG1Y7mHM1ZjbIbi/yDKm 9XvfjbfZZ2Wz21odyE3r2TP115oCpxf5L0rfYTZISjAyPNd6WBgA= 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 4ffe5147ab16..56542494ab56 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.54.0 From nobody Mon Jul 27 19:39:21 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 00C65409286 for ; Wed, 8 Jul 2026 16:09:00 +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=1783526942; cv=none; b=g6p4GIfT8MGOA+Q0zFgUCckQjj/TM2fR9TYkqMefjKov61VfqyYM9jdmAjNCgDPJL8B2RM1h31OSJ6xQIrCSs7OMl1pb1IXw2pRXiHOeUzIU6CrJN4/dgdacBz7c6TN9YFKOxgSdZh8PK9LuzeO5iDUkmMp6TIr8eV0OiwTxjE8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783526942; c=relaxed/simple; bh=fttxGMVBGL07n7oY5tNcqwsyIoOf7c4O1B/Bmytm3Sg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ZuJ0u/AMnx7dtVbjViPSt0jaRsKiowlzAsiuBmak+w2rm7K6ySI8qK2BnmIwhjeoFnAMmeafUzbAvtfYkNMB4c0ERn7fqH911+1HLiyD+CHVdCKJWr8diOygOSG3kkGof7sT+LNK5+0crG+zFMBgpPy/5QqnrAt8yTzofxKHRtQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Ypuuk+gP; 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="Ypuuk+gP" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 249B11F000E9; Wed, 8 Jul 2026 16:08:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783526940; bh=JkCB/yLDgCMXGjeHTwMFtk2LLys1f8LzwWd7x1TS8IE=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=Ypuuk+gPb5o8Sv70XfHcdhwffvMYRZMDCKVDLKTizFl0H5Czb6KaM9pqg8seJitys iJervuAtVAMQ7rshCWjMVvuhAv/VNsTfrK2TUgexa7d7NI7OUjG6OQRaMp/mcWSHNH c2oi1gMLQho/TJIK4/t8jZIv5z0Ut6El4934uE0DKWt83Hc1Pg9xzuOJptPEr7ZV+0 UsIl0QOXEkwRXhxMnbPn4Ha9Ga6InTS5Q9Tk5T4cLMZd8JVwlV/xHpgHm/pTSwQNzL +Ni74rwd01+omNfh0TBlJfwvaJ6nPi8Nk5jLlkywKMbGxnYilRjxH93eoBgGhRNL7z d07YPrYWaoW5A== From: Maxime Ripard Date: Wed, 08 Jul 2026 18:08:41 +0200 Subject: [PATCH RFC 4/8] 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: <20260708-drm-reset-state-flag-v1-4-c37dc985485d@kernel.org> References: <20260708-drm-reset-state-flag-v1-0-c37dc985485d@kernel.org> In-Reply-To: <20260708-drm-reset-state-flag-v1-0-c37dc985485d@kernel.org> To: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter Cc: Daniel Stone , Harry Wentland , =?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=2961; i=mripard@kernel.org; h=from:subject:message-id; bh=fttxGMVBGL07n7oY5tNcqwsyIoOf7c4O1B/Bmytm3Sg=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDFl+ZXwxSxpniaRMvMHVXzVrmqVu2ENV8cQj+2zkw1iKR KJ/BE3tmMrCIMzJICumyPJEJuz08vbFVQ72K3/AzGFlAhnCwMUpABN59pmx4ay8RJbTgv1865Ln 3c9x62FcNUM4bFVlxpWAuXvC6gKOR/bvy1VaUPph9hvdmF2LvUsSGOuzyt40dFoUaf3nvN9W9PJ TxZbXLgEL2U5OZ0pd+1qnqM9YWc/NWopxnjNHmNHy9dsZ4gE= 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 56542494ab56..f006de9b7263 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 =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.54.0 From nobody Mon Jul 27 19:39:21 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 50CE042DA43 for ; Wed, 8 Jul 2026 16:09:03 +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=1783526944; cv=none; b=c6dl9DCZkhNayG+SnDH76uC6jGXvSzGk75D9jj3WxBoIZ/VE8wl89EQlulEzy15uJaW0tumkvacsO3guOy4wColvwUj6rVccHl6I3O19/7fGQt0jYRZILeTn0gpXJwU6rKXpKyB2tYsI+4NfNTYDy+AvU4vDjR3mcVFhAN++TVA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783526944; c=relaxed/simple; bh=tFHqYNW5dmxUwonpBjXRaJzyfHwYkrZ5+BMI6moJfLo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TALHMq7Sh6ZzS7Kl7tyr9dDv5+raKJwfic4tpfFx5/A2mn47/4lto7f0uLk1E4U4ZuImFdR82HKt29jLHEOnFn+YS9VeiOtMANevJKl5hPH4zhZ0YDIbpH+ZFJTqY7ganYxyMHIBMXabPCrb+SAle/qpN6Zd2KOrk1geyvFrJ+I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=bYkqo2SJ; 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="bYkqo2SJ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7BE371F000E9; Wed, 8 Jul 2026 16:09:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783526943; bh=bJhaJGOcpd7DYv+YzWF0KEhFbZbraRFxmpqaLW2Zs+Y=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=bYkqo2SJkTlhpj1jdzLRG1pWyO2OPkX8z8qzygof5WyYHNeJLq8CdepI5/Wp7U5cP JODXT8v6LFBghYDbnK7qwne11SiiFZptVmjL11MMWcLAFmzmncPUjFRzlrBBE7aKLa 67OdEAVCxssyiZjD0DLUqgecViw602Hwgkbk63TXkVj8J7+yrrcz2JQF4+jho7mM+Q ATa1kwo7v32ZMRyqoxaYWw82sv7Wil6UJ5V+MXrojLRr0zm//qMoshvH2JEt0O280Q 5HvSv6Wt1zyAlVPvk8676bIA2EApXHJBpMsAt56SrZkLVV6qet3eJOqDamKBSng67J 4wYYLWMO/iuUw== From: Maxime Ripard Date: Wed, 08 Jul 2026 18:08:42 +0200 Subject: [PATCH RFC 5/8] 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: <20260708-drm-reset-state-flag-v1-5-c37dc985485d@kernel.org> References: <20260708-drm-reset-state-flag-v1-0-c37dc985485d@kernel.org> In-Reply-To: <20260708-drm-reset-state-flag-v1-0-c37dc985485d@kernel.org> To: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter Cc: Daniel Stone , Harry Wentland , =?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=tFHqYNW5dmxUwonpBjXRaJzyfHwYkrZ5+BMI6moJfLo=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDFl+ZfwHj5z8dfbMMtWowNPLLc9suW7B/J6r4NuyqsrFC lZvdKfbdkxlYRDmZJAVU2R5IhN2enn74ioH+5U/YOawMoEMYeDiFICJsK1ibJi7/vRiq9vfuLJM u183vrruMCN9wro/s/1VakR05m+X/MC5K+TNtvT5V6Z8Mzr3KYzlwQbGWvEVqs0ZTk+WLYm5f+1 yhcbPonATX6b+oEN1SzO08/ZvDOztPTTj9IS0XTYiUxykrQ4+AgA= 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 f006de9b7263..d4dcab2d851c 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.54.0 From nobody Mon Jul 27 19:39:21 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 BE36341CB55 for ; Wed, 8 Jul 2026 16:09:05 +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=1783526946; cv=none; b=aygE/lwNgcerwslcpwuj1Y5KpdqHRrHfCgDDjA5PdhN5KA07NSSvTCQihsWTjzieKP4YSC0BkGSadjCVBHWxlgw/GXt3AwikfGURk9AGr/Q6AgxoU00Ip3xqD4wnNuMdu0GJGr81mblgNq9fy2fuzoiNv/o0Gl/hRK1DcWknpLA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783526946; c=relaxed/simple; bh=G+HVYHInY7UyUBvxRjBWcTIdkFXetkDN+/ALC9mefto=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=THsNP1Hvdr7HH7Pp1PGi1LykqQEAjBgH17z6WrJBcoSBrMpavZqKhxIN7g2Q4x+xUHCgeyYu6kqHsbgnRYDw0F0/10oJi0F6/51jbo4eAMRYoXRg206qHeBWYInILFqju2EIUx3duTJT63NFb4pVXER3E6QMx2yalcxH12aQeNg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=IHtSYZeb; 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="IHtSYZeb" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D0B3E1F000E9; Wed, 8 Jul 2026 16:09:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783526945; bh=XBNlzrm2VUnzVBrb3FW1lerts2iFVkqleFLxdiQpBp4=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=IHtSYZebmnZw11RU2iJ+M8pdzcQvKUU1dDyDEX/Qox+08aS6llFDeufE5JBj0PKQm wIldvovdnAr8U5TBzIPDCBhGhhC/U2OJzKFStsDTLp8VJtQ74VSy8nOAKUXpCvt3hw zWbhFgma0d63TQBikyzYl+BNo8QiWNTavYnhh18edBZy3cw9+mA+sgzBmdHolVU6Y7 2cjLS1RUSdeK+UIXsPNjxFpk6UPAZhno2YIPXnBd94omfEreWiTgSSjuQbWDJ2A5Mq WSDG0QOGJoLUChRLfMEQNuliKhnZeOYOz65Hg2oWZAClItEVz2nW120NKRP41Dcfju csuX8exd1xGTw== From: Maxime Ripard Date: Wed, 08 Jul 2026 18:08:43 +0200 Subject: [PATCH RFC 6/8] 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: <20260708-drm-reset-state-flag-v1-6-c37dc985485d@kernel.org> References: <20260708-drm-reset-state-flag-v1-0-c37dc985485d@kernel.org> In-Reply-To: <20260708-drm-reset-state-flag-v1-0-c37dc985485d@kernel.org> To: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter Cc: Daniel Stone , Harry Wentland , =?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=G+HVYHInY7UyUBvxRjBWcTIdkFXetkDN+/ALC9mefto=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDFl+ZfzJYs0i7LdZRNZEnXlUMIFptYXgJ+d+6zwevsVWO 7fOnHu5YyoLgzAng6yYIssTmbDTy9sXVznYr/wBM4eVCWQIAxenAEyEYxtjfcDy5A/92RYiy+Uv bxNS+nPxCZforas/1ndPtnBzb4n0/eg1xTZu6y1xn9Z3P4qqa2/9Y2xYc3nNxr4ly/Y4ercw8qw Pn39XJpzhOf+3pRt9ipQMvqh5VO0xEHwUrurAdN07MrdxaRIA 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 d4dcab2d851c..79971d4b56a4 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.54.0 From nobody Mon Jul 27 19:39:21 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 27DE741CB5F for ; Wed, 8 Jul 2026 16:09:07 +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=1783526949; cv=none; b=a7litu9hpq7G+ONQYX+R3mTbTK3o4q3R2+pzI7sAQI14GLEyrlFa0G02wVryx/6BfACcidHwOlVlRfqKvNvpIRoUnD02CBPrgMVkFZc7k/YUlZxo4tUhv+vJpYC2bL/QDs4912wYpERjMgkt6IlOYjA5gY4ommUuPcBeytC5lJQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783526949; c=relaxed/simple; bh=9RtrZGE8urQnrwFN3M6gM+69Wju578sX02RNNOhvr6k=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TVGs7ddQSGIhwNscatLaCyjKElvKzZHQr7H8VdML0nP7pXN7ZL5WH7qqUuQw/OvTPqp4d1gkezPkC2f64oKR9ijt6QOzbt+IssVDdY5/G5PSwPiSkkMyTzzIwGxw/flf/Xw+dW/uMsM0eRiusxZxv494lXzRMgkzGtiVhRpq0sw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=nZdOJxwv; 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="nZdOJxwv" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2FE811F000E9; Wed, 8 Jul 2026 16:09:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783526947; bh=m/foDVFxmge/pT4KMqucPkICNE007rOp9/0fbAmHpyk=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=nZdOJxwv/M2tHHGpP8Lym+V0K8QJbNvdxSL/lUWeqmlJPgJSob1F/hrIVkqeiqcRY gYugT8kozJ2fRsFVKIkmSUTbBlrwd2wueWy2bPy8euV2BtmKpXQvnfeDT12JoJ1Uno QQPK4X1TNTDlUq5Ds0i8U2Ev5wNsyl0IyMq09KJvZiTHJ5X0HQtV02hgwyxF4edKkx cwRrWSN51DIzLugmznLdr4hZfk7Fp/2FwvSq7vm8OT2uEgkj3hoGHBVi7BDyjctQ68 2sq0kmn0M5eafNon6tZOcu9OUo78+YQqCiJqsQm9mTHVRzc8Ucmt4sDPgCiJLnA40k y+lwC5xYxDeFg== From: Maxime Ripard Date: Wed, 08 Jul 2026 18:08:44 +0200 Subject: [PATCH RFC 7/8] 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: <20260708-drm-reset-state-flag-v1-7-c37dc985485d@kernel.org> References: <20260708-drm-reset-state-flag-v1-0-c37dc985485d@kernel.org> In-Reply-To: <20260708-drm-reset-state-flag-v1-0-c37dc985485d@kernel.org> To: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter Cc: Daniel Stone , Harry Wentland , =?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=5464; i=mripard@kernel.org; h=from:subject:message-id; bh=9RtrZGE8urQnrwFN3M6gM+69Wju578sX02RNNOhvr6k=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDFl+ZQLfj3y8ONdY8apJr/pKhspjKhN82jNfRNV491yyu j7/V2Zbx1QWBmFOBlkxRZYnMmGnl7cvrnKwX/kDZg4rE8gQBi5OAZhIVQxjfcq0WXvblJef++vf unxH7Ksm/fJJ17P7f+7/cPzMmW9Vqh+2ztvVq6nXFf3MI5Rjo938KYw13PdWLgrvS7nTv0PomMV c+7NLflw7q3Kw72PcMSMVx2K3Ao7bOSZN/g+Fo974L7XrY80CAA== 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 | 112 +++++++++++++++++++++++++++++++++++++++= ++++ include/drm/drm_atomic.h | 1 + 2 files changed, 113 insertions(+) diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c index 79971d4b56a4..0c1a02d0e871 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c @@ -1608,10 +1608,122 @@ drm_atomic_get_new_bridge_state(const struct drm_a= tomic_commit *state, =20 return drm_priv_to_bridge_state(obj_state); } EXPORT_SYMBOL(drm_atomic_get_new_bridge_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); + + 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_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_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); + + 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; + } + } + + 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/include/drm/drm_atomic.h b/include/drm/drm_atomic.h index 00b3e9fc429a..e61a1bcd278b 100644 --- a/include/drm/drm_atomic.h +++ b/include/drm/drm_atomic.h @@ -698,10 +698,11 @@ static inline void drm_crtc_commit_put(struct drm_crt= c_commit *commit) =20 int drm_crtc_commit_wait(struct drm_crtc_commit *commit); =20 struct drm_atomic_commit * __must_check drm_atomic_commit_alloc(struct drm_device *dev); +int drm_atomic_commit_fill_with_defaults(struct drm_atomic_commit *commit); void drm_atomic_commit_clear(struct drm_atomic_commit *state); =20 /** * drm_atomic_commit_get - acquire a reference to the atomic state * @state: The atomic state --=20 2.54.0 From nobody Mon Jul 27 19:39:21 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 2392242F6FC for ; Wed, 8 Jul 2026 16:09:10 +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=1783526951; cv=none; b=WGpsO5qsVMaMT8E3YaI2LZLqKc/fpGnGsT1l5VDWa7UdjWgu+hvYS9AXhcEXDv7JKcmh2EQxJoDdsHJ9YwKayXTAN4qZ5n8t+nBdnoAlBqn7Mw2vF25E1NbVpNl7lUPI+N3m3QXuxXgYA/hw6GXJcZWD6nlGVbwZ4bAiJCDzq8s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783526951; c=relaxed/simple; bh=7zYpFImy0g0AluUUezrrM+0CUKtgqxI+/SX1idEGulw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=GmsvkETcf1ileXUQjy/0p00Jlri30QWyucHcHP7FOXCVNgOF+sVM5QM6V/0SHgbYT8aa2nTfDcms1JO5tdCBuxBJoaRzwfbulqYLE/eaxvidQVU5LEFXbzKjBCVJg7AoR1QF9Gd7q5AWLDP22ZtaZldx3NDY//QJDg/h7HqnbTo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=GlRdjukd; 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="GlRdjukd" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 85B981F000E9; Wed, 8 Jul 2026 16:09:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783526950; bh=d0gFAqHdkcz/DkcLNQqPxrqVc3f8gzllG+y1ErzsxJo=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=GlRdjukdQ4XGf4kYnYdoNKqabIvrA1bfQCmNtAR66fnVnSeXdQbXKeKLjHqZIMGus /xOs994uP6PUP7sLXWdyMz24dzzFRt499WQEIWLmKhgW4yn0G/14qWoBixSXoIhvCQ A5SOKNUHddf+qFYX223g0mmOnWI8SnL+r66udcda1W2ABsuseinbJ9WgwmI/AmlKxu 8FmEEFHqzJAdg+oMNkkfsep3bZj7B4p5gxW4f2/sa9RDhVTgzIwEmslhMwqBh8LuA2 qOb9y0xp6x55iFWSxUfivtJmWyoKQLSYL6nFq45ePVZVeJKp93bR842gaIFvM3ObTt OtsJzh0dj340w== From: Maxime Ripard Date: Wed, 08 Jul 2026 18:08:45 +0200 Subject: [PATCH RFC 8/8] 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: <20260708-drm-reset-state-flag-v1-8-c37dc985485d@kernel.org> References: <20260708-drm-reset-state-flag-v1-0-c37dc985485d@kernel.org> In-Reply-To: <20260708-drm-reset-state-flag-v1-0-c37dc985485d@kernel.org> To: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter Cc: Daniel Stone , Harry Wentland , =?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=3811; i=mripard@kernel.org; h=from:subject:message-id; bh=qNsLZcKnpU5JSggILRFdVhUYrRG/Qw8F+WUmBgIv5aw=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDFl+ZQK5T993uk5pexydIzWbW+Dz4TcKFg+nlCop967/E 3gpufBdx1QWBmFOBlkxRZYnMmGnl7cvrnKwX/kDZg4rE8gQBi5OAZjI3HTG+kTRWzedHq60X3V/ ej/HwrQE8/m7F+ka3T50MHTKraC+KpEoEd4L678b1YVbpf7ZoaBeydjwwbGd88fif9c8gzkY319 8sP3f+waeu0xWv1OYX9dUt8+4pc79Idv5/fwN20oLH0ZoBLkDAA== 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_uapi.c | 13 +++++++++++++ include/uapi/drm/drm_mode.h | 14 +++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) 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/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.54.0