From nobody Wed Apr 8 02:48:19 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 2A3DD3BF69B; Tue, 10 Mar 2026 16:07:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773158832; cv=none; b=YGMJ335kjDIAdDF0kuEF1UgNneGbprw/u4mwcuLjc2iX04fLnYO5bBVY26LRORUfxn7wa++v6FMatO8oiZG/wlnRnevDG/j2taz+rmWFRj50sz/eiP0Mnzk1cG2Ar118xoMgil1vnXqXhCkA1sAwvCwGPuUz4o0mqIgMc+vt29s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773158832; c=relaxed/simple; bh=HGXDwistC7j0r/Ij2K5MQr2pye6tFQ6S1DiX2HIRAQ4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jEYnMop7wGrOp8avx8YnlpD84wBR1o26ENVgLoZ8idAfvEmpkMIyiqUEyaZ2pzddhXJC4nJ6HwAamtTTUT/uiATsnG0jEnds4u+t/HFsAHSQ20VwPjw83HURch0rYmbPu3zeXhT0bc6/YTFoHqCiRtHw3THMs4WusuPQw7v0SYw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=J2wliESs; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="J2wliESs" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 72D01C19423; Tue, 10 Mar 2026 16:07:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1773158831; bh=HGXDwistC7j0r/Ij2K5MQr2pye6tFQ6S1DiX2HIRAQ4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=J2wliESseXnAdKrr8Q8T0m43B4HC6mY333oQc1PsY12N5g8VJqbWUG/p/Mea5+paI K/DkECdpFxvDcrdug8gzGN/nQHE9IWycz+9PNcQeYK+q11J48dEpAHHCtOVzGTIDle A3elvYAuTvLT+Sh3Q86CEttCMv4zLlp0Haafw4oO+loRK53nJJOA9OLhhATONBYwTi QtuTAEDIeM+JgsYongBS3jiDc3hpsvKXTvJE7c2MxOXEsjM2TRXmUDjnGLyUxCaGlI 2XSfNkaElq/Og0PFwRvIOuw6932K+6Z808vq/T2pxVcKmRb8lRgLQShdEzE1om4Gfg ZhS5zGM0pnyyw== From: Maxime Ripard Date: Tue, 10 Mar 2026 17:06:53 +0100 Subject: [PATCH 01/14] drm/atomic: Document atomic state lifetime 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: <20260310-drm-mode-config-init-v1-1-de7397c8e1cf@kernel.org> References: <20260310-drm-mode-config-init-v1-0-de7397c8e1cf@kernel.org> In-Reply-To: <20260310-drm-mode-config-init-v1-0-de7397c8e1cf@kernel.org> To: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Shuah Khan , Dmitry Baryshkov , Jyri Sarha , Tomi Valkeinen , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec Cc: dri-devel@lists.freedesktop.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, Maxime Ripard X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4285; i=mripard@kernel.org; h=from:subject:message-id; bh=HGXDwistC7j0r/Ij2K5MQr2pye6tFQ6S1DiX2HIRAQ4=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDJkbHJd8nFqSsIT/1/Sdji+Pr8u+ybLZeDLn1O8/I4OyE 0WULzUldkxlYRDmZJAVU2R5IhN2enn74ioH+5U/YOawMoEMYeDiFICJBE1jrK/SsJhuPY89hmF1 3NRndw4tKVC9nvvfffKMXUvLi07wHhXcW1h6ff2elFdnZQ5n7Tu+ZQNjnYaI9Uy3eRLhv4R+Wko ZX7he+o+rUMnz8rnX7TvNptv6r3hQWmNQJTube2GTX+ma7VaeAA== X-Developer-Key: i=mripard@kernel.org; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D How drm_atomic_state structures and the various entity structures are allocated and freed isn't really trivial, so let's document it. Signed-off-by: Maxime Ripard --- Documentation/gpu/drm-kms.rst | 6 +++++ drivers/gpu/drm/drm_atomic.c | 52 +++++++++++++++++++++++++++++++++++++++= ++++ 2 files changed, 58 insertions(+) diff --git a/Documentation/gpu/drm-kms.rst b/Documentation/gpu/drm-kms.rst index 2292e65f044c3bdebafbb8f83dfe7ac12e831273..017c7b196ed7ead4cf5fa8572e1= f977d9e00dda8 100644 --- a/Documentation/gpu/drm-kms.rst +++ b/Documentation/gpu/drm-kms.rst @@ -280,10 +280,16 @@ structure, ordering of committing state changes to ha= rdware is sequenced using :c:type:`struct drm_crtc_commit `. =20 Read on in this chapter, and also in :ref:`drm_atomic_helper` for more det= ailed coverage of specific topics. =20 +Atomic State Lifetime +--------------------- + +.. kernel-doc:: drivers/gpu/drm/drm_atomic.c + :doc: state lifetime + Handling Driver Private State ----------------------------- =20 .. kernel-doc:: drivers/gpu/drm/drm_atomic.c :doc: handling driver private state diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c index 4283ab4d06c581727cc98b1dc870bf69691ea654..92c6afc8f22c8307a59dc266aac= db8e03351409d 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c @@ -45,10 +45,62 @@ #include =20 #include "drm_crtc_internal.h" #include "drm_internal.h" =20 +/** + * DOC: state lifetime + * + * &struct drm_atomic_state represents an update to video pipeline + * state. Despite its confusing name, it's actually a transient object + * that holds a state update as a collection of pointer to individual + * objects states. &struct drm_atomic_state has a much shorter lifetime + * than the objects states, since it's only allocated while preparing, + * checking or doing the update, while object states are allocated while + * the state will be, or is active in the hardware. + * + * Their respective lifetimes are: + * + * - at reset time, the object reset implementation will allocate a new, + * default, state and will store it in the object state pointer. + * + * - whenever a new update is needed: + * + * + we allocate a new &struct drm_atomic_state using drm_atomic_state_a= lloc(). + * + * + we copy the state of each affected entity into our &struct + * drm_atomic_state using drm_atomic_get_plane_state(), + * drm_atomic_get_crtc_state(), drm_atomic_get_connector_state(), or + * drm_atomic_get_private_obj_state(). That state can then be + * modified. + * + * At that point, &struct drm_atomic_state stores three state + * pointers for that particular entity: the old, new, and existing + * (called "state") states. The old state is the state currently + * active in the hardware, which is either the one initialized by + * reset() or a newer one if a commit has been made. The new state + * is the state we just allocated and we might eventually commit to + * the hardware. The existing state points to the state we'll + * eventually have to free when the drm_atomic_state will be + * destroyed, but points to the new state for now. + * + * + After the state is populated, it is checked. If the check is + * successful, the update is committed. Part of the commit is a call + * to drm_atomic_helper_swap_state() which will turn the new states + * into the active states. Doing so involves updating the objects + * state pointer (&drm_crtc.state or similar) to point to the new + * state, and the existing states will now point to the old states, + * that used to be active but isn't anymore. + * + * + When the commit is done, and when all references to our &struct + * drm_atomic_state are put, drm_atomic_state_clear() runs and will + * free all the old states. + * + * + Now, we don't have any active &struct drm_atomic_state anymore, + * and only the entity active states remain allocated. + */ + void __drm_crtc_commit_free(struct kref *kref) { struct drm_crtc_commit *commit =3D container_of(kref, struct drm_crtc_commit, ref); =20 --=20 2.53.0 From nobody Wed Apr 8 02:48:19 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 1F7BB3BFE4D; Tue, 10 Mar 2026 16:07:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773158835; cv=none; b=iPm4S0pq2aIjKLAJ+uLnE8tv0TAHJW4XWfA+eKiCKz8pkQ0YZmevUnsTErRGEWFoTfKvLpaRoOoAym/6i/4eHIcvFcgw1nEfWGr3FrkS0HRg8Z/dnISOJTFFI3xaUIg/cFaXBH2VxmtcydLr9ytqgb94oVnCoBbEtmOxQUPrpuQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773158835; c=relaxed/simple; bh=50Fbqi2VnTgdkuk+BUDOfNFbw8A7u/ctiLVkwrOd0Js=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=d5tgT5IStZrsWlEMW6H7VsciUwIwQB+CYdYhN8+eql+paNpzxwFd/pv5XBWwdlh3AjTSTOhUYioyYpcd/8t7t+xC31n7hR9/BnRpkRYOnOH0fqOWtVCBKTI58InqaP3GTuyleUdB9lQdFx6AjHgpNlDwUc63erkSCRqSCmzRMMo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Yna6ypOK; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Yna6ypOK" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A1EF7C19425; Tue, 10 Mar 2026 16:07:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1773158835; bh=50Fbqi2VnTgdkuk+BUDOfNFbw8A7u/ctiLVkwrOd0Js=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Yna6ypOKP2w9ugdKDmwmMj1Nbt5JRRXejloG5crfwbiFKquek67b5ZyB6ZMQBrKLI Kry4nsKTCkN2Zpab26y+OevAtN6m3d4BsLr4U+wJWG2rXz2rB8sEfm4TuUXZjbCQUZ vCY7CiyFgLl5opgUf1UFycPCNUYD3EycN6LgYj9tMUO+iOiPVd9ZkNdVk1v/1oBmz9 XwbAHFDISwM+XB/9GYt4kAaDvX7OhDCVJ2VYW3Fx42pc1re2s16ljZL4xiQ07qhZNI DNEDtR8ZK/s6I01k4ZAfSh6dIqbXTc/jUlaE2JhcFWTZvODveDCgrJYF/a+WrtUuHX CFwjbh4QQxcFg== From: Maxime Ripard Date: Tue, 10 Mar 2026 17:06:54 +0100 Subject: [PATCH 02/14] drm/atomic: Drop drm_private_state.obj assignment from create_state 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: <20260310-drm-mode-config-init-v1-2-de7397c8e1cf@kernel.org> References: <20260310-drm-mode-config-init-v1-0-de7397c8e1cf@kernel.org> In-Reply-To: <20260310-drm-mode-config-init-v1-0-de7397c8e1cf@kernel.org> To: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Shuah Khan , Dmitry Baryshkov , Jyri Sarha , Tomi Valkeinen , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec Cc: dri-devel@lists.freedesktop.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, Maxime Ripard X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1530; i=mripard@kernel.org; h=from:subject:message-id; bh=50Fbqi2VnTgdkuk+BUDOfNFbw8A7u/ctiLVkwrOd0Js=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDJkbHJecqfD3UWGL2S8c/Xye2VuNVhbxDP+Gikc6vZlLl YLmPefvmMrCIMzJICumyPJEJuz08vbFVQ72K3/AzGFlAhnCwMUpABNJDWasYp63I2w56+Z+vaLL r/6oMBo/say/7Om8v6Swz+Wdy7G9DYZCsV5piQVVT0N1Wl84ce1grFNUav2xYN2G1a8O6xm8Xpi m9er9vspLfmsufZNcof+0XvCD4I3Any7rZkhKMTtduXNftxIA X-Developer-Key: i=mripard@kernel.org; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D The initial intent of the atomic_create_state helper was to simply allocate a proper drm_private_state and returning it, without any side effect. However, the __drm_atomic_helper_private_obj_create_state() introduces a side effect by setting the drm_private_obj.state to the newly allocated state. This assignment defeats the purpose, but is also redundant since the only caller, drm_atomic_private_obj_init(), will also set this pointer to the newly allocated state. Let's drop the assignment in __drm_atomic_helper_private_obj_create_state(). Fixes: e7be39ed1716 ("drm/atomic-helper: Add private_obj atomic_create_stat= e helper") Signed-off-by: Maxime Ripard --- drivers/gpu/drm/drm_atomic_state_helper.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/drivers/gpu/drm/drm_atomic_state_helper.c b/drivers/gpu/drm/dr= m_atomic_state_helper.c index bd6faa09f83b498b1417869493f31d876cd13914..323abc9926e084ad595768c06d5= c5ee28c22c014 100644 --- a/drivers/gpu/drm/drm_atomic_state_helper.c +++ b/drivers/gpu/drm/drm_atomic_state_helper.c @@ -728,12 +728,10 @@ EXPORT_SYMBOL(drm_atomic_helper_connector_destroy_sta= te); void __drm_atomic_helper_private_obj_create_state(struct drm_private_obj *= obj, struct drm_private_state *state) { if (state) state->obj =3D obj; - - obj->state =3D state; } EXPORT_SYMBOL(__drm_atomic_helper_private_obj_create_state); =20 /** * __drm_atomic_helper_private_obj_duplicate_state - copy atomic private s= tate --=20 2.53.0 From nobody Wed Apr 8 02:48:19 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 F3F1B3B8D70; Tue, 10 Mar 2026 16:07:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773158838; cv=none; b=HcinoZPNh9W0rgue9aS+jm4uhdeS43f2AyTXd2unG+UzzDOKoGAEmsxgSdIPlyHSg2A9wNWWqJ0NVrdjHq08qBMQjj78ykJj+iQdZb+X/zCu68B8acGi5Ya0qTD/o+Hb/IA6ZHQW7st7VaAUib8ymkg4+n9BheNDZYI3pPWgX+I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773158838; c=relaxed/simple; bh=pWJGn98h8ZYkxcFli5V1DyhaDv4pkkzV67j693vyn2g=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=K7JUE1PDsIjjxWbYxWDDOAkplQcnnfD1jwxcjVDHcWAQ+ePTFLZz1QtY0M0uaEFQ3NxtdaeVr43Pl2LsaoODcjEdh9QQ1EPQqaxoUNpfUlz0XLjuS/6OuBYjnIr5GdnfhPD56tm7LMkVICb39MPY0o7GZuJ9vJFMxSbsuZxE7hM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=hQ+hiVNu; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="hQ+hiVNu" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 83836C2BC9E; Tue, 10 Mar 2026 16:07:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1773158837; bh=pWJGn98h8ZYkxcFli5V1DyhaDv4pkkzV67j693vyn2g=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=hQ+hiVNun7GjFJ85s1FfxfbbCC430nUHV39Z4fFcoYjSx7hET3byrGuEgNDe+BtSh eQy0n3wbRILZL82Vgj6baY24O+MCF4nikjsaFzskgnXdbyEyHosEIe/TZWbY3xrr0N t3eRCBevUcDqfRkkJuyAnt+bGhHgB5WkKUt3mpEobaPFnzJsILw1kcDRuP5kWZlLkh ZuDVT6HMw0sWRmO9zd07yKGs4funAOZYqkasvJK0VLiQk62nTxvQSme7t90dxdOz46 FpYWxs0963CnrlN+z3mAllaZ6FYlSGs6LUmBtI7Iz0IAikBmrmhthgggjQLz9jCOJv byKmQMwrV1kFg== From: Maxime Ripard Date: Tue, 10 Mar 2026 17:06:55 +0100 Subject: [PATCH 03/14] drm/mode-config: Mention drm_mode_config_reset() culprits 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: <20260310-drm-mode-config-init-v1-3-de7397c8e1cf@kernel.org> References: <20260310-drm-mode-config-init-v1-0-de7397c8e1cf@kernel.org> In-Reply-To: <20260310-drm-mode-config-init-v1-0-de7397c8e1cf@kernel.org> To: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Shuah Khan , Dmitry Baryshkov , Jyri Sarha , Tomi Valkeinen , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec Cc: dri-devel@lists.freedesktop.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, Maxime Ripard X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1400; i=mripard@kernel.org; h=from:subject:message-id; bh=pWJGn98h8ZYkxcFli5V1DyhaDv4pkkzV67j693vyn2g=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDJkbHJfOPj3b1fOw1bqrBd3iy67cWGWWYsO9g0cjRbzcR fy4mGR/x1QWBmFOBlkxRZYnMmGnl7cvrnKwX/kDZg4rE8gQBi5OAZhI/UTGhoU33j9m3rM9Yo7/ pUU2Ms9Onf0r+jj8VP+f93s/cFls/flZmfO/1MveqCyBHRYlwidmsDA2zC64f4vh/E1XDpHHjs7 l/8/fn8/ze3/Y4RDV/gUn6kMlPToOqO89suHBbvuuV3aPFmt/AQA= X-Developer-Key: i=mripard@kernel.org; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D drm_mode_config_reset() has the expectation that drm_private_states are not reset. This is especially significant for the DP MST and tunneling code that expect to be preserved across a suspend/resume cycle, where drm_mode_config_reset() is also used. Let's document this expectation. Link: https://lore.kernel.org/dri-devel/aOaQLx-7EpsHRwkH@ideak-desk/ Signed-off-by: Maxime Ripard Reviewed-by: Laurent Pinchart --- drivers/gpu/drm/drm_mode_config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/gpu/drm/drm_mode_config.c b/drivers/gpu/drm/drm_mode_c= onfig.c index 84ae8a23a36786705fea7c0eafd7f20813b7c8f9..54c27376f9894ef5eee378bb5b1= e5fc7049de922 100644 --- a/drivers/gpu/drm/drm_mode_config.c +++ b/drivers/gpu/drm/drm_mode_config.c @@ -187,10 +187,14 @@ int drm_mode_getresources(struct drm_device *dev, voi= d *data, * @dev: drm device * * This functions calls all the crtc's, encoder's and connector's ->reset * callback. Drivers can use this in e.g. their driver load or resume code= to * reset hardware and software state. + * + * It's worth noting that @drm_private_obj structures are expected to be + * stable across suspend/resume cycles, and @drm_mode_config_reset() + * will not affect these structures. */ void drm_mode_config_reset(struct drm_device *dev) { struct drm_crtc *crtc; struct drm_colorop *colorop; --=20 2.53.0 From nobody Wed Apr 8 02:48:19 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 3F9993AB290; Tue, 10 Mar 2026 16:07:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773158841; cv=none; b=PUnHh48LblOAP1V7MAAtbJAsIcmKk1Nr4iWwXydGt2DKbtFiq8UQSDX0CYkiDkaf6NlXFGG3KubiXM/rYm1Sl20wL/XiCnI3q8KX9kCqGplnMA/9t3rAqk7S1/TjsmXvmcpqKC7fkgedFtd2Slzj7gVsSyBlXlpzSPvtT8ZM19E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773158841; c=relaxed/simple; bh=jeBMY8QrFx9AcXG0qFCtKdLKyHBMZ3v0ChKg6Vznvgk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Te1HpmkyW69MJfk7hrJfck3hdgc3zaTml97hKlR8xkc/PuQwz19r8F3q7N3EhKU9NjDwOin/IzfJOT8dHufS/o8hmdTzwllIIXSzWKI+j4XFJ8bPyZorR+0bmBcLYhOH407cmcuiC0KeJGGt1xX+sqtsR2sCEpxoI039fc1ahn4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=YBeLQD9w; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="YBeLQD9w" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 90F6CC19423; Tue, 10 Mar 2026 16:07:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1773158840; bh=jeBMY8QrFx9AcXG0qFCtKdLKyHBMZ3v0ChKg6Vznvgk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=YBeLQD9w+KXz0be24h7KHlACG5S2SFNWo48qlyLU6xQRaoa7hinidRjFgh6/0wy+M TkqAvd3KTrYc7E6SfB7rpEHtfLbn7R22Q5ACEtL74HrAJu2A6XVa+95sG4EBhjACCs UMy+f0ESomzOYQWgLS7/hlIAHlAkmZpF4PWid/Mq+Nw2GqVaEGl7tfc97+GAroE+LO wRZGjcxepAYmjVzpAZ3UK9kU3dyzplE1G5Cg+0Svij6U8zIEIr3dKX7vNg9o3/auqP Y+lpRHQLK3KI18XbdDY5q2+09xhAQd1Aot6/BrOUUEJ48SWWeMwzt04YzjyNVf+9oO nDfsvHXoTJkLA== From: Maxime Ripard Date: Tue, 10 Mar 2026 17:06:56 +0100 Subject: [PATCH 04/14] drm/atomic-state-helper: Fix __drm_atomic_helper_plane_reset() doc typo 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: <20260310-drm-mode-config-init-v1-4-de7397c8e1cf@kernel.org> References: <20260310-drm-mode-config-init-v1-0-de7397c8e1cf@kernel.org> In-Reply-To: <20260310-drm-mode-config-init-v1-0-de7397c8e1cf@kernel.org> To: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Shuah Khan , Dmitry Baryshkov , Jyri Sarha , Tomi Valkeinen , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec Cc: dri-devel@lists.freedesktop.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, Maxime Ripard X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1229; i=mripard@kernel.org; h=from:subject:message-id; bh=jeBMY8QrFx9AcXG0qFCtKdLKyHBMZ3v0ChKg6Vznvgk=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDJkbHJduMi1edq9N3oqJ12777Ru2GslXEu1OCH/p9Zjv8 nP3vDXWHVNZGIQ5GWTFFFmeyISdXt6+uMrBfuUPmDmsTCBDGLg4BWAiLeKMDUcYfQ5Ps/r9d2c6 r1r996/6wrPkakVP5WgUl/n7RRa6bC99/Pv1yUnHIw/XrL3yNP/YBsb66kb/bet4lX1exnzfKJF 5qSU1UGb1wg5pps4Evu9hazeqPLt4xOttT+i5OXrZmkKKhp4A X-Developer-Key: i=mripard@kernel.org; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D A typo has slipped through in the __drm_atomic_helper_plane_reset() documentation, probably due to copy and paste. It will not assign drm_crtc state pointer, but rather the drm_plane's. Signed-off-by: Maxime Ripard Reviewed-by: Laurent Pinchart Reviewed-by: Tomi Valkeinen --- drivers/gpu/drm/drm_atomic_state_helper.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/drm_atomic_state_helper.c b/drivers/gpu/drm/dr= m_atomic_state_helper.c index 323abc9926e084ad595768c06d5c5ee28c22c014..a1abf4247c348eca21da348c389= 3dd843b9ed391 100644 --- a/drivers/gpu/drm/drm_atomic_state_helper.c +++ b/drivers/gpu/drm/drm_atomic_state_helper.c @@ -302,11 +302,11 @@ EXPORT_SYMBOL(__drm_atomic_helper_plane_state_reset); * __drm_atomic_helper_plane_reset - reset state on plane * @plane: drm plane * @plane_state: plane state to assign * * Initializes the newly allocated @plane_state and assigns it to - * the &drm_crtc->state pointer of @plane, usually required when + * the &drm_plane->state pointer of @plane, usually required when * initializing the drivers or when called from the &drm_plane_funcs.reset * hook. * * This is useful for drivers that subclass the plane state. */ --=20 2.53.0 From nobody Wed Apr 8 02:48:19 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 406CE3BF69B; Tue, 10 Mar 2026 16:07:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773158844; cv=none; b=qe/Kd0noTyv7+EFQPzp66ABtSLNjCqcfyP4oaO0FjlV1V/X3LzIED5QYrQKu46dji8DSsc4LRoozYzfuR9qdMTB1t3AwDcfd32YfSH/qzwuTS9JdQK4S9ux44A7o+g9megTI8p1L7BQT2cU1NsX28MAnThqm/RT9gVHetCIzGHA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773158844; c=relaxed/simple; bh=vjC/BB4+6nV6lrTleZ0dvGqZuB+/+HLlfLrcv7dUBiQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Y5CVjYE0MQsNIdgWelPWeum4MpicG4XiFXc9bryBidq8yFwVHY60nLoVCCtJlXpKkVzcK+2duSqvg/0KzuYfg1ir3gB7wF8IL6xEKDYqMNA+E41Syk94VbDk+sdWP1K6q5A+JPmGTSa6TzsiktFdnL+5tC1SCcHnzSX06zFJ+U4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=LhycQOGp; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="LhycQOGp" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 792EBC19423; Tue, 10 Mar 2026 16:07:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1773158843; bh=vjC/BB4+6nV6lrTleZ0dvGqZuB+/+HLlfLrcv7dUBiQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=LhycQOGpSsJG7C/UDjQuZfiU0jn7+7HADmoSEN0DPDxdxYl7/Zbr2a6Z1xgsxW/2w NTNlOYRwUFYV8Cx4G8uwu3vXjbTiAWvAobQN14Wt5nQf+09ET4UbMl1ON0U7tKYgvq rYbq4isL9To0mABPD9fCDZ+Uw5IIVfGqQ8HTkGz8mewvTjOfZpbGd7dzclMsGI9o6D JgPJdP/ce9mrNtTcoPwaF+kL9B/OBWnchjpItvTQvS9VxZEZCg85xzsBEu1EsNx1RQ EOO/2R0qpu7kjJBj3jbMxHED2DokpQuAdsYYbbuKGXKF1hqmR/97xRZvRvXtgNUWPp pwUq3UwoX+DxA== From: Maxime Ripard Date: Tue, 10 Mar 2026 17:06:57 +0100 Subject: [PATCH 05/14] drm/plane: Add new atomic_create_state callback 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: <20260310-drm-mode-config-init-v1-5-de7397c8e1cf@kernel.org> References: <20260310-drm-mode-config-init-v1-0-de7397c8e1cf@kernel.org> In-Reply-To: <20260310-drm-mode-config-init-v1-0-de7397c8e1cf@kernel.org> To: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Shuah Khan , Dmitry Baryshkov , Jyri Sarha , Tomi Valkeinen , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec Cc: dri-devel@lists.freedesktop.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, Maxime Ripard X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=7412; i=mripard@kernel.org; h=from:subject:message-id; bh=vjC/BB4+6nV6lrTleZ0dvGqZuB+/+HLlfLrcv7dUBiQ=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDJkbHJdeFXjLeLCd+dKzDcftFjPxH9kdONWp+c5Ui998p erCUSfTO6awMAhzMsiKKbI8kQk7vbx9cZWD/cofMHNYmUCGMHBxCsBEON4xVhxYN/cJx/PaUMlV W7p/xd6ycH4nLp1b+PRI6bd/O9JuiayUip65bknRzTyVj5f3MKq/YWxY6GUyy+99WYPZcq+kS29 kFmytUnsn1Ne6/pm12HLZkJ3feRV+XD/0UlxR4Mkcn60yO1UB X-Developer-Key: i=mripard@kernel.org; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D Commit 47b5ac7daa46 ("drm/atomic: Add new atomic_create_state callback to drm_private_obj") introduced a new pattern for allocating drm object states. Instead of relying on the reset() callback, it created a new atomic_create_state hook. This is helpful because reset is a bit overloaded: it's used to create the initial software tate, reset it, but also reset the hardware. It can also be used either at probe time, to create the initial state and possibly reset the hardware to an expected default, but also during suspend/resume. Both these cases come with different expectations too: during the initialization, we want to initialize all states, but during suspend/resume, drm_private_states for example are expected to be kept around. And reset() isn't fallible, which makes it harder to handle initialization errors properly. And this is only really relevant for some drivers, since all the helpers for reset only create a new state, and don't touch the hardware at all. It was thus decided to create a new hook that would allocate and initialize a pristine state without any side effect: atomic_create_state to untangle a bit some of it, and to separate the initialization with the actual reset one might need during a suspend/resume. Let's continue the transition to the new pattern with planes. Signed-off-by: Maxime Ripard --- drivers/gpu/drm/drm_atomic_state_helper.c | 41 +++++++++++++++++++++++++++= ++++ drivers/gpu/drm/drm_mode_config.c | 18 ++++++++++++++ include/drm/drm_atomic_state_helper.h | 4 +++ include/drm/drm_plane.h | 13 ++++++++++ 4 files changed, 76 insertions(+) diff --git a/drivers/gpu/drm/drm_atomic_state_helper.c b/drivers/gpu/drm/dr= m_atomic_state_helper.c index a1abf4247c348eca21da348c3893dd843b9ed391..898e168eeae1c3899121ffd13c7= 9fae7803fcd2a 100644 --- a/drivers/gpu/drm/drm_atomic_state_helper.c +++ b/drivers/gpu/drm/drm_atomic_state_helper.c @@ -318,10 +318,29 @@ void __drm_atomic_helper_plane_reset(struct drm_plane= *plane, =20 plane->state =3D plane_state; } EXPORT_SYMBOL(__drm_atomic_helper_plane_reset); =20 +/** + * __drm_atomic_helper_plane_create_state - initializes plane state + * @plane: plane object + * @state: new state to initialize + * + * Initializes the newly allocated @state, usually required when + * initializing the drivers. + * + * @state is assumed to be zeroed. + * + * This is useful for drivers that subclass @drm_plane_state. + */ +void __drm_atomic_helper_plane_create_state(struct drm_plane *plane, + struct drm_plane_state *state) +{ + __drm_atomic_helper_plane_reset(plane, state); +} +EXPORT_SYMBOL(__drm_atomic_helper_plane_create_state); + /** * drm_atomic_helper_plane_reset - default &drm_plane_funcs.reset hook for= planes * @plane: drm plane * * Resets the atomic state for @plane by freeing the state pointer (which = might @@ -337,10 +356,32 @@ void drm_atomic_helper_plane_reset(struct drm_plane *= plane) if (plane->state) __drm_atomic_helper_plane_reset(plane, plane->state); } EXPORT_SYMBOL(drm_atomic_helper_plane_reset); =20 +/** + * drm_atomic_helper_plane_create_state - default &drm_plane_funcs.atomic_= create_state hook for planes + * @plane: plane object + * + * Initializes a pristine @drm_plane_state. + * + * This is useful for drivers that don't subclass @drm_plane_state. + */ +struct drm_plane_state *drm_atomic_helper_plane_create_state(struct drm_pl= ane *plane) +{ + struct drm_plane_state *state; + + state =3D kzalloc_obj(*state); + if (!state) + return ERR_PTR(-ENOMEM); + + __drm_atomic_helper_plane_reset(plane, state); + + return state; +} +EXPORT_SYMBOL(drm_atomic_helper_plane_create_state); + /** * __drm_atomic_helper_plane_duplicate_state - copy atomic plane state * @plane: plane object * @state: atomic plane state * diff --git a/drivers/gpu/drm/drm_mode_config.c b/drivers/gpu/drm/drm_mode_c= onfig.c index 54c27376f9894ef5eee378bb5b1e5fc7049de922..43fe64540b8ec4df4bb823d96db= 607e6bfe58824 100644 --- a/drivers/gpu/drm/drm_mode_config.c +++ b/drivers/gpu/drm/drm_mode_config.c @@ -180,10 +180,26 @@ int drm_mode_getresources(struct drm_device *dev, voi= d *data, drm_connector_list_iter_end(&conn_iter); =20 return ret; } =20 +static int drm_mode_config_plane_create_state(struct drm_plane *plane) +{ + struct drm_plane_state *plane_state; + + if (!plane->funcs->atomic_create_state) + return 0; + + plane_state =3D plane->funcs->atomic_create_state(plane); + if (IS_ERR(plane_state)) + return PTR_ERR(plane_state); + + plane->state =3D plane_state; + + return 0; +} + /** * drm_mode_config_reset - call ->reset callbacks * @dev: drm device * * This functions calls all the crtc's, encoder's and connector's ->reset @@ -207,10 +223,12 @@ void drm_mode_config_reset(struct drm_device *dev) drm_colorop_reset(colorop); =20 drm_for_each_plane(plane, dev) if (plane->funcs->reset) plane->funcs->reset(plane); + else if (plane->funcs->atomic_create_state) + drm_mode_config_plane_create_state(plane); =20 drm_for_each_crtc(crtc, dev) if (crtc->funcs->reset) crtc->funcs->reset(crtc); =20 diff --git a/include/drm/drm_atomic_state_helper.h b/include/drm/drm_atomic= _state_helper.h index 900672c6ea90ba9cb87e38a7c84225972aee43c5..f56a91fca20e778d8ccb1767301= dc00783bf40f3 100644 --- a/include/drm/drm_atomic_state_helper.h +++ b/include/drm/drm_atomic_state_helper.h @@ -51,12 +51,16 @@ struct drm_crtc_state * drm_atomic_helper_crtc_duplicate_state(struct drm_crtc *crtc); void __drm_atomic_helper_crtc_destroy_state(struct drm_crtc_state *state); void drm_atomic_helper_crtc_destroy_state(struct drm_crtc *crtc, struct drm_crtc_state *state); =20 +void __drm_atomic_helper_plane_create_state(struct drm_plane *plane, + struct drm_plane_state *state); void __drm_atomic_helper_plane_state_reset(struct drm_plane_state *state, struct drm_plane *plane); +struct drm_plane_state * +drm_atomic_helper_plane_create_state(struct drm_plane *plane); void __drm_atomic_helper_plane_reset(struct drm_plane *plane, struct drm_plane_state *state); void drm_atomic_helper_plane_reset(struct drm_plane *plane); void __drm_atomic_helper_plane_duplicate_state(struct drm_plane *plane, struct drm_plane_state *state); diff --git a/include/drm/drm_plane.h b/include/drm/drm_plane.h index 703ef4d1bbbcf084c43aa5e127d28691878061c4..4d4d511b681d50c17fbc593cce9= f706d63e04a52 100644 --- a/include/drm/drm_plane.h +++ b/include/drm/drm_plane.h @@ -386,10 +386,23 @@ struct drm_plane_funcs { * 0 on success or a negative error code on failure. */ int (*set_property)(struct drm_plane *plane, struct drm_property *property, uint64_t val); =20 + /** + * @atomic_create_state: + * + * Allocates a pristine, initialized, state for the plane object + * and returns it. + * + * RETURNS: + * + * A new, pristine, plane state instance or an error pointer + * on failure. + */ + struct drm_plane_state *(*atomic_create_state)(struct drm_plane *plane); + /** * @atomic_duplicate_state: * * Duplicate the current atomic state for this plane and return it. * The core and helpers guarantee that any atomic state duplicated with --=20 2.53.0 From nobody Wed Apr 8 02:48:19 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 EE016309F08; Tue, 10 Mar 2026 16:07:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773158847; cv=none; b=JB6L5INpV5l5GD2lCb1s3IvZ/oHCTOH7GixbpNLUoELzVCpF+M0n3MKGt0zzJk8YAfk+K4SWXlHZLpkzQpCJrdok26IZ5IZR3TmV5FiyGFp0tIGh1ks65s4Hp/P9uZ2PcdcYTZi1MwHw2Z2cCx1O+hOifRV2GdZYGFLf9ctxVrU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773158847; c=relaxed/simple; bh=Uobxq4K2wAwHRPAxJh14lNMQ5N5l4VnlxVpQCTJ3MCQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=edWA01CNLP895q8h2iONYbuggOVRYtCcazGMNmPHBHfTuqkDnB8zpdNvbuI7FpZ6jjehtdKA5EmoUx2j70oFVjSeG1Ov1LI4wmxYwpnCJi4S/mipNIFpXpIo/W+k/R1CE8Dvvv1on2T6Wa8Suc2jS/BQKqqKD1oj9AHjd4XFDMw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=KOfN3c97; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="KOfN3c97" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4A5FBC2BC9E; Tue, 10 Mar 2026 16:07:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1773158846; bh=Uobxq4K2wAwHRPAxJh14lNMQ5N5l4VnlxVpQCTJ3MCQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=KOfN3c97C7EIGRek7JDP11uWiiDQyMenLU5tkcYrpKdqNknGWN5JtEvtMmLDLMjs2 j4XxnhoxCEhKmHhOsaBMT+5xqeODUX8OvqlSvA577P8qzTUDTtZEqWKy/tVD5PE0TR SmEyBsMederRZ5WNd1n+Gkg6dRKXWz7TluvBVQJmCD3CnmsP2C8knKWTOLGePlJxvW qpQlM0NvBINmnw2Sc2DUjvmd8bhjXrkREaKcIv6Bz0re0sPFtzxPJP3G15bORLfUWR /lgWVpZkIdC5s0ngsUZzwJGIoGGkg3lrgR+/saorvhiqgc1ImuV7LNtTw+gQqZ3x9R lVzbp2MbCpDug== From: Maxime Ripard Date: Tue, 10 Mar 2026 17:06:58 +0100 Subject: [PATCH 06/14] drm/crtc: Add new atomic_create_state callback 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: <20260310-drm-mode-config-init-v1-6-de7397c8e1cf@kernel.org> References: <20260310-drm-mode-config-init-v1-0-de7397c8e1cf@kernel.org> In-Reply-To: <20260310-drm-mode-config-init-v1-0-de7397c8e1cf@kernel.org> To: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Shuah Khan , Dmitry Baryshkov , Jyri Sarha , Tomi Valkeinen , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec Cc: dri-devel@lists.freedesktop.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, Maxime Ripard X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=7227; i=mripard@kernel.org; h=from:subject:message-id; bh=Uobxq4K2wAwHRPAxJh14lNMQ5N5l4VnlxVpQCTJ3MCQ=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDJkbHJc9OO59/erPYz7MafP5JuzvUO2/9eBe6tnQa1vMX hqJRzW4d0xlYRDmZJAVU2R5IhN2enn74ioH+5U/YOawMoEMYeDiFICJbP7CWF9/r4Nj0Rp1o9tn Js8MO/GU4/vp6kTPzenhalyFn53uLuTLc3aQE7m1/1SF1zGlw8+jsxhr5WZwxc1aIGniP/mb+XN e++0p9kXMnXfdNSfJ3HZewbDV5tgTl+hLKl/iu/8UP5w3pfoOAA== X-Developer-Key: i=mripard@kernel.org; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D Commit 47b5ac7daa46 ("drm/atomic: Add new atomic_create_state callback to drm_private_obj") introduced a new pattern for allocating drm object states. Instead of relying on the reset() callback, it created a new atomic_create_state hook. This is helpful because reset is a bit overloaded: it's used to create the initial software tate, reset it, but also reset the hardware. It can also be used either at probe time, to create the initial state and possibly reset the hardware to an expected default, but also during suspend/resume. Both these cases come with different expectations too: during the initialization, we want to initialize all states, but during suspend/resume, drm_private_states for example are expected to be kept around. And reset() isn't fallible, which makes it harder to handle initialization errors properly. And this is only really relevant for some drivers, since all the helpers for reset only create a new state, and don't touch the hardware at all. It was thus decided to create a new hook that would allocate and initialize a pristine state without any side effect: atomic_create_state to untangle a bit some of it, and to separate the initialization with the actual reset one might need during a suspend/resume. Let's continue the transition to the new pattern with crtcs. Signed-off-by: Maxime Ripard --- drivers/gpu/drm/drm_atomic_state_helper.c | 41 +++++++++++++++++++++++++++= ++++ drivers/gpu/drm/drm_mode_config.c | 18 ++++++++++++++ include/drm/drm_atomic_state_helper.h | 4 +++ include/drm/drm_crtc.h | 13 ++++++++++ 4 files changed, 76 insertions(+) diff --git a/drivers/gpu/drm/drm_atomic_state_helper.c b/drivers/gpu/drm/dr= m_atomic_state_helper.c index 898e168eeae1c3899121ffd13c79fae7803fcd2a..28fa315586c2530e50f0b470d9a= d43f5c3a5e056 100644 --- a/drivers/gpu/drm/drm_atomic_state_helper.c +++ b/drivers/gpu/drm/drm_atomic_state_helper.c @@ -102,10 +102,29 @@ __drm_atomic_helper_crtc_reset(struct drm_crtc *crtc, =20 crtc->state =3D crtc_state; } EXPORT_SYMBOL(__drm_atomic_helper_crtc_reset); =20 +/** + * __drm_atomic_helper_crtc_create_state - initializes crtc state + * @crtc: crtc object + * @state: new state to initialize + * + * Initializes the newly allocated @state, usually required when + * initializing the drivers. + * + * @state is assumed to be zeroed. + * + * This is useful for drivers that subclass @drm_crtc_state. + */ +void __drm_atomic_helper_crtc_create_state(struct drm_crtc *crtc, + struct drm_crtc_state *state) +{ + __drm_atomic_helper_crtc_reset(crtc, state); +} +EXPORT_SYMBOL(__drm_atomic_helper_crtc_create_state); + /** * drm_atomic_helper_crtc_reset - default &drm_crtc_funcs.reset hook for C= RTCs * @crtc: drm CRTC * * Resets the atomic state for @crtc by freeing the state pointer (which m= ight @@ -121,10 +140,32 @@ void drm_atomic_helper_crtc_reset(struct drm_crtc *cr= tc) =20 __drm_atomic_helper_crtc_reset(crtc, crtc_state); } EXPORT_SYMBOL(drm_atomic_helper_crtc_reset); =20 +/** + * drm_atomic_helper_crtc_create_state - default &drm_crtc_funcs.atomic_cr= eate_state hook for crtcs + * @crtc: crtc object + * + * Initializes a pristine @drm_crtc_state. + * + * This is useful for drivers that don't subclass @drm_crtc_state. + */ +struct drm_crtc_state *drm_atomic_helper_crtc_create_state(struct drm_crtc= *crtc) +{ + struct drm_crtc_state *state; + + state =3D kzalloc_obj(*state); + if (!state) + return ERR_PTR(-ENOMEM); + + __drm_atomic_helper_crtc_reset(crtc, state); + + return state; +} +EXPORT_SYMBOL(drm_atomic_helper_crtc_create_state); + /** * __drm_atomic_helper_crtc_duplicate_state - copy atomic CRTC state * @crtc: CRTC object * @state: atomic CRTC state * diff --git a/drivers/gpu/drm/drm_mode_config.c b/drivers/gpu/drm/drm_mode_c= onfig.c index 43fe64540b8ec4df4bb823d96db607e6bfe58824..6d47af4097071cfb93a2c23909d= d5d643687111f 100644 --- a/drivers/gpu/drm/drm_mode_config.c +++ b/drivers/gpu/drm/drm_mode_config.c @@ -196,10 +196,26 @@ static int drm_mode_config_plane_create_state(struct = drm_plane *plane) plane->state =3D plane_state; =20 return 0; } =20 +static int drm_mode_config_crtc_create_state(struct drm_crtc *crtc) +{ + struct drm_crtc_state *crtc_state; + + if (!crtc->funcs->atomic_create_state) + return 0; + + crtc_state =3D crtc->funcs->atomic_create_state(crtc); + if (IS_ERR(crtc_state)) + return PTR_ERR(crtc_state); + + crtc->state =3D crtc_state; + + return 0; +} + /** * drm_mode_config_reset - call ->reset callbacks * @dev: drm device * * This functions calls all the crtc's, encoder's and connector's ->reset @@ -229,10 +245,12 @@ void drm_mode_config_reset(struct drm_device *dev) drm_mode_config_plane_create_state(plane); =20 drm_for_each_crtc(crtc, dev) if (crtc->funcs->reset) crtc->funcs->reset(crtc); + else if (crtc->funcs->atomic_create_state) + drm_mode_config_crtc_create_state(crtc); =20 drm_for_each_encoder(encoder, dev) if (encoder->funcs && encoder->funcs->reset) encoder->funcs->reset(encoder); =20 diff --git a/include/drm/drm_atomic_state_helper.h b/include/drm/drm_atomic= _state_helper.h index f56a91fca20e778d8ccb1767301dc00783bf40f3..d7e8ac09d81febef3a95ed460cd= 00b91ee3d05b2 100644 --- a/include/drm/drm_atomic_state_helper.h +++ b/include/drm/drm_atomic_state_helper.h @@ -43,10 +43,14 @@ struct drm_device; void __drm_atomic_helper_crtc_state_reset(struct drm_crtc_state *state, struct drm_crtc *crtc); void __drm_atomic_helper_crtc_reset(struct drm_crtc *crtc, struct drm_crtc_state *state); void drm_atomic_helper_crtc_reset(struct drm_crtc *crtc); +void __drm_atomic_helper_crtc_create_state(struct drm_crtc *crtc, + struct drm_crtc_state *state); +struct drm_crtc_state * +drm_atomic_helper_crtc_create_state(struct drm_crtc *crtc); void __drm_atomic_helper_crtc_duplicate_state(struct drm_crtc *crtc, struct drm_crtc_state *state); struct drm_crtc_state * drm_atomic_helper_crtc_duplicate_state(struct drm_crtc *crtc); void __drm_atomic_helper_crtc_destroy_state(struct drm_crtc_state *state); diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index 66278ffeebd68e69e9d0724ea5a33f93231e3f8b..30dbf430586ee7b106acbdfb28d= 27ea81c1377a6 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h @@ -624,10 +624,23 @@ struct drm_crtc_funcs { * 0 on success or a negative error code on failure. */ int (*set_property)(struct drm_crtc *crtc, struct drm_property *property, uint64_t val); =20 + /** + * @atomic_create_state: + * + * Allocates a pristine, initialized, state for the crtc object + * and returns it. + * + * RETURNS: + * + * A new, pristine, crtc state instance or an error pointer + * on failure. + */ + struct drm_crtc_state *(*atomic_create_state)(struct drm_crtc *crtc); + /** * @atomic_duplicate_state: * * Duplicate the current atomic state for this CRTC and return it. * The core and helpers guarantee that any atomic state duplicated with --=20 2.53.0 From nobody Wed Apr 8 02:48:19 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 3D093346FB3; Tue, 10 Mar 2026 16:07:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773158850; cv=none; b=Z14WyejCnssnz8kMwF+RM8+qkZZQ6iG+TvLVA50KRfyoBJVCw2BOjQOmA11OX7cY028f7D3EzRfQ/ioAUUfdogb/GobNtl3lwEeUI7AKfUxgYhNB10NuxbTcS65I1IsZAvB980aTmeJeX5CbFdFr/NK8kvonMpm9xoRGsMkBnCE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773158850; c=relaxed/simple; bh=XdoyFw1BJuo1zHelq873QMJCNghKWxb4OWgnKcCwHJw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=MtU7LwgH2p5cTw0sQrzzhgAQjUs0+F5GFHcGfZxkSRrDbnjaNDwcMRKPajtzTtEyfGzfErlyA6qlanyzSlSJ/eX835qTD+gw+5K8/d2up5bmPub23Cu+IxKifHoV5WnctggJ+FbarohTnbctmgY/Dktvf3+B+tJHBy70qGgnyGA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=aSNOzzST; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="aSNOzzST" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7E62EC19423; Tue, 10 Mar 2026 16:07:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1773158849; bh=XdoyFw1BJuo1zHelq873QMJCNghKWxb4OWgnKcCwHJw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=aSNOzzSTbOV11eKY5TvCN4cYZed4e4Pw+yaPluMVLf7XT1PW87C3ekuDbr+Dddour K6hq1sjftJ40TleO2hFxa5pE+WqKazvUsesNFiq9MdcjoqmTSTxkbE3Hnho11+2MPM u3j3UvFP42g5OsC50mJaDVL5eOOkCp9jJL/JgoA0l2uMJcg0cDGUhnG7CpMj2V2vnA eD8DClBYQZ+qgVICnfk3HyzHJjgeEq+4KLCJrY6Ef8T/d6r12JZQC8Pw/GKOy4lmXK aj761Aq7TnhqYl6YBpkKsXllhOG+yZmJpVUPWIP7EoVAGmNDK1TyD/mc+eBzGRTEm5 agGMYaAkFe25g== From: Maxime Ripard Date: Tue, 10 Mar 2026 17:06:59 +0100 Subject: [PATCH 07/14] drm/connector: Add new atomic_create_state callback 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: <20260310-drm-mode-config-init-v1-7-de7397c8e1cf@kernel.org> References: <20260310-drm-mode-config-init-v1-0-de7397c8e1cf@kernel.org> In-Reply-To: <20260310-drm-mode-config-init-v1-0-de7397c8e1cf@kernel.org> To: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Shuah Khan , Dmitry Baryshkov , Jyri Sarha , Tomi Valkeinen , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec Cc: dri-devel@lists.freedesktop.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, Maxime Ripard X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=7817; i=mripard@kernel.org; h=from:subject:message-id; bh=XdoyFw1BJuo1zHelq873QMJCNghKWxb4OWgnKcCwHJw=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDJkbHJc9CrPhDlveHmt77eSexUvlWbrStm9gykh9PHPWJ 32HgzK9HVNZGIQ5GWTFFFmeyISdXt6+uMrBfuUPmDmsTCBDGLg4BWAi114yNlw+Om+9goyzw2Px piSbuA18s1am/bPVKF//qzpkYjQT/3GXK3vvZ8svbNnSesbUJLXRirFWaKLF9+1L+i/PvNNQv0V COH3xFIXexP4Vr+bI6PfcvDaN90Pb3YRLGzd3HMyIn9fiO1ENAA== X-Developer-Key: i=mripard@kernel.org; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D Commit 47b5ac7daa46 ("drm/atomic: Add new atomic_create_state callback to drm_private_obj") introduced a new pattern for allocating drm object states. Instead of relying on the reset() callback, it created a new atomic_create_state hook. This is helpful because reset is a bit overloaded: it's used to create the initial software tate, reset it, but also reset the hardware. It can also be used either at probe time, to create the initial state and possibly reset the hardware to an expected default, but also during suspend/resume. Both these cases come with different expectations too: during the initialization, we want to initialize all states, but during suspend/resume, drm_private_states for example are expected to be kept around. And reset() isn't fallible, which makes it harder to handle initialization errors properly. And this is only really relevant for some drivers, since all the helpers for reset only create a new state, and don't touch the hardware at all. It was thus decided to create a new hook that would allocate and initialize a pristine state without any side effect: atomic_create_state to untangle a bit some of it, and to separate the initialization with the actual reset one might need during a suspend/resume. Let's continue the transition to the new pattern with connectors. Signed-off-by: Maxime Ripard --- drivers/gpu/drm/drm_atomic_state_helper.c | 42 +++++++++++++++++++++++++++= ++++ drivers/gpu/drm/drm_mode_config.c | 18 +++++++++++++ include/drm/drm_atomic_state_helper.h | 4 +++ include/drm/drm_connector.h | 13 ++++++++++ 4 files changed, 77 insertions(+) diff --git a/drivers/gpu/drm/drm_atomic_state_helper.c b/drivers/gpu/drm/dr= m_atomic_state_helper.c index 28fa315586c2530e50f0b470d9ad43f5c3a5e056..72cc88972e154d931e9ae828888= ea6a7cfb95904 100644 --- a/drivers/gpu/drm/drm_atomic_state_helper.c +++ b/drivers/gpu/drm/drm_atomic_state_helper.c @@ -543,10 +543,29 @@ __drm_atomic_helper_connector_reset(struct drm_connec= tor *connector, =20 connector->state =3D conn_state; } EXPORT_SYMBOL(__drm_atomic_helper_connector_reset); =20 +/** + * __drm_atomic_helper_connector_create_state - initializes connector state + * @connector: connector object + * @state: new state to initialize + * + * Initializes the newly allocated @state, usually required when + * initializing the drivers. + * + * @state is assumed to be zeroed. + * + * This is useful for drivers that subclass @drm_connector_state. + */ +void __drm_atomic_helper_connector_create_state(struct drm_connector *conn= ector, + struct drm_connector_state *state) +{ + __drm_atomic_helper_connector_reset(connector, state); +} +EXPORT_SYMBOL(__drm_atomic_helper_connector_create_state); + /** * drm_atomic_helper_connector_reset - default &drm_connector_funcs.reset = hook for connectors * @connector: drm connector * * Resets the atomic state for @connector by freeing the state pointer (wh= ich @@ -563,10 +582,33 @@ void drm_atomic_helper_connector_reset(struct drm_con= nector *connector) kfree(connector->state); __drm_atomic_helper_connector_reset(connector, conn_state); } EXPORT_SYMBOL(drm_atomic_helper_connector_reset); =20 +/** + * drm_atomic_helper_connector_create_state - default &drm_connector_funcs= .atomic_create_state hook for connectors + * @connector: connector object + * + * Initializes a pristine @drm_connector_state. + * + * This is useful for drivers that don't subclass @drm_connector_state. + */ +struct drm_connector_state * +drm_atomic_helper_connector_create_state(struct drm_connector *connector) +{ + struct drm_connector_state *state; + + state =3D kzalloc_obj(*state); + if (!state) + return ERR_PTR(-ENOMEM); + + __drm_atomic_helper_connector_reset(connector, state); + + return state; +} +EXPORT_SYMBOL(drm_atomic_helper_connector_create_state); + /** * drm_atomic_helper_connector_tv_margins_reset - Resets TV connector prop= erties * @connector: DRM connector * * Resets the TV-related properties attached to a connector. diff --git a/drivers/gpu/drm/drm_mode_config.c b/drivers/gpu/drm/drm_mode_c= onfig.c index 6d47af4097071cfb93a2c23909dd5d643687111f..95759a4b5176ff17032a9a267ec= 9de6980be0abc 100644 --- a/drivers/gpu/drm/drm_mode_config.c +++ b/drivers/gpu/drm/drm_mode_config.c @@ -212,10 +212,26 @@ static int drm_mode_config_crtc_create_state(struct d= rm_crtc *crtc) crtc->state =3D crtc_state; =20 return 0; } =20 +static int drm_mode_config_connector_create_state(struct drm_connector *co= nnector) +{ + struct drm_connector_state *conn_state; + + if (!connector->funcs->atomic_create_state) + return 0; + + conn_state =3D connector->funcs->atomic_create_state(connector); + if (IS_ERR(conn_state)) + return PTR_ERR(conn_state); + + connector->state =3D conn_state; + + return 0; +} + /** * drm_mode_config_reset - call ->reset callbacks * @dev: drm device * * This functions calls all the crtc's, encoder's and connector's ->reset @@ -256,10 +272,12 @@ void drm_mode_config_reset(struct drm_device *dev) =20 drm_connector_list_iter_begin(dev, &conn_iter); drm_for_each_connector_iter(connector, &conn_iter) if (connector->funcs->reset) connector->funcs->reset(connector); + else if (connector->funcs->atomic_create_state) + drm_mode_config_connector_create_state(connector); drm_connector_list_iter_end(&conn_iter); } EXPORT_SYMBOL(drm_mode_config_reset); =20 /* diff --git a/include/drm/drm_atomic_state_helper.h b/include/drm/drm_atomic= _state_helper.h index d7e8ac09d81febef3a95ed460cd00b91ee3d05b2..d5259cbfdb150553932d2b3c9c5= 13bf8e773c96d 100644 --- a/include/drm/drm_atomic_state_helper.h +++ b/include/drm/drm_atomic_state_helper.h @@ -76,11 +76,15 @@ void drm_atomic_helper_plane_destroy_state(struct drm_p= lane *plane, =20 void __drm_atomic_helper_connector_state_reset(struct drm_connector_state = *conn_state, struct drm_connector *connector); void __drm_atomic_helper_connector_reset(struct drm_connector *connector, struct drm_connector_state *conn_state); +void __drm_atomic_helper_connector_create_state(struct drm_connector *conn= ector, + struct drm_connector_state *state); void drm_atomic_helper_connector_reset(struct drm_connector *connector); +struct drm_connector_state * +drm_atomic_helper_connector_create_state(struct drm_connector *connector); void drm_atomic_helper_connector_tv_reset(struct drm_connector *connector); int drm_atomic_helper_connector_tv_check(struct drm_connector *connector, struct drm_atomic_state *state); void drm_atomic_helper_connector_tv_margins_reset(struct drm_connector *co= nnector); void diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h index c18be8c19de0ab1e02e7d7b1fcd9f2ab5ef1dd15..6d73068de157144770931c64ce3= f91e6f15ef0e4 100644 --- a/include/drm/drm_connector.h +++ b/include/drm/drm_connector.h @@ -1509,10 +1509,23 @@ struct drm_connector_funcs { * when a connector is being hot-unplugged for drivers that support * connector hotplugging (e.g. DisplayPort MST). */ void (*destroy)(struct drm_connector *connector); =20 + /** + * @atomic_create_state: + * + * Allocates a pristine, initialized, state for the connector object + * and returns it. + * + * RETURNS: + * + * A new, pristine, connector state instance or an error pointer + * on failure. + */ + struct drm_connector_state *(*atomic_create_state)(struct drm_connector *= connector); + /** * @atomic_duplicate_state: * * Duplicate the current atomic state for this connector and return it. * The core and helpers guarantee that any atomic state duplicated with --=20 2.53.0 From nobody Wed Apr 8 02:48:19 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 DE9143BFE34; Tue, 10 Mar 2026 16:07:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773158852; cv=none; b=KenUHBaGVAc3vmCuPBQKNYsW4yNfRKQ+X6QuG2riAU+FyGYeqQ4TeArb5medxmnLmecwkE6W28TCXhWeyo1bmJUGHm/mO5lZ7kblT6RSBQnyNA672cD7nZhiDH9Ruw/PAfk0Adcj3Tk5OAsiXWKLT7bT2uaWNdBRE7dwLDtqkqA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773158852; c=relaxed/simple; bh=CsVIwHX+p0j2dU0X8ERUlyY3x8L8Ul+2z/qAN1xRluo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=QSgkq6oSPACfPsZ/FrlXEsYuZ0Zxdr2zqVOfysg6fLx4mYx+VOUfYf8vQcJ1LEvo9WRUXkbYqUgwFZt2uGu1oGhq8A3asvOZotz8zsbLTtxi/xMTCbbOtVuxHFPIx+DUInclk1IZljBBQ5RJYXi+QsB3P6WDH9AAC2SzIXa3MZI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=skU8WFdu; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="skU8WFdu" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4B150C19425; Tue, 10 Mar 2026 16:07:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1773158852; bh=CsVIwHX+p0j2dU0X8ERUlyY3x8L8Ul+2z/qAN1xRluo=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=skU8WFduYo/6yp0LBTgpx8wNU1y1Ck2VasfE6wz0shvwAGT3jxNGq1s2H4zI1k8PY YHNn5MV9k1fd/Z73kiWuKyYK+5fhN3C9AeCVY9QaAXOjRRZ0PflPjFhAfheP0xYIw7 yxwzjURt3C0MxFOvYYevWByGpNYw07Y1UdAIKyMRxI+koKbiuvz+TCvdvLVM/LB+GO DXQwTe7A3XNpHfhK4Z9xCW3QLB2Q6ngdIy+4aIkaZXKy9gGU6ztYTwNH69sAaL3Zit kvS1c0wSVjwwvNNfEmyD0gzLUSH1CrHTIb6BwoCggO3DjUg6ETz424mVaPyz7ZuitZ YKT74ih5F8aow== From: Maxime Ripard Date: Tue, 10 Mar 2026 17:07:00 +0100 Subject: [PATCH 08/14] drm/mode-config: Create drm_mode_config_create_state() 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: <20260310-drm-mode-config-init-v1-8-de7397c8e1cf@kernel.org> References: <20260310-drm-mode-config-init-v1-0-de7397c8e1cf@kernel.org> In-Reply-To: <20260310-drm-mode-config-init-v1-0-de7397c8e1cf@kernel.org> To: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Shuah Khan , Dmitry Baryshkov , Jyri Sarha , Tomi Valkeinen , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec Cc: dri-devel@lists.freedesktop.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, Maxime Ripard X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=6059; i=mripard@kernel.org; h=from:subject:message-id; bh=CsVIwHX+p0j2dU0X8ERUlyY3x8L8Ul+2z/qAN1xRluo=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDJkbHJe/3qXRarXwUuIly8PH8pd633FTeJWX0vwlYY+2+ OqX8y4t6ZjKwiDMySArpsjyRCbs9PL2xVUO9it/wMxhZQIZwsDFKQATeWzC2LBO1rjLZUIgU/+N bfrbs56tnfhm8uSvXz6s9q9tK+JqUNpvc3dDWszLpFfbdNWvPgx6NJ2x3tdKecOPsNqHbOIWr3R nJ0ues/g/75iXa06+bmmuomiKd+mJ7AuzrN47HHk0R+LhXP1jAA== X-Developer-Key: i=mripard@kernel.org; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D drm_mode_config_reset() can be used to create the initial state, but also to return to the initial state, when doing a suspend/resume cycle for example. It also affects both the software and the hardware, and drivers can either choose to reset the hardware as well. Most will just create an empty state and the synchronisation between hardware and software states will effectively be done when the first commit is done. That dual role can be harmful, since some objects do need to be initialized but also need to be preserved across a suspend/resume cycle. drm_private_obj are such objects for example. Thus, let's create another helper for drivers to call to initialize their state when the driver is loaded, so we can make drm_mode_config_reset() only about handling suspend/resume and similar. Signed-off-by: Maxime Ripard --- drivers/gpu/drm/drm_atomic.c | 12 +++++- drivers/gpu/drm/drm_mode_config.c | 83 +++++++++++++++++++++++++++++++++++= ++++ include/drm/drm_mode_config.h | 1 + 3 files changed, 94 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c index 92c6afc8f22c8307a59dc266aacdb8e03351409d..d1885f895cce78725419b6291f4= dbe5563e3b240 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c @@ -58,12 +58,20 @@ * checking or doing the update, while object states are allocated while * the state will be, or is active in the hardware. * * Their respective lifetimes are: * - * - at reset time, the object reset implementation will allocate a new, - * default, state and will store it in the object state pointer. + * - at driver initialization time, the driver will allocate an initial, + * pristine, state and will store it using + * drm_mode_config_create_state(). Historically, this was one of + * drm_mode_config_reset() job, so one might still encounter it in a + * driver. + * + * - at reset time, for example during suspend/resume, + * drm_mode_config_reset() will reset the software and hardware state + * to a known default and will store it in the object state pointer. + * Not all objects are affected by drm_mode_config_reset() though. * * - whenever a new update is needed: * * + we allocate a new &struct drm_atomic_state using drm_atomic_state_a= lloc(). * diff --git a/drivers/gpu/drm/drm_mode_config.c b/drivers/gpu/drm/drm_mode_c= onfig.c index 95759a4b5176ff17032a9a267ec9de6980be0abc..1a84ac063d381014eb8afd7116e= 1e8b7a8fc92ca 100644 --- a/drivers/gpu/drm/drm_mode_config.c +++ b/drivers/gpu/drm/drm_mode_config.c @@ -21,10 +21,11 @@ */ =20 #include #include =20 +#include #include #include #include #include #include @@ -278,10 +279,92 @@ void drm_mode_config_reset(struct drm_device *dev) drm_mode_config_connector_create_state(connector); drm_connector_list_iter_end(&conn_iter); } EXPORT_SYMBOL(drm_mode_config_reset); =20 +/** + * drm_mode_config_create_state - Allocates the initial state + * @dev: drm device + * + * This functions creates the initial state for all the objects. Drivers + * can use this in e.g. their driver load to initialize its software + * state. + * + * It has two main differences with drm_mode_config_reset(): the reset() + * hooks aren't called and thus the hardware will be left untouched, but + * also the @drm_private_obj structures will be initialized as opposed + * to drm_mode_config_reset() that skips them. + * + * Returns: 0 on success, negative error value on failure. + */ +int drm_mode_config_create_state(struct drm_device *dev) +{ + struct drm_crtc *crtc; + struct drm_colorop *colorop; + struct drm_plane *plane; + struct drm_connector *connector; + struct drm_connector_list_iter conn_iter; + struct drm_private_obj *privobj; + int ret; + + drm_for_each_privobj(privobj, dev) { + struct drm_private_state *privobj_state; + + if (privobj->state) + continue; + + if (!privobj->funcs->atomic_create_state) + continue; + + privobj_state =3D privobj->funcs->atomic_create_state(privobj); + if (IS_ERR(privobj_state)) + return PTR_ERR(privobj_state); + + privobj->state =3D privobj_state; + } + + drm_for_each_colorop(colorop, dev) { + if (colorop->state) + continue; + + // TODO: Implement atomic_create_state for colorop. + drm_colorop_reset(colorop); + } + + drm_for_each_plane(plane, dev) { + if (plane->state) + continue; + + ret =3D drm_mode_config_plane_create_state(plane); + if (ret) + return ret; + } + + drm_for_each_crtc(crtc, dev) { + if (crtc->state) + continue; + + ret =3D drm_mode_config_crtc_create_state(crtc); + if (ret) + return ret; + } + + drm_connector_list_iter_begin(dev, &conn_iter); + drm_for_each_connector_iter(connector, &conn_iter) { + if (connector->state) + continue; + + ret =3D drm_mode_config_connector_create_state(connector); + if (ret) + return ret; + } + drm_connector_list_iter_end(&conn_iter); + + return 0; +} +EXPORT_SYMBOL(drm_mode_config_create_state); + /* * Global properties */ static const struct drm_prop_enum_list drm_plane_type_enum_list[] =3D { { DRM_PLANE_TYPE_OVERLAY, "Overlay" }, diff --git a/include/drm/drm_mode_config.h b/include/drm/drm_mode_config.h index 5e1dd0cfccde2d2bc00a09e98e4adc65833dad08..428ae75b7c4f193dfbd49c15a2f= 2ef32209a6cef 100644 --- a/include/drm/drm_mode_config.h +++ b/include/drm/drm_mode_config.h @@ -1000,9 +1000,10 @@ int __must_check drmm_mode_config_init(struct drm_de= vice *dev); static inline int drm_mode_config_init(struct drm_device *dev) { return drmm_mode_config_init(dev); } =20 +int drm_mode_config_create_state(struct drm_device *dev); void drm_mode_config_reset(struct drm_device *dev); void drm_mode_config_cleanup(struct drm_device *dev); =20 #endif --=20 2.53.0 From nobody Wed Apr 8 02:48:19 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 AE46C3BBA0D; Tue, 10 Mar 2026 16:07:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773158855; cv=none; b=DXo+s6wnGxOnMwlUEGifxG35f/UCUN/NwjzgiLo5y2Caw/T7IGQ/XkX2ZLQ6Gs10VEhDspakIY2pxZd9kVCYmvV5f1kRRpDxowrUZJBcRQpeZHfmSlneCx88bPwYshjiRX78TZkEHjoGx5psgJ/UKEbLtkmGTb/9xeQciHaES6E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773158855; c=relaxed/simple; bh=ZCmJ88Jg/R0ZaGWt4Lbnf1PZ95HMiD+1w0SbJAg/htU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=B5hrHJUd/HfUjQQ3Ot4Gt/Xd4ZxIud/RvLcSCc7uHYsq9EQ81ikLSelCqNHfiY71Bpkw7vzigfZG03Xf8eBtuzQg8vLkix1UR2yDHe8cCB0I03fjNZu3INBWYk9P+8uJyjRD3gvP7k/Mtn8XHTHWp5c4wWzmcSPNtVt4XBsjziA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=bw+d62D+; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="bw+d62D+" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3D5D2C19425; Tue, 10 Mar 2026 16:07:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1773158855; bh=ZCmJ88Jg/R0ZaGWt4Lbnf1PZ95HMiD+1w0SbJAg/htU=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=bw+d62D+2HAfYfotFT6pc35QvkZrS8flNObZOziMsggFtGfJbJnB2pfiMwiMAz+8+ r3E20RdKJcwhBUFxLQFlbpf6uQfJefqiC3wnPVF+ozMqc3Xz24yiglkfk8A2/A0j00 pCz0LzxoHaCnDb5Fyh2yluwsVOevkBhv6AlF9tvJsU7cjuFvZjHZgZp50sjYkpjaPy tEFyO2VsaHwdTMe2jGTpmu77LazbVtVyPEeGdIXvq5a9gtIvd4hYVRU754kiem9v3m KNdahupPURYGu709tA5kxe0hZnNVsR8LUPobsKZz/KWdw4G61VXWtl7JYQwchyvH5a R/TeGn5EssIYQ== From: Maxime Ripard Date: Tue, 10 Mar 2026 17:07:01 +0100 Subject: [PATCH 09/14] drm/drv: Call drm_mode_config_create_state() by default 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: <20260310-drm-mode-config-init-v1-9-de7397c8e1cf@kernel.org> References: <20260310-drm-mode-config-init-v1-0-de7397c8e1cf@kernel.org> In-Reply-To: <20260310-drm-mode-config-init-v1-0-de7397c8e1cf@kernel.org> To: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Shuah Khan , Dmitry Baryshkov , Jyri Sarha , Tomi Valkeinen , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec Cc: dri-devel@lists.freedesktop.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, Maxime Ripard X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1218; i=mripard@kernel.org; h=from:subject:message-id; bh=ZCmJ88Jg/R0ZaGWt4Lbnf1PZ95HMiD+1w0SbJAg/htU=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDJkbHJf36mdZLL85p/vFqdry3oYvaR9CN05a3Dq/zeNy7 JZnLDlsHVNZGIQ5GWTFFFmeyISdXt6+uMrBfuUPmDmsTCBDGLg4BWAiW3YyNhyWOHdoznL3PbG5 4QxHrNN9uiSPpa18E/J56ueunDpmocWWAUwCM5ijrvEb3+C7+s67k7HhL48upybDoeDUXn33wsY Vq6Xf8+9W4U2NudoTzcQh7Xj7tY2J8aatp3v4+75U8vB6vgIA X-Developer-Key: i=mripard@kernel.org; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D Almost all drivers, and our documented skeleton, call drm_mode_config_reset() prior to calling drm_dev_register() to initialize its DRM object states. Now that we have drm_mode_config_create_state() to create that initial state if it doesn't exist, we can call it directly in drm_dev_register(). That way, we know that the initial atomic state will always be allocated without any boilerplate. Signed-off-by: Maxime Ripard --- drivers/gpu/drm/drm_drv.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c index 2915118436ce8a6640cfb0c59936031990727ed1..820106d56ab399a39cac56d9866= 2b5ddbcae8ded 100644 --- a/drivers/gpu/drm/drm_drv.c +++ b/drivers/gpu/drm/drm_drv.c @@ -1097,10 +1097,14 @@ int drm_dev_register(struct drm_device *dev, unsign= ed long flags) =20 if (drm_core_check_feature(dev, DRIVER_MODESET)) { ret =3D drm_modeset_register_all(dev); if (ret) goto err_unload; + + ret =3D drm_mode_config_create_state(dev); + if (ret) + goto err_unload; } drm_panic_register(dev); drm_client_sysrq_register(dev); =20 DRM_INFO("Initialized %s %d.%d.%d for %s on minor %d\n", --=20 2.53.0 From nobody Wed Apr 8 02:48:19 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 750F226B74A; Tue, 10 Mar 2026 16:07:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773158858; cv=none; b=tc9pPnVO1LffupWnoXgytFKQMadq8DtF2Z2stjIhUD7AEZ/5/4o/RJSkyxcFmpaFrDCVAHSiLHLCyh3gLeEPDdMHgV6wvWAMvIvgIdG3jGs467blsgPw5Uax+3xNDH6T/TaQAA+q0/gbfiO3OPIGcl/9QTAlq/oSqAQmEkA7uqQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773158858; c=relaxed/simple; bh=0NCrUYiDXTVQ3wJ3wTIEbkD/aAsEjfCXUe8n9jnE9ik=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Dufm9+divyxZr0PgbTNBTncSECuzALnksnPSAHQhIxJUD2YbxyReteVOhmo4fgY4OQ2ASbDmYqyueJ04cOKEELUivO9u5UFMmc+uOazOjS/LlOBVjxJRwalBS3EmZwhiPSwom0te7atLzk/EmB3hnRm52czGHk1nwvG05q0Z6js= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=PO4CUllf; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="PO4CUllf" Received: by smtp.kernel.org (Postfix) with ESMTPSA id F3AA2C19423; Tue, 10 Mar 2026 16:07:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1773158858; bh=0NCrUYiDXTVQ3wJ3wTIEbkD/aAsEjfCXUe8n9jnE9ik=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=PO4CUllfUHE/ztReyFTdk5126NLtBfGijLff5Nb49Diy8OECQp1+Xu3ySkcUrxIOO i1ODzVi4KDWo3/hcZaz5ZQHKPOiR2TRNRGVziqRBPYe79Vi1ZjFTNy4J+3wkS1VjwL GT4cw1WbRodE7VXhyFd96Gyhaxx5rsOkDK43WFIMzUd82FLelWn5CChNTSaS9VYNCn j4zG4MrjKk3SdTeJRDP0V83V9J0Bt2Y4+ydd+7JAIphVYbYN8/PkIe8ReStqnT0JWO UPU5B3lg/vrWOekaLNAvPqxUF49vDzFxpEMEt9s4rDNUe86gGQbO85eJwSLEkCE4IT QCJkiBaS7S7OQ== From: Maxime Ripard Date: Tue, 10 Mar 2026 17:07:02 +0100 Subject: [PATCH 10/14] drm/atomic: Drop private obj state allocation 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: <20260310-drm-mode-config-init-v1-10-de7397c8e1cf@kernel.org> References: <20260310-drm-mode-config-init-v1-0-de7397c8e1cf@kernel.org> In-Reply-To: <20260310-drm-mode-config-init-v1-0-de7397c8e1cf@kernel.org> To: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Shuah Khan , Dmitry Baryshkov , Jyri Sarha , Tomi Valkeinen , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec Cc: dri-devel@lists.freedesktop.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, Maxime Ripard X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1376; i=mripard@kernel.org; h=from:subject:message-id; bh=0NCrUYiDXTVQ3wJ3wTIEbkD/aAsEjfCXUe8n9jnE9ik=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDJkbHFcUifcdOHxAzsv338UFy732PV/SdjsvwJdxs35jw PuNbCKsHVNZGIQ5GWTFFFmeyISdXt6+uMrBfuUPmDmsTCBDGLg4BWAiuq6MtRIFQZlBhu6nOWaJ V+9SlDn/dMlb1oYbdzjCnuhE2ZrNl2VUiHf6vvDuiatJK/wXRy48z1jFvDrjdLXDlxkbukp/Rcy Puey1ef8m+SXf32ywbVPxK3hrmfTsVqerh1HdxU1p3sWP3SQB X-Developer-Key: i=mripard@kernel.org; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D Now that drm_dev_register() calls drm_mode_config_create_state() for every modeset driver, the private obj states will be initialized at driver registration automatically if they haven't already. Thus, the explicit initial allocation we have in drm_atomic_private_obj_init() is now redundant, and we can remove it. Signed-off-by: Maxime Ripard Reviewed-by: Laurent Pinchart --- drivers/gpu/drm/drm_atomic.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c index d1885f895cce78725419b6291f4dbe5563e3b240..e8dc019364d27123c3a682a1032= 3fba9ff76f9df 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c @@ -991,25 +991,18 @@ static void drm_atomic_plane_print_state(struct drm_p= rinter *p, */ int drm_atomic_private_obj_init(struct drm_device *dev, struct drm_private_obj *obj, const struct drm_private_state_funcs *funcs) { - struct drm_private_state *state; memset(obj, 0, sizeof(*obj)); =20 drm_modeset_lock_init(&obj->lock); =20 obj->dev =3D dev; obj->funcs =3D funcs; list_add_tail(&obj->head, &dev->mode_config.privobj_list); =20 - state =3D obj->funcs->atomic_create_state(obj); - if (IS_ERR(state)) - return PTR_ERR(state); - - obj->state =3D state; - return 0; } EXPORT_SYMBOL(drm_atomic_private_obj_init); =20 /** --=20 2.53.0 From nobody Wed Apr 8 02:48:19 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 706C53C1408; Tue, 10 Mar 2026 16:07:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773158861; cv=none; b=rX4wk+13YQMQnrnrBQXudef+xKQl8refXMkLz0xfLxPgZmEhcuHSRXD/E39jco2MIpXMQi17zBiYHlyT8cY/oqZGlyM8oNXN0d2jDopWt5Bzm838g2lF5dKW9Uq2xf+LrI9zHtXwJSu3nh8LsUxQNwtLHvRRaCjniZ2RYR2x12c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773158861; c=relaxed/simple; bh=tg2gTQmqK0YIyztAChK/BRL+ppOy8cXSDiVoof4bGIs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=KpvUghZAIep7UziSIvPFrBQ1vG+c9kXJpoSMeL4JJelJ9fEbChtUfZsxzEwrLqi9ZI5jQOEnF1D8raomjbYLy0buR5V/fZSDg9YbBVHCC6vRsHMo0DfjnGu4vCXPOjl8pNY7WRzfkfHAdGOcV+JdIC6dRzwhuI2sIJGgSMLLyaQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=H05fm4WW; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="H05fm4WW" Received: by smtp.kernel.org (Postfix) with ESMTPSA id BA881C19423; Tue, 10 Mar 2026 16:07:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1773158861; bh=tg2gTQmqK0YIyztAChK/BRL+ppOy8cXSDiVoof4bGIs=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=H05fm4WWOTCE9Qy8Fm13U3vAtRdg9/5UPRGbkrt0Nzdy23zHTmT8oykiBCqrsGyN7 I2ZUUi5abm10K8B2b7qgjYmH560WBtt13smG8DhuN7zyZNWGKaHMD8Fxl/uOxgWb/8 UjxY8XW7AvX17qvkvkzJdOUtxXbOKFdF1cB6LfPKAWBh89cftwc85W+Ap3QLF9GQ1D +15SWrXp2M60B2iMRiRhbGpexkZRVr7pK57A8N8D8iWUz+e3VnQswDtJ7wdaqERLNu DaNfl3CXMhjjH/a08S8/ikch500BeEZ9uf6oYL1lcorbxPpqfSdbXVkaAnf030QpHn vfjVYhjWuQnRQ== From: Maxime Ripard Date: Tue, 10 Mar 2026 17:07:03 +0100 Subject: [PATCH 11/14] drm/drv: Drop drm_mode_config_reset() from our skeleton 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: <20260310-drm-mode-config-init-v1-11-de7397c8e1cf@kernel.org> References: <20260310-drm-mode-config-init-v1-0-de7397c8e1cf@kernel.org> In-Reply-To: <20260310-drm-mode-config-init-v1-0-de7397c8e1cf@kernel.org> To: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Shuah Khan , Dmitry Baryshkov , Jyri Sarha , Tomi Valkeinen , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec Cc: dri-devel@lists.freedesktop.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, Maxime Ripard X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=936; i=mripard@kernel.org; h=from:subject:message-id; bh=tg2gTQmqK0YIyztAChK/BRL+ppOy8cXSDiVoof4bGIs=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDJkbHFeEn1LKPnft8xuO03rOVzNLNt2O+ixvscKzYv9z+ 5X/J53d0TGVhUGYk0FWTJHliUzY6eXti6sc7Ff+gJnDygQyhIGLUwAmEmnIWCvw89GcAzO4+Xme TrzpcPxubv7+1i1pZ78nhr13Na+ZU2WyZsVbPc8nsUdmnnp/27bqogJjw5UD0vKlQWei8n1CFM2 OBD8JuL7u3YSP6wStFsxMrj6mHMc8TXpq7uyDf+8/eGn/MfrUUgA= X-Developer-Key: i=mripard@kernel.org; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D Now that we have drm_mode_config_create_state() to create the initial state called as part of drm_dev_register(), we can stop recommending calling drm_mode_config_reset() to perform that initialization in our skeleton. Signed-off-by: Maxime Ripard --- drivers/gpu/drm/drm_drv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c index 820106d56ab399a39cac56d98662b5ddbcae8ded..dc85d36670cf96dcd16e7eda8fe= 8563c6e7fc28d 100644 --- a/drivers/gpu/drm/drm_drv.c +++ b/drivers/gpu/drm/drm_drv.c @@ -339,11 +339,11 @@ void drm_minor_release(struct drm_minor *minor) * * // Further setup, display pipeline etc * * platform_set_drvdata(pdev, drm); * - * drm_mode_config_reset(drm); + * drm_mode_config_create_state(drm); * * ret =3D drm_dev_register(drm); * if (ret) * return ret; * --=20 2.53.0 From nobody Wed Apr 8 02:48:19 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 46B633C1408; Tue, 10 Mar 2026 16:07:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773158864; cv=none; b=BLJ3hGhf1+4f3GkfbltjOeY7HV+6ADq5Zf0E5hdXiXhi5SK+YuNvHANmKWoYlCmmNClSwiJLQYaYZrYx07DS+SGM3TSbNGuB+z8MSorJ03vbBFSc+2HDorR5jhJsNe9mzT2Mm1cQD3reqRspfG8ZMe6BDwzDBQsh8XbtF3nHO0E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773158864; c=relaxed/simple; bh=XqnM/u74MfAcBsfSF1rVN29p3I/8qj96BIXAEgUA4Ss=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=vA3dbmW9ah7QWtxQWhkwKyne+IM1XH1Q+JsP2Na6Jhkr5MAMrUuGM7zPxVgXCZsuiXQQx98yxIMxGHumFbfFKIvMjgWiqQypgV/mHU+DQVShP5IU+BbPC2R/ppvbptmvVeNeY6I66XFpNo+tOR2Ofle2Tie0QdimDca2rKjTndQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=gw9A/FvQ; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="gw9A/FvQ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7C16BC19425; Tue, 10 Mar 2026 16:07:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1773158863; bh=XqnM/u74MfAcBsfSF1rVN29p3I/8qj96BIXAEgUA4Ss=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=gw9A/FvQt0LInEjiatujfOPtHDO2pe9pB+2nbKNJDHWjH+M7Ru/Nxpbv2acNWK9sA kaLJhbl/fYBx3FF1ge1F12uxcVgLCtU8SrhN95H9WlFhoc4ChYHYnJjDmZutdBIyQw 81xyidVS4NdeB6H30pHfEeoxHGNUPxH/K27iYete6rZ4Iu9cF6aUSHlVyh+lif35eB KSL5+auBH88x+6Kdyl1PSwK9QkB+jioNJtXpPwjLxti2JeM22JxW2qvqDU4ndUyzwJ 1ekLqkbpbEVQF3d95WCxZ2NOMbJqRTu2EBsSERAdQjyTn4TCXp7YPOupz84P+QM9NH Khnv1aHyxh9UQ== From: Maxime Ripard Date: Tue, 10 Mar 2026 17:07:04 +0100 Subject: [PATCH 12/14] drm/tidss: Drop call to drm_mode_config_reset at probe time 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: <20260310-drm-mode-config-init-v1-12-de7397c8e1cf@kernel.org> References: <20260310-drm-mode-config-init-v1-0-de7397c8e1cf@kernel.org> In-Reply-To: <20260310-drm-mode-config-init-v1-0-de7397c8e1cf@kernel.org> To: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Shuah Khan , Dmitry Baryshkov , Jyri Sarha , Tomi Valkeinen , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec Cc: dri-devel@lists.freedesktop.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, Maxime Ripard X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=861; i=mripard@kernel.org; h=from:subject:message-id; bh=XqnM/u74MfAcBsfSF1rVN29p3I/8qj96BIXAEgUA4Ss=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDJkbHFfKa8vsYHwuPm1ldmmijxSrS/Qp0afCcoYM6y4I1 +9rZD7aMZWFQZiTQVZMkeWJTNjp5e2LqxzsV/6AmcPKBDKEgYtTACbi38TY0Omi/totL3hjwkn9 wt87TJnz2Zfv6e7fPeHxH7PZNzo2Pmr2mLQw/I8C/8Z1hxadc8qyZ2z4Xf6Pt4pR+YHj1RZ3oTi 9UxM9J8ddrbw44Z7Jtdkz92/WZmr/2KLtdNY0kWOy+ftLXbUA X-Developer-Key: i=mripard@kernel.org; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D Now that we have drm_mode_config_create_state() to create the initial state called as part of drm_dev_register(), we don't need to call drm_mode_config_reset() during the driver probe. Signed-off-by: Maxime Ripard --- drivers/gpu/drm/tidss/tidss_kms.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/drivers/gpu/drm/tidss/tidss_kms.c b/drivers/gpu/drm/tidss/tids= s_kms.c index 8bb93194e5ac686050c47f986b8cb6063eae22d3..b4779c09a1bfa5be7010bcd7d4f= 1379362996d2e 100644 --- a/drivers/gpu/drm/tidss/tidss_kms.c +++ b/drivers/gpu/drm/tidss/tidss_kms.c @@ -285,11 +285,9 @@ int tidss_modeset_init(struct tidss_device *tidss) =20 ret =3D drm_vblank_init(ddev, tidss->num_crtcs); if (ret) return ret; =20 - drm_mode_config_reset(ddev); - dev_dbg(tidss->dev, "%s done\n", __func__); =20 return 0; } --=20 2.53.0 From nobody Wed Apr 8 02:48:19 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 BDD143C342A; Tue, 10 Mar 2026 16:07:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773158866; cv=none; b=OgZasKse/i0hhIvKTJa5H+9Gw3HqXtwfAvuLpbDXtHEpSwv1ZqNv8uUH4mBYhuptkYGFAAFi7RDT/Ua8ln2uHlH21SJjdGpSsJWLxyoc7ctohXbxR6NchT2zJiV5PQ9x+pNzHjmIAecaVlwYhFHNRM+SNnyeP722v1lEdUrO/d4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773158866; c=relaxed/simple; bh=MEDGk/rh93wNi6cr2oco3L6Llp5wif5wEB6hoxGlP3s=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=oadGlWcIssiQM8J3veNCrqyqmy3J+pc3t1mFK1rDHr3A3aggn9839Rx2U9muMe3fT6UPFrMeb6UF61KhGHQoWMmyrmkUyZjX+xONGj2T5+RwALqJ18a6tT5C4u/XiSdvb4s7MYOnD1DQ1AVNs6gjH0YhBZsfJyv5dHe8PMq4uWY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=LXOHX6C8; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="LXOHX6C8" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3F397C2BC9E; Tue, 10 Mar 2026 16:07:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1773158866; bh=MEDGk/rh93wNi6cr2oco3L6Llp5wif5wEB6hoxGlP3s=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=LXOHX6C8GUNSKMaifqru8XlgS+ZWcD10w7j/Ye7dJDZ5C1kNtk9/HGHIHjbG57fkN LK9b0n8zUx8sbLewYHZ8olxtC6s/qU+ai/GSVK176KoqkK/ci3tOq17PX7NNxQs9LB RjhSndtnXn1Td+t2XHLpph2x/T/ef81oBxRNFx544YaJe6g785HquL4KrgE1hFGoRz z9bEreuiGs1s2e9Pc0kEKWImyMK7fZR5J1pfQ811qkKIZeXafbun8zjCrfCf88IPeT AJWvUtxc5W1jWETaWC9/PQO0OODq7Ks3SaWlQ6kW84Y2Am6/pcm+Ayx5b7TY3ELgsw 7H9+J0X94vvCw== From: Maxime Ripard Date: Tue, 10 Mar 2026 17:07:05 +0100 Subject: [PATCH 13/14] drm/tidss: Convert to atomic_create_state 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: <20260310-drm-mode-config-init-v1-13-de7397c8e1cf@kernel.org> References: <20260310-drm-mode-config-init-v1-0-de7397c8e1cf@kernel.org> In-Reply-To: <20260310-drm-mode-config-init-v1-0-de7397c8e1cf@kernel.org> To: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Shuah Khan , Dmitry Baryshkov , Jyri Sarha , Tomi Valkeinen , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec Cc: dri-devel@lists.freedesktop.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, Maxime Ripard X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3067; i=mripard@kernel.org; h=from:subject:message-id; bh=MEDGk/rh93wNi6cr2oco3L6Llp5wif5wEB6hoxGlP3s=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDJkbHFfGnA3f7e5o3/3otMwSy6+vjVVUXcUcpjfMmunzh nm18rOIjqksDMKcDLJiiixPZMJOL29fXOVgv/IHzBxWJpAhDFycAjARw8WMDb3i0xke1fWW5jzL MHyw2eVuhZ3Zl6nfQorll7sf2ZOg4xyz4n/mli0HdLzS73JG8YjaMdYpP+/LfDD36IJChZwSg5k hC1YZpsWJp7R9Vebe8pNv/TO1LtWOc3kHD6vOmy1f5HjimAEA X-Developer-Key: i=mripard@kernel.org; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D Our driver uses reset to create the various object states, but only calls the helper that allocate a new state. They are thus strictly equivalent to the new atomic_create_state helpers, so let's switch to these. Signed-off-by: Maxime Ripard Reviewed-by: Laurent Pinchart Reviewed-by: Tomi Valkeinen --- drivers/gpu/drm/tidss/tidss_crtc.c | 17 +++++++---------- drivers/gpu/drm/tidss/tidss_plane.c | 2 +- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/drivers/gpu/drm/tidss/tidss_crtc.c b/drivers/gpu/drm/tidss/tid= ss_crtc.c index a31c21c5f855ac8a94089dd3908e2510193b7d67..66e3d161c60bc14b2982cff4cdd= 43030d4086798 100644 --- a/drivers/gpu/drm/tidss/tidss_crtc.c +++ b/drivers/gpu/drm/tidss/tidss_crtc.c @@ -355,24 +355,21 @@ static void tidss_crtc_destroy_state(struct drm_crtc = *crtc, =20 __drm_atomic_helper_crtc_destroy_state(&tstate->base); kfree(tstate); } =20 -static void tidss_crtc_reset(struct drm_crtc *crtc) +static struct drm_crtc_state *tidss_crtc_create_state(struct drm_crtc *crt= c) { struct tidss_crtc_state *tstate; =20 - if (crtc->state) - tidss_crtc_destroy_state(crtc, crtc->state); - tstate =3D kzalloc_obj(*tstate); - if (!tstate) { - crtc->state =3D NULL; - return; - } + if (!tstate) + return ERR_PTR(-ENOMEM); =20 - __drm_atomic_helper_crtc_reset(crtc, &tstate->base); + __drm_atomic_helper_crtc_create_state(crtc, &tstate->base); + + return &tstate->base; } =20 static struct drm_crtc_state *tidss_crtc_duplicate_state(struct drm_crtc *= crtc) { struct tidss_crtc_state *state, *current_state; @@ -403,14 +400,14 @@ static void tidss_crtc_destroy(struct drm_crtc *crtc) drm_crtc_cleanup(crtc); kfree(tcrtc); } =20 static const struct drm_crtc_funcs tidss_crtc_funcs =3D { - .reset =3D tidss_crtc_reset, .destroy =3D tidss_crtc_destroy, .set_config =3D drm_atomic_helper_set_config, .page_flip =3D drm_atomic_helper_page_flip, + .atomic_create_state =3D tidss_crtc_create_state, .atomic_duplicate_state =3D tidss_crtc_duplicate_state, .atomic_destroy_state =3D tidss_crtc_destroy_state, .enable_vblank =3D tidss_crtc_enable_vblank, .disable_vblank =3D tidss_crtc_disable_vblank, }; diff --git a/drivers/gpu/drm/tidss/tidss_plane.c b/drivers/gpu/drm/tidss/ti= dss_plane.c index aaa02c851c595aa3781ec2e6741af1999092aa40..518498d4576528a0ec59fd03cf2= 7a87b1b3f1e6e 100644 --- a/drivers/gpu/drm/tidss/tidss_plane.c +++ b/drivers/gpu/drm/tidss/tidss_plane.c @@ -176,12 +176,12 @@ static const struct drm_plane_helper_funcs tidss_prim= ary_plane_helper_funcs =3D { }; =20 static const struct drm_plane_funcs tidss_plane_funcs =3D { .update_plane =3D drm_atomic_helper_update_plane, .disable_plane =3D drm_atomic_helper_disable_plane, - .reset =3D drm_atomic_helper_plane_reset, .destroy =3D drm_plane_destroy, + .atomic_create_state =3D drm_atomic_helper_plane_create_state, .atomic_duplicate_state =3D drm_atomic_helper_plane_duplicate_state, .atomic_destroy_state =3D drm_atomic_helper_plane_destroy_state, }; =20 struct tidss_plane *tidss_plane_create(struct tidss_device *tidss, --=20 2.53.0 From nobody Wed Apr 8 02:48:19 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 C6C623C3444; Tue, 10 Mar 2026 16:07:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773158869; cv=none; b=j0cXSj3RPPR7ty6vT//GYm7NsVuXSYBh7WP9KqMpcQBLh1spb3jI0degL+pE/N1Wj0ZOlN3g51SoKC2JYjcS+XWy5sjnFdB1d/GexaCdymhjzlui7xsZTx6I5zrbC5GdVJPFAh7pZ7fNylCZDFHeBbzH//maTr1pBf4kb9ZNkVs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773158869; c=relaxed/simple; bh=QxfzcvVPW0aFM70zbpbJXgcgM90rh002u3bQmLOy+YE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=eHVM+L26uGZUup4er017zZSiWLuBehp0FJkpkfzFLBdBTlGIMPjYC3U6RdMzUsi8cKCc13H+8dcwSZtGCBG4LWqAWtHJlYcHOwJmqeGY8JGtGzjRrseUwb668j0qPhRKO3MaGkRPowba6sw/cyLSyX+w/WpLUZGByD6ZnAA2r2o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=S1VWal32; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="S1VWal32" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 10422C19425; Tue, 10 Mar 2026 16:07:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1773158869; bh=QxfzcvVPW0aFM70zbpbJXgcgM90rh002u3bQmLOy+YE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=S1VWal32GmVLOUnQmKwE4b7WY9M1o/kDLaFwOcRlkuACNA4hcGwa3ES82K3e6vL3s OTzZgDIo2yb2/OdZYH8r9Hyyj/uz3JMY08FlaDkrY93jYSPbOZFsaMQVP0m+IPp0rU +fcHdqhLJx4lJvD04hewcwMzaxooH5IFZ+5HXJs9tquG4OJfOLDVLpYxjPYHYxDUKf iRErQbG+hGEYAZp+1CMG11TQh288GljsRHqgv/ld/VZkfs0CHCKQ+p/b5sc6j5yq9y adsRhuXyqKVufTkuMcgtlaCimsrmGBOFL79CHweXOQX8NPCp0GdXxUtcyfYTBXxfEu WMRNhlr7I5Lbg== From: Maxime Ripard Date: Tue, 10 Mar 2026 17:07:06 +0100 Subject: [PATCH 14/14] drm/bridge_connector: Convert to atomic_create_state 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: <20260310-drm-mode-config-init-v1-14-de7397c8e1cf@kernel.org> References: <20260310-drm-mode-config-init-v1-0-de7397c8e1cf@kernel.org> In-Reply-To: <20260310-drm-mode-config-init-v1-0-de7397c8e1cf@kernel.org> To: Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Shuah Khan , Dmitry Baryshkov , Jyri Sarha , Tomi Valkeinen , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec Cc: dri-devel@lists.freedesktop.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, Maxime Ripard X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2138; i=mripard@kernel.org; h=from:subject:message-id; bh=QxfzcvVPW0aFM70zbpbJXgcgM90rh002u3bQmLOy+YE=; b=owGbwMvMwCmsHn9OcpHtvjLG02pJDJkbHFfmzvp4b3f7OoPGmCqxQj7x2GCjw6/jHZ5mpvxSX 8T8M3Z1x1QWBmFOBlkxRZYnMmGnl7cvrnKwX/kDZg4rE8gQBi5OAZjIg42MDYs71vUdf7fAgEf5 HPftD2VaZRv1rl9/lHZg4dqEuT4PXj+Unv9Lmuvzu2+1a59LGiRXljLWu6S6TNb5ODt14+NvEgl qXFkTTUJZ/lvKTH245M55vYWZ3nXdc8X7g06o/gkpSuHfe5UTAA== X-Developer-Key: i=mripard@kernel.org; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D The connector created by drm_bridge_connector only initializes a pristine state in reset, which is equivalent to that atomic_create_state would expect. Let's convert to it. Signed-off-by: Maxime Ripard Reviewed-by: Laurent Pinchart --- drivers/gpu/drm/display/drm_bridge_connector.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/d= rm/display/drm_bridge_connector.c index f686aa5c0ed9b84dbe5e0957df22d08aff2f1945..2f73576783f5f69ebce277a7537= accefc94645a9 100644 --- a/drivers/gpu/drm/display/drm_bridge_connector.c +++ b/drivers/gpu/drm/display/drm_bridge_connector.c @@ -263,26 +263,33 @@ static void drm_bridge_connector_debugfs_init(struct = drm_connector *connector, if (bridge->funcs->debugfs_init) bridge->funcs->debugfs_init(bridge, root); } } =20 -static void drm_bridge_connector_reset(struct drm_connector *connector) +static struct drm_connector_state * +drm_bridge_connector_create_state(struct drm_connector *connector) { struct drm_bridge_connector *bridge_connector =3D to_drm_bridge_connector(connector); + struct drm_connector_state *conn_state; + + conn_state =3D drm_atomic_helper_connector_create_state(connector); + if (IS_ERR(conn_state)) + return conn_state; =20 - drm_atomic_helper_connector_reset(connector); if (bridge_connector->bridge_hdmi) __drm_atomic_helper_connector_hdmi_reset(connector, - connector->state); + conn_state); + + return conn_state; } =20 static const struct drm_connector_funcs drm_bridge_connector_funcs =3D { - .reset =3D drm_bridge_connector_reset, .detect =3D drm_bridge_connector_detect, .force =3D drm_bridge_connector_force, .fill_modes =3D drm_helper_probe_single_connector_modes, + .atomic_create_state =3D drm_bridge_connector_create_state, .atomic_duplicate_state =3D drm_atomic_helper_connector_duplicate_state, .atomic_destroy_state =3D drm_atomic_helper_connector_destroy_state, .debugfs_init =3D drm_bridge_connector_debugfs_init, .oob_hotplug_event =3D drm_bridge_connector_oob_hotplug_event, }; --=20 2.53.0