Skip to content

Commit 1cac81e

Browse files
committed
Disable FRL on shutdown
1 parent f10cde8 commit 1cac81e

3 files changed

Lines changed: 27 additions & 0 deletions

File tree

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3240,6 +3240,23 @@ static int dm_suspend(struct amdgpu_ip_block *ip_block)
32403240

32413241
hpd_rx_irq_work_suspend(dm);
32423242

3243+
/* On a full machine shutdown (not suspend/resume), notify any connected
3244+
* HDMI FRL sinks to stop expecting an FRL signal. This allows the sink
3245+
* to fall back to TMDS immediately rather than waiting for a timeout.
3246+
* Skip during suspend/resume — we will retrain FRL on resume anyway.
3247+
*/
3248+
if (adev->mp1_state == PP_MP1_STATE_UNLOAD) {
3249+
int i;
3250+
3251+
for (i = 0; i < dm->dc->link_count; i++) {
3252+
struct dc_link *link = dm->dc->links[i];
3253+
3254+
if (dc_is_hdmi_frl_signal(link->connector_signal) &&
3255+
link->local_sink)
3256+
dm->dc->link_srv->hdmi_frl_disable(link);
3257+
}
3258+
}
3259+
32433260
dc_set_power_state(dm->dc, DC_ACPI_CM_POWER_STATE_D3);
32443261

32453262
if (dm->dc->caps.ips_support && adev->in_s0ix)

drivers/gpu/drm/amd/display/dc/inc/link_service.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,5 +347,8 @@ struct link_service {
347347
uint64_t (*dp_trace_get_edp_poweroff_timestamp)(struct dc_link *link);
348348
void (*dp_trace_source_sequence)(
349349
struct dc_link *link, uint8_t dp_test_mode);
350+
351+
/*************************** HDMI FRL *********************************/
352+
void (*hdmi_frl_disable)(struct dc_link *link);
350353
};
351354
#endif /* __DC_LINK_HPD_H__ */

drivers/gpu/drm/amd/display/dc/link/link_factory.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
#include "protocols/link_edp_panel_control.h"
4444
#include "protocols/link_dp_panel_replay.h"
4545
#include "protocols/link_hpd.h"
46+
#include "protocols/link_frl_training.h"
4647
#include "gpio_service_interface.h"
4748
#include "atomfirmware.h"
4849

@@ -259,6 +260,11 @@ static void construct_link_service_dp_cts(struct link_service *link_srv)
259260
/* link dp trace implements tracing interfaces for tracking major dp sequences
260261
* including execution status and timestamps
261262
*/
263+
static void construct_link_service_hdmi_frl(struct link_service *link_srv)
264+
{
265+
link_srv->hdmi_frl_disable = dc_link_disable_frl;
266+
}
267+
262268
static void construct_link_service_dp_trace(struct link_service *link_srv)
263269
{
264270
link_srv->dp_trace_is_initialized = dp_trace_is_initialized;
@@ -298,6 +304,7 @@ static void construct_link_service(struct link_service *link_srv)
298304
construct_link_service_dp_panel_replay(link_srv);
299305
construct_link_service_dp_cts(link_srv);
300306
construct_link_service_dp_trace(link_srv);
307+
construct_link_service_hdmi_frl(link_srv);
301308
}
302309

303310
struct link_service *link_create_link_service(void)

0 commit comments

Comments
 (0)