All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] drm/amd/display: set remote MST sink power state on payload changes
@ 2026-08-29 17:29 ` Maximilian Passarello
  0 siblings, 0 replies; 3+ messages in thread
From: Maximilian Passarello via B4 Relay @ 2026-08-29 17:29 UTC (permalink / raw)
  To: Harry Wentland, Leo Li, Rodrigo Siqueira, Alex Deucher,
	Christian König, David Airlie, Simona Vetter
  Cc: amd-gfx, dri-devel, linux-kernel, Maximilian Passarello

From: Maximilian Passarello <git@0xMax42.io>

Some downstream MST displays keep their backlight on after DPMS off because
removing the MST payload does not update DP_SET_POWER on the remote sink.

Set the remote sink to D0 before allocating its payload and to D3 before
removing it. Log AUX errors without changing the existing payload flow.

Signed-off-by: Maximilian Passarello <git@0xMax42.io>
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
index ab15ceec4daa..ce27024a9593 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
@@ -372,6 +372,7 @@ bool dm_helpers_dp_mst_write_payload_allocation_table(
 	struct drm_dp_mst_topology_state *mst_state;
 	struct drm_dp_mst_atomic_payload *target_payload, *new_payload, old_payload;
 	struct drm_dp_mst_topology_mgr *mst_mgr;
+	int ret;
 
 	aconnector = (struct amdgpu_dm_connector *)stream->dm_stream_context;
 	/* Accessing the connector state is required for vcpi_slots allocation
@@ -388,11 +389,23 @@ bool dm_helpers_dp_mst_write_payload_allocation_table(
 	new_payload = drm_atomic_get_mst_payload_state(mst_state, aconnector->mst_output_port);
 
 	if (enable) {
+		ret = drm_dp_link_power_up(&aconnector->mst_output_port->aux,
+					   aconnector->mst_output_port->dpcd_rev);
+		if (ret < 0)
+			drm_dbg_dp(mst_mgr->dev,
+				   "Failed to power up remote MST sink: %d\n", ret);
+
 		target_payload = new_payload;
 
 		/* It's OK for this to fail */
 		drm_dp_add_payload_part1(mst_mgr, mst_state, new_payload);
 	} else {
+		ret = drm_dp_link_power_down(&aconnector->mst_output_port->aux,
+					     aconnector->mst_output_port->dpcd_rev);
+		if (ret < 0)
+			drm_dbg_dp(mst_mgr->dev,
+				   "Failed to power down remote MST sink: %d\n", ret);
+
 		/* construct old payload by VCPI*/
 		dm_helpers_construct_old_payload(mst_mgr, mst_state,
 						 new_payload, &old_payload);

---
base-commit: 75a5e1b6b3661c3f946885d01eebeb6b031035ef
change-id: 20260829-mst-remote-sink-power-ca0f7f41b909

Best regards,
-- 
Maximilian Passarello <git@0xMax42.io>



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

* [PATCH] drm/amd/display: set remote MST sink power state on payload changes
@ 2026-08-29 17:29 ` Maximilian Passarello
  0 siblings, 0 replies; 3+ messages in thread
From: Maximilian Passarello @ 2026-08-29 17:29 UTC (permalink / raw)
  To: Harry Wentland, Leo Li, Rodrigo Siqueira, Alex Deucher,
	Christian König, David Airlie, Simona Vetter
  Cc: amd-gfx, dri-devel, linux-kernel, Maximilian Passarello

Some downstream MST displays keep their backlight on after DPMS off because
removing the MST payload does not update DP_SET_POWER on the remote sink.

Set the remote sink to D0 before allocating its payload and to D3 before
removing it. Log AUX errors without changing the existing payload flow.

Signed-off-by: Maximilian Passarello <git@0xMax42.io>
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
index ab15ceec4daa..ce27024a9593 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
@@ -372,6 +372,7 @@ bool dm_helpers_dp_mst_write_payload_allocation_table(
 	struct drm_dp_mst_topology_state *mst_state;
 	struct drm_dp_mst_atomic_payload *target_payload, *new_payload, old_payload;
 	struct drm_dp_mst_topology_mgr *mst_mgr;
+	int ret;
 
 	aconnector = (struct amdgpu_dm_connector *)stream->dm_stream_context;
 	/* Accessing the connector state is required for vcpi_slots allocation
@@ -388,11 +389,23 @@ bool dm_helpers_dp_mst_write_payload_allocation_table(
 	new_payload = drm_atomic_get_mst_payload_state(mst_state, aconnector->mst_output_port);
 
 	if (enable) {
+		ret = drm_dp_link_power_up(&aconnector->mst_output_port->aux,
+					   aconnector->mst_output_port->dpcd_rev);
+		if (ret < 0)
+			drm_dbg_dp(mst_mgr->dev,
+				   "Failed to power up remote MST sink: %d\n", ret);
+
 		target_payload = new_payload;
 
 		/* It's OK for this to fail */
 		drm_dp_add_payload_part1(mst_mgr, mst_state, new_payload);
 	} else {
+		ret = drm_dp_link_power_down(&aconnector->mst_output_port->aux,
+					     aconnector->mst_output_port->dpcd_rev);
+		if (ret < 0)
+			drm_dbg_dp(mst_mgr->dev,
+				   "Failed to power down remote MST sink: %d\n", ret);
+
 		/* construct old payload by VCPI*/
 		dm_helpers_construct_old_payload(mst_mgr, mst_state,
 						 new_payload, &old_payload);

---
base-commit: 75a5e1b6b3661c3f946885d01eebeb6b031035ef
change-id: 20260829-mst-remote-sink-power-ca0f7f41b909

Best regards,
-- 
Maximilian Passarello <git@0xMax42.io>


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

* Re: [PATCH] drm/amd/display: set remote MST sink power state on payload changes
  2026-08-29 17:29 ` Maximilian Passarello
  (?)
@ 2026-08-29 17:46 ` sashiko-bot
  -1 siblings, 0 replies; 3+ messages in thread
From: sashiko-bot @ 2026-08-29 17:46 UTC (permalink / raw)
  To: Maximilian Passarello; +Cc: dri-devel

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] The patch introduces calls to sleeping functions (`usleep_range` and `mutex_lock`) within the display hardware sequencer path.
--

commit 407e2ac8f541eab206fd802accc0990f9bef0e0a
Author: Maximilian Passarello <git@0xMax42.io>

drm/amd/display: set remote MST sink power state on payload changes

This commit addresses downstream MST displays keeping their backlight on
after DPMS off by setting the remote sink to D0 before allocating its
payload and to D3 before removing it.

> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
> index ab15ceec4daa0..ce27024a95933 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
[ ... ]
> @@ -388,11 +389,23 @@ bool dm_helpers_dp_mst_write_payload_allocation_table(
>  	new_payload = drm_atomic_get_mst_payload_state(mst_state, aconnector->mst_output_port);
>  
>  	if (enable) {
> +		ret = drm_dp_link_power_up(&aconnector->mst_output_port->aux,
> +					   aconnector->mst_output_port->dpcd_rev);

[Severity: High]
Does calling drm_dp_link_power_up() here introduce a sleeping function into
an atomic hardware sequencer path?

The dm_helpers_dp_mst_write_payload_allocation_table() function is called by
the hardware sequencer during MST payload updates. Looking at
drm_dp_link_power_up() in drm_dp_helper.c, it internally uses usleep_range()
and takes a mutex via drm_dp_dpcd_readb() during DPCD auxiliary access.

Calling sleeping functions from atomic commit tail variants and hardware
sequencer paths can cause "scheduling while atomic" warnings, system
instability, and deadlocks.

> +		if (ret < 0)
> +			drm_dbg_dp(mst_mgr->dev,
> +				   "Failed to power up remote MST sink: %d\n", ret);
> +
>  		target_payload = new_payload;
>  
>  		/* It's OK for this to fail */
>  		drm_dp_add_payload_part1(mst_mgr, mst_state, new_payload);
>  	} else {
> +		ret = drm_dp_link_power_down(&aconnector->mst_output_port->aux,
> +					     aconnector->mst_output_port->dpcd_rev);

[Severity: High]
Similarly, does drm_dp_link_power_down() introduce sleeping operations in
the atomic disable sequence?

Like the enable path, this introduces DPCD mutex locks into an atomic
hardware sequencer path where sleeping is forbidden.

> +		if (ret < 0)
> +			drm_dbg_dp(mst_mgr->dev,
> +				   "Failed to power down remote MST sink: %d\n", ret);
> +
>  		/* construct old payload by VCPI*/
>  		dm_helpers_construct_old_payload(mst_mgr, mst_state,
>  						 new_payload, &old_payload);

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260829-mst-remote-sink-power-v1-1-b9eab331e0d5@0xMax42.io?part=1

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

end of thread, other threads:[~2026-08-29 17:46 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-29 17:29 [PATCH] drm/amd/display: set remote MST sink power state on payload changes Maximilian Passarello via B4 Relay
2026-08-29 17:29 ` Maximilian Passarello
2026-08-29 17:46 ` 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.