From nobody Mon Jun 15 10:50:31 2026 Received: from smtpout-04.galae.net (smtpout-04.galae.net [185.171.202.116]) (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 59B243A5459 for ; Thu, 9 Apr 2026 17:08:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775754539; cv=none; b=hMder62YkJbdtKdfThPbKXCDPH3lVXQhgHUhZDYMGCY8lUzoBlk4Ezk9++jmy0BZlMViWms7T54cY9E3O2xQ04/vidhPk2CxId6YgGIf7ZYdKLb+XZ7XrLWw+9Xmme+WF+TkUxwHx1vg1LAuQEoiPX33EuUb6S3fu5zLwWmXr4M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775754539; c=relaxed/simple; bh=LW06FFQa/fwhlqoZxhlnJonDJAEmCnqNKe/RwR1GiuA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=EqDhLE5kPsMrPaqyDf2NZS271d9n2ePZXfdUC3YhFv55qIO8b6Gkkd8INBccUZ+gZ2bG6ksUGvQPzc2mj/4X7aOnb9RJIUG9fJvkIoW5I8Kndq7tMxRdwDSFmoCLtGVl07sGMGsrquBEDPhAu7Cud0ufXJBV8bqeF8c8xNBxJmM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=MIZWIZeI; arc=none smtp.client-ip=185.171.202.116 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="MIZWIZeI" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 8B53CC5C18B; Thu, 9 Apr 2026 17:09:30 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id C09BA603E4; Thu, 9 Apr 2026 17:08:55 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 9BAF410450194; Thu, 9 Apr 2026 19:08:50 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1775754534; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=wQHs+xJKsUMQO+6CCh7X3NX/2yXBo/WKUOrvcvLPWfg=; b=MIZWIZeI6SDzL7xElyXrZcp1xP5FU/iv6TVLEMIzJzuy69V14+eWik9kRKFGixgQaD6ciS Ddf0uG5jq9ljh6Qn4Bfo3Lo4wh3XkM6VJnIAAGk9dBUjHNGHVUxP2CdnVN7cr8dJaD0IMj J0Syiixw7j9TNbIZj6PVG1Ugn2d1/iCHei/yCZMmd68Rx+dsZQxLDuWDrcTWQIm7QeB+QA 164m9FfPe/Owoxjn26H4BCuDi+FulELgNLV8kTRt7/wicDSenIEtyWuk+lzDtW7/7QYFln hwwOk/KBfs0c9gD6gPRrMcw5DivnFR3liiquTWK6mqxqzChKFRM/bHEfHbbn+Q== From: Kory Maincent Date: Thu, 09 Apr 2026 19:08:17 +0200 Subject: [PATCH RFC 01/12] drm/i915/display/intel_sdvo: Fix double connector destroy in error paths 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: <20260409-feat_link_cap-v1-1-7069e8199ce2@bootlin.com> References: <20260409-feat_link_cap-v1-0-7069e8199ce2@bootlin.com> In-Reply-To: <20260409-feat_link_cap-v1-0-7069e8199ce2@bootlin.com> To: Jani Nikula , Rodrigo Vivi , Joonas Lahtinen , Tvrtko Ursulin , David Airlie , Simona Vetter , Dave Airlie , Jesse Barnes , Eric Anholt , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Chun-Kuang Hu , Philipp Zabel , Matthias Brugger , AngeloGioacchino Del Regno , Chris Wilson Cc: Thomas Petazzoni , Mark Yacoub , Sean Paul , Louis Chauvet , intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Simona Vetter , Kory Maincent X-Mailer: b4 0.14-dev-d4707 X-Last-TLS-Session-Version: TLSv1.3 intel_sdvo_connector_funcs registers intel_connector_destroy() as the .destroy callback. Once drm_connector_init_with_ddc() succeeds inside intel_sdvo_connector_init(), the DRM core takes ownership of the connector object and will call .destroy on teardown. The error labels in intel_sdvo_tv_init() and intel_sdvo_lvds_init() call intel_connector_destroy() explicitly before returning false, causing it to be invoked twice: once in the error path and again by the DRM core through the registered .destroy callback. Remove the manual intel_connector_destroy() calls from the error labels and return false directly instead. Fixes: 32aad86fe88e7 ("drm/i915/sdvo: Propagate errors from reading/writing= control bus.") Signed-off-by: Kory Maincent --- Not tested as I don't have such hardware. --- drivers/gpu/drm/i915/display/intel_sdvo.c | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_sdvo.c b/drivers/gpu/drm/i9= 15/display/intel_sdvo.c index 2e1af9e869ded..6eb2b4b45a9b4 100644 --- a/drivers/gpu/drm/i915/display/intel_sdvo.c +++ b/drivers/gpu/drm/i915/display/intel_sdvo.c @@ -2873,16 +2873,12 @@ intel_sdvo_tv_init(struct intel_sdvo *intel_sdvo, u= 16 type) } =20 if (!intel_sdvo_tv_create_property(intel_sdvo, intel_sdvo_connector, type= )) - goto err; + return false; =20 if (!intel_sdvo_create_enhance_property(intel_sdvo, intel_sdvo_connector)) - goto err; + return false; =20 return true; - -err: - intel_connector_destroy(connector); - return false; } =20 static bool @@ -2945,7 +2941,7 @@ intel_sdvo_lvds_init(struct intel_sdvo *intel_sdvo, u= 16 type) } =20 if (!intel_sdvo_create_enhance_property(intel_sdvo, intel_sdvo_connector)) - goto err; + return false; =20 intel_bios_init_panel_late(display, &intel_connector->panel, NULL, NULL); =20 @@ -2967,13 +2963,9 @@ intel_sdvo_lvds_init(struct intel_sdvo *intel_sdvo, = u16 type) intel_panel_init(intel_connector, NULL); =20 if (!intel_panel_preferred_fixed_mode(intel_connector)) - goto err; + return false; =20 return true; - -err: - intel_connector_destroy(connector); - return false; } =20 static u16 intel_sdvo_filter_output_flags(u16 flags) --=20 2.43.0 From nobody Mon Jun 15 10:50:31 2026 Received: from smtpout-04.galae.net (smtpout-04.galae.net [185.171.202.116]) (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 82C553DBD7F for ; Thu, 9 Apr 2026 17:09:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775754542; cv=none; b=OzRTxF//xMjoxPbyr3VYF8NRzHCuSw3QaNElluVhzJ0a89ZESvI6+mjAgY2i3mFx1ay/dBE24S1NQ8uiuSeje3fCqJCLoD2SvHOQd6QxLjTHVOhTTciMLE41XTJULf7kNJ6B0FrW+B2IspLTkiddIesFMar/eFA/iRmfddJjjdM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775754542; c=relaxed/simple; bh=yLrayC+KaA1mutcx1StNH+IzSKSUoGWnncSyqPc87XA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=UF2s/Lznwx1LpxRb7ARA3rZV4UQSGvKojjQwZz8xyaVO0oz1b5PMFk+sTR0TSsdHly5Wj6YjYnV2xgufzAKqQyQYIZAespnplL/Jn5iQc8GujmDit9tRgdS6kQSa7Nm/9ymhLjFgQm/U6zAravowydXjFwkF/nHriO/75L1SxDc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=Esilw5jB; arc=none smtp.client-ip=185.171.202.116 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="Esilw5jB" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 182F8C5C18C; Thu, 9 Apr 2026 17:09:34 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 4E569603E4; Thu, 9 Apr 2026 17:08:59 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 63A85104500F2; Thu, 9 Apr 2026 19:08:54 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1775754537; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=NhYzqxeLYhJJ/6ErxgYsDp7OCqAbT6h4r7mS/NeBN9E=; b=Esilw5jBNt2HrURjOGXsg52LiDQiFuR0QII4Q91Rpe6T0eEUWE3VvQMHZ+yKKX+MzIInVx 3roiCnEIl7sK/Fr89SK+iIVzA3aSLyUJpoSanEFRF/PUhnZide9jpzZBl2ql4TVzB0w5Jy LketgkWtt6ykso5AUT4CbjuyQcVFnYbFo6hZAYsEQJK6mcsV5/fOfmMibllUS1SJL0eIOr 8dQxWlx4hITtWuQWnURGImJNSoHUjGMi0ZvaiW2tux7699tL+xK3EcK4Xd/2EUQWkThmuU OwDnYjTfVFwSjKHvtXFGcZGePvXwyZy/qN6G69EvEzyBFbOtXBTcNd80Pmw9CQ== From: Kory Maincent Date: Thu, 09 Apr 2026 19:08:18 +0200 Subject: [PATCH RFC 02/12] drm/i915/display/intel_lvds: Drop redundant manual cleanup on init failure 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: <20260409-feat_link_cap-v1-2-7069e8199ce2@bootlin.com> References: <20260409-feat_link_cap-v1-0-7069e8199ce2@bootlin.com> In-Reply-To: <20260409-feat_link_cap-v1-0-7069e8199ce2@bootlin.com> To: Jani Nikula , Rodrigo Vivi , Joonas Lahtinen , Tvrtko Ursulin , David Airlie , Simona Vetter , Dave Airlie , Jesse Barnes , Eric Anholt , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Chun-Kuang Hu , Philipp Zabel , Matthias Brugger , AngeloGioacchino Del Regno , Chris Wilson Cc: Thomas Petazzoni , Mark Yacoub , Sean Paul , Louis Chauvet , intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Simona Vetter , Kory Maincent X-Mailer: b4 0.14-dev-d4707 X-Last-TLS-Session-Version: TLSv1.3 intel_lvds_init() had a goto-based error path that manually called drm_connector_cleanup(), drm_encoder_cleanup(), kfree() and intel_connector_free() when no LVDS panel mode could be found. Once drm_connector_init_with_ddc() and drm_encoder_init() have been called, the DRM core takes ownership of these objects and will invoke their .destroy callbacks (intel_connector_destroy and intel_encoder_destroy) during device teardown. The manual cleanup in the failed: label is therefore redundant. Remove it and replace the goto with a simple early return. Fixes: 79e539453b34e ("DRM: i915: add mode setting support") Signed-off-by: Kory Maincent --- Not tested as I don't have such hardware. --- drivers/gpu/drm/i915/display/intel_lvds.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_lvds.c b/drivers/gpu/drm/i9= 15/display/intel_lvds.c index cc6d4bfcff102..e78a41e2b268c 100644 --- a/drivers/gpu/drm/i915/display/intel_lvds.c +++ b/drivers/gpu/drm/i915/display/intel_lvds.c @@ -991,8 +991,10 @@ void intel_lvds_init(struct intel_display *display) mutex_unlock(&display->drm->mode_config.mutex); =20 /* If we still don't have a mode after all that, give up. */ - if (!intel_panel_preferred_fixed_mode(connector)) - goto failed; + if (!intel_panel_preferred_fixed_mode(connector)) { + drm_dbg_kms(display->drm, "No LVDS modes found, disabling.\n"); + return; + } =20 intel_panel_init(connector, drm_edid); =20 @@ -1005,12 +1007,4 @@ void intel_lvds_init(struct intel_display *display) lvds_encoder->a3_power =3D lvds & LVDS_A3_POWER_MASK; =20 return; - -failed: - drm_dbg_kms(display->drm, "No LVDS modes found, disabling.\n"); - drm_connector_cleanup(&connector->base); - drm_encoder_cleanup(&encoder->base); - kfree(lvds_encoder); - intel_connector_free(connector); - return; } --=20 2.43.0 From nobody Mon Jun 15 10:50:31 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (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 53A993E1207 for ; Thu, 9 Apr 2026 17:09:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775754546; cv=none; b=jphMOv7GfPyDTcE7/ZkQVmYKXX2fZbhJuMvlPYv3vorHd8dQjkBR3/at2yYdqPWGsEgdlUy9NGBrT4FChPhPVZZ5zzQ/YWcOtozq4Xfcxtenl6IuSsv3RRiHSJ3rs46Ce1A23AwP2+ucR2rgNn4ATO9xCQpIdX5NqGjQNYiRILI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775754546; c=relaxed/simple; bh=d0EfHxHbZwIuwN95+d5jhRiyqaAsCECSPGepSKuzj7I=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=skm2q4L9gKpQkCNNAnqm5iB8upxRgSfF54GSibBibO3gLsheNt4STmwrboHZDl9TrMgkqYtv7ui0BfeslbAji5zbX61QMoL3RQkXxMQR8CuTS5KSlgi7a0rkELdyiOZedyMne1WHlkedmiAfvAltK5A261boaf/CTUgZpbgaqQE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=G+GjrKxf; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="G+GjrKxf" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id A08B41A324F; Thu, 9 Apr 2026 17:09:03 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 6E8D7603E4; Thu, 9 Apr 2026 17:09:03 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 31D461045019C; Thu, 9 Apr 2026 19:08:58 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1775754541; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=ni70mQN+06B9PrFWju5Vc9jCJGly/AFJiVYl7kDxCyk=; b=G+GjrKxfsxCSIWMIv+pwZvAagbcJbW9sMgZKMpbqpi3Zq5sFrJCjuNZ+bUlmD0zHIiUX6y 8tm1vdGx6zVwq9775jZ5CXlTLM65igo19UXwJ65CFvWPVdJsXmGUSM33E9Rot3O0YQ9Ps+ dkFawd9NFVZiT5xRQTCspEo7EYjHUlYopKFq5ublJE/7ECFUKchcdmq+k1wPtI6yxUvc9b le/PKC4/7QYmxbvSsfTA9lvy/4L2taX2/Cyy7m2430v4dJRR/Xn2f+HOAX5NWcVttAGqfC uQ6ToIINYfd0UoCfq2VBfq4GgnzXbOx8s45R4x86t0J8tQq+PKGPwPrQXXyZrA== From: Kory Maincent Date: Thu, 09 Apr 2026 19:08:19 +0200 Subject: [PATCH RFC 03/12] drm/i915/display/intel_dp: Drop redundant intel_dp_aux_fini() on init failure 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: <20260409-feat_link_cap-v1-3-7069e8199ce2@bootlin.com> References: <20260409-feat_link_cap-v1-0-7069e8199ce2@bootlin.com> In-Reply-To: <20260409-feat_link_cap-v1-0-7069e8199ce2@bootlin.com> To: Jani Nikula , Rodrigo Vivi , Joonas Lahtinen , Tvrtko Ursulin , David Airlie , Simona Vetter , Dave Airlie , Jesse Barnes , Eric Anholt , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Chun-Kuang Hu , Philipp Zabel , Matthias Brugger , AngeloGioacchino Del Regno , Chris Wilson Cc: Thomas Petazzoni , Mark Yacoub , Sean Paul , Louis Chauvet , intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Simona Vetter , Kory Maincent X-Mailer: b4 0.14-dev-d4707 X-Last-TLS-Session-Version: TLSv1.3 intel_dp_aux_fini() is already invoked via intel_dp_encoder_flush_work() in the encoder destroy path (intel_dp_encoder_destroy() and intel_ddi_encoder_destroy()). Calling it explicitly when intel_edp_init_connector() fails before jumping to the fail label therefore results in a double invocation. Drop the redundant call. Fixes: c191eca110a37 ("drm/i915: Move intel_connector->unregister to connec= tor->early_unregister") Signed-off-by: Kory Maincent --- drivers/gpu/drm/i915/display/intel_dp.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915= /display/intel_dp.c index 4955bd8b11d7a..71f206adbebd3 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -7232,10 +7232,8 @@ intel_dp_init_connector(struct intel_digital_port *d= ig_port, connector->get_hw_state =3D intel_connector_get_hw_state; connector->sync_state =3D intel_dp_connector_sync_state; =20 - if (!intel_edp_init_connector(intel_dp, connector)) { - intel_dp_aux_fini(intel_dp); + if (!intel_edp_init_connector(intel_dp, connector)) goto fail; - } =20 intel_dp_set_source_rates(intel_dp); intel_dp_set_common_rates(intel_dp); --=20 2.43.0 From nobody Mon Jun 15 10:50:31 2026 Received: from smtpout-03.galae.net (smtpout-03.galae.net [185.246.85.4]) (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 55AA53E2744 for ; Thu, 9 Apr 2026 17:09:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.85.4 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775754550; cv=none; b=QKuIVQomOzr3WYoTpah+HoM6USu+dbG/2y5FMHaH9rbLknJT50ZXWNC2rQHTy8U63Lcn7Z2dlQoi6OdU8iKpOuQ8H+ZIIuE5FXFMy8hpg5D79fP4qDJa47oOjptfLwFlknk7FMs8LMv04qqcOvHyFsgkI7LKnC3gALe+IF7Igy0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775754550; c=relaxed/simple; bh=qPId0LWCtAJUauy5dj/KCRDNqeDNfYFXGc79A02aINQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TKLzsMZ8nSU5N3QYrYirmtMyNMnWrLjGl1oVlYDl7G6e3fQHkQjEYkEGeaGoDgFHDvveoyCm6LA3b6fx279KDGUI5+nAaHsw7bXX6vUYzJrcoaSPBGSsVzITNXVL+OUfkPJKgw5VHPsWTooPvb5ksMidztZch/TzbwHdgOKQ9/0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=OcWU6p4E; arc=none smtp.client-ip=185.246.85.4 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="OcWU6p4E" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id A90004E429AA; Thu, 9 Apr 2026 17:09:07 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 7B402603E4; Thu, 9 Apr 2026 17:09:07 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 4A52E104501A3; Thu, 9 Apr 2026 19:09:02 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1775754545; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=PUrev3OwtF7+aQkaLQNcxHy9DAd6gNcwgyZHwoDRdgs=; b=OcWU6p4Eq4OVCUQGSq0OR24F3SV9U9aoJdhjwYfqGnATABnWmw3hYwQNxsrBWr7LFEN0wY +zjRqf2kiNbPo/mU9nW61kDj5CwC7jaSAc5Gy3rkPy5Fj6M7a6/HMc++qZJDBCIVp5SsPv dJE7aBu08Dc+AWujlXmml9BdfZqEFleNP2qMh7AKwPjvG6avstJ/DraY1cnCzO32nFb0hm MbWiVfy6jfzGcJ3GtebCNIHq3TMe8Qh8ej8R1eIvUEP/2XYnx7UGtypJKwFS4d41ddVztJ uP4X8e1sExgc0UDbrUrd84ESpva7V1NRlz9nbV2ut6fF2cmdpdkXxjNkFsekMA== From: Kory Maincent Date: Thu, 09 Apr 2026 19:08:20 +0200 Subject: [PATCH RFC 04/12] drm/i915/display: Switch to drmm_mode_config_init() and drop manual cleanup 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: <20260409-feat_link_cap-v1-4-7069e8199ce2@bootlin.com> References: <20260409-feat_link_cap-v1-0-7069e8199ce2@bootlin.com> In-Reply-To: <20260409-feat_link_cap-v1-0-7069e8199ce2@bootlin.com> To: Jani Nikula , Rodrigo Vivi , Joonas Lahtinen , Tvrtko Ursulin , David Airlie , Simona Vetter , Dave Airlie , Jesse Barnes , Eric Anholt , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Chun-Kuang Hu , Philipp Zabel , Matthias Brugger , AngeloGioacchino Del Regno , Chris Wilson Cc: Thomas Petazzoni , Mark Yacoub , Sean Paul , Louis Chauvet , intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Simona Vetter , Kory Maincent X-Mailer: b4 0.14-dev-d4707 X-Last-TLS-Session-Version: TLSv1.3 Replace drm_mode_config_init() with drmm_mode_config_init() in intel_mode_config_init(). The managed variant automatically registers drm_mode_config_cleanup() with devres, so drivers must no longer call it directly. Since intel_mode_config_cleanup() was solely a wrapper combining intel_atomic_global_obj_cleanup() and drm_mode_config_cleanup(), and the latter is now handled by DRM core, remove it entirely. Instead, register intel_atomic_global_obj_cleanup() as a devres action so it still runs just before drm_mode_config_cleanup() during teardown, preserving the correct cleanup ordering. Change intel_mode_config_init() to return int to propagate any error from drmm_mode_config_init(). Signed-off-by: Kory Maincent --- .../gpu/drm/i915/display/intel_display_driver.c | 37 ++++++++++++++----= ---- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/= gpu/drm/i915/display/intel_display_driver.c index 23bfecc983e8d..d02393053cef4 100644 --- a/drivers/gpu/drm/i915/display/intel_display_driver.c +++ b/drivers/gpu/drm/i915/display/intel_display_driver.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -48,6 +49,7 @@ #include "intel_fbdev.h" #include "intel_fdi.h" #include "intel_flipq.h" +#include "intel_global_state.h" #include "intel_gmbus.h" #include "intel_hdcp.h" #include "intel_hotplug.h" @@ -111,13 +113,28 @@ static const struct drm_mode_config_helper_funcs inte= l_mode_config_funcs =3D { .atomic_commit_setup =3D drm_dp_mst_atomic_setup_commit, }; =20 -static void intel_mode_config_init(struct intel_display *display) +static void intel_atomic_global_obj_cleanup_action(struct drm_device *drm,= void *data) +{ + intel_atomic_global_obj_cleanup((struct intel_display *)data); +} + +static int intel_mode_config_init(struct intel_display *display) { struct drm_mode_config *mode_config =3D &display->drm->mode_config; + int ret; + + ret =3D drmm_mode_config_init(display->drm); + if (ret) + return ret; =20 - drm_mode_config_init(display->drm); INIT_LIST_HEAD(&display->global.obj_list); =20 + ret =3D drmm_add_action_or_reset(display->drm, + intel_atomic_global_obj_cleanup_action, + display); + if (ret) + return ret; + mode_config->min_width =3D 0; mode_config->min_height =3D 0; =20 @@ -148,12 +165,8 @@ static void intel_mode_config_init(struct intel_displa= y *display) } =20 intel_cursor_mode_config_init(display); -} =20 -static void intel_mode_config_cleanup(struct intel_display *display) -{ - intel_atomic_global_obj_cleanup(display); - drm_mode_config_cleanup(display->drm); + return 0; } =20 static void intel_plane_possible_crtcs_init(struct intel_display *display) @@ -255,7 +268,9 @@ int intel_display_driver_probe_noirq(struct intel_displ= ay *display) =20 intel_dmc_init(display); =20 - intel_mode_config_init(display); + ret =3D intel_mode_config_init(display); + if (ret) + goto cleanup_wq_unordered; =20 ret =3D intel_cdclk_init(display); if (ret) @@ -456,7 +471,7 @@ int intel_display_driver_probe_nogem(struct intel_displ= ay *display) =20 ret =3D intel_crtc_init(display); if (ret) - goto err_mode_config; + return ret; =20 intel_plane_possible_crtcs_init(display); intel_dpll_init(display); @@ -497,8 +512,6 @@ int intel_display_driver_probe_nogem(struct intel_displ= ay *display) =20 err_hdcp: intel_hdcp_component_fini(display); -err_mode_config: - intel_mode_config_cleanup(display); =20 return ret; } @@ -618,8 +631,6 @@ void intel_display_driver_remove_noirq(struct intel_dis= play *display) =20 intel_hdcp_component_fini(display); =20 - intel_mode_config_cleanup(display); - intel_dp_tunnel_mgr_cleanup(display); =20 intel_overlay_cleanup(display); --=20 2.43.0 From nobody Mon Jun 15 10:50:31 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (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 0C0E03E2758 for ; Thu, 9 Apr 2026 17:09:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775754554; cv=none; b=ID0BkTw8+tpOSfxTOGJOYnrqRtfgovk6C6qRkG4x+DovHfkdg+/NX2KTVClBPu0Pt4JhJCCb7XyNoOW9DBZqfTgf1yKvDgQQQ68808SPdtpvKA8Im4RdnfwJVmiC+fTKUeNsFogjHmiJ8dKrKWHexYnWig7XB3jBrxYSw+yOEJw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775754554; c=relaxed/simple; bh=ERF23L1LwNnRd49lGv3TuFbBlCNZOskUtqW7eNYeD54=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=o6vrv7lJnotdyuTJprFiX6RR8yhA+ViUGj7uCgCML/blTqZXpKzK0te7V0Nk/RFeTTglOOz+6Plo8XqLXIrLuYbKx/NrHif0BGa3kFG15LDiwO49rPho7vi8U7IyU1bNdx1lL+l98TnPCGq2DHXxhpfn3ipluBrC901QiWPeyTU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=NsNneuci; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="NsNneuci" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 8652A1A324F; Thu, 9 Apr 2026 17:09:11 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 5B165603E4; Thu, 9 Apr 2026 17:09:11 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 4B362104501CC; Thu, 9 Apr 2026 19:09:06 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1775754549; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=gLCKdJRpfKPoB5WWQAXBdqHs5x4sKwWXgZVhJIjP7RQ=; b=NsNneuciB3J5k/khO3wOG9JznpaYRpPkooz/Oq4DtiNephghulGNOFQz596h3I9V2Humf1 e6PbTovsstxzMUZIwx+NkLGQBcfANB9dSd16qfZ0pM1kqH9xjb8ErmbqkiD3PJOn9+jRjm +8qFFiXIzE8c1NbwFZUpEHa81fGdRnZQgVRCcaYss/e71EcOB1xfBnDKqJT7dzystwCwPw ZuIPCtsJI0GQNPzsuj5VGyZxC8v/wbVsUlTSqVaZTcUDzi/pdUWvs+VpkiW1tvdQgb1RxZ lwZGrYfjNxpwEv3MLe3fmyFwboJORD5neDvsKug/g6GDuYMg4c9IJ15OpG7plQ== From: Kory Maincent Date: Thu, 09 Apr 2026 19:08:21 +0200 Subject: [PATCH RFC 05/12] drm/i915/display: Switch to managed for crtc 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: <20260409-feat_link_cap-v1-5-7069e8199ce2@bootlin.com> References: <20260409-feat_link_cap-v1-0-7069e8199ce2@bootlin.com> In-Reply-To: <20260409-feat_link_cap-v1-0-7069e8199ce2@bootlin.com> To: Jani Nikula , Rodrigo Vivi , Joonas Lahtinen , Tvrtko Ursulin , David Airlie , Simona Vetter , Dave Airlie , Jesse Barnes , Eric Anholt , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Chun-Kuang Hu , Philipp Zabel , Matthias Brugger , AngeloGioacchino Del Regno , Chris Wilson Cc: Thomas Petazzoni , Mark Yacoub , Sean Paul , Louis Chauvet , intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Simona Vetter , Kory Maincent X-Mailer: b4 0.14-dev-d4707 X-Last-TLS-Session-Version: TLSv1.3 The current i915 driver uses non-managed function to create crtc. It is not an issue yet, but in order to comply with the latest DRM requirement, convert this code to use drm and device managed helpers. Assisted-by: Claude Code:2.1.90 Signed-off-by: Kory Maincent --- drivers/gpu/drm/i915/display/intel_crtc.c | 102 ++++++++++----------------= ---- 1 file changed, 35 insertions(+), 67 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_crtc.c b/drivers/gpu/drm/i9= 15/display/intel_crtc.c index b8189cd5d864a..e2f995313acf2 100644 --- a/drivers/gpu/drm/i915/display/intel_crtc.c +++ b/drivers/gpu/drm/i915/display/intel_crtc.c @@ -8,6 +8,7 @@ =20 #include #include +#include #include #include #include @@ -191,41 +192,11 @@ void intel_crtc_state_reset(struct intel_crtc_state *= crtc_state, crtc_state->max_link_bpp_x16 =3D INT_MAX; } =20 -static struct intel_crtc *intel_crtc_alloc(void) +static void intel_crtc_vblank_pm_qos_cleanup(struct drm_device *drm, void = *data) { - struct intel_crtc_state *crtc_state; - struct intel_crtc *crtc; - - crtc =3D kzalloc_obj(*crtc); - if (!crtc) - return ERR_PTR(-ENOMEM); - - crtc_state =3D intel_crtc_state_alloc(crtc); - if (!crtc_state) { - kfree(crtc); - return ERR_PTR(-ENOMEM); - } - - crtc->base.state =3D &crtc_state->uapi; - crtc->config =3D crtc_state; - - return crtc; -} - -static void intel_crtc_free(struct intel_crtc *crtc) -{ - intel_crtc_destroy_state(&crtc->base, crtc->base.state); - kfree(crtc); -} - -static void intel_crtc_destroy(struct drm_crtc *_crtc) -{ - struct intel_crtc *crtc =3D to_intel_crtc(_crtc); + struct intel_crtc *crtc =3D data; =20 cpu_latency_qos_remove_request(&crtc->vblank_pm_qos); - - drm_crtc_cleanup(&crtc->base); - kfree(crtc); } =20 static int intel_crtc_late_register(struct drm_crtc *crtc) @@ -236,7 +207,6 @@ static int intel_crtc_late_register(struct drm_crtc *cr= tc) =20 #define INTEL_CRTC_FUNCS \ .set_config =3D drm_atomic_helper_set_config, \ - .destroy =3D intel_crtc_destroy, \ .page_flip =3D drm_atomic_helper_page_flip, \ .atomic_duplicate_state =3D intel_crtc_duplicate_state, \ .atomic_destroy_state =3D intel_crtc_destroy_state, \ @@ -311,28 +281,19 @@ static const struct drm_crtc_funcs i8xx_crtc_funcs = =3D { static int __intel_crtc_init(struct intel_display *display, enum pipe pipe) { struct intel_plane *primary, *cursor; + struct intel_crtc_state *crtc_state; const struct drm_crtc_funcs *funcs; struct intel_crtc *crtc; + u32 plane_ids_mask =3D 0; int sprite, ret; =20 - crtc =3D intel_crtc_alloc(); - if (IS_ERR(crtc)) - return PTR_ERR(crtc); - - crtc->pipe =3D pipe; - crtc->num_scalers =3D DISPLAY_RUNTIME_INFO(display)->num_scalers[pipe]; - if (DISPLAY_VER(display) >=3D 9) primary =3D skl_universal_plane_create(display, pipe, PLANE_1); else primary =3D intel_primary_plane_create(display, pipe); - if (IS_ERR(primary)) { - ret =3D PTR_ERR(primary); - goto fail; - } - crtc->plane_ids_mask |=3D BIT(primary->id); - - intel_init_fifo_underrun_reporting(display, crtc, false); + if (IS_ERR(primary)) + return PTR_ERR(primary); + plane_ids_mask |=3D BIT(primary->id); =20 for_each_sprite(display, pipe, sprite) { struct intel_plane *plane; @@ -341,19 +302,15 @@ static int __intel_crtc_init(struct intel_display *di= splay, enum pipe pipe) plane =3D skl_universal_plane_create(display, pipe, PLANE_2 + sprite); else plane =3D intel_sprite_plane_create(display, pipe, sprite); - if (IS_ERR(plane)) { - ret =3D PTR_ERR(plane); - goto fail; - } - crtc->plane_ids_mask |=3D BIT(plane->id); + if (IS_ERR(plane)) + return PTR_ERR(plane); + plane_ids_mask |=3D BIT(plane->id); } =20 cursor =3D intel_cursor_plane_create(display, pipe); - if (IS_ERR(cursor)) { - ret =3D PTR_ERR(cursor); - goto fail; - } - crtc->plane_ids_mask |=3D BIT(cursor->id); + if (IS_ERR(cursor)) + return PTR_ERR(cursor); + plane_ids_mask |=3D BIT(cursor->id); =20 if (HAS_GMCH(display)) { if (display->platform.cherryview || @@ -376,11 +333,23 @@ static int __intel_crtc_init(struct intel_display *di= splay, enum pipe pipe) funcs =3D &ilk_crtc_funcs; } =20 - ret =3D drm_crtc_init_with_planes(display->drm, &crtc->base, - &primary->base, &cursor->base, - funcs, "pipe %c", pipe_name(pipe)); - if (ret) - goto fail; + crtc =3D drmm_crtc_alloc_with_planes(display->drm, struct intel_crtc, bas= e, + &primary->base, &cursor->base, + funcs, "pipe %c", pipe_name(pipe)); + if (IS_ERR(crtc)) + return PTR_ERR(crtc); + + crtc->pipe =3D pipe; + crtc->num_scalers =3D DISPLAY_RUNTIME_INFO(display)->num_scalers[pipe]; + crtc->plane_ids_mask =3D plane_ids_mask; + + crtc_state =3D intel_crtc_state_alloc(crtc); + if (!crtc_state) + return -ENOMEM; + crtc->base.state =3D &crtc_state->uapi; + crtc->config =3D crtc_state; + + intel_init_fifo_underrun_reporting(display, crtc, false); =20 if (DISPLAY_VER(display) >=3D 11) drm_crtc_create_scaling_filter_property(&crtc->base, @@ -393,17 +362,16 @@ static int __intel_crtc_init(struct intel_display *di= splay, enum pipe pipe) =20 cpu_latency_qos_add_request(&crtc->vblank_pm_qos, PM_QOS_DEFAULT_VALUE); =20 + ret =3D drmm_add_action_or_reset(display->drm, intel_crtc_vblank_pm_qos_c= leanup, crtc); + if (ret) + return ret; + drm_WARN_ON(display->drm, drm_crtc_index(&crtc->base) !=3D crtc->pipe); =20 if (HAS_CASF(display) && crtc->num_scalers >=3D 2) drm_crtc_create_sharpness_strength_property(&crtc->base); =20 return 0; - -fail: - intel_crtc_free(crtc); - - return ret; } =20 int intel_crtc_init(struct intel_display *display) --=20 2.43.0 From nobody Mon Jun 15 10:50:31 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (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 B2BFD3E274D for ; Thu, 9 Apr 2026 17:09:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775754559; cv=none; b=oFf/KUPQPDrDl82J4B+XQj3WhvZllzzT5tATiT5wa+S1s/ZRK6gRpfqbcbNGDPNPKzOXOxvK6q4WmJGouPRI4vvUWZUeLrm0Sazx7HRVkOk86kw7mF7B4mt+Y7CKqxmQai56KsmVvY9OO5jkhth4F1usFzNRUY3KhHrXGn7E/Oo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775754559; c=relaxed/simple; bh=A1nbLB13nFByjeTo5uvPu9wWSVyIOhPOZf2fTe5uJdA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=AIBKSyJTAOm1Bzbvn+8PDzwEHEH9h7xO8yIdx0JZHS24mdUF+wCdd8GNpeRUuqbtAOLel2iR8iA3ZZ2Pf3p8UWAujTfLAeFSDtxNWVXRYALwf61ffEMjiuqiGEd7Td7xpYTSlGayzptulAXictCbp8CeSa41L84M4s8PYG6DwWQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=DjUrLR5y; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="DjUrLR5y" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 6BA201A324F; Thu, 9 Apr 2026 17:09:15 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 3DCDD603E4; Thu, 9 Apr 2026 17:09:15 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 496B2104501B9; Thu, 9 Apr 2026 19:09:10 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1775754553; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=wX7pWpmziBNvFcnTaf8fwuS1/DS6EX90GHY6UzJaV7c=; b=DjUrLR5y0kyp5a69sBPx7vxDI68E2p+JWQxYiCEIdcla6HbZUbQbCnuGg5PCZ+KmSzMpNU 4SaxwgWrjgqzkivNaTqTWQrunfRupR7MlPkZq1rsyAa/GqaOLnta5kjeIkehhzZM6Zpsd6 OGOF2N15lIYlAprXd6Qykxh67y7KS2nDRSYiIn2NwkI7E+E2PofJBs5zHiO1JhopqW6plC QeqraZs69QyjajhNQkDnbzB8wEtKy7/xn44CRktZdvKafiMdLMsUxWbqGDGrAq0vJbgj0s QR5X/f+dXNO+HGqAW8cg7RoCKAiWczknwepO7OI16ymzEg1OrH6MrvEuTGj2bQ== From: Kory Maincent Date: Thu, 09 Apr 2026 19:08:22 +0200 Subject: [PATCH RFC 06/12] drm/i915/display: Switch to managed for plane 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: <20260409-feat_link_cap-v1-6-7069e8199ce2@bootlin.com> References: <20260409-feat_link_cap-v1-0-7069e8199ce2@bootlin.com> In-Reply-To: <20260409-feat_link_cap-v1-0-7069e8199ce2@bootlin.com> To: Jani Nikula , Rodrigo Vivi , Joonas Lahtinen , Tvrtko Ursulin , David Airlie , Simona Vetter , Dave Airlie , Jesse Barnes , Eric Anholt , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Chun-Kuang Hu , Philipp Zabel , Matthias Brugger , AngeloGioacchino Del Regno , Chris Wilson Cc: Thomas Petazzoni , Mark Yacoub , Sean Paul , Louis Chauvet , intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Simona Vetter , Kory Maincent X-Mailer: b4 0.14-dev-d4707 X-Last-TLS-Session-Version: TLSv1.3 The current i915 driver uses non-managed function to create plane. It is not an issue yet, but in order to comply with the latest DRM requirement, convert this code to use drm and device managed helpers. Assisted-by: Claude Code:2.1.90 Signed-off-by: Kory Maincent --- drivers/gpu/drm/i915/display/i9xx_plane.c | 97 ++++++++--------- drivers/gpu/drm/i915/display/intel_cursor.c | 41 ++++--- drivers/gpu/drm/i915/display/intel_plane.c | 45 +------- drivers/gpu/drm/i915/display/intel_plane.h | 5 +- drivers/gpu/drm/i915/display/intel_sprite.c | 119 ++++++++++-------= ---- drivers/gpu/drm/i915/display/skl_universal_plane.c | 102 +++++++++--------- 6 files changed, 181 insertions(+), 228 deletions(-) diff --git a/drivers/gpu/drm/i915/display/i9xx_plane.c b/drivers/gpu/drm/i9= 15/display/i9xx_plane.c index 9c16753a1f3ba..032c56b478dfc 100644 --- a/drivers/gpu/drm/i915/display/i9xx_plane.c +++ b/drivers/gpu/drm/i915/display/i9xx_plane.c @@ -8,6 +8,7 @@ #include #include #include +#include #include =20 #include "i9xx_plane.h" @@ -882,7 +883,6 @@ static unsigned int i9xx_plane_min_alignment(struct int= el_plane *plane, static const struct drm_plane_funcs i965_plane_funcs =3D { .update_plane =3D drm_atomic_helper_update_plane, .disable_plane =3D drm_atomic_helper_disable_plane, - .destroy =3D intel_plane_destroy, .atomic_duplicate_state =3D intel_plane_duplicate_state, .atomic_destroy_state =3D intel_plane_destroy_state, .format_mod_supported =3D i965_plane_format_mod_supported, @@ -892,7 +892,6 @@ static const struct drm_plane_funcs i965_plane_funcs = =3D { static const struct drm_plane_funcs i8xx_plane_funcs =3D { .update_plane =3D drm_atomic_helper_update_plane, .disable_plane =3D drm_atomic_helper_disable_plane, - .destroy =3D intel_plane_destroy, .atomic_duplicate_state =3D intel_plane_duplicate_state, .atomic_destroy_state =3D intel_plane_destroy_state, .format_mod_supported =3D i8xx_plane_format_mod_supported, @@ -923,32 +922,15 @@ static void i9xx_disable_tiling(struct intel_plane *p= lane) struct intel_plane * intel_primary_plane_create(struct intel_display *display, enum pipe pipe) { + struct intel_plane_state *plane_state; struct intel_plane *plane; const struct drm_plane_funcs *plane_funcs; unsigned int supported_rotations; const u64 *modifiers; const u32 *formats; int num_formats; - int ret, zpos; - - plane =3D intel_plane_alloc(); - if (IS_ERR(plane)) - return plane; - - plane->pipe =3D pipe; - /* - * On gen2/3 only plane A can do FBC, but the panel fitter and LVDS - * port is hooked to pipe B. Hence we want plane A feeding pipe B. - */ - if (HAS_FBC(display) && DISPLAY_VER(display) < 4 && - INTEL_NUM_PIPES(display) =3D=3D 2) - plane->i9xx_plane =3D (enum i9xx_plane_id) !pipe; - else - plane->i9xx_plane =3D (enum i9xx_plane_id) pipe; - plane->id =3D PLANE_PRIMARY; - plane->frontbuffer_bit =3D INTEL_FRONTBUFFER(pipe, plane->id); - - intel_fbc_add_plane(i9xx_plane_fbc(display, plane->i9xx_plane), plane); + enum i9xx_plane_id i9xx_plane; + int zpos; =20 if (display->platform.valleyview || display->platform.cherryview) { formats =3D vlv_primary_formats; @@ -984,6 +966,46 @@ intel_primary_plane_create(struct intel_display *displ= ay, enum pipe pipe) else plane_funcs =3D &i8xx_plane_funcs; =20 + /* + * On gen2/3 only plane A can do FBC, but the panel fitter and LVDS + * port is hooked to pipe B. Hence we want plane A feeding pipe B. + */ + if (HAS_FBC(display) && DISPLAY_VER(display) < 4 && + INTEL_NUM_PIPES(display) =3D=3D 2) + i9xx_plane =3D (enum i9xx_plane_id)!pipe; + else + i9xx_plane =3D (enum i9xx_plane_id)pipe; + + modifiers =3D intel_fb_plane_get_modifiers(display, INTEL_PLANE_CAP_TILIN= G_X); + + if (DISPLAY_VER(display) >=3D 5 || display->platform.g4x) + plane =3D drmm_universal_plane_alloc(display->drm, struct intel_plane, b= ase, + 0, plane_funcs, + formats, num_formats, + modifiers, + DRM_PLANE_TYPE_PRIMARY, + "primary %c", pipe_name(pipe)); + else + plane =3D drmm_universal_plane_alloc(display->drm, struct intel_plane, b= ase, + 0, plane_funcs, + formats, num_formats, + modifiers, + DRM_PLANE_TYPE_PRIMARY, + "plane %c", + plane_name(i9xx_plane)); + + kfree(modifiers); + + if (IS_ERR(plane)) + return plane; + + plane->pipe =3D pipe; + plane->i9xx_plane =3D i9xx_plane; + plane->id =3D PLANE_PRIMARY; + plane->frontbuffer_bit =3D INTEL_FRONTBUFFER(pipe, plane->id); + + intel_fbc_add_plane(i9xx_plane_fbc(display, plane->i9xx_plane), plane); + if (display->platform.valleyview || display->platform.cherryview) plane->min_cdclk =3D vlv_plane_min_cdclk; else if (display->platform.broadwell || display->platform.haswell) @@ -1069,28 +1091,12 @@ intel_primary_plane_create(struct intel_display *di= splay, enum pipe pipe) =20 plane->disable_tiling =3D i9xx_disable_tiling; =20 - modifiers =3D intel_fb_plane_get_modifiers(display, INTEL_PLANE_CAP_TILIN= G_X); - - if (DISPLAY_VER(display) >=3D 5 || display->platform.g4x) - ret =3D drm_universal_plane_init(display->drm, &plane->base, - 0, plane_funcs, - formats, num_formats, - modifiers, - DRM_PLANE_TYPE_PRIMARY, - "primary %c", pipe_name(pipe)); - else - ret =3D drm_universal_plane_init(display->drm, &plane->base, - 0, plane_funcs, - formats, num_formats, - modifiers, - DRM_PLANE_TYPE_PRIMARY, - "plane %c", - plane_name(plane->i9xx_plane)); - - kfree(modifiers); + plane_state =3D kzalloc_obj(*plane_state); + if (!plane_state) + return ERR_PTR(-ENOMEM); =20 - if (ret) - goto fail; + intel_plane_state_reset(plane_state, plane); + plane->base.state =3D &plane_state->uapi; =20 if (display->platform.cherryview && pipe =3D=3D PIPE_B) { supported_rotations =3D @@ -1114,11 +1120,6 @@ intel_primary_plane_create(struct intel_display *dis= play, enum pipe pipe) intel_plane_helper_add(plane); =20 return plane; - -fail: - intel_plane_free(plane); - - return ERR_PTR(ret); } =20 static int i9xx_format_to_fourcc(int format) diff --git a/drivers/gpu/drm/i915/display/intel_cursor.c b/drivers/gpu/drm/= i915/display/intel_cursor.c index 18d1014de3613..2493baf25fbe2 100644 --- a/drivers/gpu/drm/i915/display/intel_cursor.c +++ b/drivers/gpu/drm/i915/display/intel_cursor.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include =20 @@ -971,7 +972,6 @@ intel_legacy_cursor_update(struct drm_plane *_plane, static const struct drm_plane_funcs intel_cursor_plane_funcs =3D { .update_plane =3D intel_legacy_cursor_update, .disable_plane =3D drm_atomic_helper_disable_plane, - .destroy =3D intel_plane_destroy, .atomic_duplicate_state =3D intel_plane_duplicate_state, .atomic_destroy_state =3D intel_plane_destroy_state, .format_mod_supported =3D intel_cursor_format_mod_supported, @@ -1004,11 +1004,23 @@ struct intel_plane * intel_cursor_plane_create(struct intel_display *display, enum pipe pipe) { + struct intel_plane_state *plane_state; struct intel_plane *cursor; - int ret, zpos; + int zpos; u64 *modifiers; =20 - cursor =3D intel_plane_alloc(); + modifiers =3D intel_fb_plane_get_modifiers(display, INTEL_PLANE_CAP_NONE); + + cursor =3D drmm_universal_plane_alloc(display->drm, struct intel_plane, b= ase, + 0, &intel_cursor_plane_funcs, + intel_cursor_formats, + ARRAY_SIZE(intel_cursor_formats), + modifiers, + DRM_PLANE_TYPE_CURSOR, + "cursor %c", pipe_name(pipe)); + + kfree(modifiers); + if (IS_ERR(cursor)) return cursor; =20 @@ -1056,20 +1068,12 @@ intel_cursor_plane_create(struct intel_display *dis= play, if (display->platform.i845g || display->platform.i865g || HAS_CUR_FBC(dis= play)) cursor->cursor.size =3D ~0; =20 - modifiers =3D intel_fb_plane_get_modifiers(display, INTEL_PLANE_CAP_NONE); - - ret =3D drm_universal_plane_init(display->drm, &cursor->base, - 0, &intel_cursor_plane_funcs, - intel_cursor_formats, - ARRAY_SIZE(intel_cursor_formats), - modifiers, - DRM_PLANE_TYPE_CURSOR, - "cursor %c", pipe_name(pipe)); - - kfree(modifiers); + plane_state =3D kzalloc_obj(*plane_state); + if (!plane_state) + return ERR_PTR(-ENOMEM); =20 - if (ret) - goto fail; + intel_plane_state_reset(plane_state, cursor); + cursor->base.state =3D &plane_state->uapi; =20 if (DISPLAY_VER(display) >=3D 4) drm_plane_create_rotation_property(&cursor->base, @@ -1088,11 +1092,6 @@ intel_cursor_plane_create(struct intel_display *disp= lay, intel_plane_helper_add(cursor); =20 return cursor; - -fail: - intel_plane_free(cursor); - - return ERR_PTR(ret); } =20 void intel_cursor_mode_config_init(struct intel_display *display) diff --git a/drivers/gpu/drm/i915/display/intel_plane.c b/drivers/gpu/drm/i= 915/display/intel_plane.c index 5390ceb21ca42..05c2dc0902f5c 100644 --- a/drivers/gpu/drm/i915/display/intel_plane.c +++ b/drivers/gpu/drm/i915/display/intel_plane.c @@ -62,8 +62,8 @@ #include "skl_universal_plane.h" #include "skl_watermark.h" =20 -static void intel_plane_state_reset(struct intel_plane_state *plane_state, - struct intel_plane *plane) +void intel_plane_state_reset(struct intel_plane_state *plane_state, + struct intel_plane *plane) { memset(plane_state, 0, sizeof(*plane_state)); =20 @@ -72,47 +72,6 @@ static void intel_plane_state_reset(struct intel_plane_s= tate *plane_state, plane_state->scaler_id =3D -1; } =20 -struct intel_plane *intel_plane_alloc(void) -{ - struct intel_plane_state *plane_state; - struct intel_plane *plane; - - plane =3D kzalloc_obj(*plane); - if (!plane) - return ERR_PTR(-ENOMEM); - - plane_state =3D kzalloc_obj(*plane_state); - if (!plane_state) { - kfree(plane); - return ERR_PTR(-ENOMEM); - } - - intel_plane_state_reset(plane_state, plane); - - plane->base.state =3D &plane_state->uapi; - - return plane; -} - -void intel_plane_free(struct intel_plane *plane) -{ - intel_plane_destroy_state(&plane->base, plane->base.state); - kfree(plane); -} - -/** - * intel_plane_destroy - destroy a plane - * @plane: plane to destroy - * - * Common destruction function for all types of planes (primary, cursor, - * sprite). - */ -void intel_plane_destroy(struct drm_plane *plane) -{ - drm_plane_cleanup(plane); - kfree(to_intel_plane(plane)); -} - /** * intel_plane_duplicate_state - duplicate plane state * @plane: drm plane diff --git a/drivers/gpu/drm/i915/display/intel_plane.h b/drivers/gpu/drm/i= 915/display/intel_plane.h index 5a8f2f3baab5f..56221619a2b29 100644 --- a/drivers/gpu/drm/i915/display/intel_plane.h +++ b/drivers/gpu/drm/i915/display/intel_plane.h @@ -55,9 +55,8 @@ void intel_plane_update_arm(struct intel_dsb *dsb, void intel_plane_disable_arm(struct intel_dsb *dsb, struct intel_plane *plane, const struct intel_crtc_state *crtc_state); -struct intel_plane *intel_plane_alloc(void); -void intel_plane_free(struct intel_plane *plane); -void intel_plane_destroy(struct drm_plane *plane); +void intel_plane_state_reset(struct intel_plane_state *plane_state, + struct intel_plane *plane); struct drm_plane_state *intel_plane_duplicate_state(struct drm_plane *plan= e); void intel_plane_destroy_state(struct drm_plane *plane, struct drm_plane_state *state); diff --git a/drivers/gpu/drm/i915/display/intel_sprite.c b/drivers/gpu/drm/= i915/display/intel_sprite.c index 6a65f92e8a031..f285d15734ee5 100644 --- a/drivers/gpu/drm/i915/display/intel_sprite.c +++ b/drivers/gpu/drm/i915/display/intel_sprite.c @@ -36,6 +36,7 @@ #include #include #include +#include #include #include =20 @@ -1563,7 +1564,6 @@ static bool vlv_sprite_format_mod_supported(struct dr= m_plane *_plane, static const struct drm_plane_funcs g4x_sprite_funcs =3D { .update_plane =3D drm_atomic_helper_update_plane, .disable_plane =3D drm_atomic_helper_disable_plane, - .destroy =3D intel_plane_destroy, .atomic_duplicate_state =3D intel_plane_duplicate_state, .atomic_destroy_state =3D intel_plane_destroy_state, .format_mod_supported =3D g4x_sprite_format_mod_supported, @@ -1573,7 +1573,6 @@ static const struct drm_plane_funcs g4x_sprite_funcs = =3D { static const struct drm_plane_funcs snb_sprite_funcs =3D { .update_plane =3D drm_atomic_helper_update_plane, .disable_plane =3D drm_atomic_helper_disable_plane, - .destroy =3D intel_plane_destroy, .atomic_duplicate_state =3D intel_plane_duplicate_state, .atomic_destroy_state =3D intel_plane_destroy_state, .format_mod_supported =3D snb_sprite_format_mod_supported, @@ -1583,7 +1582,6 @@ static const struct drm_plane_funcs snb_sprite_funcs = =3D { static const struct drm_plane_funcs vlv_sprite_funcs =3D { .update_plane =3D drm_atomic_helper_update_plane, .disable_plane =3D drm_atomic_helper_disable_plane, - .destroy =3D intel_plane_destroy, .atomic_duplicate_state =3D intel_plane_duplicate_state, .atomic_destroy_state =3D intel_plane_destroy_state, .format_mod_supported =3D vlv_sprite_format_mod_supported, @@ -1594,18 +1592,69 @@ struct intel_plane * intel_sprite_plane_create(struct intel_display *display, enum pipe pipe, int sprite) { + struct intel_plane_state *plane_state; struct intel_plane *plane; const struct drm_plane_funcs *plane_funcs; unsigned int supported_rotations; const u64 *modifiers; const u32 *formats; int num_formats; - int ret, zpos; + int zpos; + + if (display->platform.valleyview || display->platform.cherryview) { + if (display->platform.cherryview && pipe =3D=3D PIPE_B) { + formats =3D chv_pipe_b_sprite_formats; + num_formats =3D ARRAY_SIZE(chv_pipe_b_sprite_formats); + } else { + formats =3D vlv_sprite_formats; + num_formats =3D ARRAY_SIZE(vlv_sprite_formats); + } + + plane_funcs =3D &vlv_sprite_funcs; + } else if (DISPLAY_VER(display) >=3D 7) { + formats =3D snb_sprite_formats; + num_formats =3D ARRAY_SIZE(snb_sprite_formats); + + plane_funcs =3D &snb_sprite_funcs; + } else { + if (display->platform.sandybridge) { + formats =3D snb_sprite_formats; + num_formats =3D ARRAY_SIZE(snb_sprite_formats); + + plane_funcs =3D &snb_sprite_funcs; + } else { + formats =3D g4x_sprite_formats; + num_formats =3D ARRAY_SIZE(g4x_sprite_formats); + + plane_funcs =3D &g4x_sprite_funcs; + } + } + + if (display->platform.cherryview && pipe =3D=3D PIPE_B) { + supported_rotations =3D + DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_180 | + DRM_MODE_REFLECT_X; + } else { + supported_rotations =3D + DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_180; + } + + modifiers =3D intel_fb_plane_get_modifiers(display, INTEL_PLANE_CAP_TILIN= G_X); + + plane =3D drmm_universal_plane_alloc(display->drm, struct intel_plane, ba= se, + 0, plane_funcs, + formats, num_formats, modifiers, + DRM_PLANE_TYPE_OVERLAY, + "sprite %c", sprite_name(display, pipe, sprite)); + kfree(modifiers); =20 - plane =3D intel_plane_alloc(); if (IS_ERR(plane)) return plane; =20 + plane->pipe =3D pipe; + plane->id =3D PLANE_SPRITE0 + sprite; + plane->frontbuffer_bit =3D INTEL_FRONTBUFFER(pipe, plane->id); + if (display->platform.valleyview || display->platform.cherryview) { plane->update_noarm =3D vlv_sprite_update_noarm; plane->update_arm =3D vlv_sprite_update_arm; @@ -1621,16 +1670,6 @@ intel_sprite_plane_create(struct intel_display *disp= lay, /* FIXME undocumented for VLV/CHV so not sure what's actually needed */ if (intel_scanout_needs_vtd_wa(display)) plane->vtd_guard =3D 128; - - if (display->platform.cherryview && pipe =3D=3D PIPE_B) { - formats =3D chv_pipe_b_sprite_formats; - num_formats =3D ARRAY_SIZE(chv_pipe_b_sprite_formats); - } else { - formats =3D vlv_sprite_formats; - num_formats =3D ARRAY_SIZE(vlv_sprite_formats); - } - - plane_funcs =3D &vlv_sprite_funcs; } else if (DISPLAY_VER(display) >=3D 7) { plane->update_noarm =3D ivb_sprite_update_noarm; plane->update_arm =3D ivb_sprite_update_arm; @@ -1652,11 +1691,6 @@ intel_sprite_plane_create(struct intel_display *disp= lay, =20 if (intel_scanout_needs_vtd_wa(display)) plane->vtd_guard =3D 64; - - formats =3D snb_sprite_formats; - num_formats =3D ARRAY_SIZE(snb_sprite_formats); - - plane_funcs =3D &snb_sprite_funcs; } else { plane->update_noarm =3D g4x_sprite_update_noarm; plane->update_arm =3D g4x_sprite_update_arm; @@ -1671,44 +1705,14 @@ intel_sprite_plane_create(struct intel_display *dis= play, =20 if (intel_scanout_needs_vtd_wa(display)) plane->vtd_guard =3D 64; - - if (display->platform.sandybridge) { - formats =3D snb_sprite_formats; - num_formats =3D ARRAY_SIZE(snb_sprite_formats); - - plane_funcs =3D &snb_sprite_funcs; - } else { - formats =3D g4x_sprite_formats; - num_formats =3D ARRAY_SIZE(g4x_sprite_formats); - - plane_funcs =3D &g4x_sprite_funcs; - } } =20 - if (display->platform.cherryview && pipe =3D=3D PIPE_B) { - supported_rotations =3D - DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_180 | - DRM_MODE_REFLECT_X; - } else { - supported_rotations =3D - DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_180; - } + plane_state =3D kzalloc_obj(*plane_state); + if (!plane_state) + return ERR_PTR(-ENOMEM); =20 - plane->pipe =3D pipe; - plane->id =3D PLANE_SPRITE0 + sprite; - plane->frontbuffer_bit =3D INTEL_FRONTBUFFER(pipe, plane->id); - - modifiers =3D intel_fb_plane_get_modifiers(display, INTEL_PLANE_CAP_TILIN= G_X); - - ret =3D drm_universal_plane_init(display->drm, &plane->base, - 0, plane_funcs, - formats, num_formats, modifiers, - DRM_PLANE_TYPE_OVERLAY, - "sprite %c", sprite_name(display, pipe, sprite)); - kfree(modifiers); - - if (ret) - goto fail; + intel_plane_state_reset(plane_state, plane); + plane->base.state =3D &plane_state->uapi; =20 drm_plane_create_rotation_property(&plane->base, DRM_MODE_ROTATE_0, @@ -1728,9 +1732,4 @@ intel_sprite_plane_create(struct intel_display *displ= ay, intel_plane_helper_add(plane); =20 return plane; - -fail: - intel_plane_free(plane); - - return ERR_PTR(ret); } diff --git a/drivers/gpu/drm/i915/display/skl_universal_plane.c b/drivers/g= pu/drm/i915/display/skl_universal_plane.c index 11ba42c67e3ed..6d6b108bf7e46 100644 --- a/drivers/gpu/drm/i915/display/skl_universal_plane.c +++ b/drivers/gpu/drm/i915/display/skl_universal_plane.c @@ -7,6 +7,7 @@ #include #include #include +#include #include =20 #include "intel_bo.h" @@ -2690,7 +2691,6 @@ static bool tgl_plane_format_mod_supported(struct drm= _plane *_plane, static const struct drm_plane_funcs skl_plane_funcs =3D { .update_plane =3D drm_atomic_helper_update_plane, .disable_plane =3D drm_atomic_helper_disable_plane, - .destroy =3D intel_plane_destroy, .atomic_duplicate_state =3D intel_plane_duplicate_state, .atomic_destroy_state =3D intel_plane_destroy_state, .format_mod_supported =3D skl_plane_format_mod_supported, @@ -2700,7 +2700,6 @@ static const struct drm_plane_funcs skl_plane_funcs = =3D { static const struct drm_plane_funcs icl_plane_funcs =3D { .update_plane =3D drm_atomic_helper_update_plane, .disable_plane =3D drm_atomic_helper_disable_plane, - .destroy =3D intel_plane_destroy, .atomic_duplicate_state =3D intel_plane_duplicate_state, .atomic_destroy_state =3D intel_plane_destroy_state, .format_mod_supported =3D icl_plane_format_mod_supported, @@ -2710,7 +2709,6 @@ static const struct drm_plane_funcs icl_plane_funcs = =3D { static const struct drm_plane_funcs tgl_plane_funcs =3D { .update_plane =3D drm_atomic_helper_update_plane, .disable_plane =3D drm_atomic_helper_disable_plane, - .destroy =3D intel_plane_destroy, .atomic_duplicate_state =3D intel_plane_duplicate_state, .atomic_destroy_state =3D intel_plane_destroy_state, .format_mod_supported =3D tgl_plane_format_mod_supported, @@ -2850,6 +2848,7 @@ struct intel_plane * skl_universal_plane_create(struct intel_display *display, enum pipe pipe, enum plane_id plane_id) { + struct intel_plane_state *plane_state; const struct drm_plane_funcs *plane_funcs; struct intel_plane *plane; enum drm_plane_type plane_type; @@ -2858,10 +2857,50 @@ skl_universal_plane_create(struct intel_display *di= splay, const u64 *modifiers; const u32 *formats; int num_formats; - int ret; u8 caps; =20 - plane =3D intel_plane_alloc(); + if (DISPLAY_VER(display) >=3D 11) + formats =3D icl_get_plane_formats(display, pipe, + plane_id, &num_formats); + else if (DISPLAY_VER(display) >=3D 10) + formats =3D glk_get_plane_formats(display, pipe, + plane_id, &num_formats); + else + formats =3D skl_get_plane_formats(display, pipe, + plane_id, &num_formats); + + if (DISPLAY_VER(display) >=3D 12) + plane_funcs =3D &tgl_plane_funcs; + else if (DISPLAY_VER(display) =3D=3D 11) + plane_funcs =3D &icl_plane_funcs; + else + plane_funcs =3D &skl_plane_funcs; + + if (plane_id =3D=3D PLANE_1) + plane_type =3D DRM_PLANE_TYPE_PRIMARY; + else + plane_type =3D DRM_PLANE_TYPE_OVERLAY; + + if (DISPLAY_VER(display) >=3D 12) + caps =3D tgl_plane_caps(display, pipe, plane_id); + else if (DISPLAY_VER(display) =3D=3D 11) + caps =3D icl_plane_caps(display, pipe, plane_id); + else if (DISPLAY_VER(display) =3D=3D 10) + caps =3D glk_plane_caps(display, pipe, plane_id); + else + caps =3D skl_plane_caps(display, pipe, plane_id); + + modifiers =3D intel_fb_plane_get_modifiers(display, caps); + + plane =3D drmm_universal_plane_alloc(display->drm, struct intel_plane, ba= se, + 0, plane_funcs, + formats, num_formats, modifiers, + plane_type, + "plane %d%c", plane_id + 1, + pipe_name(pipe)); + + kfree(modifiers); + if (IS_ERR(plane)) return plane; =20 @@ -2940,50 +2979,12 @@ skl_universal_plane_create(struct intel_display *di= splay, plane->can_async_flip =3D skl_plane_can_async_flip; } =20 - if (DISPLAY_VER(display) >=3D 11) - formats =3D icl_get_plane_formats(display, pipe, - plane_id, &num_formats); - else if (DISPLAY_VER(display) >=3D 10) - formats =3D glk_get_plane_formats(display, pipe, - plane_id, &num_formats); - else - formats =3D skl_get_plane_formats(display, pipe, - plane_id, &num_formats); + plane_state =3D kzalloc_obj(*plane_state); + if (!plane_state) + return ERR_PTR(-ENOMEM); =20 - if (DISPLAY_VER(display) >=3D 12) - plane_funcs =3D &tgl_plane_funcs; - else if (DISPLAY_VER(display) =3D=3D 11) - plane_funcs =3D &icl_plane_funcs; - else - plane_funcs =3D &skl_plane_funcs; - - if (plane_id =3D=3D PLANE_1) - plane_type =3D DRM_PLANE_TYPE_PRIMARY; - else - plane_type =3D DRM_PLANE_TYPE_OVERLAY; - - if (DISPLAY_VER(display) >=3D 12) - caps =3D tgl_plane_caps(display, pipe, plane_id); - else if (DISPLAY_VER(display) =3D=3D 11) - caps =3D icl_plane_caps(display, pipe, plane_id); - else if (DISPLAY_VER(display) =3D=3D 10) - caps =3D glk_plane_caps(display, pipe, plane_id); - else - caps =3D skl_plane_caps(display, pipe, plane_id); - - modifiers =3D intel_fb_plane_get_modifiers(display, caps); - - ret =3D drm_universal_plane_init(display->drm, &plane->base, - 0, plane_funcs, - formats, num_formats, modifiers, - plane_type, - "plane %d%c", plane_id + 1, - pipe_name(pipe)); - - kfree(modifiers); - - if (ret) - goto fail; + intel_plane_state_reset(plane_state, plane); + plane->base.state =3D &plane_state->uapi; =20 if (DISPLAY_VER(display) >=3D 13) supported_rotations =3D DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_180; @@ -3033,11 +3034,6 @@ skl_universal_plane_create(struct intel_display *dis= play, intel_plane_helper_add(plane); =20 return plane; - -fail: - intel_plane_free(plane); - - return ERR_PTR(ret); } =20 void --=20 2.43.0 From nobody Mon Jun 15 10:50:31 2026 Received: from smtpout-03.galae.net (smtpout-03.galae.net [185.246.85.4]) (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 AABB13DBD7F for ; Thu, 9 Apr 2026 17:09:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.85.4 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775754563; cv=none; b=nCaTdE0pMjQYHPffFVLY3qAu3rZwey9YmfW4BA4WQFsJuUcHoKGHyFKKNTVZvB3oa4exUuKMkdAG93uybqLvhYnbKwdb8bHzZzWTRe87BT304XGB9jHE7dPFAnu6bVdlRQcDfrvLx9Ji4d99U2cAnu4KKqCZ2BVdsoImyKLsoTg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775754563; c=relaxed/simple; bh=Az4i9I5IeE1LobJCSkxzoSi5KJjbAQl1+1H0qZd955o=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Leqpacs/uxLVN76Arwf75Qz6tzXYEK0yAx3SDCeEHdfEbCMobcc08jlD61DTBtwpI4Uop7Lw5d05dUAzYrSRvv0N51D6Qb90K84G1eGa9QLti7YW9arkaZ17wNY90qG01mHflgqymGVThEoRuNsV5a5ac5v6s7buldNY2Pm03go= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=f4o385lf; arc=none smtp.client-ip=185.246.85.4 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="f4o385lf" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 629EE4E429AE; Thu, 9 Apr 2026 17:09:19 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 34F8E603E4; Thu, 9 Apr 2026 17:09:19 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 126CF104501D0; Thu, 9 Apr 2026 19:09:13 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1775754557; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=4zTCftcFdbHfd09YrMB7pNOLoJLsMARPpzU+VDQDU9A=; b=f4o385lfqOAkrmNLvJ9Gebbr6dmxUMzNZxPRmLmKv3kF/71x+Ts4PIonuNEqt/77LxftL/ Is2Z+9xyBGoCTHvwhCaImazbNjTtN+QA/OMrCr0ceczKRJhX4d43m+xpAyfVfR1odEfkzr vEeSPQh0tamrA+yZG/lLfboIdgIZ5LxjaWcS6AfiSRz7FCl+vv+So0j/tmq2BU6ztDP+pt MfbixRkFrTpcbRgpgpzXzIB8w6WvhyHebsM5tGZHoDxebemRb+2NQp2wHxuDcNYlGLng9P 57c7aqybDXWFS8E1UpI7Y5jZw70rubz7/KbxN3JHbDLw11GVVq3G71fsTIX9Aw== From: Kory Maincent Date: Thu, 09 Apr 2026 19:08:23 +0200 Subject: [PATCH RFC 07/12] drm/i915/display: Switch to managed for encoder 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: <20260409-feat_link_cap-v1-7-7069e8199ce2@bootlin.com> References: <20260409-feat_link_cap-v1-0-7069e8199ce2@bootlin.com> In-Reply-To: <20260409-feat_link_cap-v1-0-7069e8199ce2@bootlin.com> To: Jani Nikula , Rodrigo Vivi , Joonas Lahtinen , Tvrtko Ursulin , David Airlie , Simona Vetter , Dave Airlie , Jesse Barnes , Eric Anholt , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Chun-Kuang Hu , Philipp Zabel , Matthias Brugger , AngeloGioacchino Del Regno , Chris Wilson Cc: Thomas Petazzoni , Mark Yacoub , Sean Paul , Louis Chauvet , intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Simona Vetter , Kory Maincent X-Mailer: b4 0.14-dev-d4707 X-Last-TLS-Session-Version: TLSv1.3 The current i915 driver uses non-managed function to create encoder. It is not an issue yet, but in order to comply with the latest DRM requirement, convert this code to use drm and device managed helpers. Assisted-by: Claude Code:2.1.90 Signed-off-by: Kory Maincent --- drivers/gpu/drm/i915/display/g4x_dp.c | 31 ++++++++--------- drivers/gpu/drm/i915/display/g4x_hdmi.c | 19 ++++------- drivers/gpu/drm/i915/display/icl_dsi.c | 20 +++-------- drivers/gpu/drm/i915/display/intel_crt.c | 9 +++-- drivers/gpu/drm/i915/display/intel_ddi.c | 50 +++++++++++++++---------= ---- drivers/gpu/drm/i915/display/intel_display.c | 8 ----- drivers/gpu/drm/i915/display/intel_display.h | 1 - drivers/gpu/drm/i915/display/intel_dp_mst.c | 20 +++-------- drivers/gpu/drm/i915/display/intel_dvo.c | 22 ++++++------ drivers/gpu/drm/i915/display/intel_encoder.c | 6 ++-- drivers/gpu/drm/i915/display/intel_encoder.h | 3 +- drivers/gpu/drm/i915/display/intel_lvds.c | 13 +++----- drivers/gpu/drm/i915/display/intel_sdvo.c | 45 +++++++++++-------------- drivers/gpu/drm/i915/display/intel_tv.c | 11 +++--- drivers/gpu/drm/i915/display/vlv_dsi.c | 22 +++++------- 15 files changed, 114 insertions(+), 166 deletions(-) diff --git a/drivers/gpu/drm/i915/display/g4x_dp.c b/drivers/gpu/drm/i915/d= isplay/g4x_dp.c index 5e74d8a3ba5c8..99b6c5ce39b2a 100644 --- a/drivers/gpu/drm/i915/display/g4x_dp.c +++ b/drivers/gpu/drm/i915/display/g4x_dp.c @@ -7,6 +7,7 @@ =20 #include =20 +#include #include =20 #include "g4x_dp.h" @@ -1250,12 +1251,9 @@ static void g4x_dp_suspend_complete(struct intel_enc= oder *encoder) intel_encoder_link_check_flush_work(encoder); } =20 -static void intel_dp_encoder_destroy(struct drm_encoder *encoder) +static void intel_dp_encoder_flush_work_cleanup(struct drm_device *drm, vo= id *data) { - intel_dp_encoder_flush_work(encoder); - - drm_encoder_cleanup(encoder); - kfree(enc_to_dig_port(to_intel_encoder(encoder))); + intel_dp_encoder_flush_work(data); } =20 static void intel_dp_encoder_reset(struct drm_encoder *encoder) @@ -1276,7 +1274,6 @@ static void intel_dp_encoder_reset(struct drm_encoder= *encoder) =20 static const struct drm_encoder_funcs intel_dp_enc_funcs =3D { .reset =3D intel_dp_encoder_reset, - .destroy =3D intel_dp_encoder_destroy, }; =20 bool g4x_dp_init(struct intel_display *display, @@ -1298,22 +1295,26 @@ bool g4x_dp_init(struct intel_display *display, drm_dbg_kms(display->drm, "No VBT child device for DP-%c\n", port_name(port)); =20 - dig_port =3D intel_dig_port_alloc(); + dig_port =3D intel_dig_port_alloc(display->drm); if (!dig_port) return false; =20 intel_connector =3D intel_connector_alloc(); if (!intel_connector) - goto err_connector_alloc; + return false; =20 intel_encoder =3D &dig_port->base; encoder =3D &intel_encoder->base; =20 intel_encoder->devdata =3D devdata; =20 - if (drm_encoder_init(display->drm, &intel_encoder->base, - &intel_dp_enc_funcs, DRM_MODE_ENCODER_TMDS, - "DP %c", port_name(port))) + if (drmm_encoder_init(display->drm, &intel_encoder->base, + &intel_dp_enc_funcs, DRM_MODE_ENCODER_TMDS, + "DP %c", port_name(port))) + goto err_encoder_init; + + if (drmm_add_action_or_reset(display->drm, + intel_dp_encoder_flush_work_cleanup, encoder)) goto err_encoder_init; =20 intel_encoder_link_check_init(intel_encoder, intel_dp_link_check); @@ -1411,18 +1412,14 @@ bool g4x_dp_init(struct intel_display *display, =20 dig_port->aux_ch =3D intel_dp_aux_ch(intel_encoder); if (dig_port->aux_ch =3D=3D AUX_CH_NONE) - goto err_init_connector; + goto err_encoder_init; =20 if (!intel_dp_init_connector(dig_port, intel_connector)) - goto err_init_connector; + goto err_encoder_init; =20 return true; =20 -err_init_connector: - drm_encoder_cleanup(encoder); err_encoder_init: kfree(intel_connector); -err_connector_alloc: - kfree(dig_port); return false; } diff --git a/drivers/gpu/drm/i915/display/g4x_hdmi.c b/drivers/gpu/drm/i915= /display/g4x_hdmi.c index 5fe5067c4237c..45ee1ad504bc1 100644 --- a/drivers/gpu/drm/i915/display/g4x_hdmi.c +++ b/drivers/gpu/drm/i915/display/g4x_hdmi.c @@ -5,6 +5,7 @@ * HDMI support for G4x,ILK,SNB,IVB,VLV,CHV (HSW+ handled by the DDI code). */ =20 +#include #include =20 #include "g4x_hdmi.h" @@ -562,7 +563,6 @@ static void chv_hdmi_pre_enable(struct intel_atomic_sta= te *state, } =20 static const struct drm_encoder_funcs intel_hdmi_enc_funcs =3D { - .destroy =3D intel_encoder_destroy, }; =20 static enum intel_hotplug_state @@ -686,21 +686,21 @@ bool g4x_hdmi_init(struct intel_display *display, drm_dbg_kms(display->drm, "No VBT child device for HDMI-%c\n", port_name(port)); =20 - dig_port =3D intel_dig_port_alloc(); + dig_port =3D intel_dig_port_alloc(display->drm); if (!dig_port) return false; =20 intel_connector =3D intel_connector_alloc(); if (!intel_connector) - goto err_connector_alloc; + return false; =20 intel_encoder =3D &dig_port->base; =20 intel_encoder->devdata =3D devdata; =20 - if (drm_encoder_init(display->drm, &intel_encoder->base, - &intel_hdmi_enc_funcs, DRM_MODE_ENCODER_TMDS, - "HDMI %c", port_name(port))) + if (drmm_encoder_init(display->drm, &intel_encoder->base, + &intel_hdmi_enc_funcs, DRM_MODE_ENCODER_TMDS, + "HDMI %c", port_name(port))) goto err_encoder_init; =20 intel_encoder->hotplug =3D intel_hdmi_hotplug; @@ -763,16 +763,11 @@ bool g4x_hdmi_init(struct intel_display *display, intel_infoframe_init(dig_port); =20 if (!intel_hdmi_init_connector(dig_port, intel_connector)) - goto err_init_connector; + goto err_encoder_init; =20 return true; - -err_init_connector: - drm_encoder_cleanup(&intel_encoder->base); err_encoder_init: kfree(intel_connector); -err_connector_alloc: - kfree(dig_port); =20 return false; } diff --git a/drivers/gpu/drm/i915/display/icl_dsi.c b/drivers/gpu/drm/i915/= display/icl_dsi.c index afbaa0465842a..cfee173a2367a 100644 --- a/drivers/gpu/drm/i915/display/icl_dsi.c +++ b/drivers/gpu/drm/i915/display/icl_dsi.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -1775,13 +1776,7 @@ static bool gen11_dsi_initial_fastset_check(struct i= ntel_encoder *encoder, return true; } =20 -static void gen11_dsi_encoder_destroy(struct drm_encoder *encoder) -{ - intel_encoder_destroy(encoder); -} - static const struct drm_encoder_funcs gen11_dsi_encoder_funcs =3D { - .destroy =3D gen11_dsi_encoder_destroy, }; =20 static const struct drm_connector_funcs gen11_dsi_connector_funcs =3D { @@ -1934,8 +1929,10 @@ void icl_dsi_init(struct intel_display *display, if (port =3D=3D PORT_NONE) return; =20 - intel_dsi =3D kzalloc_obj(*intel_dsi); - if (!intel_dsi) + intel_dsi =3D drmm_encoder_alloc(display->drm, struct intel_dsi, base.bas= e, + &gen11_dsi_encoder_funcs, + DRM_MODE_ENCODER_DSI, "DSI %c", port_name(port)); + if (IS_ERR(intel_dsi)) return; =20 intel_connector =3D intel_connector_alloc(); @@ -1950,11 +1947,6 @@ void icl_dsi_init(struct intel_display *display, =20 encoder->devdata =3D devdata; =20 - /* register DSI encoder with DRM subsystem */ - drm_encoder_init(display->drm, &encoder->base, - &gen11_dsi_encoder_funcs, - DRM_MODE_ENCODER_DSI, "DSI %c", port_name(port)); - encoder->pre_pll_enable =3D gen11_dsi_pre_pll_enable; encoder->pre_enable =3D gen11_dsi_pre_enable; encoder->enable =3D gen11_dsi_enable; @@ -2037,7 +2029,5 @@ void icl_dsi_init(struct intel_display *display, =20 err: drm_connector_cleanup(connector); - drm_encoder_cleanup(&encoder->base); - kfree(intel_dsi); kfree(intel_connector); } diff --git a/drivers/gpu/drm/i915/display/intel_crt.c b/drivers/gpu/drm/i91= 5/display/intel_crt.c index 6aa6a1dd6e1b0..39bb115955f5a 100644 --- a/drivers/gpu/drm/i915/display/intel_crt.c +++ b/drivers/gpu/drm/i915/display/intel_crt.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include