From: Nicholas Kazlauskas <nicholas.kazlaus...@amd.com>

[Why]
Idle optimizations are blocked if there's more than one eDP connector
on the board - blocking S0i3 and IPS2 for static screen.

[How]
Fix the checks to correctly detect number of active eDP.
Also restrict the eDP support to panels that have correct feature
support.

Cc: Mario Limonciello <mario.limoncie...@amd.com>
Cc: Alex Deucher <alexander.deuc...@amd.com>
Cc: sta...@vger.kernel.org
Reviewed-by: Charlene Liu <charlene....@amd.com>
Acked-by: Tom Chung <chiahsuan.ch...@amd.com>
Signed-off-by: Nicholas Kazlauskas <nicholas.kazlaus...@amd.com>
---
 .../amd/display/dc/hwss/dcn35/dcn35_hwseq.c   | 33 +++++++++++++++----
 1 file changed, 27 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c 
b/drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c
index 1c71a5d4ac5d..bddcd23a2727 100644
--- a/drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c
+++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c
@@ -660,22 +660,43 @@ void dcn35_power_down_on_boot(struct dc *dc)
 
 bool dcn35_apply_idle_power_optimizations(struct dc *dc, bool enable)
 {
-       struct dc_link *edp_links[MAX_NUM_EDP];
-       int i, edp_num;
        if (dc->debug.dmcub_emulation)
                return true;
 
        if (enable) {
-               dc_get_edp_links(dc, edp_links, &edp_num);
-               if (edp_num == 0 || edp_num > 1)
-                       return false;
+               uint32_t num_active_edp = 0;
+               int i;
 
                for (i = 0; i < dc->current_state->stream_count; ++i) {
                        struct dc_stream_state *stream = 
dc->current_state->streams[i];
+                       struct dc_link *link = stream->link;
+                       bool is_psr = link && 
!link->panel_config.psr.disable_psr &&
+                                     (link->psr_settings.psr_version == 
DC_PSR_VERSION_1 ||
+                                      link->psr_settings.psr_version == 
DC_PSR_VERSION_SU_1);
+                       bool is_replay = link && 
link->replay_settings.replay_feature_enabled;
+
+                       /* Ignore streams that disabled. */
+                       if (stream->dpms_off)
+                               continue;
+
+                       /* Active external displays block idle optimizations. */
+                       if (!dc_is_embedded_signal(stream->signal))
+                               return false;
+
+                       /* If not PWRSEQ0 can't enter idle optimizations */
+                       if (link && link->link_index != 0)
+                               return false;
 
-                       if (!stream->dpms_off && 
!dc_is_embedded_signal(stream->signal))
+                       /* Check for panel power features required for idle 
optimizations. */
+                       if (!is_psr && !is_replay)
                                return false;
+
+                       num_active_edp += 1;
                }
+
+               /* If more than one active eDP then disallow. */
+               if (num_active_edp > 1)
+                       return false;
        }
 
        // TODO: review other cases when idle optimization is allowed
-- 
2.34.1

Reply via email to