From nobody Wed Sep 23 05:20:31 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 1C65654B1C8 for ; Tue, 8 Sep 2026 14:35:23 +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=1788878130; cv=none; b=HQa5ZSg+vx4AHsK1phk8qgouO5V13ErHtKsZczbEra6qNz9TjNPpq66uXrAzW6PUDNYOo/onO0qnMyv3FNchmPReOOEVt2pfVC/K355E05rlS4jrveFFCa9qa5RJVHoe9fdGC6XStHEEe0pB70PfDIk7hnIpWa3zYIfCVm7C5Co= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788878130; c=relaxed/simple; bh=tUdqkKg02G7pZNM/cxmM4hrdK64B6/77cjhDvSy80wQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=H/cX90VrZxfsJXUgnJqk4YI+bYT+WIFn7n9nIrcMLnQ58o31QaYjmF949v+2zvNUosNqguo/ecq516CmHf4srS9gpagzb9y9Kw7g6w0W4+O5RNpbUNuAJFaAn+caHMpDvtcpu3R86E9e4mhV3SpppywpxSzNZlByFx7rbuwSE9I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=dAcXXL2P; 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="dAcXXL2P" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 29B6B1F00A3E; Tue, 8 Sep 2026 14:35:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1788878119; bh=rhbPg4XZXLlcdCtHG8r7d95+Q7hYT+p0CMQ+ukMM0+8=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=dAcXXL2PVD9eNa8FkFtNSvGEAy3REIco//NLmuzoZ0y+sqCNGOXo70KxKPkbshKjb 7ME4qeK26032suIE27/BdFJPz+JuNtde+5Dy6VvYOZFFdut0Gnh9O7IK9iWt5yxP+S up0Nni72Kx/gLFCTz15ymwXjl2phG0KRn5ilQ7f4js28QQhwjMVibRw4jqu9Th5r5G ezG8bkqOKmqpCA1vM+0tXC41eUnjsmAwFXuB2+BxK/SgLu47JWM/JGnSIvZXQzDnz9 lFuE8fzH3kOsfZNhxRHAEFrmAEBPo7F5Q3IxrDkGGxeg0Eaa6pZcd01WMYGzNxBTpL /5tLmJ0cq//ZQ== From: Maxime Ripard Date: Tue, 08 Sep 2026 16:35:02 +0200 Subject: [PATCH v3 01/11] 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: <20260908-drm-reset-state-flag-v3-1-905570f387a4@kernel.org> References: <20260908-drm-reset-state-flag-v3-0-905570f387a4@kernel.org> In-Reply-To: <20260908-drm-reset-state-flag-v3-0-905570f387a4@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=tUdqkKg02G7pZNM/cxmM4hrdK64B6/77cjhDvSy80wQ=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDFkLZKV5+ObIWmew+75udTTa2twZEfP4ghLHfe6cpD1LF nYuEPfpmMrCIMzJICumyPJEJuz08vbFVQ72K3/AzGFlAhnCwMUpABPZxcjYsNRsylRB30wXEdPd Tv+PT2nufr9Hft1iT1dZ9f0vL2Z1HUq9mzml6ajIhH+3b7yr37llI2PD7ufflN9qHSk+m+MtnPD q8i7eE32yerwz/lYZXZknfaOLNVvfYe9mLebNzY7fWj5pK6QCAA== 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 Reviewed-by: Thomas Zimmermann --- 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 45df6376f408..5c0f7b7024d1 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 Wed Sep 23 05:20:31 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 BEA3A53FD5A for ; Tue, 8 Sep 2026 14:35: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=1788878131; cv=none; b=et2/yDvwypzt6LhiINtOX0OIHaOMQ3RNF8D7ZF7nxRCmrIljMEkTrN7gP42/CeVIwwntwFwlsfyI/661i0LfXHzLW861kp5W75ZMWK188CvsbutkKNzq4p5jMoW/tavpVxqKJZae/pvBDLFfs00rHqnK72nvNxAgCK86lFQ/uCE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788878131; c=relaxed/simple; bh=i0ebjrzllE9a+RJMjGlK4kAZEGdsP5r+YMP40Y27aFM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=MmT8KALjtPw2Pgq7qcyx2uK31CTAvDA5NebOBiifC6KEe4Wkp+2fKtxoFY/GdLGCUPqvC9dFBZOLwMe6T1AraERkpvTA8OD+Mt+TwhB+6p3SJOfPz0jOqBf/N/NcwkxTcQEsmPk0Z1JVS5ef+5h2Ilo2QwpZoqHyXBeb5K6oa90= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=YXuIcb0o; 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="YXuIcb0o" Received: by smtp.kernel.org (Postfix) with ESMTPSA id F0DAC1F00A3F; Tue, 8 Sep 2026 14:35:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1788878123; bh=ohLVhV+vK2hN/lzyGqNK6/ZnRj8cPzMGLS+edC/u0TE=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=YXuIcb0oHtVxmTaaTOmZaVKppO3iR0VLad2tU6WIJKab+W12QMtu0r5wjceeBkJap 1fHoWaJ1CL5dotJC28xJLRpj0Ryzobf5sdHPwLbvsLXwmy9vbEwSBxFJlp9k43SbdH 7LPncrfmrQtDFmtd1glP48+I7ULFBYFdlDCi4rdBSsg9YlW8jpmch/8bk/xkxv5xV9 CIb4OFTzaeecZ02u8FwyV/XwFor0wyaxRCQkc9f5y60NjqFVf8VKmT+5vhGn2Hz8U6 ta7wjpdOhLbd2C/aAjR/7WmlvnjExOWe+JC30p/kQW9mnTMJi1FoX4a4lms5vN17dN BCBRiJDODEm7Q== From: Maxime Ripard Date: Tue, 08 Sep 2026 16:35:03 +0200 Subject: [PATCH v3 02/11] 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: <20260908-drm-reset-state-flag-v3-2-905570f387a4@kernel.org> References: <20260908-drm-reset-state-flag-v3-0-905570f387a4@kernel.org> In-Reply-To: <20260908-drm-reset-state-flag-v3-0-905570f387a4@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=i0ebjrzllE9a+RJMjGlK4kAZEGdsP5r+YMP40Y27aFM=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDFkLZKWljCJ9Odhma/RYf+YLudotPzmx1SDaoCqaRXNuy 2K7NKGOqSwMwpwMsmKKLE9kwk4vb19c5WC/8gfMHFYmkCEMXJwCMJH97xnrvXP7My8E5l96uWYR Q/TE5+0Ohf/5zmmft3As5E1aGGS36pbcopLWY3bL3/7cmTbtrWEKY52dZP25bw2vbyzue38xQzZ wxZ+pz45JOfC/6VnS3nzmwP6/+RxblfofRW06ESwS47FftQUA 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 Reviewed-by: Thomas Zimmermann --- 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 5c0f7b7024d1..153d959bd4ff 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 Wed Sep 23 05:20:31 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 EA97354DADA for ; Tue, 8 Sep 2026 14:35:30 +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=1788878137; cv=none; b=ePdE+KVTkfJhbXMTyp9eKqCCweieCteUtW58s8JtrKmnuWZkEGmPL3A74/dg9wKZFdfmoJUi8vqhBodCE34Y+MDQDQLshN+3DmJ+XyBnco3ZAbWVn1XF6PbYT8cy214oVYq5w+c+CXqx0ookfknQhbt25k4D/QPJ0WzIGodk8wM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788878137; c=relaxed/simple; bh=SBXepA+Kzx2kmCXRTs2XA6GB/9sKhpv4dQQh4KGM1yE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=J81IxhNhHK+N/nITAf87Qb/NwuuG2PVj2RMTrvNl9jjeUwp3lZ9OTHeEaj4wGs90t3fookIHH5C2PgB4Hxu+nNtqOQGLs4LTg6RMZJBAX5Aibyi1gfoZAa6EWi7dofk7iwW5tyfElUPBWrNe+05gzFOXYKOHJ4bK6Ndsw4KAJk8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=BEz2sfP/; 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="BEz2sfP/" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B860C1F00ACA; Tue, 8 Sep 2026 14:35:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1788878127; bh=bqBWshvt3L6MTIRaqkZiDc6MNSNPGD81ogLG36xTIIg=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=BEz2sfP/ZwE43hDKsTyCe3K9a1usqzxP2GqopSFANewtxzFAF78Rt0Gq3FQqrUZDK 4fx+h5+G1O6B/wmcVZJUG4e/XPeotusY80Uq3GgBoRGJGAs5sK9u1exr74VDgWOevA g+pAAmIh3uwDFUvaTHWQweiDvfR0x9hl//XA2vqHO2I5URSyf7UAYC2OpQxyKZUoaH mD5Lq0SXO3O1VgUxeVz+v1my4wJ94UTdLw/rWTRyBaX6gIg8CTa4NxmdpPooyR5FDF mxHBXfs13g4LzqZQY7SuhB/Kiw7qYC0sOEJgL5AVN37FMRgP33ECeGhAyPw1Na8WHX 8JCCFtiIz9s1Q== From: Maxime Ripard Date: Tue, 08 Sep 2026 16:35:04 +0200 Subject: [PATCH v3 03/11] 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: <20260908-drm-reset-state-flag-v3-3-905570f387a4@kernel.org> References: <20260908-drm-reset-state-flag-v3-0-905570f387a4@kernel.org> In-Reply-To: <20260908-drm-reset-state-flag-v3-0-905570f387a4@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=SBXepA+Kzx2kmCXRTs2XA6GB/9sKhpv4dQQh4KGM1yE=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDFkLZGUCKrn1cxZYyWvt5SnhZlp0JTpPwP+QjJdmy4sa8 2Pqxzd1TGVhEOZkkBVTZHkiE3Z6efviKgf7lT9g5rAygQxh4OIUgInsZWZs+DIlMy7uwq2Cidyz g841bbi569PDVKXz1++/XyHHHH6pzCb3mo7xtEsn+7fMF5D72/lLnLFOZV91guXCk3MzamXym1I WrX97xGjS37l9r+LuCTO6L1ZLfXNbYf/d8CjtbVJ7XS0WbJMGAA== 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 Reviewed-by: Thomas Zimmermann --- 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 153d959bd4ff..f62323679f44 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 Wed Sep 23 05:20:31 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 01266548551 for ; Tue, 8 Sep 2026 14:35:35 +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=1788878141; cv=none; b=pXWAAI9xNHP8o92KnEyOWEBL25kynlOiCLSY/IWqpbs+CC4tDeQcaZkEik6JRWrJUopJn2JXLDVhf4BSCLJaXTReY1NM6ZZommItAWEPKzmEGdppieKkZ8GDLcOqUuNvuFKxaR6XcFAw8kenrWo3BIrYVidyAN4sXWMgiKFV2T8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788878141; c=relaxed/simple; bh=norOsKJSzhagJvOfVR7DhL/TvimASvnyTfHuJ3JakF4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=IzAVVec4QRElBm2A2/MDrZk7T73vL8tyl7eUwSVlLidmL2B7z5pOz2n+nmQbhjXKmjCniedQIGZodZ0TXy6fIaRvr1FzrchLxoXBsFtuulBl2JcbAt8Di4r6u8dTHJOJTn891ZwFVNsySA9M2sLGsSPlDS+rnbtZVtCTh+j6uGc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=GEoB3Kdu; 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="GEoB3Kdu" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 815EE1F00AC4; Tue, 8 Sep 2026 14:35:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1788878131; bh=XMX13DtPDDnyfrT120bG1968XXiMmSlCAD2GolHcyVY=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=GEoB3KduVPc01tcYEIO5KOnyQn8BuXVS+a4NBE7w49HkSSc0rYPbkiqEq/ssz2IO4 +ZQnc1rlTsoI8tZeMGB9tZpupdB+Rssb2ATAQKjUfwJfJy0XGpVGWiCoSOFyD7YYfD 4ZbzuRS37eTW3k4vZwK7v31rCdcLzbmit1Ynj8W2MsQsLeXyOMnETuIrHetrLwAezG pyeq3xLCnKCHZTRnq2IO+GZcvPNu0Y8Vw4CV3mGTHqQvDYd8rE4qdoSjEx7fKT31yb W/0GwK2FkTUD/nfNX4/K7AEWOiRkT+jDTyMtEW7Sv0/IftZ9BK9RFgg8xUSJnuK1bc n32ddQ0NavmVA== From: Maxime Ripard Date: Tue, 08 Sep 2026 16:35:05 +0200 Subject: [PATCH v3 04/11] 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: <20260908-drm-reset-state-flag-v3-4-905570f387a4@kernel.org> References: <20260908-drm-reset-state-flag-v3-0-905570f387a4@kernel.org> In-Reply-To: <20260908-drm-reset-state-flag-v3-0-905570f387a4@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=norOsKJSzhagJvOfVR7DhL/TvimASvnyTfHuJ3JakF4=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDFkLZGX627PvOfkniETfr0q78jYrODRLPD22dNtsd79q2 1P2ToYdU1kYhDkZZMUUWZ7IhJ1e3r64ysF+5Q+YOaxMIEMYuDgFYCJBdxlrBY9N2cI/O6HI8Abr Elk/tndxlXdt7lkdXnFl1+zQS7wFm+zLNL+907l0wkIg/Kb79qtpjPU+s9TM0y4psM7+2P3P+/6 jbysOLHNasnduqMKauHZP7pCNOhoXmRbtsQxi/PuhRc+C7TQA 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 Reviewed-by: Thomas Zimmermann --- 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 f62323679f44..f6a31c9d477d 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 Wed Sep 23 05:20:31 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 68891549387 for ; Tue, 8 Sep 2026 14:35:39 +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=1788878147; cv=none; b=N7hRUpOwaLWbKPVlb/5Z/hUe6bBmjTdTl+V7lqvsZfcTC3i6rw0YgmI8LZ3HRRB7+X09T+cpm5lF52HRjmxezsPre1tqTmXIIKQTGsp4aSmlhZbXVWYbPa/OHBhzK3PTbywPIgJWXnlxkpmniG4uK2taq+Qqn0r5schE+AV2918= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788878147; c=relaxed/simple; bh=aGtwc+jsBW8u3XkMa+jusPXWSRKAVFkN5fj8q3v+qSA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rfC+eGSzK+Laf2WE2eWcn0tr4tfHy9WDi5+4moeP09PjLHqd2KiidtVTpiWBXl5x97He/n4kwGQ25lYX1Bkf7/+/YZiLbNpYCKJi/IAV2qd0DHiLs+eHXixjXVfu3FGz07hvxT7/PWa1tpoei7E1x/uITPCmv1gb29b+UNJJvFM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8486C1F00A3D; Tue, 8 Sep 2026 14:35:34 +0000 (UTC) From: Maxime Ripard Date: Tue, 08 Sep 2026 16:35:06 +0200 Subject: [PATCH v3 05/11] 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: <20260908-drm-reset-state-flag-v3-5-905570f387a4@kernel.org> References: <20260908-drm-reset-state-flag-v3-0-905570f387a4@kernel.org> In-Reply-To: <20260908-drm-reset-state-flag-v3-0-905570f387a4@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=aGtwc+jsBW8u3XkMa+jusPXWSRKAVFkN5fj8q3v+qSA=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDFkLZGU/7Fx554LVxI6NZ29GhIkc87/7gd1swqKnk9cd9 PExkrQ+1jGVhUGYk0FWTJHliUzY6eXti6sc7Ff+gJnDygQyhIGLUwAmwrCWsWHC6lvOV6f4v5+l /XhOYK6Kuun2hao2EfE8KWd/yspd2Xzo5MNt3G9P3TipObO5b4LIzizGhu0ybKn7V/aV+H/Wm1f y7cUmq43tLI93hwroGdXPusDYeIjJ+aXs/mdhoU8+lMQuEr2yHAA= 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 f6a31c9d477d..1be4af940ed1 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c @@ -1101,10 +1101,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 * @@ -1117,13 +1148,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 @@ -1133,31 +1162,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 Wed Sep 23 05:20:31 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 A1EB4550DB7 for ; Tue, 8 Sep 2026 14:35:42 +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=1788878149; cv=none; b=IXFNafPNXDLaUYC1UILteh5GAVVZ77x91Ud/qSKDMCjeKQuw9MIFFRgy0lyvJI2sZ/pcLwe/E+B/9JCI4soTaT/woATiB9A2/Orr/httL9Hkha+YVKHW5okjp72TK7lCltz0RxicSXKHnXVgOBMo+9WgqCVoMuCQYBwVzPNAkT8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788878149; c=relaxed/simple; bh=osCKjucgcyfujACipcyBvMDUNnj5UCllwhzO4hiGIGo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cCBsZvPwhn5k9brLGiQoOigLhgKdPpcTNb+R0qdWJE/mKzQUNjlKqfgEVylirowiu8neSFYn1jDPr+0hYkDbKxSdorvOb204TESOmN39qVg1dBaAcKROIV2YmSFWF/o90exB/KXT3PCtAQhAtGwoNZtqUvmMraatfhQHKOnsQQc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7E2991F00A3E; Tue, 8 Sep 2026 14:35:39 +0000 (UTC) From: Maxime Ripard Date: Tue, 08 Sep 2026 16:35:07 +0200 Subject: [PATCH v3 06/11] 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: <20260908-drm-reset-state-flag-v3-6-905570f387a4@kernel.org> References: <20260908-drm-reset-state-flag-v3-0-905570f387a4@kernel.org> In-Reply-To: <20260908-drm-reset-state-flag-v3-0-905570f387a4@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=osCKjucgcyfujACipcyBvMDUNnj5UCllwhzO4hiGIGo=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDFkLZGU1XL+/T1kanGnQaJjV5e7Fdk9Qvd77e62lg/Smz zJMJ693TGVhEOZkkBVTZHkiE3Z6efviKgf7lT9g5rAygQxh4OIUgIns/s7YcL0pde7x0xHBVhHf jcOD7FT4Fp2rXOgc1ecdm/S1wyrb5MoyNsejZQV2gZkibc15Wj2MDVNduD7etZZSs2/6qTd1QoT fEecPGzZExTkYnjRJTtNZGNaVsJl/+u7zbCnSt4xusXm3AAA= 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 1be4af940ed1..19678e8a2bd4 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c @@ -1412,10 +1412,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 * @@ -1430,53 +1466,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 Wed Sep 23 05:20:31 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 BE8F755199F for ; Tue, 8 Sep 2026 14:35:46 +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=1788878158; cv=none; b=o958REPWnyO3JCfXXFtZvcl+9kGEIlnqmWGjKSd+kpDujzvkwKU83iDA1oUCf6IahQuSvE5MmSvMvkZEoqZRXb6Z3+Y6wsPAL03C5aKzetxH4TeUmxTyYtoY43izP9JHsKkrIFa80Om0PujDy95ZYoOq6WMFOcUCHHY5RwibXRM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788878158; c=relaxed/simple; bh=d0e1bkJn7+NMBwM9i+AZw5D06zeTuCeswC7oh2rs+hU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=R/Z0QxZuY3SQ2HpvdF8ecqF0swWKwrTEE4vR5dLx1fSz8ywsmF5TzNKOEkAP8eShddLwwmT1DGpxCMPObUBXhbdUDdnuwpJ9B/kEVdTR0WnLa/Pn7e0BnLFxn7GugZ60qWVbjsbQPVBoLvl5SZZL3UXklZ6Ukif/P7a+GmUFwOU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=FNKIXIv4; 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="FNKIXIv4" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 400CE1F00A3F; Tue, 8 Sep 2026 14:35:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1788878143; bh=lJckSwA4yz1X6pqZcF1oUQ7YXY4uLF7/JNIqYv1gCVg=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=FNKIXIv4bSTIwnWSG2vxkrFg+tdwSSGYJChV3hozQK/wrjpyDcxs4m/yHhW78cz00 FDFafSjU0wRYXpO91YsyLMYUGgA+nfEraigrhCiqSbLwmtqsPg/WXQpv2aIv/d+wx5 qtIpbAiYbfqgp2FeEaDOmszufT7YMGppJPnVacqkGUeCaJpTQHxxidaasm3TLFKnGU Txog5PEOifAG1Nxm1csntQqeID4reFI3Ye5bVDcySC3N9/uGtfRXlLQqnBmUhYfMr4 IDiZSEqjvuDTjzPLcPTJ+qX2YsZsbZxgDGsL+VwUv1TnkPk+3963qAZ6LMymxSLpqL hCcYQcfNkODhw== From: Maxime Ripard Date: Tue, 08 Sep 2026 16:35:08 +0200 Subject: [PATCH v3 07/11] 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: <20260908-drm-reset-state-flag-v3-7-905570f387a4@kernel.org> References: <20260908-drm-reset-state-flag-v3-0-905570f387a4@kernel.org> In-Reply-To: <20260908-drm-reset-state-flag-v3-0-905570f387a4@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=d0e1bkJn7+NMBwM9i+AZw5D06zeTuCeswC7oh2rs+hU=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDFkLZOWOLmKMrl27XuLXjz/VVSxHtm0y3yPgPOVy10x/z lWP3Lo1O6ayMAhzMsiKKbI8kQk7vbx9cZWD/cofMHNYmUCGMHBxCsBEKmYw1lcIH+NuXm66fenD fTGbZX86LXTNPLV9TbVXJvsq0bDMV1MSWec5qet9elL+SqHv18e074wN157O6rzfM7nqfPZOsSW i3Q/0Xctn7L8j+nDSs8knTr1aYr2AnVG21jYwewnvzkZmwe0fAQ== 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 19678e8a2bd4..508a027398af 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c @@ -1612,10 +1612,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 Wed Sep 23 05:20:31 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 5B38054EEC4 for ; Tue, 8 Sep 2026 14:35:49 +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=1788878157; cv=none; b=E1fmMOGDuAGboFBlPnAab80htsQroMI/D6W1VxFJkKJXDGNjxyRAQgiKzbKmInCH4xbn9d3rrk0DnYaYqYtgdlj+SSvn/yDh9toYt/lPPp+t8wHlu0Pz8r2l3fGxy/632Tnspu+yh6kYYQtgtIJi6fCVbPna2Uake9ARFRQ/H3Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788878157; c=relaxed/simple; bh=ZBuKAl5IObDo5KtYQuqC7dsR75c++l49iqYJikN6FAg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=BLZY7ibPsB4ndOhLdia/HIivOyB96bY2kYOCSCUqL2SR5+Ek3Or4LxyTITZm12TTVKUORRMi1rIwmVKh05Bksr6F3cY8h8BrUSODc95PH1YxKIMaDnM0N9y8nGfcyvJqbnZfdWV1EULw/U5YhytZpQFURrezLGRq/3+KKMatC1U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=l2Zxtyuy; 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="l2Zxtyuy" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 603D61F00A3D; Tue, 8 Sep 2026 14:35:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1788878147; bh=KFtAQfV7wRWuQNHuMkwGFbejLux/ntXf+ShTWRWrNT4=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=l2Zxtyuyxce60cZS2tM1auSH/jE7hcLXXqxxy4BbPiaSy0ecGjTJOJc6NbTqrVVvY +Bywrn/jhMsbzDatVpvuniyxiFKkHX62vux4YfifwOHqCr6gBHBlXyX87pMDeQOpxI ZbqiznsDYmo6mbV6ViQcw1GTYfiY0mppKTNlYMsSWeBX2ppp7eHGq/Azz5upOIw4bY 0T96ALPADB+BPu3oEQWVE6vJjcM4k2qXikWQJH3cQq2bye1EtpzwRmO5Mosb1/ao7U ogIYvOqTMXmqup19GC7a4M/Z6uezREF4ZRomSdOvYQGWSiYradmb5wrvyDOy1NYyM2 Ib0OF8oRcEWRA== From: Maxime Ripard Date: Tue, 08 Sep 2026 16:35:09 +0200 Subject: [PATCH v3 08/11] 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: <20260908-drm-reset-state-flag-v3-8-905570f387a4@kernel.org> References: <20260908-drm-reset-state-flag-v3-0-905570f387a4@kernel.org> In-Reply-To: <20260908-drm-reset-state-flag-v3-0-905570f387a4@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=6302; i=mripard@kernel.org; h=from:subject:message-id; bh=ZBuKAl5IObDo5KtYQuqC7dsR75c++l49iqYJikN6FAg=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDFkLZOViFk88dM1Hnf3+/L3/tddrm9X+iz7f35N4R3zLp 5cn21vXdkxlYRDmZJAVU2R5IhN2enn74ioH+5U/YOawMoEMYeDiFICJrDvC2HC53urX1I45U8+1 Mx/WzbS/u2/G5FmCO075qEdG6kicic80OHv+56LeR1vevZzXunBi+wvGht+vpi25rHfskdETT2b fU66fFgiGL3V467Z2tsKM+mkck45tTL1y8sTm2j0XqriXH14lzAQA 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 | 123 +++++++++++++++++++++++++++++++++++++++= ++++ drivers/gpu/drm/drm_ioctl.c | 1 + include/drm/drm_atomic.h | 1 + 3 files changed, 125 insertions(+) diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c index 508a027398af..4c15757308d6 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c @@ -1661,10 +1661,133 @@ 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 their 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; + + ret =3D drm_modeset_lock(&colorop->plane->mutex, commit->acquire_ctx); + if (ret) + return ret; + + colorop_state =3D drm_atomic_helper_colorop_create_state(colorop); + if (IS_ERR(colorop_state)) + return PTR_ERR(colorop_state); + + 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 9039a39c4324..0dbf04d4aa9e 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 Wed Sep 23 05:20:31 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 2154154EEA5 for ; Tue, 8 Sep 2026 14:35:55 +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=1788878163; cv=none; b=HJik9g2rowq674YyElwUbbJc79W9BzszkuW/YqS0gdGlB+uWhCBDrq/ChwM8YOJWupkyOtblZSaHK6VTkSeP6knTOxQM1i3jtJ/kzFU5aRI55qzxqWPGjJPDV5q2EhtlPdWBKEz7YciY6DreolBLB7YQpf8vl5GLB8cBNiWdL+E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788878163; c=relaxed/simple; bh=N61exStbh9KaH8bVcwPhZ+bzcJ2LC+ZN5oJj/j+w3TI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kEhtD50mXKElOHXJH/+da0gBGrFnem50mS9miUHGjU7EjrVFutvCIGEe//dNztoj4DtcjzYAz8Vys12jZ3tEIx3dq1A+ny88BOIWqv3yKX79xWCP7kqOk8L7QnEzdTWEcMSlqqs6yIhHMycPChAlHPbTi+CwWi7Gf4+gkMu0FC8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 Received: by smtp.kernel.org (Postfix) with ESMTPSA id B276D1F00A3E; Tue, 8 Sep 2026 14:35:52 +0000 (UTC) From: Maxime Ripard Date: Tue, 08 Sep 2026 16:35:10 +0200 Subject: [PATCH v3 09/11] 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: <20260908-drm-reset-state-flag-v3-9-905570f387a4@kernel.org> References: <20260908-drm-reset-state-flag-v3-0-905570f387a4@kernel.org> In-Reply-To: <20260908-drm-reset-state-flag-v3-0-905570f387a4@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=HbrgWfTQ17BOXbNy+x8RaRsQOheojSMfOMVXInohdjQ=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDFkLZOVffJR/aPGqrGdvQ+qXj0mFSy9u4ro07ULNzaWnF t6pPFU+u2MqC4MwJ4OsmCLLE5mw08vbF1c52K/8ATOHlQlkCAMXpwBM5HAgY8OKXadVA8y3LSxU 2Zdj7T29r2xmltZkDs2O1/xXX5/YeF3n85emLVxHXOzmmt8557Xg6RTGhtvfyhWmuP0qymS5xbF 49/bOZX+y4sxi/jW0NrWsWBO1+UKS46pFRW87th3My/7betn+DwA= 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 Reviewed-by: Thomas Zimmermann --- 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 4c15757308d6..d5b3a7d99239 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c @@ -1625,10 +1625,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 d52504d823bc..fe794a65a727 100644 --- a/drivers/gpu/drm/drm_atomic_uapi.c +++ b/drivers/gpu/drm/drm_atomic_uapi.c @@ -1665,10 +1665,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); @@ -1680,10 +1687,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 0dbf04d4aa9e..f13bb7c490c4 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 ed1a660a3dfd..32eb3f650d7a 100644 --- a/include/uapi/drm/drm_mode.h +++ b/include/uapi/drm/drm_mode.h @@ -1326,10 +1326,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 @@ -1338,11 +1349,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 From nobody Wed Sep 23 05:20:31 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 6756F548552 for ; Tue, 8 Sep 2026 14:35:59 +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=1788878176; cv=none; b=IKzEBXSIz65A68Z1ReAE9bRQbAFqMZVJQt18WfLO3tXdfUNCko4ekqxS0tPAuQwO75hhVmR+s68fLXgwdu53TZMKAXapafpU4e+81tksxb+gt1aIMCg++qUx25lpZuOwEe+Lw1de3jvCG9BBWqIJ2nM3/neIvR/XPwlsDnKbiNY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788878176; c=relaxed/simple; bh=T0/yZbif8qvMhUYbKQ5OZSohlQVc+4QmXLfUx6lhP6s=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=X45uymWtA5rKkIwv5fP8b7/5ZSDTSBoWOUo/0c6B3sgfLFCALA5ZozlnbHFn/U/GTeBJeEpvG7y66WbX8Lg7vrj0PISx9U2ZZmgcTtmFWL4gbIVvhSLT3ghMC/lP0lMTOKPktlor51v7geuH9pHh/R+8c/6m+nMKRK/WKPfybWw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=YQTo86ut; 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="YQTo86ut" Received: by smtp.kernel.org (Postfix) with ESMTPSA id ABAE41F00A3D; Tue, 8 Sep 2026 14:35:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1788878159; bh=WrDnBXEUES0WR7P2lhOYTykVEKJTOaUBbf8pmdHPY8w=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=YQTo86uttUuej6wyqqArJ3CYc0uDeSMFp/a5qkibb7fPRf5M6xc28Gs/Bp8rawv3P 0VWSNs4c5rm/SEjEF/m2CRu+kHn+EeaNrmpsBRZrht85WnlyEfLnLzCfo0YOC0D1Dp 7HuEdeF8C19gVgpYS+XzNPn+X7PR5TAAfCADprzU5iHzHEe+I9gFP1nkN3CuyE/OgV OocdfikL8wzCMbfT7JQeD1CxQt3T4Mwc7a7mbmONzX+Xx70v24DGtjVLwxqjtR00s9 ck3dp+su78kZFrg2YJoSfxvSV3u0eOHcUnLTy7tiuCD+zoa/ob1TqHSO0L3IBCx4Oy RlfoFdqd6jzjQ== From: Maxime Ripard Date: Tue, 08 Sep 2026 16:35:11 +0200 Subject: [PATCH v3 10/11] drm/vkms: Switch container_of helpers to container_of_const 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: <20260908-drm-reset-state-flag-v3-10-905570f387a4@kernel.org> References: <20260908-drm-reset-state-flag-v3-0-905570f387a4@kernel.org> In-Reply-To: <20260908-drm-reset-state-flag-v3-0-905570f387a4@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=1657; i=mripard@kernel.org; h=from:subject:message-id; bh=T0/yZbif8qvMhUYbKQ5OZSohlQVc+4QmXLfUx6lhP6s=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDFkLZOWP7ZpwiOfxzckvD/6sfH3mvX1iRceslvTPqnluK 2reXH22tmMqC4MwJ4OsmCLLE5mw08vbF1c52K/8ATOHlQlkCAMXpwBMxHoyY51Gxp/H4ocac9kl p5mdPMt2mGtZnn+8r2pL9F/eZsNJvz0/VT79mRl+aau3zLkaRjnnp4wNlzW1TNmvxs8smDf7AeN Wc/Mt4sqvLshr6rCWcttcqvJcJ/X66WO/6Xr7WlbztZ9y0z8EAA== X-Developer-Key: i=mripard@kernel.org; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D The vkms container_of helpers use container_of() which discards the const qualifier from the input pointer. This prevents passing a const state pointer to to_vkms_plane_state() without a cast, for instance in atomic_get_property which receives a const drm_plane_state. Switch all four helpers to container_of_const() so the const qualifier is properly propagated to the result type. Signed-off-by: Maxime Ripard --- drivers/gpu/drm/vkms/vkms_drv.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_dr= v.h index 381483aa4fb0..dea6cad3f1b9 100644 --- a/drivers/gpu/drm/vkms/vkms_drv.h +++ b/drivers/gpu/drm/vkms/vkms_drv.h @@ -248,20 +248,20 @@ struct vkms_device { /* * The following helpers are used to convert a member of a struct into its= parent. */ =20 #define drm_crtc_to_vkms_output(target) \ - container_of(target, struct vkms_output, crtc) + container_of_const(target, struct vkms_output, crtc) =20 #define drm_device_to_vkms_device(target) \ - container_of(target, struct vkms_device, drm) + container_of_const(target, struct vkms_device, drm) =20 #define to_vkms_crtc_state(target)\ - container_of(target, struct vkms_crtc_state, base) + container_of_const(target, struct vkms_crtc_state, base) =20 #define to_vkms_plane_state(target)\ - container_of(target, struct vkms_plane_state, base.base) + container_of_const(target, struct vkms_plane_state, base.base) =20 /** * vkms_create() - Create a device from a configuration * @config: Config used to configure the new device * --=20 2.55.0 From nobody Wed Sep 23 05:20:31 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 9877355294C for ; Tue, 8 Sep 2026 14:36:06 +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=1788878178; cv=none; b=nXNzUvfJLGN+RMT2H4XM9K+sY6myt0G9yPeX7ZEYa0k1K4vkXIZlbn4WSKvyF5xWNyjw5cMDpoMQ73wR2K2/ajVoDB23DS4EGWOhUUa6WfSkRctwJSPxUIjEHyAIxDAd3IyX2uIMmRXXUB51SdM8HjBv29S28cRQjre7YOBEMJ0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788878178; c=relaxed/simple; bh=rx00sXWn5MJHdSH6gN45L9lMWJzjUVjUG9ORKnW1irE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=P8shEdR48aMlIJwdm0j+WoYHLVdU07FVuNExUQ9riSRzDYx+VtOqkHxnax6uIx89BgDhRuSnez4BKgZSOCK/rglr9EokuE48ydB497BB1r3Q/Ldiry8Ua+iqQLRhKxOsrb2BUlo/TBesTGRlM7lyfWkqhdEbiweUODofyzPArC8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8390F1F00A3F; Tue, 8 Sep 2026 14:36:02 +0000 (UTC) From: Maxime Ripard Date: Tue, 08 Sep 2026 16:35:12 +0200 Subject: [PATCH v3 11/11] drm/vkms: Add driver-specific plane property for testing 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: <20260908-drm-reset-state-flag-v3-11-905570f387a4@kernel.org> References: <20260908-drm-reset-state-flag-v3-0-905570f387a4@kernel.org> In-Reply-To: <20260908-drm-reset-state-flag-v3-0-905570f387a4@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=6425; i=mripard@kernel.org; h=from:subject:message-id; bh=rx00sXWn5MJHdSH6gN45L9lMWJzjUVjUG9ORKnW1irE=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDFkLZOVdz1vxCFsJf8jgD5qbfHi23J7UciG+O/zlC75KW m/axny4YyoLgzAng6yYIssTmbDTy9sXVznYr/wBM4eVCWQIAxenAEykcAJjw8Tpii6Bf6WUXy44 sXHXNsEA07OP1LZOyDvx8o556IbV5ZdyWxcsNX3nnhl69tcRTW3Fl4x19rEPtYIEm+r2T+SWzd0 bIJv5PTF00uQJ61i1Fuwr6potNnFvubDw6Tm/Vt3heCT10EoVAA== X-Developer-Key: i=mripard@kernel.org; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D The DRM_MODE_ATOMIC_RESET flag allows userspace to reset all object states to their defaults before applying new property values. Testing that this mechanism works correctly requires a property that the test can set to a non-default value and then verify is properly reset. Using a standard property for this is problematic: compositors like Mutter enumerate and track all known properties, making it difficult to isolate the reset behavior from the compositor's own property management. Add a "vkms-test-do-not-use-in-prod" range property to vkms planes. The property is stored in vkms_plane_state, duplicated across state copies, and initialized from its registered default in atomic_create_state via drm_object_property_get_default_value(). Signed-off-by: Maxime Ripard --- drivers/gpu/drm/vkms/vkms_drv.h | 3 ++ drivers/gpu/drm/vkms/vkms_plane.c | 61 +++++++++++++++++++++++++++++++++++= ++-- 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_dr= v.h index dea6cad3f1b9..384616095b45 100644 --- a/drivers/gpu/drm/vkms/vkms_drv.h +++ b/drivers/gpu/drm/vkms/vkms_drv.h @@ -144,20 +144,23 @@ struct conversion_matrix { * @base: base plane state * @frame_info: data required for composing computation * @pixel_read_line: function to read a pixel line in this plane. The crea= tor of a * struct vkms_plane_state must ensure that this pointer is valid * @conversion_matrix: matrix used for yuv formats to convert to rgb + * @vkms_test_do_not_use_value: driver-specific property for testing only */ struct vkms_plane_state { struct drm_shadow_plane_state base; struct vkms_frame_info frame_info; pixel_read_line_t pixel_read_line; struct conversion_matrix conversion_matrix; + unsigned int vkms_test_do_not_use_value; }; =20 struct vkms_plane { struct drm_plane base; + struct drm_property *vkms_test_do_not_use_property; }; =20 struct vkms_color_lut { struct drm_color_lut *base; size_t lut_length; diff --git a/drivers/gpu/drm/vkms/vkms_plane.c b/drivers/gpu/drm/vkms/vkms_= plane.c index fd3d34dcf0fe..0ebc131c2788 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -9,14 +9,18 @@ #include #include #include #include #include +#include =20 #include "vkms_drv.h" #include "vkms_formats.h" =20 +#define to_vkms_plane(target) \ + container_of_const(target, struct vkms_plane, base) + static const u32 vkms_formats[] =3D { DRM_FORMAT_ARGB8888, DRM_FORMAT_ABGR8888, DRM_FORMAT_BGRA8888, DRM_FORMAT_RGBA8888, @@ -52,16 +56,19 @@ static const u32 vkms_formats[] =3D { }; =20 static struct drm_plane_state * vkms_plane_duplicate_state(struct drm_plane *plane) { + struct vkms_plane_state *old_state =3D to_vkms_plane_state(plane->state); struct vkms_plane_state *vkms_state; =20 vkms_state =3D kzalloc_obj(*vkms_state); if (!vkms_state) return NULL; =20 + vkms_state->vkms_test_do_not_use_value =3D old_state->vkms_test_do_not_us= e_value; + __drm_gem_duplicate_shadow_plane_state(plane, &vkms_state->base); =20 return &vkms_state->base.base; } =20 @@ -83,28 +90,69 @@ static void vkms_plane_destroy_state(struct drm_plane *= plane, kfree(vkms_state); } =20 static struct drm_plane_state *vkms_plane_create_state(struct drm_plane *p= lane) { + struct vkms_plane *vkms_plane =3D to_vkms_plane(plane); struct vkms_plane_state *vkms_state; + u64 val; =20 vkms_state =3D kzalloc_obj(*vkms_state); if (!vkms_state) { DRM_ERROR("Cannot allocate vkms_plane_state\n"); return ERR_PTR(-ENOMEM); } =20 __drm_gem_shadow_plane_state_init(plane, &vkms_state->base); =20 + if (!drm_object_property_get_default_value(&plane->base, + vkms_plane->vkms_test_do_not_use_property, + &val)) + vkms_state->vkms_test_do_not_use_value =3D val; + return &(&vkms_state->base)->base; } =20 +static int vkms_plane_atomic_set_property(struct drm_plane *plane, + struct drm_plane_state *state, + struct drm_property *property, + uint64_t val) +{ + struct vkms_plane *vkms_plane =3D to_vkms_plane(plane); + struct vkms_plane_state *vkms_state =3D to_vkms_plane_state(state); + + if (property =3D=3D vkms_plane->vkms_test_do_not_use_property) { + vkms_state->vkms_test_do_not_use_value =3D val; + return 0; + } + + return -EINVAL; +} + +static int vkms_plane_atomic_get_property(struct drm_plane *plane, + const struct drm_plane_state *state, + struct drm_property *property, + uint64_t *val) +{ + const struct vkms_plane_state *vkms_state =3D to_vkms_plane_state(state); + const struct vkms_plane *vkms_plane =3D to_vkms_plane(plane); + + if (property =3D=3D vkms_plane->vkms_test_do_not_use_property) { + *val =3D vkms_state->vkms_test_do_not_use_value; + return 0; + } + + return -EINVAL; +} + static const struct drm_plane_funcs vkms_plane_funcs =3D { .update_plane =3D drm_atomic_helper_update_plane, .disable_plane =3D drm_atomic_helper_disable_plane, - .atomic_create_state =3D vkms_plane_create_state, - .atomic_duplicate_state =3D vkms_plane_duplicate_state, + .atomic_set_property =3D vkms_plane_atomic_set_property, + .atomic_get_property =3D vkms_plane_atomic_get_property, + .atomic_create_state =3D vkms_plane_create_state, + .atomic_duplicate_state =3D vkms_plane_duplicate_state, .atomic_destroy_state =3D vkms_plane_destroy_state, }; =20 static void vkms_plane_atomic_update(struct drm_plane *plane, struct drm_atomic_commit *state) @@ -281,10 +329,19 @@ struct vkms_plane *vkms_plane_init(struct vkms_device= *vkmsdev, BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | BIT(DRM_COLOR_YCBCR_FULL_RANGE), DRM_COLOR_YCBCR_BT601, DRM_COLOR_YCBCR_FULL_RANGE); =20 + plane->vkms_test_do_not_use_property =3D + drm_property_create_range(dev, 0, + "vkms-test-do-not-use-in-prod", + 0, U32_MAX); + if (plane->vkms_test_do_not_use_property) + drm_object_attach_property(&plane->base.base, + plane->vkms_test_do_not_use_property, + 0); + if (vkms_config_plane_get_default_pipeline(plane_cfg)) vkms_initialize_colorops(&plane->base); =20 return plane; } --=20 2.55.0