]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
drm/amd/display: Fill in vrefresh and min_vblank_time for dce8/dce10
authorJordan Lazare <Jordan.Lazare@amd.com>
Thu, 30 Mar 2017 17:08:34 +0000 (13:08 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 26 Sep 2017 21:22:25 +0000 (17:22 -0400)
PPLib is now calling into DC to get vrefresh and min_vblank_time, but
since full bandwidth calcs are missing for those generations, the pplib
structures were never being filled. This change fills the currently
required fields to prevent screen corruption.

Signed-off-by: Jordan Lazare <Jordan.Lazare@amd.com>
Acked-by: Harry Wentland <Harry.Wentland@amd.com>
Reviewed-by: Jordan Lazare <Jordan.Lazare@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dce100/dce100_hw_sequencer.c
drivers/gpu/drm/amd/display/dc/dce100/dce100_hw_sequencer.h
drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.h
drivers/gpu/drm/amd/display/dc/dce80/dce80_hw_sequencer.c

index bd8e19f1038ba3b8ef922a13764616c4e62b1831..f11044e0245cf506e3c5f7ec6160b85cbcc8d0c4 100644 (file)
@@ -104,6 +104,26 @@ static bool dce100_enable_display_power_gating(
                return false;
 }
 
+void dce100_pplib_apply_display_requirements(
+       struct core_dc *dc,
+       struct validate_context *context)
+{
+       struct dm_pp_display_configuration *pp_display_cfg = &context->pp_display_cfg;
+
+       pp_display_cfg->avail_mclk_switch_time_us =
+                                               dce110_get_min_vblank_time_us(context);
+
+       dce110_fill_display_configs(context, pp_display_cfg);
+
+       if (memcmp(&dc->prev_display_config, pp_display_cfg, sizeof(
+                       struct dm_pp_display_configuration)) !=  0)
+               dm_pp_apply_display_requirements(dc->ctx, pp_display_cfg);
+
+       dc->prev_display_config = *pp_display_cfg;
+}
+
+
+
 static void set_displaymarks(
                const struct core_dc *dc, struct validate_context *context)
 {
@@ -116,6 +136,7 @@ static void set_bandwidth(
                bool decrease_allowed)
 {
        dc->hwss.set_displaymarks(dc, context);
+       dce100_pplib_apply_display_requirements(dc, context);
 }
 
 
index cf497ea605c83d6a3bbf304cbe0cadcbb1efcce2..f51d04a66a49527cbd7b34b4d87a94a87eaef919 100644 (file)
 #include "core_types.h"
 
 struct core_dc;
+struct validate_context;
 
 bool dce100_hw_sequencer_construct(struct core_dc *dc);
 
+void dce100_pplib_apply_display_requirements(
+       struct core_dc *dc,
+       struct validate_context *context);
+
 #endif /* __DC_HWSS_DCE100_H__ */
 
index 2a3a39e3171796bc11e76980c2faca91ba2a5ecb..839c34409c633018dc822f892f7ae82ac3ef08ad 100644 (file)
@@ -2097,7 +2097,7 @@ static void init_hw(struct core_dc *dc)
        }
 }
 
-static void fill_display_configs(
+void dce110_fill_display_configs(
        const struct validate_context *context,
        struct dm_pp_display_configuration *pp_display_cfg)
 {
@@ -2146,7 +2146,7 @@ static void fill_display_configs(
        pp_display_cfg->display_count = num_cfgs;
 }
 
-static uint32_t get_min_vblank_time_us(const struct validate_context *context)
+uint32_t dce110_get_min_vblank_time_us(const struct validate_context *context)
 {
        uint8_t j;
        uint32_t min_vertical_blank_time = -1;
@@ -2224,13 +2224,13 @@ static void pplib_apply_display_requirements(
                        = context->bw_results.required_sclk_deep_sleep;
 
        pp_display_cfg->avail_mclk_switch_time_us =
-                                               get_min_vblank_time_us(context);
+                                               dce110_get_min_vblank_time_us(context);
        /* TODO: dce11.2*/
        pp_display_cfg->avail_mclk_switch_time_in_disp_active_us = 0;
 
        pp_display_cfg->disp_clk_khz = context->dispclk_khz;
 
-       fill_display_configs(context, pp_display_cfg);
+       dce110_fill_display_configs(context, pp_display_cfg);
 
        /* TODO: is this still applicable?*/
        if (pp_display_cfg->display_count == 1) {
index a6b4d0d2429fc4ff1183a0ae56d17f9eb499264a..52462c17b2e985b4bf174d0ce69291be60121dc7 100644 (file)
@@ -30,6 +30,8 @@
 
 #define GAMMA_HW_POINTS_NUM 256
 struct core_dc;
+struct validate_context;
+struct dm_pp_display_configuration;
 
 bool dce110_hw_sequencer_construct(struct core_dc *dc);
 
@@ -58,5 +60,11 @@ void dce110_power_down(struct core_dc *dc);
 
 void dce110_update_pending_status(struct pipe_ctx *pipe_ctx);
 
+void dce110_fill_display_configs(
+       const struct validate_context *context,
+       struct dm_pp_display_configuration *pp_display_cfg);
+
+uint32_t dce110_get_min_vblank_time_us(const struct validate_context *context);
+
 #endif /* __DC_HWSS_DCE110_H__ */
 
index 85a54d963f8d1da82462bebdf92591f747645e26..9d4e7d8b836eef343f4d9e31da0042ae04572e46 100644 (file)
@@ -31,6 +31,7 @@
 
 #include "dce/dce_hwseq.h"
 #include "dce110/dce110_hw_sequencer.h"
+#include "dce100/dce100_hw_sequencer.h"
 
 /* include DCE8 register header files */
 #include "dce/dce_8_0_d.h"
@@ -118,6 +119,7 @@ static void set_bandwidth(
                bool decrease_allowed)
 {
        dc->hwss.set_displaymarks(dc, context);
+       dce100_pplib_apply_display_requirements(dc, context);
 }