aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/4137-drm-amd-dc-Add-dc-display-driver-v3.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/4137-drm-amd-dc-Add-dc-display-driver-v3.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/4137-drm-amd-dc-Add-dc-display-driver-v3.patch159
1 files changed, 159 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/4137-drm-amd-dc-Add-dc-display-driver-v3.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/4137-drm-amd-dc-Add-dc-display-driver-v3.patch
new file mode 100644
index 00000000..3c0a79d2
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/4137-drm-amd-dc-Add-dc-display-driver-v3.patch
@@ -0,0 +1,159 @@
+From a9c2b51cc3d75fb871bcc685e203027ca6779f3a Mon Sep 17 00:00:00 2001
+From: Harry Wentland <harry.wentland@amd.com>
+Date: Tue, 12 Sep 2017 15:58:20 -0400
+Subject: [PATCH 4137/5725] drm/amd/dc: Add dc display driver (v3)
+
+Supported DCE versions: 8.0, 10.0, 11.0, 11.2
+
+Added functions get_norm_pix_clk & calculate_phy_pix_clks and
+No need to keep track of unreffedclk sources.
+
+Signed-off-by: Harry Wentland <harry.wentland@amd.com>
+Acked-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Kalyan Alle <kalyan.alle@amd.com>
+---
+ drivers/gpu/drm/amd/display/dc/core/dc_resource.c | 91 ++++++++++++++---------
+ 1 file changed, 57 insertions(+), 34 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
+index 4ab04c7..81c6de7 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
+@@ -265,30 +265,23 @@ bool resource_construct(
+
+ return true;
+ }
+-static int find_matching_clock_source(
+- const struct resource_pool *pool,
+- struct clock_source *clock_source)
+-{
+-
+- int i;
+-
+- for (i = 0; i < pool->clk_src_count; i++) {
+- if (pool->clock_sources[i] == clock_source)
+- return i;
+- }
+- return -1;
+-}
+
+ void resource_unreference_clock_source(
+ struct resource_context *res_ctx,
+ const struct resource_pool *pool,
+ struct clock_source *clock_source)
+ {
+- int i = find_matching_clock_source(pool, clock_source);
++ int i;
+
+- if (i > -1)
++ for (i = 0; i < pool->clk_src_count; i++) {
++ if (pool->clock_sources[i] != clock_source)
++ continue;
++
+ res_ctx->clock_source_ref_count[i]--;
+
++ break;
++ }
++
+ if (pool->dp_clock_source == clock_source)
+ res_ctx->dp_clock_source_ref_count--;
+ }
+@@ -298,31 +291,19 @@ void resource_reference_clock_source(
+ const struct resource_pool *pool,
+ struct clock_source *clock_source)
+ {
+- int i = find_matching_clock_source(pool, clock_source);
+-
+- if (i > -1)
++ int i;
++ for (i = 0; i < pool->clk_src_count; i++) {
++ if (pool->clock_sources[i] != clock_source)
++ continue;
++
+ res_ctx->clock_source_ref_count[i]++;
++ break;
++ }
+
+ if (pool->dp_clock_source == clock_source)
+ res_ctx->dp_clock_source_ref_count++;
+ }
+
+-int resource_get_clock_source_reference(
+- struct resource_context *res_ctx,
+- const struct resource_pool *pool,
+- struct clock_source *clock_source)
+-{
+- int i = find_matching_clock_source(pool, clock_source);
+-
+- if (i > -1)
+- return res_ctx->clock_source_ref_count[i];
+-
+- if (pool->dp_clock_source == clock_source)
+- return res_ctx->dp_clock_source_ref_count;
+-
+- return -1;
+-}
+-
+ bool resource_are_streams_timing_synchronizable(
+ struct dc_stream_state *stream1,
+ struct dc_stream_state *stream2)
+@@ -1648,6 +1629,46 @@ static struct dc_stream_state *find_pll_sharable_stream(
+ return NULL;
+ }
+
++static int get_norm_pix_clk(const struct dc_crtc_timing *timing)
++{
++ uint32_t pix_clk = timing->pix_clk_khz;
++ uint32_t normalized_pix_clk = pix_clk;
++
++ if (timing->pixel_encoding == PIXEL_ENCODING_YCBCR420)
++ pix_clk /= 2;
++ if (timing->pixel_encoding != PIXEL_ENCODING_YCBCR422) {
++ switch (timing->display_color_depth) {
++ case COLOR_DEPTH_888:
++ normalized_pix_clk = pix_clk;
++ break;
++ case COLOR_DEPTH_101010:
++ normalized_pix_clk = (pix_clk * 30) / 24;
++ break;
++ case COLOR_DEPTH_121212:
++ normalized_pix_clk = (pix_clk * 36) / 24;
++ break;
++ case COLOR_DEPTH_161616:
++ normalized_pix_clk = (pix_clk * 48) / 24;
++ break;
++ default:
++ ASSERT(0);
++ break;
++ }
++ }
++ return normalized_pix_clk;
++}
++
++static void calculate_phy_pix_clks(struct dc_stream_state *stream)
++{
++ /* update actual pixel clock on all streams */
++ if (dc_is_hdmi_signal(stream->signal))
++ stream->phy_pix_clk = get_norm_pix_clk(
++ &stream->timing);
++ else
++ stream->phy_pix_clk =
++ stream->timing.pix_clk_khz;
++}
++
+ enum dc_status resource_map_pool_resources(
+ const struct dc *dc,
+ struct dc_state *context,
+@@ -2550,6 +2571,8 @@ enum dc_status dc_validate_stream(struct dc *dc, struct dc_stream_state *stream)
+ struct timing_generator *tg = core_dc->res_pool->timing_generators[0];
+ enum dc_status res = DC_OK;
+
++ calculate_phy_pix_clks(stream);
++
+ if (!tg->funcs->validate_timing(tg, &stream->timing))
+ res = DC_FAIL_CONTROLLER_VALIDATE;
+
+--
+2.7.4
+