Commit 48af9b91 authored by Alvin Lee's avatar Alvin Lee Committed by Alex Deucher

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: default avatarAlvin Lee <alvin.lee2@amd.com>
Reviewed-by: default avatarWenjing Liu <Wenjing.Liu@amd.com>
Acked-by: default avatarBhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent e6d14df7
...@@ -282,7 +282,7 @@ void dm_helpers_dp_mst_clear_payload_allocation_table( ...@@ -282,7 +282,7 @@ void dm_helpers_dp_mst_clear_payload_allocation_table(
* Polls for ACT (allocation change trigger) handled and sends * Polls for ACT (allocation change trigger) handled and sends
* ALLOCATE_PAYLOAD message. * 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, struct dc_context *ctx,
const struct dc_stream_state *stream) const struct dc_stream_state *stream)
{ {
...@@ -293,19 +293,19 @@ bool dm_helpers_dp_mst_poll_for_allocation_change_trigger( ...@@ -293,19 +293,19 @@ bool dm_helpers_dp_mst_poll_for_allocation_change_trigger(
aconnector = (struct amdgpu_dm_connector *)stream->dm_stream_context; aconnector = (struct amdgpu_dm_connector *)stream->dm_stream_context;
if (!aconnector || !aconnector->mst_port) if (!aconnector || !aconnector->mst_port)
return false; return ACT_FAILED;
mst_mgr = &aconnector->mst_port->mst_mgr; mst_mgr = &aconnector->mst_port->mst_mgr;
if (!mst_mgr->mst_state) if (!mst_mgr->mst_state)
return false; return ACT_FAILED;
ret = drm_dp_check_act_status(mst_mgr); ret = drm_dp_check_act_status(mst_mgr);
if (ret) if (ret)
return false; return ACT_FAILED;
return true; return ACT_SUCCESS;
} }
bool dm_helpers_dp_mst_send_payload_allocation( bool dm_helpers_dp_mst_send_payload_allocation(
......
...@@ -2510,7 +2510,7 @@ static void update_mst_stream_alloc_table( ...@@ -2510,7 +2510,7 @@ static void update_mst_stream_alloc_table(
/* convert link_mst_stream_alloc_table to dm dp_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 * 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_stream_state *stream = pipe_ctx->stream;
struct dc_link *link = stream->link; struct dc_link *link = stream->link;
...@@ -2521,6 +2521,7 @@ static enum dc_status allocate_mst_payload(struct pipe_ctx *pipe_ctx) ...@@ -2521,6 +2521,7 @@ static enum dc_status allocate_mst_payload(struct pipe_ctx *pipe_ctx)
struct fixed31_32 pbn; struct fixed31_32 pbn;
struct fixed31_32 pbn_per_slot; struct fixed31_32 pbn_per_slot;
uint8_t i; uint8_t i;
enum act_return_status ret;
DC_LOGGER_INIT(link->ctx->logger); DC_LOGGER_INIT(link->ctx->logger);
/* enable_link_dp_mst already check link->enabled_stream_count /* enable_link_dp_mst already check link->enabled_stream_count
...@@ -2568,14 +2569,16 @@ static enum dc_status allocate_mst_payload(struct pipe_ctx *pipe_ctx) ...@@ -2568,14 +2569,16 @@ static enum dc_status allocate_mst_payload(struct pipe_ctx *pipe_ctx)
&link->mst_stream_alloc_table); &link->mst_stream_alloc_table);
/* send down message */ /* 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->ctx,
stream); stream);
dm_helpers_dp_mst_send_payload_allocation( if (ret != ACT_LINK_LOST) {
stream->ctx, dm_helpers_dp_mst_send_payload_allocation(
stream, stream->ctx,
true); stream,
true);
}
/* slot X.Y for only current stream */ /* slot X.Y for only current stream */
pbn_per_slot = get_pbn_per_slot(stream); pbn_per_slot = get_pbn_per_slot(stream);
...@@ -2786,7 +2789,7 @@ void core_link_enable_stream( ...@@ -2786,7 +2789,7 @@ void core_link_enable_stream(
#endif #endif
if (pipe_ctx->stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST) 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, core_dc->hwss.unblank_stream(pipe_ctx,
&pipe_ctx->stream->link->cur_link_settings); &pipe_ctx->stream->link->cur_link_settings);
......
...@@ -2364,6 +2364,8 @@ bool dc_link_handle_hpd_rx_irq(struct dc_link *link, union hpd_irq_data *out_hpd ...@@ -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; enum dc_status result;
bool status = false; bool status = false;
struct pipe_ctx *pipe_ctx;
int i;
if (out_link_loss) if (out_link_loss)
*out_link_loss = false; *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 ...@@ -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, &link->cur_link_settings,
true, LINK_TRAINING_ATTEMPTS); 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; status = false;
if (out_link_loss) if (out_link_loss)
*out_link_loss = true; *out_link_loss = true;
......
...@@ -192,6 +192,7 @@ enum dc_detect_reason { ...@@ -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_detect(struct dc_link *dc_link, enum dc_detect_reason reason);
bool dc_link_get_hpd_state(struct dc_link *dc_link); 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). /* Notify DC about DP RX Interrupt (aka Short Pulse Interrupt).
* Return: * Return:
......
...@@ -159,6 +159,12 @@ enum dc_edid_status { ...@@ -159,6 +159,12 @@ enum dc_edid_status {
EDID_THE_SAME, EDID_THE_SAME,
}; };
enum act_return_status {
ACT_SUCCESS,
ACT_LINK_LOST,
ACT_FAILED
};
/* audio capability from EDID*/ /* audio capability from EDID*/
struct dc_cea_audio_mode { struct dc_cea_audio_mode {
uint8_t format_code; /* ucData[0] [6:3]*/ uint8_t format_code; /* ucData[0] [6:3]*/
......
...@@ -74,7 +74,7 @@ void dm_helpers_dp_mst_clear_payload_allocation_table( ...@@ -74,7 +74,7 @@ void dm_helpers_dp_mst_clear_payload_allocation_table(
/* /*
* Polls for ACT (allocation change trigger) handled and * 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, struct dc_context *ctx,
const struct dc_stream_state *stream); const struct dc_stream_state *stream);
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment