diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3709-drm-amd-display-Don-t-allocate-payloads-if-link-lost.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3709-drm-amd-display-Don-t-allocate-payloads-if-link-lost.patch | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3709-drm-amd-display-Don-t-allocate-payloads-if-link-lost.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3709-drm-amd-display-Don-t-allocate-payloads-if-link-lost.patch new file mode 100644 index 00000000..9c7303a7 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3709-drm-amd-display-Don-t-allocate-payloads-if-link-lost.patch @@ -0,0 +1,184 @@ +From 1333fa165e7f7cf168acd8a297285b92a0ce3468 Mon Sep 17 00:00:00 2001 +From: Alvin Lee <alvin.lee2@amd.com> +Date: Fri, 2 Aug 2019 13:42:49 -0400 +Subject: [PATCH 3709/4256] drm/amd/display: Don't allocate payloads if link + lost + +We should not allocate payloads if the link is lost until the link is retrained. +Some displays require this. + +Signed-off-by: Alvin Lee <alvin.lee2@amd.com> +Reviewed-by: Wenjing Liu <Wenjing.Liu@amd.com> +Acked-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com> +--- + .../amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 10 +++++----- + drivers/gpu/drm/amd/display/dc/core/dc_link.c | 17 ++++++++++------- + .../gpu/drm/amd/display/dc/core/dc_link_dp.c | 11 +++++++++++ + drivers/gpu/drm/amd/display/dc/dc_link.h | 1 + + drivers/gpu/drm/amd/display/dc/dc_types.h | 6 ++++++ + drivers/gpu/drm/amd/display/dc/dm_helpers.h | 2 +- + 6 files changed, 34 insertions(+), 13 deletions(-) + +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 9328882230d8..1f0c8821af53 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 +@@ -283,7 +283,7 @@ void dm_helpers_dp_mst_clear_payload_allocation_table( + * Polls for ACT (allocation change trigger) handled and sends + * ALLOCATE_PAYLOAD message. + */ +-bool dm_helpers_dp_mst_poll_for_allocation_change_trigger( ++enum act_return_status dm_helpers_dp_mst_poll_for_allocation_change_trigger( + struct dc_context *ctx, + const struct dc_stream_state *stream) + { +@@ -294,19 +294,19 @@ bool dm_helpers_dp_mst_poll_for_allocation_change_trigger( + aconnector = (struct amdgpu_dm_connector *)stream->dm_stream_context; + + if (!aconnector || !aconnector->mst_port) +- return false; ++ return ACT_FAILED; + + mst_mgr = &aconnector->mst_port->mst_mgr; + + if (!mst_mgr->mst_state) +- return false; ++ return ACT_FAILED; + + ret = drm_dp_check_act_status(mst_mgr); + + if (ret) +- return false; ++ return ACT_FAILED; + +- return true; ++ return ACT_SUCCESS; + } + + bool dm_helpers_dp_mst_send_payload_allocation( +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c +index 3dfebfd4c130..94734c22bbde 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c +@@ -2508,7 +2508,7 @@ static void update_mst_stream_alloc_table( + /* convert link_mst_stream_alloc_table to dm dp_mst_stream_alloc_table + * because stream_encoder is not exposed to dm + */ +-static enum dc_status allocate_mst_payload(struct pipe_ctx *pipe_ctx) ++enum dc_status dc_link_allocate_mst_payload(struct pipe_ctx *pipe_ctx) + { + struct dc_stream_state *stream = pipe_ctx->stream; + struct dc_link *link = stream->link; +@@ -2519,6 +2519,7 @@ static enum dc_status allocate_mst_payload(struct pipe_ctx *pipe_ctx) + struct fixed31_32 pbn; + struct fixed31_32 pbn_per_slot; + uint8_t i; ++ enum act_return_status ret; + DC_LOGGER_INIT(link->ctx->logger); + + /* enable_link_dp_mst already check link->enabled_stream_count +@@ -2566,14 +2567,16 @@ static enum dc_status allocate_mst_payload(struct pipe_ctx *pipe_ctx) + &link->mst_stream_alloc_table); + + /* send down message */ +- dm_helpers_dp_mst_poll_for_allocation_change_trigger( ++ ret = dm_helpers_dp_mst_poll_for_allocation_change_trigger( + stream->ctx, + stream); + +- dm_helpers_dp_mst_send_payload_allocation( +- stream->ctx, +- stream, +- true); ++ if (ret != ACT_LINK_LOST) { ++ dm_helpers_dp_mst_send_payload_allocation( ++ stream->ctx, ++ stream, ++ true); ++ } + + /* slot X.Y for only current stream */ + pbn_per_slot = get_pbn_per_slot(stream); +@@ -2784,7 +2787,7 @@ void core_link_enable_stream( + #endif + + if (pipe_ctx->stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST) +- allocate_mst_payload(pipe_ctx); ++ dc_link_allocate_mst_payload(pipe_ctx); + + core_dc->hwss.unblank_stream(pipe_ctx, + &pipe_ctx->stream->link->cur_link_settings); +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c +index f5742719b5d9..7c78caf7a602 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c +@@ -2364,6 +2364,8 @@ bool dc_link_handle_hpd_rx_irq(struct dc_link *link, union hpd_irq_data *out_hpd + enum dc_status result; + + bool status = false; ++ struct pipe_ctx *pipe_ctx; ++ int i; + + if (out_link_loss) + *out_link_loss = false; +@@ -2440,6 +2442,15 @@ bool dc_link_handle_hpd_rx_irq(struct dc_link *link, union hpd_irq_data *out_hpd + &link->cur_link_settings, + true, LINK_TRAINING_ATTEMPTS); + ++ for (i = 0; i < MAX_PIPES; i++) { ++ pipe_ctx = &link->dc->current_state->res_ctx.pipe_ctx[i]; ++ if (pipe_ctx && pipe_ctx->stream && pipe_ctx->stream->link == link && ++ pipe_ctx->stream->dpms_off == false && ++ pipe_ctx->stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST) { ++ dc_link_allocate_mst_payload(pipe_ctx); ++ } ++ } ++ + status = false; + if (out_link_loss) + *out_link_loss = true; +diff --git a/drivers/gpu/drm/amd/display/dc/dc_link.h b/drivers/gpu/drm/amd/display/dc/dc_link.h +index 9ea75db3484e..45e6195c5395 100644 +--- a/drivers/gpu/drm/amd/display/dc/dc_link.h ++++ b/drivers/gpu/drm/amd/display/dc/dc_link.h +@@ -192,6 +192,7 @@ enum dc_detect_reason { + + bool dc_link_detect(struct dc_link *dc_link, enum dc_detect_reason reason); + bool dc_link_get_hpd_state(struct dc_link *dc_link); ++enum dc_status dc_link_allocate_mst_payload(struct pipe_ctx *pipe_ctx); + + /* Notify DC about DP RX Interrupt (aka Short Pulse Interrupt). + * Return: +diff --git a/drivers/gpu/drm/amd/display/dc/dc_types.h b/drivers/gpu/drm/amd/display/dc/dc_types.h +index d93758e919a1..f4ccdb2e3c32 100644 +--- a/drivers/gpu/drm/amd/display/dc/dc_types.h ++++ b/drivers/gpu/drm/amd/display/dc/dc_types.h +@@ -168,6 +168,12 @@ enum dc_edid_status { + EDID_THE_SAME, + }; + ++enum act_return_status { ++ ACT_SUCCESS, ++ ACT_LINK_LOST, ++ ACT_FAILED ++}; ++ + /* audio capability from EDID*/ + struct dc_cea_audio_mode { + uint8_t format_code; /* ucData[0] [6:3]*/ +diff --git a/drivers/gpu/drm/amd/display/dc/dm_helpers.h b/drivers/gpu/drm/amd/display/dc/dm_helpers.h +index b6b4333737f2..94b75e942607 100644 +--- a/drivers/gpu/drm/amd/display/dc/dm_helpers.h ++++ b/drivers/gpu/drm/amd/display/dc/dm_helpers.h +@@ -74,7 +74,7 @@ void dm_helpers_dp_mst_clear_payload_allocation_table( + /* + * Polls for ACT (allocation change trigger) handled and + */ +-bool dm_helpers_dp_mst_poll_for_allocation_change_trigger( ++enum act_return_status dm_helpers_dp_mst_poll_for_allocation_change_trigger( + struct dc_context *ctx, + const struct dc_stream_state *stream); + /* +-- +2.17.1 + |