From: Duncan Ma Date: Wed, 16 Aug 2023 16:28:05 +0000 (-0400) Subject: drm/amd/display: Update driver and IPS interop X-Git-Tag: v6.7-rc1~145^2~10^2~299 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=dc01c4b79bfe052ef0f9624b5e6ea9b05347f5f0;p=thirdparty%2Fkernel%2Flinux.git drm/amd/display: Update driver and IPS interop [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 Reviewed-by: Charlene Liu Reviewed-by: Jun Lei Reviewed-by: Aric Cyr Acked-by: Qingqing Zhuo Signed-off-by: Duncan Ma Signed-off-by: Alex Deucher --- diff --git a/drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c b/drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c index 2f98dfa06dad1..91b3a4610957b 100644 --- a/drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c +++ b/drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c @@ -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); diff --git a/drivers/gpu/drm/amd/display/dc/dcn35/dcn35_hwseq.c b/drivers/gpu/drm/amd/display/dc/dcn35/dcn35_hwseq.c index 0258491432548..06960fada0597 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn35/dcn35_hwseq.c +++ b/drivers/gpu/drm/amd/display/dc/dcn35/dcn35_hwseq.c @@ -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);