aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/4220-drm-amd-display-Use-dig-enable-to-determine-fast-boo.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/4220-drm-amd-display-Use-dig-enable-to-determine-fast-boo.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/4220-drm-amd-display-Use-dig-enable-to-determine-fast-boo.patch166
1 files changed, 166 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/4220-drm-amd-display-Use-dig-enable-to-determine-fast-boo.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/4220-drm-amd-display-Use-dig-enable-to-determine-fast-boo.patch
new file mode 100644
index 00000000..2d8ded3e
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/4220-drm-amd-display-Use-dig-enable-to-determine-fast-boo.patch
@@ -0,0 +1,166 @@
+From 0666d10c5c6fa478c7fb0b229520cbef053377e2 Mon Sep 17 00:00:00 2001
+From: Yongqiang Sun <yongqiang.sun@amd.com>
+Date: Mon, 9 Apr 2018 16:15:20 -0400
+Subject: [PATCH 4220/5725] drm/amd/display: Use dig enable to determine fast
+ boot optimization.
+
+Linux doesn't know lid state, better to check dig enable
+value from register.
+
+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>
+---
+ drivers/gpu/drm/amd/display/dc/dc_stream.h | 1 -
+ .../gpu/drm/amd/display/dc/dce/dce_link_encoder.c | 6 ++-
+ .../gpu/drm/amd/display/dc/dce/dce_link_encoder.h | 2 +
+ .../amd/display/dc/dce110/dce110_hw_sequencer.c | 47 +++++++---------------
+ .../gpu/drm/amd/display/dc/inc/hw/link_encoder.h | 1 +
+ 5 files changed, 21 insertions(+), 36 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dc_stream.h b/drivers/gpu/drm/amd/display/dc/dc_stream.h
+index 4750768..aefc76b 100644
+--- a/drivers/gpu/drm/amd/display/dc/dc_stream.h
++++ b/drivers/gpu/drm/amd/display/dc/dc_stream.h
+@@ -98,7 +98,6 @@ struct dc_stream_state {
+ int phy_pix_clk;
+ enum signal_type signal;
+ bool dpms_off;
+- bool lid_state_closed;
+
+ struct dc_stream_status status;
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c
+index 8167cad..dbe3b26 100644
+--- a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c
++++ b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c
+@@ -113,6 +113,7 @@ static const struct link_encoder_funcs dce110_lnk_enc_funcs = {
+ .connect_dig_be_to_fe = dce110_link_encoder_connect_dig_be_to_fe,
+ .enable_hpd = dce110_link_encoder_enable_hpd,
+ .disable_hpd = dce110_link_encoder_disable_hpd,
++ .is_dig_enabled = dce110_is_dig_enabled,
+ .destroy = dce110_link_encoder_destroy
+ };
+
+@@ -535,8 +536,9 @@ void dce110_psr_program_secondary_packet(struct link_encoder *enc,
+ DP_SEC_GSP0_PRIORITY, 1);
+ }
+
+-static bool is_dig_enabled(const struct dce110_link_encoder *enc110)
++bool dce110_is_dig_enabled(struct link_encoder *enc)
+ {
++ struct dce110_link_encoder *enc110 = TO_DCE110_LINK_ENC(enc);
+ uint32_t value;
+
+ REG_GET(DIG_BE_EN_CNTL, DIG_ENABLE, &value);
+@@ -1031,7 +1033,7 @@ void dce110_link_encoder_disable_output(
+ struct bp_transmitter_control cntl = { 0 };
+ enum bp_result result;
+
+- if (!is_dig_enabled(enc110)) {
++ if (!dce110_is_dig_enabled(enc)) {
+ /* OF_SKIP_POWER_DOWN_INACTIVE_ENCODER */
+ return;
+ }
+diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.h b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.h
+index 0ec3433..3470694 100644
+--- a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.h
++++ b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.h
+@@ -263,4 +263,6 @@ void dce110_psr_program_dp_dphy_fast_training(struct link_encoder *enc,
+ void dce110_psr_program_secondary_packet(struct link_encoder *enc,
+ unsigned int sdp_transmit_line_num_deadline);
+
++bool dce110_is_dig_enabled(struct link_encoder *enc);
++
+ #endif /* __DC_LINK_ENCODER__DCE110_H__ */
+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 3920310..0c92348 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
+@@ -1481,15 +1481,15 @@ static void disable_vga_and_power_gate_all_controllers(
+ }
+ }
+
+-static bool is_eDP_lid_closed(struct dc_state *context)
++static struct dc_link *get_link_for_edp(struct dc *dc)
+ {
+ int i;
+
+- for (i = 0; i < context->stream_count; i++) {
+- if (context->streams[i]->signal == SIGNAL_TYPE_EDP)
+- return context->streams[i]->lid_state_closed;
++ for (i = 0; i < dc->link_count; i++) {
++ if (dc->links[i]->connector_signal == SIGNAL_TYPE_EDP)
++ return dc->links[i];
+ }
+- return false;
++ return NULL;
+ }
+
+ static struct dc_link *get_link_for_edp_not_in_use(
+@@ -1526,41 +1526,22 @@ static struct dc_link *get_link_for_edp_not_in_use(
+ */
+ void dce110_enable_accelerated_mode(struct dc *dc, struct dc_state *context)
+ {
+- /* check eDP lid state and BIOS_SCRATCH_3 to determine fast boot optimization
+- * UEFI boot
+- * edp_active_status_from_scratch fast boot optimization
+- * S4/S5 resume:
+- * Lid Open true true
+- * Lid Close false false
+- *
+- * S3/ resume:
+- * Lid Open false false
+- * Lid Close false false
+- *
+- * Legacy boot:
+- * edp_active_status_from_scratch fast boot optimization
+- * S4/S resume:
+- * Lid Open true true
+- * Lid Close true false
+- *
+- * S3/ resume:
+- * Lid Open false false
+- * Lid Close false false
+- */
+- struct dc_bios *dcb = dc->ctx->dc_bios;
+- bool lid_state_closed = is_eDP_lid_closed(context);
+ struct dc_link *edp_link_to_turnoff = NULL;
+- bool edp_active_status_from_scratch =
+- (dcb->funcs->get_vga_enabled_displays(dc->ctx->dc_bios) == ATOM_DISPLAY_LCD1_ACTIVE);
++ struct dc_link *edp_link = get_link_for_edp(dc);
++ bool can_eDP_fast_boot_optimize = false;
++
++ if (edp_link) {
++ can_eDP_fast_boot_optimize =
++ edp_link->link_enc->funcs->is_dig_enabled(edp_link->link_enc);
++ }
+
+- /*Lid open*/
+- if (!lid_state_closed) {
++ if (can_eDP_fast_boot_optimize) {
+ edp_link_to_turnoff = get_link_for_edp_not_in_use(dc, context);
+
+ /* if OS doesn't light up eDP and eDP link is available, we want to disable
+ * If resume from S4/S5, should optimization.
+ */
+- if (!edp_link_to_turnoff && edp_active_status_from_scratch)
++ if (!edp_link_to_turnoff)
+ dc->apply_edp_fast_boot_optimization = true;
+ }
+
+diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/link_encoder.h b/drivers/gpu/drm/amd/display/dc/inc/hw/link_encoder.h
+index 54d8a13..cf6df2e 100644
+--- a/drivers/gpu/drm/amd/display/dc/inc/hw/link_encoder.h
++++ b/drivers/gpu/drm/amd/display/dc/inc/hw/link_encoder.h
+@@ -149,6 +149,7 @@ struct link_encoder_funcs {
+ bool connect);
+ void (*enable_hpd)(struct link_encoder *enc);
+ void (*disable_hpd)(struct link_encoder *enc);
++ bool (*is_dig_enabled)(struct link_encoder *enc);
+ void (*destroy)(struct link_encoder **enc);
+ };
+
+--
+2.7.4
+