<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote gmail_quote_container"><div dir="ltr" class="gmail_attr">On Fri, May 16, 2025 at 12:48 PM Luca Ceresoli <<a href="mailto:luca.ceresoli@bootlin.com">luca.ceresoli@bootlin.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Use the new DRM bridge allocation API, which is the only supported now, for<br>
the kunit tests.<br>
<br>
This change is more massive than for the typical DRM bridge driver because<br>
struct drm_bridge_init_priv currently embeds a struct drm_bridge, which is<br>
not supported anymore. We new have to use devm_drm_bridge_alloc() to<br></blockquote><div> typo ^^^s/new/now.</div><div><br></div><div>Thanks,</div><div>Anusha</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
dynamically allocate a "private driver struct", which is a bit awkward here<br>
because there is no real bridge driver. Thus let's add a "dummy" DRM bridge<br>
struct to represent it.<br>
<br>
As a nice cleanup we can now move the enable_count and disable_count<br>
members, which are counting bridge-specific events, into the new "private<br>
driver struct" (and avoid adding new unnecessary indirections).<br>
<br>
Also add a trivial bridge_to_dummy_bridge() just like many drivers do.<br>
<br>
Signed-off-by: Luca Ceresoli <<a href="mailto:luca.ceresoli@bootlin.com" target="_blank">luca.ceresoli@bootlin.com</a>><br>
<br>
---<br>
<br>
This patch was added in v8.<br>
---<br>
drivers/gpu/drm/tests/drm_bridge_test.c | 95 +++++++++++++++++++--------------<br>
1 file changed, 55 insertions(+), 40 deletions(-)<br>
<br>
diff --git a/drivers/gpu/drm/tests/drm_bridge_test.c b/drivers/gpu/drm/tests/drm_bridge_test.c<br>
index ff88ec2e911c9cc9a718483f09d4c764f45f991a..f3a625c536f610dc8560b56531056df7c613f564 100644<br>
--- a/drivers/gpu/drm/tests/drm_bridge_test.c<br>
+++ b/drivers/gpu/drm/tests/drm_bridge_test.c<br>
@@ -10,31 +10,45 @@<br>
<br>
#include <kunit/test.h><br>
<br>
+/*<br>
+ * Mimick the typical struct defined by a bridge driver, which embeds a<br>
+ * bridge plus other fields.<br>
+ *<br>
+ * Having at least one member before @bridge ensures we test non-zero<br>
+ * @bridge offset.<br>
+ */<br>
+struct dummy_drm_bridge {<br>
+ unsigned int enable_count;<br>
+ unsigned int disable_count;<br>
+ struct drm_bridge bridge;<br>
+};<br>
+<br>
struct drm_bridge_init_priv {<br>
struct drm_device drm;<br>
struct drm_plane *plane;<br>
struct drm_crtc *crtc;<br>
struct drm_encoder encoder;<br>
- struct drm_bridge bridge;<br>
+ struct dummy_drm_bridge *test_bridge;<br>
struct drm_connector *connector;<br>
- unsigned int enable_count;<br>
- unsigned int disable_count;<br>
};<br>
<br>
+static struct dummy_drm_bridge *bridge_to_dummy_bridge(struct drm_bridge *bridge)<br>
+{<br>
+ return container_of(bridge, struct dummy_drm_bridge, bridge);<br>
+}<br>
+<br>
static void drm_test_bridge_enable(struct drm_bridge *bridge)<br>
{<br>
- struct drm_bridge_init_priv *priv =<br>
- container_of(bridge, struct drm_bridge_init_priv, bridge);<br>
+ struct dummy_drm_bridge *dummy_br = bridge_to_dummy_bridge(bridge);<br>
<br>
- priv->enable_count++;<br>
+ dummy_br->enable_count++;<br>
}<br>
<br>
static void drm_test_bridge_disable(struct drm_bridge *bridge)<br>
{<br>
- struct drm_bridge_init_priv *priv =<br>
- container_of(bridge, struct drm_bridge_init_priv, bridge);<br>
+ struct dummy_drm_bridge *dummy_br = bridge_to_dummy_bridge(bridge);<br>
<br>
- priv->disable_count++;<br>
+ dummy_br->disable_count++;<br>
}<br>
<br>
static const struct drm_bridge_funcs drm_test_bridge_legacy_funcs = {<br>
@@ -45,19 +59,17 @@ static const struct drm_bridge_funcs drm_test_bridge_legacy_funcs = {<br>
static void drm_test_bridge_atomic_enable(struct drm_bridge *bridge,<br>
struct drm_atomic_state *state)<br>
{<br>
- struct drm_bridge_init_priv *priv =<br>
- container_of(bridge, struct drm_bridge_init_priv, bridge);<br>
+ struct dummy_drm_bridge *dummy_br = bridge_to_dummy_bridge(bridge);<br>
<br>
- priv->enable_count++;<br>
+ dummy_br->enable_count++;<br>
}<br>
<br>
static void drm_test_bridge_atomic_disable(struct drm_bridge *bridge,<br>
struct drm_atomic_state *state)<br>
{<br>
- struct drm_bridge_init_priv *priv =<br>
- container_of(bridge, struct drm_bridge_init_priv, bridge);<br>
+ struct dummy_drm_bridge *dummy_br = bridge_to_dummy_bridge(bridge);<br>
<br>
- priv->disable_count++;<br>
+ dummy_br->disable_count++;<br>
}<br>
<br>
static const struct drm_bridge_funcs drm_test_bridge_atomic_funcs = {<br>
@@ -102,6 +114,10 @@ drm_test_bridge_init(struct kunit *test, const struct drm_bridge_funcs *funcs)<br>
if (IS_ERR(priv))<br>
return ERR_CAST(priv);<br>
<br>
+ priv->test_bridge = devm_drm_bridge_alloc(dev, struct dummy_drm_bridge, bridge, funcs);<br>
+ if (IS_ERR(priv->test_bridge))<br>
+ return ERR_CAST(priv->test_bridge);<br>
+<br>
drm = &priv->drm;<br>
priv->plane = drm_kunit_helper_create_primary_plane(test, drm,<br>
NULL,<br>
@@ -125,9 +141,8 @@ drm_test_bridge_init(struct kunit *test, const struct drm_bridge_funcs *funcs)<br>
<br>
enc->possible_crtcs = drm_crtc_mask(priv->crtc);<br>
<br>
- bridge = &priv->bridge;<br>
+ bridge = &priv->test_bridge->bridge;<br>
bridge->type = DRM_MODE_CONNECTOR_VIRTUAL;<br>
- bridge->funcs = funcs;<br>
<br>
ret = drm_kunit_bridge_add(test, bridge);<br>
if (ret)<br>
@@ -173,7 +188,7 @@ static void drm_test_drm_bridge_get_current_state_atomic(struct kunit *test)<br>
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state);<br>
<br>
retry_commit:<br>
- bridge = &priv->bridge;<br>
+ bridge = &priv->test_bridge->bridge;<br>
bridge_state = drm_atomic_get_bridge_state(state, bridge);<br>
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, bridge_state);<br>
<br>
@@ -228,7 +243,7 @@ static void drm_test_drm_bridge_get_current_state_legacy(struct kunit *test)<br>
* locking. The function would return NULL in all cases anyway,<br>
* so we don't really have any concurrency to worry about.<br>
*/<br>
- bridge = &priv->bridge;<br>
+ bridge = &priv->test_bridge->bridge;<br>
KUNIT_EXPECT_NULL(test, drm_bridge_get_current_state(bridge));<br>
}<br>
<br>
@@ -253,7 +268,7 @@ static void drm_test_drm_bridge_helper_reset_crtc_atomic(struct kunit *test)<br>
struct drm_modeset_acquire_ctx ctx;<br>
struct drm_bridge_init_priv *priv;<br>
struct drm_display_mode *mode;<br>
- struct drm_bridge *bridge;<br>
+ struct dummy_drm_bridge *dummy_br;<br>
int ret;<br>
<br>
priv = drm_test_bridge_init(test, &drm_test_bridge_atomic_funcs);<br>
@@ -279,14 +294,14 @@ static void drm_test_drm_bridge_helper_reset_crtc_atomic(struct kunit *test)<br>
drm_modeset_drop_locks(&ctx);<br>
drm_modeset_acquire_fini(&ctx);<br>
<br>
- bridge = &priv->bridge;<br>
- KUNIT_ASSERT_EQ(test, priv->enable_count, 1);<br>
- KUNIT_ASSERT_EQ(test, priv->disable_count, 0);<br>
+ dummy_br = priv->test_bridge;<br>
+ KUNIT_ASSERT_EQ(test, dummy_br->enable_count, 1);<br>
+ KUNIT_ASSERT_EQ(test, dummy_br->disable_count, 0);<br>
<br>
drm_modeset_acquire_init(&ctx, 0);<br>
<br>
retry_reset:<br>
- ret = drm_bridge_helper_reset_crtc(bridge, &ctx);<br>
+ ret = drm_bridge_helper_reset_crtc(&dummy_br->bridge, &ctx);<br>
if (ret == -EDEADLK) {<br>
drm_modeset_backoff(&ctx);<br>
goto retry_reset;<br>
@@ -296,8 +311,8 @@ static void drm_test_drm_bridge_helper_reset_crtc_atomic(struct kunit *test)<br>
drm_modeset_drop_locks(&ctx);<br>
drm_modeset_acquire_fini(&ctx);<br>
<br>
- KUNIT_EXPECT_EQ(test, priv->enable_count, 2);<br>
- KUNIT_EXPECT_EQ(test, priv->disable_count, 1);<br>
+ KUNIT_EXPECT_EQ(test, dummy_br->enable_count, 2);<br>
+ KUNIT_EXPECT_EQ(test, dummy_br->disable_count, 1);<br>
}<br>
<br>
/*<br>
@@ -309,7 +324,7 @@ static void drm_test_drm_bridge_helper_reset_crtc_atomic_disabled(struct kunit *<br>
struct drm_modeset_acquire_ctx ctx;<br>
struct drm_bridge_init_priv *priv;<br>
struct drm_display_mode *mode;<br>
- struct drm_bridge *bridge;<br>
+ struct dummy_drm_bridge *dummy_br;<br>
int ret;<br>
<br>
priv = drm_test_bridge_init(test, &drm_test_bridge_atomic_funcs);<br>
@@ -318,14 +333,14 @@ static void drm_test_drm_bridge_helper_reset_crtc_atomic_disabled(struct kunit *<br>
mode = drm_kunit_display_mode_from_cea_vic(test, &priv->drm, 16);<br>
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, mode);<br>
<br>
- bridge = &priv->bridge;<br>
- KUNIT_ASSERT_EQ(test, priv->enable_count, 0);<br>
- KUNIT_ASSERT_EQ(test, priv->disable_count, 0);<br>
+ dummy_br = priv->test_bridge;<br>
+ KUNIT_ASSERT_EQ(test, dummy_br->enable_count, 0);<br>
+ KUNIT_ASSERT_EQ(test, dummy_br->disable_count, 0);<br>
<br>
drm_modeset_acquire_init(&ctx, 0);<br>
<br>
retry_reset:<br>
- ret = drm_bridge_helper_reset_crtc(bridge, &ctx);<br>
+ ret = drm_bridge_helper_reset_crtc(&dummy_br->bridge, &ctx);<br>
if (ret == -EDEADLK) {<br>
drm_modeset_backoff(&ctx);<br>
goto retry_reset;<br>
@@ -335,8 +350,8 @@ static void drm_test_drm_bridge_helper_reset_crtc_atomic_disabled(struct kunit *<br>
drm_modeset_drop_locks(&ctx);<br>
drm_modeset_acquire_fini(&ctx);<br>
<br>
- KUNIT_EXPECT_EQ(test, priv->enable_count, 0);<br>
- KUNIT_EXPECT_EQ(test, priv->disable_count, 0);<br>
+ KUNIT_EXPECT_EQ(test, dummy_br->enable_count, 0);<br>
+ KUNIT_EXPECT_EQ(test, dummy_br->disable_count, 0);<br>
}<br>
<br>
/*<br>
@@ -348,7 +363,7 @@ static void drm_test_drm_bridge_helper_reset_crtc_legacy(struct kunit *test)<br>
struct drm_modeset_acquire_ctx ctx;<br>
struct drm_bridge_init_priv *priv;<br>
struct drm_display_mode *mode;<br>
- struct drm_bridge *bridge;<br>
+ struct dummy_drm_bridge *dummy_br;<br>
int ret;<br>
<br>
priv = drm_test_bridge_init(test, &drm_test_bridge_legacy_funcs);<br>
@@ -374,14 +389,14 @@ static void drm_test_drm_bridge_helper_reset_crtc_legacy(struct kunit *test)<br>
drm_modeset_drop_locks(&ctx);<br>
drm_modeset_acquire_fini(&ctx);<br>
<br>
- bridge = &priv->bridge;<br>
- KUNIT_ASSERT_EQ(test, priv->enable_count, 1);<br>
- KUNIT_ASSERT_EQ(test, priv->disable_count, 0);<br>
+ dummy_br = priv->test_bridge;<br>
+ KUNIT_ASSERT_EQ(test, dummy_br->enable_count, 1);<br>
+ KUNIT_ASSERT_EQ(test, dummy_br->disable_count, 0);<br>
<br>
drm_modeset_acquire_init(&ctx, 0);<br>
<br>
retry_reset:<br>
- ret = drm_bridge_helper_reset_crtc(bridge, &ctx);<br>
+ ret = drm_bridge_helper_reset_crtc(&dummy_br->bridge, &ctx);<br>
if (ret == -EDEADLK) {<br>
drm_modeset_backoff(&ctx);<br>
goto retry_reset;<br>
@@ -391,8 +406,8 @@ static void drm_test_drm_bridge_helper_reset_crtc_legacy(struct kunit *test)<br>
drm_modeset_drop_locks(&ctx);<br>
drm_modeset_acquire_fini(&ctx);<br>
<br>
- KUNIT_EXPECT_EQ(test, priv->enable_count, 2);<br>
- KUNIT_EXPECT_EQ(test, priv->disable_count, 1);<br>
+ KUNIT_EXPECT_EQ(test, dummy_br->enable_count, 2);<br>
+ KUNIT_EXPECT_EQ(test, dummy_br->disable_count, 1);<br>
}<br>
<br>
static struct kunit_case drm_bridge_helper_reset_crtc_tests[] = {<br>
<br>
-- <br>
2.49.0<br>
<br>
</blockquote></div></div>