All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/4] drm/bridge: tc358767: register DP aux bus even in DRM_BRIDGE_ATTACH_NO_CONNECTOR case
@ 2026-06-24 12:15 Alexander Stein
  2026-06-24 12:15 ` [PATCH 2/4] drm/bridge: tc358767: allow panels or bridges (connectors) on output Alexander Stein
                   ` (3 more replies)
  0 siblings, 4 replies; 6+ messages in thread
From: Alexander Stein @ 2026-06-24 12:15 UTC (permalink / raw)
  To: Andrzej Hajda, Neil Armstrong, Robert Foss, Laurent Pinchart,
	Jonas Karlman, Jernej Skrabec, Luca Ceresoli, Maarten Lankhorst,
	Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter
  Cc: Alexander Stein, dri-devel, linux-kernel

Even if DRM_BRIDGE_ATTACH_NO_CONNECTOR is set the DP aux bus has to be
registered. Move the flags check after registration.

Signed-off-by: Alexander Stein <alexander.stein@ew.tq-group.com>
---
 drivers/gpu/drm/bridge/tc358767.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
index 7188935fdb826..a1663cc6c2236 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -1833,14 +1833,14 @@ static int tc_edp_bridge_attach(struct drm_bridge *bridge,
 			return ret;
 	}
 
-	if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)
-		return 0;
-
 	tc->aux.drm_dev = drm;
 	ret = drm_dp_aux_register(&tc->aux);
 	if (ret < 0)
 		return ret;
 
+	if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)
+		return 0;
+
 	/* Create DP/eDP connector */
 	drm_connector_helper_add(&tc->connector, &tc_connector_helper_funcs);
 	ret = drm_connector_init(drm, &tc->connector, &tc_connector_funcs, tc->bridge.type);
-- 
2.54.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/4] drm/bridge: tc358767: allow panels or bridges (connectors) on output
  2026-06-24 12:15 [PATCH 1/4] drm/bridge: tc358767: register DP aux bus even in DRM_BRIDGE_ATTACH_NO_CONNECTOR case Alexander Stein
@ 2026-06-24 12:15 ` Alexander Stein
  2026-06-24 12:15 ` [PATCH 3/4] drm/bridge: tc358767: do not open-code devm_drm_of_get_bridge in DPI path Alexander Stein
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 6+ messages in thread
From: Alexander Stein @ 2026-06-24 12:15 UTC (permalink / raw)
  To: Andrzej Hajda, Neil Armstrong, Robert Foss, Laurent Pinchart,
	Jonas Karlman, Jernej Skrabec, Luca Ceresoli, Maarten Lankhorst,
	Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter
  Cc: Alexander Stein, dri-devel, linux-kernel

With DRM_BRIDGE_ATTACH_NO_CONNECTOR becoming more common, explicit
connectors (bridges on its own) are necessary. Allow specifying bridges
on the output endpoint.

Signed-off-by: Alexander Stein <alexander.stein@ew.tq-group.com>
---
 drivers/gpu/drm/bridge/tc358767.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
index a1663cc6c2236..2e705bd0d6be5 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -2346,11 +2346,12 @@ static int tc_probe_dpi_bridge_endpoint(struct tc_data *tc)
 static int tc_probe_edp_bridge_endpoint(struct tc_data *tc)
 {
 	struct device *dev = tc->dev;
+	struct drm_bridge *bridge;
 	struct drm_panel *panel;
 	int ret;
 
 	/* port@2 is the output port */
-	ret = drm_of_find_panel_or_bridge(dev->of_node, 2, 0, &panel, NULL);
+	ret = drm_of_find_panel_or_bridge(dev->of_node, 2, 0, &panel, &bridge);
 	if (ret && ret != -ENODEV)
 		return dev_err_probe(dev, ret,
 				     "Could not find DSI panel or bridge\n");
-- 
2.54.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 3/4] drm/bridge: tc358767: do not open-code devm_drm_of_get_bridge in DPI path
  2026-06-24 12:15 [PATCH 1/4] drm/bridge: tc358767: register DP aux bus even in DRM_BRIDGE_ATTACH_NO_CONNECTOR case Alexander Stein
  2026-06-24 12:15 ` [PATCH 2/4] drm/bridge: tc358767: allow panels or bridges (connectors) on output Alexander Stein
@ 2026-06-24 12:15 ` Alexander Stein
  2026-06-24 12:15 ` [PATCH 4/4] drm/bridge: tc358767: do not open-code devm_drm_of_get_bridge in DSI path Alexander Stein
  2026-06-24 12:31 ` [PATCH 1/4] drm/bridge: tc358767: register DP aux bus even in DRM_BRIDGE_ATTACH_NO_CONNECTOR case sashiko-bot
  3 siblings, 0 replies; 6+ messages in thread
From: Alexander Stein @ 2026-06-24 12:15 UTC (permalink / raw)
  To: Andrzej Hajda, Neil Armstrong, Robert Foss, Laurent Pinchart,
	Jonas Karlman, Jernej Skrabec, Luca Ceresoli, Maarten Lankhorst,
	Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter
  Cc: Alexander Stein, dri-devel, linux-kernel

Use devm_drm_of_get_bridge() to simplify probing code path.

Signed-off-by: Alexander Stein <alexander.stein@ew.tq-group.com>
---
 drivers/gpu/drm/bridge/tc358767.c | 28 +++++++++++-----------------
 1 file changed, 11 insertions(+), 17 deletions(-)

diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
index 2e705bd0d6be5..8d5a05dd8d32c 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -2318,29 +2318,23 @@ static int tc_probe_dpi_bridge_endpoint(struct tc_data *tc)
 {
 	struct device *dev = tc->dev;
 	struct drm_bridge *bridge;
-	struct drm_panel *panel;
 	int ret;
 
 	/* port@1 is the DPI input/output port */
-	ret = drm_of_find_panel_or_bridge(dev->of_node, 1, 0, &panel, &bridge);
-	if (ret && ret != -ENODEV)
-		return dev_err_probe(dev, ret,
-				     "Could not find DPI panel or bridge\n");
-
-	if (panel) {
-		bridge = devm_drm_panel_bridge_add(dev, panel);
-		if (IS_ERR(bridge))
-			return PTR_ERR(bridge);
+	bridge = devm_drm_of_get_bridge(dev, dev->of_node, 1, 0);
+	if (IS_ERR(bridge)) {
+		ret = PTR_ERR(bridge);
+		if (ret != -ENODEV)
+			return dev_err_probe(dev, ret,
+					     "Could not find DPI panel or bridge\n");
+		else
+			return ret;
 	}
 
-	if (bridge) {
-		tc->panel_bridge = bridge;
-		tc->bridge.type = DRM_MODE_CONNECTOR_DPI;
-
-		return 0;
-	}
+	tc->panel_bridge = bridge;
+	tc->bridge.type = DRM_MODE_CONNECTOR_DPI;
 
-	return ret;
+	return 0;
 }
 
 static int tc_probe_edp_bridge_endpoint(struct tc_data *tc)
-- 
2.54.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 4/4] drm/bridge: tc358767: do not open-code devm_drm_of_get_bridge in DSI path
  2026-06-24 12:15 [PATCH 1/4] drm/bridge: tc358767: register DP aux bus even in DRM_BRIDGE_ATTACH_NO_CONNECTOR case Alexander Stein
  2026-06-24 12:15 ` [PATCH 2/4] drm/bridge: tc358767: allow panels or bridges (connectors) on output Alexander Stein
  2026-06-24 12:15 ` [PATCH 3/4] drm/bridge: tc358767: do not open-code devm_drm_of_get_bridge in DPI path Alexander Stein
@ 2026-06-24 12:15 ` Alexander Stein
  2026-06-24 12:24   ` sashiko-bot
  2026-06-24 12:31 ` [PATCH 1/4] drm/bridge: tc358767: register DP aux bus even in DRM_BRIDGE_ATTACH_NO_CONNECTOR case sashiko-bot
  3 siblings, 1 reply; 6+ messages in thread
From: Alexander Stein @ 2026-06-24 12:15 UTC (permalink / raw)
  To: Andrzej Hajda, Neil Armstrong, Robert Foss, Laurent Pinchart,
	Jonas Karlman, Jernej Skrabec, Luca Ceresoli, Maarten Lankhorst,
	Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter
  Cc: Alexander Stein, dri-devel, linux-kernel

Use devm_drm_of_get_bridge() to simplify probing code path.

Signed-off-by: Alexander Stein <alexander.stein@ew.tq-group.com>
---
 drivers/gpu/drm/bridge/tc358767.c | 28 +++++++++++-----------------
 1 file changed, 11 insertions(+), 17 deletions(-)

diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
index 8d5a05dd8d32c..7b64521839893 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -2341,28 +2341,22 @@ static int tc_probe_edp_bridge_endpoint(struct tc_data *tc)
 {
 	struct device *dev = tc->dev;
 	struct drm_bridge *bridge;
-	struct drm_panel *panel;
 	int ret;
 
 	/* port@2 is the output port */
-	ret = drm_of_find_panel_or_bridge(dev->of_node, 2, 0, &panel, &bridge);
-	if (ret && ret != -ENODEV)
-		return dev_err_probe(dev, ret,
-				     "Could not find DSI panel or bridge\n");
-
-	if (panel) {
-		struct drm_bridge *panel_bridge;
-
-		panel_bridge = devm_drm_panel_bridge_add(dev, panel);
-		if (IS_ERR(panel_bridge))
-			return PTR_ERR(panel_bridge);
-
-		tc->panel_bridge = panel_bridge;
-		tc->bridge.type = DRM_MODE_CONNECTOR_eDP;
-	} else {
-		tc->bridge.type = DRM_MODE_CONNECTOR_DisplayPort;
+	bridge = devm_drm_of_get_bridge(dev, dev->of_node, 2, 0);
+	if (IS_ERR(bridge)) {
+		ret = PTR_ERR(bridge);
+		if (ret != -ENODEV)
+			return dev_err_probe(dev, ret,
+					     "Could not find DSI panel or bridge\n");
+		else
+			return ret;
 	}
 
+	tc->panel_bridge = bridge;
+	tc->bridge.type = bridge->type;
+
 	if (tc->hpd_pin >= 0)
 		tc->bridge.ops |= DRM_BRIDGE_OP_DETECT;
 	tc->bridge.ops |= DRM_BRIDGE_OP_EDID;
-- 
2.54.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 4/4] drm/bridge: tc358767: do not open-code devm_drm_of_get_bridge in DSI path
  2026-06-24 12:15 ` [PATCH 4/4] drm/bridge: tc358767: do not open-code devm_drm_of_get_bridge in DSI path Alexander Stein
@ 2026-06-24 12:24   ` sashiko-bot
  0 siblings, 0 replies; 6+ messages in thread
From: sashiko-bot @ 2026-06-24 12:24 UTC (permalink / raw)
  To: Alexander Stein; +Cc: dri-devel

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] Probe fails with -ENODEV when port 2 has no downstream panel or bridge defined, breaking DisplayPort output.
--

commit 70b94894718399f191075561feb4f2f4f31b4aa9
Author: Alexander Stein <alexander.stein@ew.tq-group.com>

drm/bridge: tc358767: do not open-code devm_drm_of_get_bridge in DSI path

This commit replaces the open-coded panel/bridge discovery logic
with devm_drm_of_get_bridge() to simplify the probing code path
in the tc358767 bridge driver.

> diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
> --- a/drivers/gpu/drm/bridge/tc358767.c
> +++ b/drivers/gpu/drm/bridge/tc358767.c
[ ... ]
> @@ -2341,28 +2341,22 @@ static int tc_probe_edp_bridge_endpoint(struct tc_data *tc)
>  {
>  	struct device *dev = tc->dev;
>  	struct drm_bridge *bridge;
> -	struct drm_panel *panel;
>  	int ret;
>  
>  	/* port@2 is the output port */
> -	ret = drm_of_find_panel_or_bridge(dev->of_node, 2, 0, &panel, &bridge);
> -	if (ret && ret != -ENODEV)
> -		return dev_err_probe(dev, ret,
> -				     "Could not find DSI panel or bridge\n");
> -
> -	if (panel) {
> -		struct drm_bridge *panel_bridge;
> -
> -		panel_bridge = devm_drm_panel_bridge_add(dev, panel);
> -		if (IS_ERR(panel_bridge))
> -			return PTR_ERR(panel_bridge);
> -
> -		tc->panel_bridge = panel_bridge;
> -		tc->bridge.type = DRM_MODE_CONNECTOR_eDP;
> -	} else {
> -		tc->bridge.type = DRM_MODE_CONNECTOR_DisplayPort;
> +	bridge = devm_drm_of_get_bridge(dev, dev->of_node, 2, 0);
> +	if (IS_ERR(bridge)) {
> +		ret = PTR_ERR(bridge);
> +		if (ret != -ENODEV)
> +			return dev_err_probe(dev, ret,
> +					     "Could not find DSI panel or bridge\n");
> +		else
> +			return ret;

[Severity: High]
Does this break the probe sequence for DisplayPort configurations?

The previous code in tc_probe_edp_bridge_endpoint() allowed -ENODEV
to bypass the early return, falling back to setting the bridge type to
DRM_MODE_CONNECTOR_DisplayPort when no panel or bridge was found.

By explicitly returning ret when it equals -ENODEV, probe is now aborted
if the downstream device isn't fixed in the device tree. Could this cause
the DisplayPort/eDP bridge driver to fail to load on valid hardware setups?

>  	}
>  
> +	tc->panel_bridge = bridge;
> +	tc->bridge.type = bridge->type;
> +
>  	if (tc->hpd_pin >= 0)
>  		tc->bridge.ops |= DRM_BRIDGE_OP_DETECT;
>  	tc->bridge.ops |= DRM_BRIDGE_OP_EDID;

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260624121515.2301219-1-alexander.stein@ew.tq-group.com?part=4

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/4] drm/bridge: tc358767: register DP aux bus even in DRM_BRIDGE_ATTACH_NO_CONNECTOR case
  2026-06-24 12:15 [PATCH 1/4] drm/bridge: tc358767: register DP aux bus even in DRM_BRIDGE_ATTACH_NO_CONNECTOR case Alexander Stein
                   ` (2 preceding siblings ...)
  2026-06-24 12:15 ` [PATCH 4/4] drm/bridge: tc358767: do not open-code devm_drm_of_get_bridge in DSI path Alexander Stein
@ 2026-06-24 12:31 ` sashiko-bot
  3 siblings, 0 replies; 6+ messages in thread
From: sashiko-bot @ 2026-06-24 12:31 UTC (permalink / raw)
  To: Alexander Stein; +Cc: dri-devel

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:

Pre-existing issues:
- [High] The bridge detach function `tc_edp_bridge_detach` does not call `drm_connector_cleanup()` for the connector initialized in `tc_edp_bridge_attach()`, leading to a use-after-free when the module unloads.
--

commit 29555064108dbff74cdded5aeba9baee8adfd8a7
Author: Alexander Stein <alexander.stein@ew.tq-group.com>

drm/bridge: tc358767: register DP aux bus even in DRM_BRIDGE_ATTACH_NO_CONNECTOR case

This commit changes the bridge attach sequence to always register the DP aux
bus. It achieves this by moving the check for the no-connector flag to after
the aux registration is complete.

> diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
> index 7188935fdb826..a1663cc6c2236 100644
> --- a/drivers/gpu/drm/bridge/tc358767.c
> +++ b/drivers/gpu/drm/bridge/tc358767.c
> @@ -1833,14 +1833,14 @@ static int tc_edp_bridge_attach(struct drm_bridge *bridge,
>  			return ret;
>  	}
>  
> -	if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)
> -		return 0;
> -
>  	tc->aux.drm_dev = drm;
>  	ret = drm_dp_aux_register(&tc->aux);
>  	if (ret < 0)
>  		return ret;
>  
> +	if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)
> +		return 0;
> +
>  	/* Create DP/eDP connector */
>  	drm_connector_helper_add(&tc->connector, &tc_connector_helper_funcs);
>  	ret = drm_connector_init(drm, &tc->connector, &tc_connector_funcs, tc->bridge.type);

[Severity: High]
This isn't a bug introduced by this patch, but is a pre-existing issue. Does
tc_edp_bridge_detach() properly clean up the connector initialized here?

Looking at the detach function in drivers/gpu/drm/bridge/tc358767.c:

static void tc_edp_bridge_detach(struct drm_bridge *bridge)
{
	drm_dp_aux_unregister(&bridge_to_tc(bridge)->aux);
}

It seems drm_connector_cleanup() is never called for tc->connector.

Since tc_data (which embeds the connector) is allocated via devm_kzalloc,
could the freed connector remain linked in the active drm_device connector
list when the driver is unbound?

Would this cause a use-after-free if the DRM core accesses the connector list
after the module is unloaded or unbound?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260624121515.2301219-1-alexander.stein@ew.tq-group.com?part=1

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2026-06-24 12:31 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-24 12:15 [PATCH 1/4] drm/bridge: tc358767: register DP aux bus even in DRM_BRIDGE_ATTACH_NO_CONNECTOR case Alexander Stein
2026-06-24 12:15 ` [PATCH 2/4] drm/bridge: tc358767: allow panels or bridges (connectors) on output Alexander Stein
2026-06-24 12:15 ` [PATCH 3/4] drm/bridge: tc358767: do not open-code devm_drm_of_get_bridge in DPI path Alexander Stein
2026-06-24 12:15 ` [PATCH 4/4] drm/bridge: tc358767: do not open-code devm_drm_of_get_bridge in DSI path Alexander Stein
2026-06-24 12:24   ` sashiko-bot
2026-06-24 12:31 ` [PATCH 1/4] drm/bridge: tc358767: register DP aux bus even in DRM_BRIDGE_ATTACH_NO_CONNECTOR case sashiko-bot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.