]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/amd/display: Set minimum requirement for using PSR-SU on Rembrandt
authorMario Limonciello <mario.limonciello@amd.com>
Fri, 23 Jun 2023 15:05:20 +0000 (10:05 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 3 Aug 2023 08:23:53 +0000 (10:23 +0200)
[ Upstream commit c35b6ea8f2ecfa9d775530b70d4e727869099a9c ]

A number of parade TCONs are causing system hangs when utilized with
older DMUB firmware and PSR-SU. Some changes have been introduced into
DMUB firmware to add resilience against these failures.

Don't allow running PSR-SU unless on the newer firmware.

Cc: stable@vger.kernel.org
Cc: Sean Wang <sean.ns.wang@amd.com>
Cc: Marc Rossi <Marc.Rossi@amd.com>
Cc: Hamza Mahfooz <Hamza.Mahfooz@amd.com>
Cc: Tsung-hua (Ryan) Lin <Tsung-hua.Lin@amd.com>
Link: https://gitlab.freedesktop.org/drm/amd/-/issues/2443
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
Reviewed-by: Leo Li <sunpeng.li@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Stable-dep-of: cd2e31a9ab93 ("drm/amd/display: Set minimum requirement for using PSR-SU on Phoenix")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_psr.c
drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c
drivers/gpu/drm/amd/display/dc/dc_dmub_srv.h
drivers/gpu/drm/amd/display/dmub/dmub_srv.h
drivers/gpu/drm/amd/display/dmub/src/dmub_dcn31.c
drivers/gpu/drm/amd/display/dmub/src/dmub_dcn31.h
drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c

index 872d06fe14364ad1baa9fc706511e980b7ed9874..3eb8794807d2b815cbbf1d347b651e45d3798bb8 100644 (file)
@@ -24,6 +24,7 @@
  */
 
 #include "amdgpu_dm_psr.h"
+#include "dc_dmub_srv.h"
 #include "dc.h"
 #include "dm_helpers.h"
 #include "amdgpu_dm.h"
@@ -50,7 +51,7 @@ static bool link_supports_psrsu(struct dc_link *link)
            !link->dpcd_caps.psr_info.psr2_su_y_granularity_cap)
                return false;
 
-       return true;
+       return dc_dmub_check_min_version(dc->ctx->dmub_srv->dmub);
 }
 
 /*
index a461e9463534be85b0d66f11d9b227900d6744fe..31bb7e782c6b1d910ad0101ec089c934d3b13c46 100644 (file)
@@ -1026,3 +1026,10 @@ void dc_send_update_cursor_info_to_dmu(
                dc_send_cmd_to_dmu(pCtx->stream->ctx->dmub_srv, &cmd);
        }
 }
+
+bool dc_dmub_check_min_version(struct dmub_srv *srv)
+{
+       if (!srv->hw_funcs.is_psrsu_supported)
+               return true;
+       return srv->hw_funcs.is_psrsu_supported(srv);
+}
index d34f5563df2ec374f6c1b0543afc61ddc42b6c28..9a248ced03b9cdad8e42e96c2a3562d834eb2ac6 100644 (file)
@@ -89,4 +89,5 @@ void dc_dmub_setup_subvp_dmub_command(struct dc *dc, struct dc_state *context, b
 void dc_dmub_srv_log_diagnostic_data(struct dc_dmub_srv *dc_dmub_srv);
 
 void dc_send_update_cursor_info_to_dmu(struct pipe_ctx *pCtx, uint8_t pipe_idx);
+bool dc_dmub_check_min_version(struct dmub_srv *srv);
 #endif /* _DMUB_DC_SRV_H_ */
index b53468aca4a9b67a9729d152886b008818c06a6d..5f17b252e9be403734f30903a9920686b5ed4d0d 100644 (file)
@@ -350,6 +350,8 @@ struct dmub_srv_hw_funcs {
 
        bool (*is_supported)(struct dmub_srv *dmub);
 
+       bool (*is_psrsu_supported)(struct dmub_srv *dmub);
+
        bool (*is_hw_init)(struct dmub_srv *dmub);
 
        bool (*is_phy_init)(struct dmub_srv *dmub);
index c90b9ee42e126d67b225eed32b759e0287c8e704..89d24fb7024e2be0cac7839f9ec660dd3dfb2dc4 100644 (file)
@@ -297,6 +297,11 @@ bool dmub_dcn31_is_supported(struct dmub_srv *dmub)
        return supported;
 }
 
+bool dmub_dcn31_is_psrsu_supported(struct dmub_srv *dmub)
+{
+       return dmub->fw_version >= DMUB_FW_VERSION(4, 0, 59);
+}
+
 void dmub_dcn31_set_gpint(struct dmub_srv *dmub,
                          union dmub_gpint_data_register reg)
 {
index f6db6f89d45dc74b6c17a6c506c53a8a0df5ed00..eb62410941473ab5ae6a256bfd233883bd7e8942 100644 (file)
@@ -219,6 +219,8 @@ bool dmub_dcn31_is_hw_init(struct dmub_srv *dmub);
 
 bool dmub_dcn31_is_supported(struct dmub_srv *dmub);
 
+bool dmub_dcn31_is_psrsu_supported(struct dmub_srv *dmub);
+
 void dmub_dcn31_set_gpint(struct dmub_srv *dmub,
                          union dmub_gpint_data_register reg);
 
index 6d76ce327d69f595d1ab8ef75dd6dfdc26c74736..0f43a05a41874a8efe32e390fde5665bcdd4137c 100644 (file)
@@ -227,14 +227,16 @@ static bool dmub_srv_hw_setup(struct dmub_srv *dmub, enum dmub_asic asic)
        case DMUB_ASIC_DCN314:
        case DMUB_ASIC_DCN315:
        case DMUB_ASIC_DCN316:
-               if (asic == DMUB_ASIC_DCN314)
+               if (asic == DMUB_ASIC_DCN314) {
                        dmub->regs_dcn31 = &dmub_srv_dcn314_regs;
-               else if (asic == DMUB_ASIC_DCN315)
+               } else if (asic == DMUB_ASIC_DCN315) {
                        dmub->regs_dcn31 = &dmub_srv_dcn315_regs;
-               else if (asic == DMUB_ASIC_DCN316)
+               } else if (asic == DMUB_ASIC_DCN316) {
                        dmub->regs_dcn31 = &dmub_srv_dcn316_regs;
-               else
+               } else {
                        dmub->regs_dcn31 = &dmub_srv_dcn31_regs;
+                       funcs->is_psrsu_supported = dmub_dcn31_is_psrsu_supported;
+               }
                funcs->reset = dmub_dcn31_reset;
                funcs->reset_release = dmub_dcn31_reset_release;
                funcs->backdoor_load = dmub_dcn31_backdoor_load;