drm/amd/display: Update driver and IPS interop
authorDuncan Ma <duncan.ma@amd.com>
Wed, 16 Aug 2023 16:28:05 +0000 (12:28 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 20 Sep 2023 20:24:08 +0000 (16:24 -0400)
[Why]
Two issues fixed:

1. Currently, driver does not allow idle prior to PSR entry. Once
   PSR1+IPS is enabled, there is intermittent hang due to DCN access
from IrqMgr during IPS2.

2. Driver is sending multiple commands to PMFW and dmcub to exit IPS
   even during IPS0.

[How]
1. Set driver allow optimization prior to entering PSR mode with the
   condition for eDP display only.  Unregister all interrupts before
   allowing driver idle and re-register interrupts when exiting from
   idle. This will prevent IrqMgr to access DCN during IPS2.

2. Block sending PMFW and dmcub exit low power state commands when
   driver is not in idle state.

Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Reviewed-by: Charlene Liu <charlene.liu@amd.com>
Reviewed-by: Jun Lei <jun.lei@amd.com>
Reviewed-by: Aric Cyr <aric.cyr@amd.com>
Acked-by: Qingqing Zhuo <qingqing.zhuo@amd.com>
Signed-off-by: Duncan Ma <duncan.ma@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c
drivers/gpu/drm/amd/display/dc/dcn35/dcn35_hwseq.c

index 2f98dfa06dad1e6391f93cc30068d732cf810b73..91b3a4610957bf7d05f43a4dd2c82a72d22e6473 100644 (file)
@@ -1110,6 +1110,10 @@ void dc_dmub_srv_exit_low_power_state(const struct dc *dc)
 {
        if (dc->debug.dmcub_emulation)
                return;
+
+       if (!dc->idle_optimizations_allowed)
+               return;
+
        // Tell PMFW to exit low power state
        if (dc->clk_mgr->funcs->exit_low_power_state)
                dc->clk_mgr->funcs->exit_low_power_state(dc->clk_mgr);
index 0258491432548ee5946466a83a929b3db41133f5..06960fada059750c5f87ea1d13abeb4a9c7e5eca 100644 (file)
@@ -651,6 +651,8 @@ bool dcn35_apply_idle_power_optimizations(struct dc *dc, bool enable)
                // Tell PMFW to exit low power state
                if (dc->clk_mgr->funcs->exit_low_power_state)
                        dc->clk_mgr->funcs->exit_low_power_state(dc->clk_mgr);
+
+               dc_dmub_srv_is_hw_pwr_up(dc->ctx->dmub_srv, true);
        }
 
        dc_dmub_srv_notify_idle(dc, enable);