diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0719-drm-amd-dal-update-core-link-mst-stream-allocation-t.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0719-drm-amd-dal-update-core-link-mst-stream-allocation-t.patch | 499 |
1 files changed, 499 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0719-drm-amd-dal-update-core-link-mst-stream-allocation-t.patch b/common/recipes-kernel/linux/files/0719-drm-amd-dal-update-core-link-mst-stream-allocation-t.patch new file mode 100644 index 00000000..841aadb1 --- /dev/null +++ b/common/recipes-kernel/linux/files/0719-drm-amd-dal-update-core-link-mst-stream-allocation-t.patch @@ -0,0 +1,499 @@ +From c02f297bf62cbfe4cda8955332780e5ebb0c3e90 Mon Sep 17 00:00:00 2001 +From: Hersen Wu <hersenxs.wu@amd.com> +Date: Mon, 11 Jan 2016 16:53:07 -0500 +Subject: [PATCH 0719/1110] drm/amd/dal: update core link mst stream allocation + table with stream encoder + +Signed-off-by: Hersen Wu <hersenxs.wu@amd.com> +Acked-by: Harry Wentland <harry.wentland@amd.com> +--- + .../gpu/drm/amd/dal/amdgpu_dm/amdgpu_dc_helpers.c | 43 +------- + drivers/gpu/drm/amd/dal/dc/core/dc_link.c | 122 +++++++++++++-------- + drivers/gpu/drm/amd/dal/dc/core/dc_link_hwss.c | 2 +- + drivers/gpu/drm/amd/dal/dc/dc_helpers.h | 1 - + .../drm/amd/dal/dc/dce110/dce110_hw_sequencer.c | 5 +- + .../drm/amd/dal/dc/dce110/dce110_link_encoder.c | 12 +- + .../drm/amd/dal/dc/dce110/dce110_link_encoder.h | 2 +- + drivers/gpu/drm/amd/dal/dc/inc/core_types.h | 26 ++++- + drivers/gpu/drm/amd/dal/dc/inc/link_encoder.h | 2 +- + .../drm/amd/dal/dc/virtual/virtual_link_encoder.c | 2 +- + .../gpu/drm/amd/dal/include/link_service_types.h | 8 +- + 11 files changed, 113 insertions(+), 112 deletions(-) + +diff --git a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dc_helpers.c b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dc_helpers.c +index 855f9f9..ab426e3 100644 +--- a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dc_helpers.c ++++ b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dc_helpers.c +@@ -160,27 +160,8 @@ static struct amdgpu_connector *get_connector_for_link( + return aconnector; + } + +-const struct dp_mst_stream_allocation *find_stream_with_matching_vcpi( +- const struct dp_mst_stream_allocation_table *table, +- uint32_t vcpi) +-{ +- int i; +- +- for (i = 0; i < table->stream_count; i++) { +- const struct dp_mst_stream_allocation *sa = +- &table->stream_allocations[i]; +- if (sa->vcp_id == vcpi) +- return sa; +- } +- return NULL; +-} +- +- + static void get_payload_table( +- struct drm_device *dev, + struct amdgpu_connector *aconnector, +- const struct dc_stream *stream, +- const struct dp_mst_stream_allocation_table *cur_table, + struct dp_mst_stream_allocation_table *proposed_table) + { + int i; +@@ -203,26 +184,13 @@ static void get_payload_table( + mst_mgr->payloads[i].payload_state == + DP_PAYLOAD_REMOTE) { + +- const struct dp_mst_stream_allocation *sa_src +- = find_stream_with_matching_vcpi( +- cur_table, +- mst_mgr->proposed_vcpis[i]->vcpi); +- +- if (sa_src) { +- proposed_table->stream_allocations[ +- proposed_table->stream_count] = *sa_src; +- proposed_table->stream_count++; +- } else { +- struct dp_mst_stream_allocation *sa = ++ struct dp_mst_stream_allocation *sa = + &proposed_table->stream_allocations[ + proposed_table->stream_count]; + +- sa->slot_count = +- mst_mgr->payloads[i].num_slots; +- sa->stream = stream; +- sa->vcp_id = mst_mgr->proposed_vcpis[i]->vcpi; +- proposed_table->stream_count++; +- } ++ sa->slot_count = mst_mgr->payloads[i].num_slots; ++ sa->vcp_id = mst_mgr->proposed_vcpis[i]->vcpi; ++ proposed_table->stream_count++; + } + } + +@@ -235,7 +203,6 @@ static void get_payload_table( + bool dc_helpers_dp_mst_write_payload_allocation_table( + struct dc_context *ctx, + const struct dc_stream *stream, +- const struct dp_mst_stream_allocation_table *cur_table, + struct dp_mst_stream_allocation_table *proposed_table, + bool enable) + { +@@ -312,7 +279,7 @@ bool dc_helpers_dp_mst_write_payload_allocation_table( + * stream. AMD ASIC stream slot allocation should follow the same + * sequence. copy DRM MST allocation to dc */ + +- get_payload_table(dev, aconnector, stream, cur_table, proposed_table); ++ get_payload_table(aconnector, proposed_table); + + if (ret) + return false; +diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc_link.c b/drivers/gpu/drm/amd/dal/dc/core/dc_link.c +index 912f3fe..caba06e 100644 +--- a/drivers/gpu/drm/amd/dal/dc/core/dc_link.c ++++ b/drivers/gpu/drm/amd/dal/dc/core/dc_link.c +@@ -1390,6 +1390,58 @@ static struct fixed31_32 get_pbn_from_timing(struct core_stream *stream) + return peak_kbps; + } + ++static void update_mst_stream_alloc_table( ++ struct core_link *link, ++ struct core_stream *stream, ++ const struct dp_mst_stream_allocation_table *proposed_table) ++{ ++ struct link_mst_stream_allocation work_table[MAX_CONTROLLER_NUM] = { ++ { 0 } }; ++ struct link_mst_stream_allocation *dc_alloc; ++ ++ int i; ++ int j; ++ ++ /* if DRM proposed_table has more than one new payload */ ++ ASSERT(proposed_table->stream_count - ++ link->mst_stream_alloc_table.stream_count < 2); ++ ++ /* copy proposed_table to core_link, add stream encoder */ ++ for (i = 0; i < proposed_table->stream_count; i++) { ++ ++ for (j = 0; j < link->mst_stream_alloc_table.stream_count; j++) { ++ dc_alloc = ++ &link->mst_stream_alloc_table.stream_allocations[j]; ++ ++ if (dc_alloc->vcp_id == ++ proposed_table->stream_allocations[i].vcp_id) { ++ ++ work_table[i] = *dc_alloc; ++ break; /* exit j loop */ ++ } ++ } ++ ++ /* new vcp_id */ ++ if (j == link->mst_stream_alloc_table.stream_count) { ++ work_table[i].vcp_id = ++ proposed_table->stream_allocations[i].vcp_id; ++ work_table[i].slot_count = ++ proposed_table->stream_allocations[i].slot_count; ++ work_table[i].stream_enc = stream->stream_enc; ++ } ++ } ++ ++ /* update link->mst_stream_alloc_table with work_table */ ++ link->mst_stream_alloc_table.stream_count = ++ proposed_table->stream_count; ++ for (i = 0; i < MAX_CONTROLLER_NUM; i++) ++ link->mst_stream_alloc_table.stream_allocations[i] = ++ work_table[i]; ++} ++ ++/* 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 core_stream *stream) + { + struct core_link *link = stream->sink->link; +@@ -1411,31 +1463,32 @@ static enum dc_status allocate_mst_payload(struct core_stream *stream) + dc_helpers_dp_mst_write_payload_allocation_table( + stream->ctx, + &stream->public, +- &link->stream_alloc_table, + &proposed_table, + true); + ++ update_mst_stream_alloc_table(link, stream, &proposed_table); ++ + dal_logger_write(link->ctx->logger, + LOG_MAJOR_MST, + LOG_MINOR_MST_PROGRAMMING, + "%s " + "stream_count: %d: \n ", + __func__, +- proposed_table.stream_count); ++ link->mst_stream_alloc_table.stream_count); + + for (i = 0; i < MAX_CONTROLLER_NUM; i++) { + dal_logger_write(link->ctx->logger, + LOG_MAJOR_MST, + LOG_MINOR_MST_PROGRAMMING, +- "stream[%d]: 0x%x " ++ "stream_enc[%d]: 0x%x " + "stream[%d].vcp_id: %d " + "stream[%d].slot_count: %d\n", + i, +- proposed_table.stream_allocations[i].stream, ++ link->mst_stream_alloc_table.stream_allocations[i].stream_enc, + i, +- proposed_table.stream_allocations[i].vcp_id, ++ link->mst_stream_alloc_table.stream_allocations[i].vcp_id, + i, +- proposed_table.stream_allocations[i].slot_count); ++ link->mst_stream_alloc_table.stream_allocations[i].slot_count); + } + + ASSERT(proposed_table.stream_count > 0); +@@ -1453,9 +1506,7 @@ static enum dc_status allocate_mst_payload(struct core_stream *stream) + /* program DP source TX for payload */ + link_encoder->funcs->update_mst_stream_allocation_table( + link_encoder, +- &proposed_table); +- +- link->stream_alloc_table = proposed_table; ++ &link->mst_stream_alloc_table); + + /* send down message */ + dc_helpers_dp_mst_poll_for_allocation_change_trigger( +@@ -1509,9 +1560,15 @@ static enum dc_status deallocate_mst_payload(struct core_stream *stream) + dc_helpers_dp_mst_write_payload_allocation_table( + stream->ctx, + &stream->public, +- &link->stream_alloc_table, + &proposed_table, + false); ++ dc_helpers_dp_mst_write_payload_allocation_table( ++ stream->ctx, ++ &stream->public, ++ &proposed_table, ++ false); ++ ++ update_mst_stream_alloc_table(link, stream, &proposed_table); + + dal_logger_write(link->ctx->logger, + LOG_MAJOR_MST, +@@ -1519,28 +1576,26 @@ static enum dc_status deallocate_mst_payload(struct core_stream *stream) + "%s" + "stream_count: %d: ", + __func__, +- proposed_table.stream_count); ++ link->mst_stream_alloc_table.stream_count); + + for (i = 0; i < MAX_CONTROLLER_NUM; i++) { + dal_logger_write(link->ctx->logger, + LOG_MAJOR_MST, + LOG_MINOR_MST_PROGRAMMING, +- "stream[%d]: 0x%x" +- "stream[%d].vcp_id: %d" +- "stream[%d].slot_count: %d", ++ "stream_enc[%d]: 0x%x " ++ "stream[%d].vcp_id: %d " ++ "stream[%d].slot_count: %d\n", + i, +- proposed_table.stream_allocations[i].stream, ++ link->mst_stream_alloc_table.stream_allocations[i].stream_enc, + i, +- proposed_table.stream_allocations[i].vcp_id, ++ link->mst_stream_alloc_table.stream_allocations[i].vcp_id, + i, +- proposed_table.stream_allocations[i].slot_count); ++ link->mst_stream_alloc_table.stream_allocations[i].slot_count); + } + + link_encoder->funcs->update_mst_stream_allocation_table( + link_encoder, +- &proposed_table); +- +- link->stream_alloc_table = proposed_table; ++ &link->mst_stream_alloc_table); + + if (mst_mode) { + dc_helpers_dp_mst_poll_for_allocation_change_trigger( +@@ -1589,31 +1644,4 @@ void core_link_disable_stream( + + } + +-void core_link_update_stream( +- struct core_link *link, +- struct core_stream *stream) +-{ +- if (stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST) { +- uint32_t i; + +- for (i = 0; i < link->stream_alloc_table.stream_count; i++) { +- const struct core_stream *s; +- +- s = DC_STREAM_TO_CORE( +- link->stream_alloc_table. +- stream_allocations[i].stream); +- +- if (stream->stream_enc == s->stream_enc) { +- link->stream_alloc_table.stream_allocations[i].stream = +- &stream->public; +- +- dal_logger_write(link->ctx->logger, +- LOG_MAJOR_MST, +- LOG_MINOR_MST_PROGRAMMING, +- "%s ", +- __func__); +- break; +- } +- } +- } +-} +diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc_link_hwss.c b/drivers/gpu/drm/amd/dal/dc/core/dc_link_hwss.c +index 8f1b869..2ed9eb8 100644 +--- a/drivers/gpu/drm/amd/dal/dc/core/dc_link_hwss.c ++++ b/drivers/gpu/drm/amd/dal/dc/core/dc_link_hwss.c +@@ -96,7 +96,7 @@ void dp_disable_link_phy(struct core_link *link, enum signal_type signal) + void dp_disable_link_phy_mst(struct core_link *link, struct core_stream *stream) + { + /* MST disable link only when no stream use the link */ +- if (link->stream_alloc_table.stream_count > 0) ++ if (link->mst_stream_alloc_table.stream_count > 0) + return; + + dp_disable_link_phy(link, stream->signal); +diff --git a/drivers/gpu/drm/amd/dal/dc/dc_helpers.h b/drivers/gpu/drm/amd/dal/dc/dc_helpers.h +index bd082d8..6bb1160 100644 +--- a/drivers/gpu/drm/amd/dal/dc/dc_helpers.h ++++ b/drivers/gpu/drm/amd/dal/dc/dc_helpers.h +@@ -46,7 +46,6 @@ enum dc_edid_status dc_helpers_parse_edid_caps( + bool dc_helpers_dp_mst_write_payload_allocation_table( + struct dc_context *ctx, + const struct dc_stream *stream, +- const struct dp_mst_stream_allocation_table *cur_table, + struct dp_mst_stream_allocation_table *proposed_table, + bool enable); + +diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c +index 44ad5a2..74d437e 100644 +--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c ++++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c +@@ -898,11 +898,8 @@ static enum dc_status apply_single_controller_ctx_to_hw(uint8_t controller_idx, + context->res_ctx.pool.timing_generators[controller_idx], + color_space); + +- if (timing_changed) { ++ if (timing_changed) + core_link_enable_stream(stream->sink->link, stream); +- } else { +- core_link_update_stream(stream->sink->link, stream); +- } + + if (dc_is_dp_signal(stream->signal)) + unblank_stream(stream, &stream->sink->link->cur_link_settings); +diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_link_encoder.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_link_encoder.c +index 780c3a6..4a83e25 100644 +--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_link_encoder.c ++++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_link_encoder.c +@@ -1592,16 +1592,14 @@ void dce110_link_encoder_dp_set_phy_pattern( + } + + static void fill_stream_allocation_row_info( +- const struct dp_mst_stream_allocation *stream_allocation, ++ const struct link_mst_stream_allocation *stream_allocation, + uint32_t *src, + uint32_t *slots) + { +- const struct dc_stream *dc_stream = stream_allocation->stream; +- struct core_stream *core_stream; ++ const struct stream_encoder *stream_enc = stream_allocation->stream_enc; + +- if (dc_stream) { +- core_stream = DC_STREAM_TO_CORE(dc_stream); +- *src = core_stream->stream_enc->id; ++ if (stream_enc) { ++ *src = stream_enc->id; + *slots = stream_allocation->slot_count; + } else { + *src = 0; +@@ -1612,7 +1610,7 @@ static void fill_stream_allocation_row_info( + /* programs DP MST VC payload allocation */ + void dce110_link_encoder_update_mst_stream_allocation_table( + struct link_encoder *enc, +- const struct dp_mst_stream_allocation_table *table) ++ const struct link_mst_stream_allocation_table *table) + { + struct dce110_link_encoder *enc110 = TO_DCE110_LINK_ENC(enc); + struct dc_context *ctx = enc110->base.ctx; +diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_link_encoder.h b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_link_encoder.h +index 31a33a8..46e2971 100644 +--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_link_encoder.h ++++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_link_encoder.h +@@ -133,7 +133,7 @@ void dce110_link_encoder_dp_set_phy_pattern( + /* programs DP MST VC payload allocation */ + void dce110_link_encoder_update_mst_stream_allocation_table( + struct link_encoder *enc, +- const struct dp_mst_stream_allocation_table *table); ++ const struct link_mst_stream_allocation_table *table); + + void dce110_link_encoder_set_lcd_backlight_level( + struct link_encoder *enc, +diff --git a/drivers/gpu/drm/amd/dal/dc/inc/core_types.h b/drivers/gpu/drm/amd/dal/dc/inc/core_types.h +index f31ee42..1597b33 100644 +--- a/drivers/gpu/drm/amd/dal/dc/inc/core_types.h ++++ b/drivers/gpu/drm/amd/dal/dc/inc/core_types.h +@@ -196,6 +196,25 @@ union dp_wa { + uint32_t raw; + }; + ++/* DP MST stream allocation (payload bandwidth number) */ ++struct link_mst_stream_allocation { ++ /* DIG front */ ++ const struct stream_encoder *stream_enc; ++ /* associate DRM payload table with DC stream encoder */ ++ uint8_t vcp_id; ++ /* number of slots required for the DP stream in transport packet */ ++ uint8_t slot_count; ++}; ++ ++/* DP MST stream allocation table */ ++struct link_mst_stream_allocation_table { ++ /* number of DP video streams */ ++ int stream_count; ++ /* array of stream allocations */ ++ struct link_mst_stream_allocation ++ stream_allocations[MAX_CONTROLLER_NUM]; ++}; ++ + struct core_link { + struct dc_link public; + const struct dc *dc; +@@ -221,11 +240,10 @@ struct core_link { + enum edp_revision edp_revision; + + /* MST record stream using this link */ +- struct dp_mst_stream_allocation_table stream_alloc_table; +- + struct link_flags { + bool dp_keep_receiver_powered; + } wa_flags; ++ struct link_mst_stream_allocation_table mst_stream_alloc_table; + }; + + #define DC_LINK_TO_LINK(dc_link) container_of(dc_link, struct core_link, public) +@@ -248,10 +266,6 @@ void core_link_disable_stream( + struct core_link *link, + struct core_stream *stream); + +-void core_link_update_stream( +- struct core_link *link, +- struct core_stream *stream); +- + /********** DAL Core*********************/ + #include "display_clock_interface.h" + +diff --git a/drivers/gpu/drm/amd/dal/dc/inc/link_encoder.h b/drivers/gpu/drm/amd/dal/dc/inc/link_encoder.h +index f63c479..95defa8 100644 +--- a/drivers/gpu/drm/amd/dal/dc/inc/link_encoder.h ++++ b/drivers/gpu/drm/amd/dal/dc/inc/link_encoder.h +@@ -55,7 +55,7 @@ struct link_encoder_funcs { + const struct encoder_set_dp_phy_pattern_param *para); + void (*update_mst_stream_allocation_table)( + struct link_encoder *enc, +- const struct dp_mst_stream_allocation_table *table); ++ const struct link_mst_stream_allocation_table *table); + void (*set_lcd_backlight_level) (struct link_encoder *enc, + uint32_t level); + void (*backlight_control) (struct link_encoder *enc, +diff --git a/drivers/gpu/drm/amd/dal/dc/virtual/virtual_link_encoder.c b/drivers/gpu/drm/amd/dal/dc/virtual/virtual_link_encoder.c +index 5fa9af8..4d48daa 100644 +--- a/drivers/gpu/drm/amd/dal/dc/virtual/virtual_link_encoder.c ++++ b/drivers/gpu/drm/amd/dal/dc/virtual/virtual_link_encoder.c +@@ -69,7 +69,7 @@ static void virtual_link_encoder_dp_set_phy_pattern( + + static void virtual_link_encoder_update_mst_stream_allocation_table( + struct link_encoder *enc, +- const struct dp_mst_stream_allocation_table *table) {} ++ const struct link_mst_stream_allocation_table *table) {} + + static void virtual_link_encoder_set_lcd_backlight_level( + struct link_encoder *enc, +diff --git a/drivers/gpu/drm/amd/dal/include/link_service_types.h b/drivers/gpu/drm/amd/dal/include/link_service_types.h +index 573dd5c..30fc6f0 100644 +--- a/drivers/gpu/drm/amd/dal/include/link_service_types.h ++++ b/drivers/gpu/drm/amd/dal/include/link_service_types.h +@@ -391,18 +391,16 @@ struct mst_device_info { + + /* DP MST stream allocation (payload bandwidth number) */ + struct dp_mst_stream_allocation { +- /* stream engine id (DIG) */ +- const struct dc_stream *stream; +- uint32_t vcp_id; ++ uint8_t vcp_id; + /* number of slots required for the DP stream in + * transport packet */ +- uint32_t slot_count; ++ uint8_t slot_count; + }; + + /* DP MST stream allocation table */ + struct dp_mst_stream_allocation_table { + /* number of DP video streams */ +- uint8_t stream_count; ++ int stream_count; + /* array of stream allocations */ + struct dp_mst_stream_allocation stream_allocations[MAX_CONTROLLER_NUM]; + }; +-- +2.7.4 + |