diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0668-drm-amd-dal-Compute-x-y-for-MST-in-dc_link.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0668-drm-amd-dal-Compute-x-y-for-MST-in-dc_link.patch | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0668-drm-amd-dal-Compute-x-y-for-MST-in-dc_link.patch b/common/recipes-kernel/linux/files/0668-drm-amd-dal-Compute-x-y-for-MST-in-dc_link.patch new file mode 100644 index 00000000..29597e77 --- /dev/null +++ b/common/recipes-kernel/linux/files/0668-drm-amd-dal-Compute-x-y-for-MST-in-dc_link.patch @@ -0,0 +1,167 @@ +From 489af48fca5911be0db30127181a2c11bff9772d Mon Sep 17 00:00:00 2001 +From: Harry Wentland <harry.wentland@amd.com> +Date: Thu, 3 Dec 2015 00:18:30 -0500 +Subject: [PATCH 0668/1110] drm/amd/dal: Compute x/y for MST in dc_link + +Computing x/y for MST more accurately, based on DAL2 code, +rather than doing what radeon driver did. + +Signed-off-by: Harry Wentland <harry.wentland@amd.com> +Acked-by: Jordan Lazare <Jordan.Lazare@amd.com> +--- + .../gpu/drm/amd/dal/amdgpu_dm/amdgpu_dc_helpers.c | 8 --- + drivers/gpu/drm/amd/dal/dc/core/dc_link.c | 69 ++++++++++++++++++++-- + .../gpu/drm/amd/dal/include/link_service_types.h | 3 - + 3 files changed, 63 insertions(+), 17 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 3a71159..578517f 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 +@@ -221,14 +221,6 @@ static void get_payload_table( + dev, + master_port, + mst_mgr->payloads[i].vcpi); +- +- if (mst_mgr->payloads[i].vcpi == +- aconnector->port->vcpi.vcpi) +- table->cur_stream_payload_idx = i; +- +- /* TODO remove the following and calculate in DC */ +- table->stream_allocations[i].pbn_per_slot = mst_mgr->pbn_div; +- table->stream_allocations[i].pbn = mst_mgr->proposed_vcpis[i]->pbn; + } + } + +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 94990b9..5e39a41 100644 +--- a/drivers/gpu/drm/amd/dal/dc/core/dc_link.c ++++ b/drivers/gpu/drm/amd/dal/dc/core/dc_link.c +@@ -37,6 +37,7 @@ + #include "stream_encoder.h" + #include "link_encoder.h" + #include "hw_sequencer.h" ++#include "fixed31_32.h" + + + #define LINK_INFO(...) \ +@@ -52,6 +53,10 @@ + * Private structures + ******************************************************************************/ + ++enum { ++ LINK_RATE_REF_FREQ_IN_MHZ = 27, ++ PEAK_FACTOR_X1000 = 1006 ++}; + + /******************************************************************************* + * Private functions +@@ -1275,6 +1280,59 @@ void core_link_resume(struct core_link *link) + program_hpd_filter(link); + } + ++static struct fixed31_32 get_pbn_per_slot(struct core_stream *stream) ++{ ++ struct link_settings *link_settings = &stream->sink->link->cur_link_settings; ++ uint32_t link_rate_in_mbps = link_settings->link_rate * LINK_RATE_REF_FREQ_IN_MHZ; ++ struct fixed31_32 mbps = dal_fixed31_32_from_int(link_rate_in_mbps * link_settings->lane_count); ++ ++ return dal_fixed31_32_div_int(mbps, 54); ++} ++ ++static int get_color_depth(struct core_stream *stream) ++{ ++ switch (stream->pix_clk_params.color_depth) { ++ case COLOR_DEPTH_666: return 6; ++ case COLOR_DEPTH_888: return 8; ++ case COLOR_DEPTH_101010: return 10; ++ case COLOR_DEPTH_121212: return 12; ++ case COLOR_DEPTH_141414: return 14; ++ case COLOR_DEPTH_161616: return 16; ++ default: return 0; ++ } ++} ++ ++static struct fixed31_32 get_pbn_from_timing(struct core_stream *stream) ++{ ++ uint32_t bpc; ++ uint64_t kbps; ++ struct fixed31_32 peak_kbps; ++ uint32_t numerator; ++ uint32_t denominator; ++ ++ bpc = get_color_depth(stream); ++ kbps = stream->pix_clk_params.requested_pix_clk * bpc * 3; ++ ++ /* ++ * margin 5300ppm + 300ppm ~ 0.6% as per spec, factor is 1.006 ++ * ++ * The unit of 54/64Mbytes/sec is an arbitrary unit chosen based on ++ * common multiplier to render an integer PBN for all link rate/lane ++ * counts combinations ++ * * ++ * calculate ++ * peak_kbps *= (1006/1000) ++ * peak_kbps *= (64/54) ++ * peak_kbps *= 8 convert to bytes ++ */ ++ ++ numerator = 64 * PEAK_FACTOR_X1000; ++ denominator = 54 * 8 * 1000 * 1000; ++ kbps *= numerator; ++ peak_kbps = dal_fixed31_32_from_fraction(kbps, denominator); ++ ++ return peak_kbps; ++} + + static enum dc_status allocate_mst_payload(struct core_stream *stream) + { +@@ -1283,8 +1341,9 @@ static enum dc_status allocate_mst_payload(struct core_stream *stream) + struct stream_encoder *stream_encoder = stream->stream_enc; + struct dp_mst_stream_allocation_table table = {0}; + struct fixed31_32 avg_time_slots_per_mtp; +- uint8_t cur_stream_payload_idx; + struct dc *dc = stream->ctx->dc; ++ struct fixed31_32 pbn; ++ struct fixed31_32 pbn_per_slot; + + /* enable_link_dp_mst already check link->enabled_stream_count + * and stream is in link->stream[]. This is called during set mode, +@@ -1322,11 +1381,9 @@ static enum dc_status allocate_mst_payload(struct core_stream *stream) + &stream->public, + true); + +- /* slot X.Y for only current stream */ +- cur_stream_payload_idx = table.cur_stream_payload_idx; +- avg_time_slots_per_mtp = dal_fixed31_32_from_fraction( +- table.stream_allocations[cur_stream_payload_idx].pbn, +- table.stream_allocations[cur_stream_payload_idx].pbn_per_slot); ++ pbn_per_slot = get_pbn_per_slot(stream); ++ pbn = get_pbn_from_timing(stream); ++ avg_time_slots_per_mtp = dal_fixed31_32_div(pbn, pbn_per_slot); + + dc->hwss.set_mst_bandwidth( + stream_encoder, +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 d91f4b0..429d969 100644 +--- a/drivers/gpu/drm/amd/dal/include/link_service_types.h ++++ b/drivers/gpu/drm/amd/dal/include/link_service_types.h +@@ -396,15 +396,12 @@ struct dp_mst_stream_allocation { + /* number of slots required for the DP stream in + * transport packet */ + uint32_t slot_count; +- uint32_t pbn; +- uint32_t pbn_per_slot; + }; + + /* DP MST stream allocation table */ + struct dp_mst_stream_allocation_table { + /* number of DP video streams */ + uint8_t stream_count; +- uint8_t cur_stream_payload_idx; + /* array of stream allocations */ + struct dp_mst_stream_allocation stream_allocations[MAX_CONTROLLER_NUM]; + }; +-- +2.7.4 + |