From nobody Fri Dec 19 18:41:45 2025 Received: from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net [217.70.183.198]) (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 99FF7224F6 for ; Fri, 16 May 2025 16:48:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747414127; cv=none; b=W+otzzHIjqEcqyBsjVpsq+EmAXh8dMyJk2u9v82tGoubIrltbXydv26CstsE2Uewg7qF+6vRSKdZmfRnSd/R/iTPnfAPFz2xO0ySL9QAf6RgloMtxDxvCNqX6uRu7l3D1qvtOVmAj6NuyVSNLcw1XhrOxVqPftNoevfZi1SpJvM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747414127; c=relaxed/simple; bh=ZU3d4zBYeTPrDCggApT1wJbNmWQJ51VgK1f+6sgeEuE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=V770ubwmGLNS0N4s/bQbSgShT2FxklWUE4wwVKdve6H+1VvebL10BD7FCk8+3/Qwpkq4qLAtdcu3M48UL/l6apm4AuTzpzjuRi5JnwXwaX5HHMMPIFCX7nisP9WJno9E/8y2dGWWXLZP165rqowtSiWcvDZzbq8VjTFtbf9EZKU= 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=AiBpUbKI; arc=none smtp.client-ip=217.70.183.198 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="AiBpUbKI" Received: by mail.gandi.net (Postfix) with ESMTPSA id 7CF70439B0; Fri, 16 May 2025 16:48:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1747414122; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=cB13JIYwcRaHKqdJWGZYYoAhod8XQl74qcOrQIyVBu4=; b=AiBpUbKI10lqJm9tsXcxxmQRKeo0iu5QwHDRYtMSCwY0ICWkSLNLjIfmm/20Eun9UzNfj0 n3K/rAG4hMH4fL5DpX2Q8tjeMPlED9F7yybcqVq3ErpeMMQtX6hdd4LWBoYT7dkW7Tvy4M EmyeXpOA2PwEs/uPFVi1l8n+e9n3KoLvwLBs1CS/8ZjNzvbvSY3+sjDi0RYvY/0cIV5uyo C9w2GkrG8M5y0uCS67S/PphNVlVSUBoBJNHwBI/d5o5vM0Fs3sdd2Q2rM2LSHdIEUQxoo4 ypMj70FVAkmxhB6ZKObbPFvTlit0LXiaOrl4RHRKg+67sVMVuUmhm/bwapr1aA== From: Luca Ceresoli Date: Fri, 16 May 2025 18:48:37 +0200 Subject: [PATCH v8 1/3] drm/tests: bridge: convert to devm_drm_bridge_alloc() API 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: <20250516-drm-bridge-alloc-doc-test-v8-1-7e356fd58ba5@bootlin.com> References: <20250516-drm-bridge-alloc-doc-test-v8-0-7e356fd58ba5@bootlin.com> In-Reply-To: <20250516-drm-bridge-alloc-doc-test-v8-0-7e356fd58ba5@bootlin.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec Cc: Anusha Srivatsa , Paul Kocialkowski , Dmitry Baryshkov , =?utf-8?q?Herv=C3=A9_Codina?= , Hui Pu , Thomas Petazzoni , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Luca Ceresoli X-Mailer: b4 0.14.2 X-GND-State: clean X-GND-Score: -100 X-GND-Cause: gggruggvucftvghtrhhoucdtuddrgeefvddrtddtgdefudefvdejucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuifetpfffkfdpucggtfgfnhhsuhgsshgtrhhisggvnecuuegrihhlohhuthemuceftddunecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenucfjughrpefhfffugggtgffkfhgjvfevofesthejredtredtjeenucfhrhhomhepnfhutggrucevvghrvghsohhlihcuoehluhgtrgdrtggvrhgvshholhhisegsohhothhlihhnrdgtohhmqeenucggtffrrghtthgvrhhnpeeiieeuvdfftefgueduleehueetgffgjeeitedtteetkeeuueeuueekveevvdeuveenucfkphepvdgrtddvmeeijedtmedvtddvtdemvggrtddumegsvgegudemleehvgejmeefgeefmeeludefvgenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepihhnvghtpedvrgdtvdemieejtdemvddtvddtmegvrgdtudemsggvgedumeelhegvjeemfeegfeemledufegvpdhhvghloheplgduledvrdduieekrddujeekrdejhegnpdhmrghilhhfrhhomheplhhutggrrdgtvghrvghsohhlihessghoohhtlhhinhdrtghomhdpnhgspghrtghpthhtohepvddtpdhrtghpthhtohepmhgrrghrthgvnhdrlhgrnhhkhhhorhhstheslhhinhhugidrihhnthgvlhdrtghomhdprhgtphhtthhopegurhhiqdguvghvvghlsehlihhsthhsrdhfrhgvvgguvghskhhtohhprdhorhhgpdhrtghpthhtoheplhhumhgrghesk hgvrhhnvghlrdhorhhgpdhrtghpthhtohepnhgvihhlrdgrrhhmshhtrhhonhhgsehlihhnrghrohdrohhrghdprhgtphhtthhopehmrhhiphgrrhgusehkvghrnhgvlhdrohhrghdprhgtphhtthhopegrnhgurhiivghjrdhhrghjuggrsehinhhtvghlrdgtohhmpdhrtghpthhtohepphgruhhlkhesshihshdqsggrshgvrdhiohdprhgtphhtthhopehhvghrvhgvrdgtohguihhnrgessghoohhtlhhinhdrtghomh X-GND-Sasl: luca.ceresoli@bootlin.com Use the new DRM bridge allocation API, which is the only supported now, for the kunit tests. This change is more massive than for the typical DRM bridge driver because struct drm_bridge_init_priv currently embeds a struct drm_bridge, which is not supported anymore. We new have to use devm_drm_bridge_alloc() to dynamically allocate a "private driver struct", which is a bit awkward here because there is no real bridge driver. Thus let's add a "dummy" DRM bridge struct to represent it. As a nice cleanup we can now move the enable_count and disable_count members, which are counting bridge-specific events, into the new "private driver struct" (and avoid adding new unnecessary indirections). Also add a trivial bridge_to_dummy_bridge() just like many drivers do. Signed-off-by: Luca Ceresoli --- This patch was added in v8. --- drivers/gpu/drm/tests/drm_bridge_test.c | 95 +++++++++++++++++++----------= ---- 1 file changed, 55 insertions(+), 40 deletions(-) diff --git a/drivers/gpu/drm/tests/drm_bridge_test.c b/drivers/gpu/drm/test= s/drm_bridge_test.c index ff88ec2e911c9cc9a718483f09d4c764f45f991a..f3a625c536f610dc8560b565310= 56df7c613f564 100644 --- a/drivers/gpu/drm/tests/drm_bridge_test.c +++ b/drivers/gpu/drm/tests/drm_bridge_test.c @@ -10,31 +10,45 @@ =20 #include =20 +/* + * Mimick the typical struct defined by a bridge driver, which embeds a + * bridge plus other fields. + * + * Having at least one member before @bridge ensures we test non-zero + * @bridge offset. + */ +struct dummy_drm_bridge { + unsigned int enable_count; + unsigned int disable_count; + struct drm_bridge bridge; +}; + struct drm_bridge_init_priv { struct drm_device drm; struct drm_plane *plane; struct drm_crtc *crtc; struct drm_encoder encoder; - struct drm_bridge bridge; + struct dummy_drm_bridge *test_bridge; struct drm_connector *connector; - unsigned int enable_count; - unsigned int disable_count; }; =20 +static struct dummy_drm_bridge *bridge_to_dummy_bridge(struct drm_bridge *= bridge) +{ + return container_of(bridge, struct dummy_drm_bridge, bridge); +} + static void drm_test_bridge_enable(struct drm_bridge *bridge) { - struct drm_bridge_init_priv *priv =3D - container_of(bridge, struct drm_bridge_init_priv, bridge); + struct dummy_drm_bridge *dummy_br =3D bridge_to_dummy_bridge(bridge); =20 - priv->enable_count++; + dummy_br->enable_count++; } =20 static void drm_test_bridge_disable(struct drm_bridge *bridge) { - struct drm_bridge_init_priv *priv =3D - container_of(bridge, struct drm_bridge_init_priv, bridge); + struct dummy_drm_bridge *dummy_br =3D bridge_to_dummy_bridge(bridge); =20 - priv->disable_count++; + dummy_br->disable_count++; } =20 static const struct drm_bridge_funcs drm_test_bridge_legacy_funcs =3D { @@ -45,19 +59,17 @@ static const struct drm_bridge_funcs drm_test_bridge_le= gacy_funcs =3D { static void drm_test_bridge_atomic_enable(struct drm_bridge *bridge, struct drm_atomic_state *state) { - struct drm_bridge_init_priv *priv =3D - container_of(bridge, struct drm_bridge_init_priv, bridge); + struct dummy_drm_bridge *dummy_br =3D bridge_to_dummy_bridge(bridge); =20 - priv->enable_count++; + dummy_br->enable_count++; } =20 static void drm_test_bridge_atomic_disable(struct drm_bridge *bridge, struct drm_atomic_state *state) { - struct drm_bridge_init_priv *priv =3D - container_of(bridge, struct drm_bridge_init_priv, bridge); + struct dummy_drm_bridge *dummy_br =3D bridge_to_dummy_bridge(bridge); =20 - priv->disable_count++; + dummy_br->disable_count++; } =20 static const struct drm_bridge_funcs drm_test_bridge_atomic_funcs =3D { @@ -102,6 +114,10 @@ drm_test_bridge_init(struct kunit *test, const struct = drm_bridge_funcs *funcs) if (IS_ERR(priv)) return ERR_CAST(priv); =20 + priv->test_bridge =3D devm_drm_bridge_alloc(dev, struct dummy_drm_bridge,= bridge, funcs); + if (IS_ERR(priv->test_bridge)) + return ERR_CAST(priv->test_bridge); + drm =3D &priv->drm; priv->plane =3D drm_kunit_helper_create_primary_plane(test, drm, NULL, @@ -125,9 +141,8 @@ drm_test_bridge_init(struct kunit *test, const struct d= rm_bridge_funcs *funcs) =20 enc->possible_crtcs =3D drm_crtc_mask(priv->crtc); =20 - bridge =3D &priv->bridge; + bridge =3D &priv->test_bridge->bridge; bridge->type =3D DRM_MODE_CONNECTOR_VIRTUAL; - bridge->funcs =3D funcs; =20 ret =3D drm_kunit_bridge_add(test, bridge); if (ret) @@ -173,7 +188,7 @@ static void drm_test_drm_bridge_get_current_state_atomi= c(struct kunit *test) KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state); =20 retry_commit: - bridge =3D &priv->bridge; + bridge =3D &priv->test_bridge->bridge; bridge_state =3D drm_atomic_get_bridge_state(state, bridge); KUNIT_ASSERT_NOT_ERR_OR_NULL(test, bridge_state); =20 @@ -228,7 +243,7 @@ static void drm_test_drm_bridge_get_current_state_legac= y(struct kunit *test) * locking. The function would return NULL in all cases anyway, * so we don't really have any concurrency to worry about. */ - bridge =3D &priv->bridge; + bridge =3D &priv->test_bridge->bridge; KUNIT_EXPECT_NULL(test, drm_bridge_get_current_state(bridge)); } =20 @@ -253,7 +268,7 @@ static void drm_test_drm_bridge_helper_reset_crtc_atomi= c(struct kunit *test) struct drm_modeset_acquire_ctx ctx; struct drm_bridge_init_priv *priv; struct drm_display_mode *mode; - struct drm_bridge *bridge; + struct dummy_drm_bridge *dummy_br; int ret; =20 priv =3D drm_test_bridge_init(test, &drm_test_bridge_atomic_funcs); @@ -279,14 +294,14 @@ static void drm_test_drm_bridge_helper_reset_crtc_ato= mic(struct kunit *test) drm_modeset_drop_locks(&ctx); drm_modeset_acquire_fini(&ctx); =20 - bridge =3D &priv->bridge; - KUNIT_ASSERT_EQ(test, priv->enable_count, 1); - KUNIT_ASSERT_EQ(test, priv->disable_count, 0); + dummy_br =3D priv->test_bridge; + KUNIT_ASSERT_EQ(test, dummy_br->enable_count, 1); + KUNIT_ASSERT_EQ(test, dummy_br->disable_count, 0); =20 drm_modeset_acquire_init(&ctx, 0); =20 retry_reset: - ret =3D drm_bridge_helper_reset_crtc(bridge, &ctx); + ret =3D drm_bridge_helper_reset_crtc(&dummy_br->bridge, &ctx); if (ret =3D=3D -EDEADLK) { drm_modeset_backoff(&ctx); goto retry_reset; @@ -296,8 +311,8 @@ static void drm_test_drm_bridge_helper_reset_crtc_atomi= c(struct kunit *test) drm_modeset_drop_locks(&ctx); drm_modeset_acquire_fini(&ctx); =20 - KUNIT_EXPECT_EQ(test, priv->enable_count, 2); - KUNIT_EXPECT_EQ(test, priv->disable_count, 1); + KUNIT_EXPECT_EQ(test, dummy_br->enable_count, 2); + KUNIT_EXPECT_EQ(test, dummy_br->disable_count, 1); } =20 /* @@ -309,7 +324,7 @@ static void drm_test_drm_bridge_helper_reset_crtc_atomi= c_disabled(struct kunit * struct drm_modeset_acquire_ctx ctx; struct drm_bridge_init_priv *priv; struct drm_display_mode *mode; - struct drm_bridge *bridge; + struct dummy_drm_bridge *dummy_br; int ret; =20 priv =3D drm_test_bridge_init(test, &drm_test_bridge_atomic_funcs); @@ -318,14 +333,14 @@ static void drm_test_drm_bridge_helper_reset_crtc_ato= mic_disabled(struct kunit * mode =3D drm_kunit_display_mode_from_cea_vic(test, &priv->drm, 16); KUNIT_ASSERT_NOT_ERR_OR_NULL(test, mode); =20 - bridge =3D &priv->bridge; - KUNIT_ASSERT_EQ(test, priv->enable_count, 0); - KUNIT_ASSERT_EQ(test, priv->disable_count, 0); + dummy_br =3D priv->test_bridge; + KUNIT_ASSERT_EQ(test, dummy_br->enable_count, 0); + KUNIT_ASSERT_EQ(test, dummy_br->disable_count, 0); =20 drm_modeset_acquire_init(&ctx, 0); =20 retry_reset: - ret =3D drm_bridge_helper_reset_crtc(bridge, &ctx); + ret =3D drm_bridge_helper_reset_crtc(&dummy_br->bridge, &ctx); if (ret =3D=3D -EDEADLK) { drm_modeset_backoff(&ctx); goto retry_reset; @@ -335,8 +350,8 @@ static void drm_test_drm_bridge_helper_reset_crtc_atomi= c_disabled(struct kunit * drm_modeset_drop_locks(&ctx); drm_modeset_acquire_fini(&ctx); =20 - KUNIT_EXPECT_EQ(test, priv->enable_count, 0); - KUNIT_EXPECT_EQ(test, priv->disable_count, 0); + KUNIT_EXPECT_EQ(test, dummy_br->enable_count, 0); + KUNIT_EXPECT_EQ(test, dummy_br->disable_count, 0); } =20 /* @@ -348,7 +363,7 @@ static void drm_test_drm_bridge_helper_reset_crtc_legac= y(struct kunit *test) struct drm_modeset_acquire_ctx ctx; struct drm_bridge_init_priv *priv; struct drm_display_mode *mode; - struct drm_bridge *bridge; + struct dummy_drm_bridge *dummy_br; int ret; =20 priv =3D drm_test_bridge_init(test, &drm_test_bridge_legacy_funcs); @@ -374,14 +389,14 @@ static void drm_test_drm_bridge_helper_reset_crtc_leg= acy(struct kunit *test) drm_modeset_drop_locks(&ctx); drm_modeset_acquire_fini(&ctx); =20 - bridge =3D &priv->bridge; - KUNIT_ASSERT_EQ(test, priv->enable_count, 1); - KUNIT_ASSERT_EQ(test, priv->disable_count, 0); + dummy_br =3D priv->test_bridge; + KUNIT_ASSERT_EQ(test, dummy_br->enable_count, 1); + KUNIT_ASSERT_EQ(test, dummy_br->disable_count, 0); =20 drm_modeset_acquire_init(&ctx, 0); =20 retry_reset: - ret =3D drm_bridge_helper_reset_crtc(bridge, &ctx); + ret =3D drm_bridge_helper_reset_crtc(&dummy_br->bridge, &ctx); if (ret =3D=3D -EDEADLK) { drm_modeset_backoff(&ctx); goto retry_reset; @@ -391,8 +406,8 @@ static void drm_test_drm_bridge_helper_reset_crtc_legac= y(struct kunit *test) drm_modeset_drop_locks(&ctx); drm_modeset_acquire_fini(&ctx); =20 - KUNIT_EXPECT_EQ(test, priv->enable_count, 2); - KUNIT_EXPECT_EQ(test, priv->disable_count, 1); + KUNIT_EXPECT_EQ(test, dummy_br->enable_count, 2); + KUNIT_EXPECT_EQ(test, dummy_br->disable_count, 1); } =20 static struct kunit_case drm_bridge_helper_reset_crtc_tests[] =3D { --=20 2.49.0 From nobody Fri Dec 19 18:41:45 2025 Received: from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net [217.70.183.198]) (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 E2F9D1D5161 for ; Fri, 16 May 2025 16:48:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747414128; cv=none; b=HVE6q0bkp1UmwbwlNZtPTvw/nh/cGlWS4NqJxeeU83RC788g/n+3OdNoCkWPLQMBNlg2/LKw5ecuWHznn5zIKTbotHkmUuY7hOLwo7XM3SsoB1GXJ7WXgg4ucWjdZOt79yIOtNFTFeZFFeBj4iwsm0bSqZQh3Xt4OHp/Q8Ol45w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747414128; c=relaxed/simple; bh=Vgbc1maod9xp+UWdtLkde/gZcHCqeJHDFjxnmU/bznM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Jlj9CwVTwYaRAryVEhItc4LJFi1EuI/vUfK25iLBfnijPo6o2H1AxKqQ758Gd5nuFZlsdaEvfk4FOmYQ8qAkuHydlFQESjZEcVNPrB3q5EV6CS2UrhurSii7s5BV9u3LB0URFi+MaUMM9ZkMVzhrABIyxSRdECYiknforMxQr0E= 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=RNSQfC13; arc=none smtp.client-ip=217.70.183.198 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="RNSQfC13" Received: by mail.gandi.net (Postfix) with ESMTPSA id 47127439BF; Fri, 16 May 2025 16:48:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1747414123; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=bnnSP8emWWczjXdhIVZKO3SpECVp47VYoxSTdeFsaMA=; b=RNSQfC13EHpHlLF5OTLrcVNSVg+iXrF/o1ABqCBCU2/viuS1dmupvKSYEcIeYxO0UuURDR bIDnAhXcDYhXFAC6cMG6xuGaKVu+Mke6U1esq4L5ivJW/2f7yVxI8CPNnXybg/GJyOpkJJ PyO+NdnRHzEEbuvROQigihlLVsMN9mskD3lujE2lX0XBSvtu5IOgT2pgax+aQoYihwuOXQ CXaGC+vwmJZmWzI/BsHjX/AjMoYD8gYqAxQlJu/tvyMQMJOixkvsrqgLGntMq6Ga+IhT6k N4UahVuxd23NQxEYYX6QMv2drB24VlPGib/J82mr5CRXq32yCk8FA1DXNwQ9nQ== From: Luca Ceresoli Date: Fri, 16 May 2025 18:48:38 +0200 Subject: [PATCH v8 2/3] dmr/bridge: add a .destroy func 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: <20250516-drm-bridge-alloc-doc-test-v8-2-7e356fd58ba5@bootlin.com> References: <20250516-drm-bridge-alloc-doc-test-v8-0-7e356fd58ba5@bootlin.com> In-Reply-To: <20250516-drm-bridge-alloc-doc-test-v8-0-7e356fd58ba5@bootlin.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec Cc: Anusha Srivatsa , Paul Kocialkowski , Dmitry Baryshkov , =?utf-8?q?Herv=C3=A9_Codina?= , Hui Pu , Thomas Petazzoni , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Luca Ceresoli X-Mailer: b4 0.14.2 X-GND-State: clean X-GND-Score: -100 X-GND-Cause: gggruggvucftvghtrhhoucdtuddrgeefvddrtddtgdefudefvdejucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuifetpfffkfdpucggtfgfnhhsuhgsshgtrhhisggvnecuuegrihhlohhuthemuceftddunecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenucfjughrpefhfffugggtgffkfhgjvfevofesthejredtredtjeenucfhrhhomhepnfhutggrucevvghrvghsohhlihcuoehluhgtrgdrtggvrhgvshholhhisegsohhothhlihhnrdgtohhmqeenucggtffrrghtthgvrhhnpeehjefgudegvddukeegvedtgfduudehtdfgteefvefgheekjeehvdeihfdtfffhkeenucffohhmrghinhepkhgvrhhnvghlrdhorhhgnecukfhppedvrgdtvdemieejtdemvddtvddtmegvrgdtudemsggvgedumeelhegvjeemfeegfeemledufegvnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehinhgvthepvdgrtddvmeeijedtmedvtddvtdemvggrtddumegsvgegudemleehvgejmeefgeefmeeludefvgdphhgvlhhopegludelvddrudeikedrudejkedrjeehngdpmhgrihhlfhhrohhmpehluhgtrgdrtggvrhgvshholhhisegsohhothhlihhnrdgtohhmpdhnsggprhgtphhtthhopedvtddprhgtphhtthhopehmrggrrhhtvghnrdhlrghnkhhhohhrshhtsehlihhnuhigrdhinhhtvghlrdgtohhmpdhrtghpthhtohepughrihdquggvvhgvlheslhhishhtshdrfhhrvggvuggvshhkthhop hdrohhrghdprhgtphhtthhopehluhhmrghgsehkvghrnhgvlhdrohhrghdprhgtphhtthhopehnvghilhdrrghrmhhsthhrohhngheslhhinhgrrhhordhorhhgpdhrtghpthhtohepmhhrihhprghrugeskhgvrhhnvghlrdhorhhgpdhrtghpthhtoheprghnughriigvjhdrhhgrjhgurgesihhnthgvlhdrtghomhdprhgtphhtthhopehprghulhhksehshihsqdgsrghsvgdrihhopdhrtghpthhtohephhgvrhhvvgdrtghoughinhgrsegsohhothhlihhnrdgtohhm X-GND-Sasl: luca.ceresoli@bootlin.com Some users of DRM bridges may need to execute specific code just before deallocation. As of now the only known user would be KUnit tests. Suggested-by: Maxime Ripard Signed-off-by: Luca Ceresoli Acked-by: Maxime Ripard --- This patch is new in v8. The .destroy callback had appeared in v5 as well [5], but as part of a larger patch and for different reason that do not apply anymore. [5] https://lore.kernel.org/all/20241231-hotplug-drm-bridge-v5-3-173065a1ec= e1@bootlin.com/#t --- drivers/gpu/drm/drm_bridge.c | 2 ++ include/drm/drm_bridge.h | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c index b4c89ec01998b849018ce031c7cd84614e65e710..6185cb29fe3162264f0912c09c2= 05fb467975dee 100644 --- a/drivers/gpu/drm/drm_bridge.c +++ b/drivers/gpu/drm/drm_bridge.c @@ -203,6 +203,8 @@ static void __drm_bridge_free(struct kref *kref) { struct drm_bridge *bridge =3D container_of(kref, struct drm_bridge, refco= unt); =20 + if (bridge->funcs->destroy) + bridge->funcs->destroy(bridge); kfree(bridge->container); } =20 diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h index 4e418a29a9ff9d014d6ac0910a5d9bcf7118195e..3ccd493faa580845c2ed1166f39= 8eca27b464261 100644 --- a/include/drm/drm_bridge.h +++ b/include/drm/drm_bridge.h @@ -86,6 +86,16 @@ struct drm_bridge_funcs { */ void (*detach)(struct drm_bridge *bridge); =20 + /** + * @destroy: + * + * This callback is invoked when the bridge is about to be + * deallocated. + * + * The @destroy callback is optional. + */ + void (*destroy)(struct drm_bridge *bridge); + /** * @mode_valid: * --=20 2.49.0 From nobody Fri Dec 19 18:41:45 2025 Received: from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net [217.70.183.198]) (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 78EC01DDC2B for ; Fri, 16 May 2025 16:48:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747414129; cv=none; b=Z3Guc17aAd/yo5m1G22F5+KZVCHvkUr572bMjSdTOR5HJ0UKbc4jLnZCCi0ZDFqVwtPmzRTyE6kIvFaIJ77G8F1pGMaEZ5nAB3nYWVoS6Ww9eBO2I7RGTV9qAJD0l2FdJyoAVApvLEDvzdANqHzeJIMgbvRxq4PUklcWCI2BJzI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747414129; c=relaxed/simple; bh=/f8kyOvNPuischNyTg3IFMOJTDBfi3p3WIMAiKExCd0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=U9MHYKt5WeyyRsbfsppJxJq9eUpUfoUTfwV4bItZh1wRbvH6+SkLN2ycfvpw5KJ67qOPJ8/eUjiZTn/gmbS2gH/cSV12lI0mHX2KCQ11k96gV9Cv1ok2FPuvb49ATJTXnzjL5sQqpMbUa9qctS4mhVTmdi58HhhW+Vtvi1dQ5C0= 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=WitPjM45; arc=none smtp.client-ip=217.70.183.198 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="WitPjM45" Received: by mail.gandi.net (Postfix) with ESMTPSA id F1805439C3; Fri, 16 May 2025 16:48:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1747414125; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ZQrmPmkpZLcvYwzVyIcePfVAEoL0IdnmeRCnBsVn4Rs=; b=WitPjM45siFcCw96knYm6XtevTudsV5ENtd7wJBmPN4Rc9EoSceN4Zyw9kyMra6Zm+Vder 2+UwNe5ork0e99LkrJ6Bm0STiTWKGU3jK1TW+SQrV5KufimwzDUaRWijOU1RAYuXx+GmIN n6e3q1qxSphY+kXRY2G25wZKZyi30MnLtC1fouXotJWGupHM+Tk4aD2587vpM4wujq1jqL BLRBlEHX7cZAHq7y079Iaid+WuuT46o+GHLwRnLOgZQB0P8JYLoetSU/jSCelMH+X7sguG m9cxUwdBr1B+Bgbi2B9l8hhzOt+GvXNcZi16wYZSU2JAFsSve4y8DUOHzzoRjQ== From: Luca Ceresoli Date: Fri, 16 May 2025 18:48:39 +0200 Subject: [PATCH v8 3/3] drm/tests: bridge: add KUnit tests for devm_drm_bridge_alloc() 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: <20250516-drm-bridge-alloc-doc-test-v8-3-7e356fd58ba5@bootlin.com> References: <20250516-drm-bridge-alloc-doc-test-v8-0-7e356fd58ba5@bootlin.com> In-Reply-To: <20250516-drm-bridge-alloc-doc-test-v8-0-7e356fd58ba5@bootlin.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec Cc: Anusha Srivatsa , Paul Kocialkowski , Dmitry Baryshkov , =?utf-8?q?Herv=C3=A9_Codina?= , Hui Pu , Thomas Petazzoni , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Luca Ceresoli X-Mailer: b4 0.14.2 X-GND-State: clean X-GND-Score: -100 X-GND-Cause: gggruggvucftvghtrhhoucdtuddrgeefvddrtddtgdefudefvdejucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuifetpfffkfdpucggtfgfnhhsuhgsshgtrhhisggvnecuuegrihhlohhuthemuceftddunecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenucfjughrpefhfffugggtgffkfhgjvfevofesthejredtredtjeenucfhrhhomhepnfhutggrucevvghrvghsohhlihcuoehluhgtrgdrtggvrhgvshholhhisegsohhothhlihhnrdgtohhmqeenucggtffrrghtthgvrhhnpeeiieeuvdfftefgueduleehueetgffgjeeitedtteetkeeuueeuueekveevvdeuveenucfkphepvdgrtddvmeeijedtmedvtddvtdemvggrtddumegsvgegudemleehvgejmeefgeefmeeludefvgenucevlhhushhtvghrufhiiigvpedunecurfgrrhgrmhepihhnvghtpedvrgdtvdemieejtdemvddtvddtmegvrgdtudemsggvgedumeelhegvjeemfeegfeemledufegvpdhhvghloheplgduledvrdduieekrddujeekrdejhegnpdhmrghilhhfrhhomheplhhutggrrdgtvghrvghsohhlihessghoohhtlhhinhdrtghomhdpnhgspghrtghpthhtohepvddtpdhrtghpthhtohepmhgrrghrthgvnhdrlhgrnhhkhhhorhhstheslhhinhhugidrihhnthgvlhdrtghomhdprhgtphhtthhopegurhhiqdguvghvvghlsehlihhsthhsrdhfrhgvvgguvghskhhtohhprdhorhhgpdhrtghpthhtoheplhhumhgrghesk hgvrhhnvghlrdhorhhgpdhrtghpthhtohepnhgvihhlrdgrrhhmshhtrhhonhhgsehlihhnrghrohdrohhrghdprhgtphhtthhopehmrhhiphgrrhgusehkvghrnhgvlhdrohhrghdprhgtphhtthhopegrnhgurhiivghjrdhhrghjuggrsehinhhtvghlrdgtohhmpdhrtghpthhtohepphgruhhlkhesshihshdqsggrshgvrdhiohdprhgtphhtthhopehhvghrvhgvrdgtohguihhnrgessghoohhtlhhinhdrtghomh X-GND-Sasl: luca.ceresoli@bootlin.com Add KUnit tests for the newly introduced devm_drm_bridge_alloc(). Signed-off-by: Luca Ceresoli --- Changed in v8: - rebase on new patch converting drm_bridge_test.c to devm_drm_bridge_alloc() - add check that bridge is removed (thanks to the .destroy callback) - add a check with get/put Changed in v7: - rebase on current drm-misc-next, which now has a drm_bridge_test.c file - cleanup commit message Changed in v6: - update to new devm_drm_bridge_alloc() API - remove drm_test_drm_bridge_put test, not straightforward to write with the new API and the current notification mechanism - do not allocate a drm_device: a bridge is allocated without one - rename some identifiers for easier code reading This patch was added in v5. --- drivers/gpu/drm/tests/drm_bridge_test.c | 84 +++++++++++++++++++++++++++++= ++++ 1 file changed, 84 insertions(+) diff --git a/drivers/gpu/drm/tests/drm_bridge_test.c b/drivers/gpu/drm/test= s/drm_bridge_test.c index f3a625c536f610dc8560b56531056df7c613f564..32db3a82fe6d14a3e9d6536bcf4= b19f1bc65969a 100644 --- a/drivers/gpu/drm/tests/drm_bridge_test.c +++ b/drivers/gpu/drm/tests/drm_bridge_test.c @@ -8,6 +8,7 @@ #include #include =20 +#include #include =20 /* @@ -21,6 +22,7 @@ struct dummy_drm_bridge { unsigned int enable_count; unsigned int disable_count; struct drm_bridge bridge; + void *data; }; =20 struct drm_bridge_init_priv { @@ -422,11 +424,93 @@ static struct kunit_suite drm_bridge_helper_reset_crt= c_test_suite =3D { .test_cases =3D drm_bridge_helper_reset_crtc_tests, }; =20 +struct drm_bridge_alloc_test_ctx { + struct device *dev; + struct dummy_drm_bridge *dummy_br; + bool destroyed; +}; + +static void dummy_drm_bridge_destroy(struct drm_bridge *bridge) +{ + struct dummy_drm_bridge *dummy_br =3D bridge_to_dummy_bridge(bridge); + struct drm_bridge_alloc_test_ctx *ctx =3D (struct drm_bridge_alloc_test_c= tx *)dummy_br->data; + + ctx->destroyed =3D true; +} + +static const struct drm_bridge_funcs drm_bridge_dummy_funcs =3D { + .destroy =3D dummy_drm_bridge_destroy, +}; + +static int drm_test_bridge_alloc_init(struct kunit *test) +{ + struct drm_bridge_alloc_test_ctx *ctx; + + ctx =3D kunit_kzalloc(test, sizeof(*ctx), GFP_KERNEL); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ctx); + + ctx->dev =3D kunit_device_register(test, "drm-bridge-dev"); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ctx->dev); + + test->priv =3D ctx; + + ctx->dummy_br =3D devm_drm_bridge_alloc(ctx->dev, struct dummy_drm_bridge= , bridge, + &drm_bridge_dummy_funcs); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ctx->dummy_br); + + ctx->dummy_br->data =3D ctx; + + KUNIT_ASSERT_FALSE(test, ctx->destroyed); + + return 0; +} + +static void drm_test_drm_bridge_alloc_basic(struct kunit *test) +{ + struct drm_bridge_alloc_test_ctx *ctx =3D test->priv; + + KUNIT_ASSERT_FALSE(test, ctx->destroyed); + + kunit_device_unregister(test, ctx->dev); + KUNIT_ASSERT_TRUE(test, ctx->destroyed); +} + +static void drm_test_drm_bridge_alloc_get_put(struct kunit *test) +{ + struct drm_bridge_alloc_test_ctx *ctx =3D test->priv; + + KUNIT_ASSERT_FALSE(test, ctx->destroyed); + + drm_bridge_get(&ctx->dummy_br->bridge); + KUNIT_ASSERT_FALSE(test, ctx->destroyed); + + kunit_device_unregister(test, ctx->dev); + KUNIT_ASSERT_FALSE(test, ctx->destroyed); + + drm_bridge_put(&ctx->dummy_br->bridge); + KUNIT_ASSERT_TRUE(test, ctx->destroyed); +} + +static struct kunit_case drm_bridge_alloc_tests[] =3D { + KUNIT_CASE(drm_test_drm_bridge_alloc_basic), + KUNIT_CASE(drm_test_drm_bridge_alloc_get_put), + { } +}; + +static struct kunit_suite drm_bridge_alloc_test_suite =3D { + .name =3D "drm_bridge_alloc", + .init =3D drm_test_bridge_alloc_init, + .test_cases =3D drm_bridge_alloc_tests, +}; + kunit_test_suites( &drm_bridge_get_current_state_test_suite, &drm_bridge_helper_reset_crtc_test_suite, + &drm_bridge_alloc_test_suite, ); =20 MODULE_AUTHOR("Maxime Ripard "); +MODULE_AUTHOR("Luca Ceresoli "); + MODULE_DESCRIPTION("Kunit test for drm_bridge functions"); MODULE_LICENSE("GPL"); --=20 2.49.0