diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3553-drm-amd-display-Keep-eDP-stream-enabled-during-boot.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3553-drm-amd-display-Keep-eDP-stream-enabled-during-boot.patch | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3553-drm-amd-display-Keep-eDP-stream-enabled-during-boot.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3553-drm-amd-display-Keep-eDP-stream-enabled-during-boot.patch new file mode 100644 index 00000000..489da555 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3553-drm-amd-display-Keep-eDP-stream-enabled-during-boot.patch @@ -0,0 +1,133 @@ +From e91517e75f45c6a86200d1f45c5674feea3da782 Mon Sep 17 00:00:00 2001 +From: Yongqiang Sun <yongqiang.sun@amd.com> +Date: Fri, 2 Feb 2018 17:35:00 -0500 +Subject: [PATCH 3553/4131] drm/amd/display: Keep eDP stream enabled during + boot. + +This path fixed specific eDP panel cold boot black screen +due to unnecessary enable link. +Change: +In case of boot up with eDP, if OS is going to set mode +on eDP, keep eDP light up, do not disable and reset corresponding +HW. +This change may affect dce asics and S3/S4 Resume with multi-monitor. + +Signed-off-by: Yongqiang Sun <yongqiang.sun@amd.com> +Reviewed-by: Tony Cheng <Tony.Cheng@amd.com> +Acked-by: Harry Wentland <harry.wentland@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/display/dc/core/dc_link.c | 11 +++++- + drivers/gpu/drm/amd/display/dc/dc.h | 2 + + .../amd/display/dc/dce110/dce110_hw_sequencer.c | 45 +++++++++++----------- + 3 files changed, 34 insertions(+), 24 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c +index 9ede0f8..44b12f04 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c +@@ -2296,7 +2296,16 @@ void core_link_enable_stream( + { + struct dc *core_dc = pipe_ctx->stream->ctx->dc; + +- enum dc_status status = enable_link(state, pipe_ctx); ++ enum dc_status status; ++ ++ /* eDP lit up by bios already, no need to enable again. */ ++ if (pipe_ctx->stream->signal == SIGNAL_TYPE_EDP && ++ core_dc->apply_edp_fast_boot_optimization) { ++ core_dc->apply_edp_fast_boot_optimization = false; ++ return; ++ } ++ ++ status = enable_link(state, pipe_ctx); + + if (status != DC_OK) { + dm_logger_write(pipe_ctx->stream->ctx->logger, +diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h +index 77cece4..f8816972 100644 +--- a/drivers/gpu/drm/amd/display/dc/dc.h ++++ b/drivers/gpu/drm/amd/display/dc/dc.h +@@ -257,6 +257,8 @@ struct dc { + + bool optimized_required; + ++ bool apply_edp_fast_boot_optimization; ++ + /* FBC compressor */ + #if defined(CONFIG_DRM_AMD_DC_FBC) + struct compressor *fbc_compressor; +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 5c387e8..9e97cd74 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 +@@ -57,6 +57,8 @@ + #include "dce/dce_11_0_sh_mask.h" + #include "custom_float.h" + ++#include "atomfirmware.h" ++ + /* + * All values are in milliseconds; + * For eDP, after power-up/power/down, +@@ -1425,23 +1427,6 @@ static void disable_vga_and_power_gate_all_controllers( + } + } + +-static struct dc_link *get_link_for_edp( +- struct dc *dc) +-{ +- int i; +- struct dc_link *link = NULL; +- +- /* check if there is an eDP panel not in use */ +- for (i = 0; i < dc->link_count; i++) { +- if (dc->links[i]->local_sink && +- dc->links[i]->local_sink->sink_signal == SIGNAL_TYPE_EDP) { +- link = dc->links[i]; +- break; +- } +- } +- +- return link; +-} + static struct dc_link *get_link_for_edp_not_in_use( + struct dc *dc, + struct dc_state *context) +@@ -1477,13 +1462,27 @@ static struct dc_link *get_link_for_edp_not_in_use( + void dce110_enable_accelerated_mode(struct dc *dc, struct dc_state *context) + { + struct dc_bios *dcb = dc->ctx->dc_bios; +- struct dc_link *edp_link_to_turnoff = get_link_for_edp_not_in_use(dc, context); + +- struct dc_link *edp_link = get_link_for_edp(dc); +- if (dcb->funcs->get_vga_enabled_displays(dc->ctx->dc_bios) != 0) { +- if (edp_link) { +- /*we need turn off backlight before DP_blank and encoder powered down, todo add optimization*/ +- dc->hwss.edp_backlight_control(edp_link, false); ++ /* vbios already light up eDP, so we can leverage vbios and skip eDP ++ * programming ++ */ ++ bool can_eDP_fast_boot_optimize = ++ (dcb->funcs->get_vga_enabled_displays(dc->ctx->dc_bios) == ATOM_DISPLAY_LCD1_ACTIVE); ++ ++ /* if OS doesn't light up eDP and eDP link is available, we want to disable */ ++ struct dc_link *edp_link_to_turnoff = NULL; ++ ++ if (can_eDP_fast_boot_optimize) { ++ edp_link_to_turnoff = get_link_for_edp_not_in_use(dc, context); ++ ++ if (!edp_link_to_turnoff) ++ dc->apply_edp_fast_boot_optimization = true; ++ } ++ ++ if (!dc->apply_edp_fast_boot_optimization) { ++ if (edp_link_to_turnoff) { ++ /*turn off backlight before DP_blank and encoder powered down*/ ++ dc->hwss.edp_backlight_control(edp_link_to_turnoff, false); + } + /*resume from S3, no vbios posting, no need to power down again*/ + power_down_all_hw_blocks(dc); +-- +2.7.4 + |