From: Jake Wang <haonan.wa...@amd.com>

[ Upstream commit 3addbde269f21ffc735f6d3d0c2237664923824e ]

[Why]
During headless boot, DIG may be on which causes HW/SW discrepancies.
To avoid this we power down hardware on boot if DIG is turned on. With
introduction of multiple eDP, hardware power down is being bypassed
under certain conditions.

[How]
Fixed hardware power down bypass, and ensured hardware will power down
if DIG is on and seamless boot is not enabled.

Reviewed-by: Nicholas Kazlauskas <nicholas.kazlaus...@amd.com>
Acked-by: Rodrigo Siqueira <rodrigo.sique...@amd.com>
Signed-off-by: Jake Wang <haonan.wa...@amd.com>
Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 .../amd/display/dc/dcn10/dcn10_hw_sequencer.c | 27 +++++++++----------
 .../drm/amd/display/dc/dcn30/dcn30_hwseq.c    | 25 ++++++++---------
 .../drm/amd/display/dc/dcn31/dcn31_hwseq.c    |  5 +++-
 3 files changed, 27 insertions(+), 30 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c 
b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
index c545eddabdcc..dee1ce5f9609 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
@@ -1502,25 +1502,22 @@ void dcn10_init_hw(struct dc *dc)
 void dcn10_power_down_on_boot(struct dc *dc)
 {
        struct dc_link *edp_links[MAX_NUM_EDP];
-       struct dc_link *edp_link;
+       struct dc_link *edp_link = NULL;
        int edp_num;
        int i = 0;
 
        get_edp_links(dc, edp_links, &edp_num);
-
-       if (edp_num) {
-               for (i = 0; i < edp_num; i++) {
-                       edp_link = edp_links[i];
-                       if (edp_link->link_enc->funcs->is_dig_enabled &&
-                                       
edp_link->link_enc->funcs->is_dig_enabled(edp_link->link_enc) &&
-                                       dc->hwseq->funcs.edp_backlight_control 
&&
-                                       dc->hwss.power_down &&
-                                       dc->hwss.edp_power_control) {
-                               
dc->hwseq->funcs.edp_backlight_control(edp_link, false);
-                               dc->hwss.power_down(dc);
-                               dc->hwss.edp_power_control(edp_link, false);
-                       }
-               }
+       if (edp_num)
+               edp_link = edp_links[0];
+
+       if (edp_link && edp_link->link_enc->funcs->is_dig_enabled &&
+                       
edp_link->link_enc->funcs->is_dig_enabled(edp_link->link_enc) &&
+                       dc->hwseq->funcs.edp_backlight_control &&
+                       dc->hwss.power_down &&
+                       dc->hwss.edp_power_control) {
+               dc->hwseq->funcs.edp_backlight_control(edp_link, false);
+               dc->hwss.power_down(dc);
+               dc->hwss.edp_power_control(edp_link, false);
        } else {
                for (i = 0; i < dc->link_count; i++) {
                        struct dc_link *link = dc->links[i];
diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c 
b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c
index c68e3a708a33..2e8ab9775fa3 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c
@@ -580,22 +580,19 @@ void dcn30_init_hw(struct dc *dc)
         */
        if (dc->config.power_down_display_on_boot) {
                struct dc_link *edp_links[MAX_NUM_EDP];
-               struct dc_link *edp_link;
+               struct dc_link *edp_link = NULL;
 
                get_edp_links(dc, edp_links, &edp_num);
-               if (edp_num) {
-                       for (i = 0; i < edp_num; i++) {
-                               edp_link = edp_links[i];
-                               if (edp_link->link_enc->funcs->is_dig_enabled &&
-                                               
edp_link->link_enc->funcs->is_dig_enabled(edp_link->link_enc) &&
-                                               dc->hwss.edp_backlight_control 
&&
-                                               dc->hwss.power_down &&
-                                               dc->hwss.edp_power_control) {
-                                       
dc->hwss.edp_backlight_control(edp_link, false);
-                                       dc->hwss.power_down(dc);
-                                       dc->hwss.edp_power_control(edp_link, 
false);
-                               }
-                       }
+               if (edp_num)
+                       edp_link = edp_links[0];
+               if (edp_link && edp_link->link_enc->funcs->is_dig_enabled &&
+                               
edp_link->link_enc->funcs->is_dig_enabled(edp_link->link_enc) &&
+                               dc->hwss.edp_backlight_control &&
+                               dc->hwss.power_down &&
+                               dc->hwss.edp_power_control) {
+                       dc->hwss.edp_backlight_control(edp_link, false);
+                       dc->hwss.power_down(dc);
+                       dc->hwss.edp_power_control(edp_link, false);
                } else {
                        for (i = 0; i < dc->link_count; i++) {
                                struct dc_link *link = dc->links[i];
diff --git a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c 
b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c
index 8a2119d8ca0d..8189606537c5 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c
@@ -226,6 +226,7 @@ void dcn31_init_hw(struct dc *dc)
        if (dc->config.power_down_display_on_boot) {
                struct dc_link *edp_links[MAX_NUM_EDP];
                struct dc_link *edp_link;
+               bool power_down = false;
 
                get_edp_links(dc, edp_links, &edp_num);
                if (edp_num) {
@@ -239,9 +240,11 @@ void dcn31_init_hw(struct dc *dc)
                                        
dc->hwss.edp_backlight_control(edp_link, false);
                                        dc->hwss.power_down(dc);
                                        dc->hwss.edp_power_control(edp_link, 
false);
+                                       power_down = true;
                                }
                        }
-               } else {
+               }
+               if (!power_down) {
                        for (i = 0; i < dc->link_count; i++) {
                                struct dc_link *link = dc->links[i];
 
-- 
2.30.2

Reply via email to