mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 18:41:58 +09:00
drm/amd/display: Set minimum requirement for using PSR-SU on Rembrandt
[ Upstream commitc35b6ea8f2] 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:cd2e31a9ab("drm/amd/display: Set minimum requirement for using PSR-SU on Phoenix") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
41c666e2b7
commit
f8b61a2c29
@@ -24,6 +24,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "amdgpu_dm_psr.h"
|
#include "amdgpu_dm_psr.h"
|
||||||
|
#include "dc_dmub_srv.h"
|
||||||
#include "dc.h"
|
#include "dc.h"
|
||||||
#include "dm_helpers.h"
|
#include "dm_helpers.h"
|
||||||
#include "amdgpu_dm.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)
|
!link->dpcd_caps.psr_info.psr2_su_y_granularity_cap)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return true;
|
return dc_dmub_check_min_version(dc->ctx->dmub_srv->dmub);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -1026,3 +1026,10 @@ void dc_send_update_cursor_info_to_dmu(
|
|||||||
dc_send_cmd_to_dmu(pCtx->stream->ctx->dmub_srv, &cmd);
|
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);
|
||||||
|
}
|
||||||
|
|||||||
@@ -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_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);
|
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_ */
|
#endif /* _DMUB_DC_SRV_H_ */
|
||||||
|
|||||||
@@ -350,6 +350,8 @@ struct dmub_srv_hw_funcs {
|
|||||||
|
|
||||||
bool (*is_supported)(struct dmub_srv *dmub);
|
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_hw_init)(struct dmub_srv *dmub);
|
||||||
|
|
||||||
bool (*is_phy_init)(struct dmub_srv *dmub);
|
bool (*is_phy_init)(struct dmub_srv *dmub);
|
||||||
|
|||||||
@@ -297,6 +297,11 @@ bool dmub_dcn31_is_supported(struct dmub_srv *dmub)
|
|||||||
return supported;
|
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,
|
void dmub_dcn31_set_gpint(struct dmub_srv *dmub,
|
||||||
union dmub_gpint_data_register reg)
|
union dmub_gpint_data_register reg)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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_supported(struct dmub_srv *dmub);
|
||||||
|
|
||||||
|
bool dmub_dcn31_is_psrsu_supported(struct dmub_srv *dmub);
|
||||||
|
|
||||||
void dmub_dcn31_set_gpint(struct dmub_srv *dmub,
|
void dmub_dcn31_set_gpint(struct dmub_srv *dmub,
|
||||||
union dmub_gpint_data_register reg);
|
union dmub_gpint_data_register reg);
|
||||||
|
|
||||||
|
|||||||
@@ -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_DCN314:
|
||||||
case DMUB_ASIC_DCN315:
|
case DMUB_ASIC_DCN315:
|
||||||
case DMUB_ASIC_DCN316:
|
case DMUB_ASIC_DCN316:
|
||||||
if (asic == DMUB_ASIC_DCN314)
|
if (asic == DMUB_ASIC_DCN314) {
|
||||||
dmub->regs_dcn31 = &dmub_srv_dcn314_regs;
|
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;
|
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;
|
dmub->regs_dcn31 = &dmub_srv_dcn316_regs;
|
||||||
else
|
} else {
|
||||||
dmub->regs_dcn31 = &dmub_srv_dcn31_regs;
|
dmub->regs_dcn31 = &dmub_srv_dcn31_regs;
|
||||||
|
funcs->is_psrsu_supported = dmub_dcn31_is_psrsu_supported;
|
||||||
|
}
|
||||||
funcs->reset = dmub_dcn31_reset;
|
funcs->reset = dmub_dcn31_reset;
|
||||||
funcs->reset_release = dmub_dcn31_reset_release;
|
funcs->reset_release = dmub_dcn31_reset_release;
|
||||||
funcs->backdoor_load = dmub_dcn31_backdoor_load;
|
funcs->backdoor_load = dmub_dcn31_backdoor_load;
|
||||||
|
|||||||
Reference in New Issue
Block a user