aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3553-drm-amd-display-Keep-eDP-stream-enabled-during-boot.patch
diff options
context:
space:
mode:
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.patch133
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
+