diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3106-drm-amd-display-Disable-eDP-with-a-proper-sequence.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3106-drm-amd-display-Disable-eDP-with-a-proper-sequence.patch | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3106-drm-amd-display-Disable-eDP-with-a-proper-sequence.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3106-drm-amd-display-Disable-eDP-with-a-proper-sequence.patch new file mode 100644 index 00000000..1729bc1f --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3106-drm-amd-display-Disable-eDP-with-a-proper-sequence.patch @@ -0,0 +1,162 @@ +From 7311434e3fc7ec4b0791afafe179b03548249e61 Mon Sep 17 00:00:00 2001 +From: Yongqiang Sun <yongqiang.sun@amd.com> +Date: Tue, 19 Dec 2017 11:51:40 -0500 +Subject: [PATCH 3106/4131] drm/amd/display: Disable eDP with a proper + sequence. + +Proper sequence should be: +disable backlight +dp blank +disable output +edp power off + +In enable accelatate mode, all the encoder and controller +are disabled, so move disable eDP to the function is the +easiest way to implement. + +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/core/dc.c | 31 ++---------------- + .../amd/display/dc/dce110/dce110_hw_sequencer.c | 37 ++++++++++++++++++++-- + .../amd/display/dc/dce110/dce110_hw_sequencer.h | 2 +- + drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h | 2 +- + 4 files changed, 39 insertions(+), 33 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c +index 9427eaf..f1ecb2d 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc.c +@@ -649,31 +649,6 @@ bool dc_enable_stereo( + return ret; + } + +-static void disable_eDP_not_in_use(struct dc *dc, struct dc_state *context) +-{ +- int i; +- struct dc_link *link = NULL; +- +- /* check if eDP panel is suppose to be set mode, if yes, no need to disable */ +- for (i = 0; i < context->stream_count; i++) { +- if (context->streams[i]->signal == SIGNAL_TYPE_EDP) +- return; +- } +- +- /* 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; +- } +- } +- +- if (link) { +- dc->hwss.edp_backlight_control(link, false); +- dc->hwss.edp_power_control(link, false); +- } +-} + /* + * Applies given context to HW and copy it into current context. + * It's up to the user to release the src context afterwards. +@@ -691,10 +666,8 @@ static enum dc_status dc_commit_state_no_check(struct dc *dc, struct dc_state *c + for (i = 0; i < context->stream_count; i++) + dc_streams[i] = context->streams[i]; + +- if (!dcb->funcs->is_accelerated_mode(dcb)) { +- dc->hwss.enable_accelerated_mode(dc); +- disable_eDP_not_in_use(dc, context); +- } ++ if (!dcb->funcs->is_accelerated_mode(dcb)) ++ dc->hwss.enable_accelerated_mode(dc, context); + + /* re-program planes for existing stream, in case we need to + * free up plane resource for later use +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 d046212..57bc994 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 +@@ -1407,6 +1407,31 @@ static void disable_vga_and_power_gate_all_controllers( + } + } + ++static struct dc_link *get_link_for_eDP_not_in_use( ++ struct dc *dc, ++ struct dc_state *context) ++{ ++ int i; ++ struct dc_link *link = NULL; ++ ++ /* check if eDP panel is suppose to be set mode, if yes, no need to disable */ ++ for (i = 0; i < context->stream_count; i++) { ++ if (context->streams[i]->signal == SIGNAL_TYPE_EDP) ++ return 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; ++} ++ + /** + * When ASIC goes from VBIOS/VGA mode to driver/accelerated mode we need: + * 1. Power down all DC HW blocks +@@ -1414,11 +1439,19 @@ static void disable_vga_and_power_gate_all_controllers( + * 3. Enable power gating for controller + * 4. Set acc_mode_change bit (VBIOS will clear this bit when going to FSDOS) + */ +-void dce110_enable_accelerated_mode(struct dc *dc) ++void dce110_enable_accelerated_mode(struct dc *dc, struct dc_state *context) + { +- power_down_all_hw_blocks(dc); ++ struct dc_link *eDP_link_to_turnoff = get_link_for_eDP_not_in_use(dc, context); + ++ if (eDP_link_to_turnoff) ++ dc->hwss.edp_backlight_control(eDP_link_to_turnoff, false); ++ ++ power_down_all_hw_blocks(dc); + disable_vga_and_power_gate_all_controllers(dc); ++ ++ if (eDP_link_to_turnoff) ++ dc->hwss.edp_power_control(eDP_link_to_turnoff, false); ++ + bios_set_scratch_acc_mode_change(dc->ctx->dc_bios); + } + +diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.h b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.h +index fc63764..7e1f95a 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.h ++++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.h +@@ -55,7 +55,7 @@ void dce110_unblank_stream(struct pipe_ctx *pipe_ctx, + void dce110_update_info_frame(struct pipe_ctx *pipe_ctx); + + void dce110_set_avmute(struct pipe_ctx *pipe_ctx, bool enable); +-void dce110_enable_accelerated_mode(struct dc *dc); ++void dce110_enable_accelerated_mode(struct dc *dc, struct dc_state *context); + + void dce110_power_down(struct dc *dc); + +diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h b/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h +index 4c0aa56..a904b59 100644 +--- a/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h ++++ b/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h +@@ -114,7 +114,7 @@ struct hw_sequencer_funcs { + + void (*power_down)(struct dc *dc); + +- void (*enable_accelerated_mode)(struct dc *dc); ++ void (*enable_accelerated_mode)(struct dc *dc, struct dc_state *context); + + void (*enable_timing_synchronization)( + struct dc *dc, +-- +2.7.4 + |