summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/amd/display/dc/dce110
diff options
context:
space:
mode:
authorYongqiang Sun <yongqiang.sun@amd.com>2018-02-02 17:35:00 -0500
committerAlex Deucher <alexander.deucher@amd.com>2018-02-19 14:20:03 -0500
commit4cac1e6d2ffaddcdd054abf73c3a3c30eb659099 (patch)
treeb8624beb1acc57e74b6424b63cfc2675bae43bc7 /drivers/gpu/drm/amd/display/dc/dce110
parent75023034c0e575b068c39d3d632c010672dd780a (diff)
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>
Diffstat (limited to 'drivers/gpu/drm/amd/display/dc/dce110')
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c45
1 files changed, 22 insertions, 23 deletions
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 5c387e8d58a2..9e97cd74b0ec 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);