From nobody Tue Aug 25 05:46:24 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