diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/4002-drm-amd-display-add-delay-between-panel-pwr-off-to-o.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/4002-drm-amd-display-add-delay-between-panel-pwr-off-to-o.patch | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/4002-drm-amd-display-add-delay-between-panel-pwr-off-to-o.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/4002-drm-amd-display-add-delay-between-panel-pwr-off-to-o.patch new file mode 100644 index 00000000..0eb02ec1 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/4002-drm-amd-display-add-delay-between-panel-pwr-off-to-o.patch @@ -0,0 +1,134 @@ +From 76f9b2689a82c64a7c71593ca980ae3f80b8475d Mon Sep 17 00:00:00 2001 +From: Charlene Liu <charlene.liu@amd.com> +Date: Tue, 20 Mar 2018 14:53:04 -0400 +Subject: [PATCH 4002/4131] drm/amd/display: add delay between panel pwr off to + on. + +As per eDP 1.4 spec, there must be at least 500ms delay +between eDP power off and on. +This change added time stamp when edp power off, which can +be used to calculate duration time when edp power on. +If duration less than 500ms, add a wait. + +Signed-off-by: Charlene Liu <charlene.liu@amd.com> +Reviewed-by: Tony Cheng <Tony.Cheng@amd.com> +Acked-by: Harry Wentland <harry.wentland@amd.com> +--- + .../drm/amd/display/amdgpu_dm/amdgpu_dm_services.c | 7 ++++++ + drivers/gpu/drm/amd/display/dc/dc_link.h | 9 +++++++ + .../amd/display/dc/dce110/dce110_hw_sequencer.c | 29 +++++++++++++++++++++- + drivers/gpu/drm/amd/display/dc/dm_services.h | 4 +++ + 4 files changed, 48 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_services.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_services.c +index fe29125..0229c7ed 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_services.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_services.c +@@ -43,6 +43,13 @@ unsigned long long dm_get_timestamp(struct dc_context *ctx) + return timespec64_to_ns(&time); + } + ++unsigned long long dm_get_elapse_time_in_ns(struct dc_context *ctx, ++ unsigned long long current_time_stamp, ++ unsigned long long last_time_stamp) ++{ ++ return current_time_stamp - last_time_stamp; ++} ++ + void dm_perf_trace_timestamp(const char *func_name, unsigned int line) + { + } +diff --git a/drivers/gpu/drm/amd/display/dc/dc_link.h b/drivers/gpu/drm/amd/display/dc/dc_link.h +index fb4d9ea..eeff987 100644 +--- a/drivers/gpu/drm/amd/display/dc/dc_link.h ++++ b/drivers/gpu/drm/amd/display/dc/dc_link.h +@@ -51,6 +51,14 @@ struct link_mst_stream_allocation_table { + struct link_mst_stream_allocation stream_allocations[MAX_CONTROLLER_NUM]; + }; + ++struct time_stamp { ++ uint64_t edp_poweroff; ++ uint64_t edp_poweron; ++}; ++ ++struct link_trace { ++ struct time_stamp time_stamp; ++}; + /* + * A link contains one or more sinks and their connected status. + * The currently active signal type (HDMI, DP-SST, DP-MST) is also reported. +@@ -114,6 +122,7 @@ struct dc_link { + + struct dc_link_status link_status; + ++ struct link_trace link_trace; + }; + + const struct dc_link_status *dc_link_get_status(const struct dc_link *dc_link); +diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c +index e8df50f..db2d15d 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c ++++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c +@@ -849,6 +849,28 @@ void hwss_edp_power_control( + + if (power_up != is_panel_powered_on(hwseq)) { + /* Send VBIOS command to prompt eDP panel power */ ++ if (power_up) { ++ unsigned long long current_ts = dm_get_timestamp(ctx); ++ unsigned long long duration_in_ms = ++ dm_get_elapse_time_in_ns( ++ ctx, ++ current_ts, ++ link->link_trace.time_stamp.edp_poweroff) / 1000000; ++ unsigned long long wait_time_ms = 0; ++ ++ /* max 500ms from LCDVDD off to on */ ++ if (link->link_trace.time_stamp.edp_poweroff == 0) ++ wait_time_ms = 500; ++ else if (duration_in_ms < 500) ++ wait_time_ms = 500 - duration_in_ms; ++ ++ if (wait_time_ms) { ++ msleep(wait_time_ms); ++ dm_output_to_console("%s: wait %lld ms to power on eDP.\n", ++ __func__, wait_time_ms); ++ } ++ ++ } + + DC_LOG_HW_RESUME_S3( + "%s: Panel Power action: %s\n", +@@ -862,9 +884,14 @@ void hwss_edp_power_control( + cntl.coherent = false; + cntl.lanes_number = LANE_COUNT_FOUR; + cntl.hpd_sel = link->link_enc->hpd_source; +- + bp_result = link_transmitter_control(ctx->dc_bios, &cntl); + ++ if (!power_up) ++ /*save driver power off time stamp*/ ++ link->link_trace.time_stamp.edp_poweroff = dm_get_timestamp(ctx); ++ else ++ link->link_trace.time_stamp.edp_poweron = dm_get_timestamp(ctx); ++ + if (bp_result != BP_RESULT_OK) + DC_LOG_ERROR( + "%s: Panel Power bp_result: %d\n", +diff --git a/drivers/gpu/drm/amd/display/dc/dm_services.h b/drivers/gpu/drm/amd/display/dc/dm_services.h +index 22e7ee7..8eafe1a 100644 +--- a/drivers/gpu/drm/amd/display/dc/dm_services.h ++++ b/drivers/gpu/drm/amd/display/dc/dm_services.h +@@ -341,6 +341,10 @@ bool dm_dmcu_set_pipe(struct dc_context *ctx, unsigned int controller_id); + + unsigned long long dm_get_timestamp(struct dc_context *ctx); + ++unsigned long long dm_get_elapse_time_in_ns(struct dc_context *ctx, ++ unsigned long long current_time_stamp, ++ unsigned long long last_time_stamp); ++ + /* + * performance tracing + */ +-- +2.7.4 + |