Skip to content

Commit c35b6ea

Browse files
superm1alexdeucher
authored andcommitted
drm/amd/display: Set minimum requirement for using PSR-SU on Rembrandt
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: [email protected] Cc: Sean Wang <[email protected]> Cc: Marc Rossi <[email protected]> Cc: Hamza Mahfooz <[email protected]> Cc: Tsung-hua (Ryan) Lin <[email protected]> Link: https://gitlab.freedesktop.org/drm/amd/-/issues/2443 Signed-off-by: Mario Limonciello <[email protected]> Reviewed-by: Leo Li <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent 274d205 commit c35b6ea

File tree

7 files changed

+25
-5
lines changed

7 files changed

+25
-5
lines changed

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_psr.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
*/
2525

2626
#include "amdgpu_dm_psr.h"
27+
#include "dc_dmub_srv.h"
2728
#include "dc.h"
2829
#include "dm_helpers.h"
2930
#include "amdgpu_dm.h"
@@ -50,7 +51,7 @@ static bool link_supports_psrsu(struct dc_link *link)
5051
!link->dpcd_caps.psr_info.psr2_su_y_granularity_cap)
5152
return false;
5253

53-
return true;
54+
return dc_dmub_check_min_version(dc->ctx->dmub_srv->dmub);
5455
}
5556

5657
/*

drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1011,3 +1011,10 @@ void dc_send_update_cursor_info_to_dmu(
10111011
dm_execute_dmub_cmd_list(pCtx->stream->ctx, 2, cmd, DM_DMUB_WAIT_TYPE_WAIT);
10121012
}
10131013
}
1014+
1015+
bool dc_dmub_check_min_version(struct dmub_srv *srv)
1016+
{
1017+
if (!srv->hw_funcs.is_psrsu_supported)
1018+
return true;
1019+
return srv->hw_funcs.is_psrsu_supported(srv);
1020+
}

drivers/gpu/drm/amd/display/dc/dc_dmub_srv.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,4 +86,5 @@ void dc_dmub_setup_subvp_dmub_command(struct dc *dc, struct dc_state *context, b
8686
void dc_dmub_srv_log_diagnostic_data(struct dc_dmub_srv *dc_dmub_srv);
8787

8888
void dc_send_update_cursor_info_to_dmu(struct pipe_ctx *pCtx, uint8_t pipe_idx);
89+
bool dc_dmub_check_min_version(struct dmub_srv *srv);
8990
#endif /* _DMUB_DC_SRV_H_ */

drivers/gpu/drm/amd/display/dmub/dmub_srv.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,8 @@ struct dmub_srv_hw_funcs {
367367

368368
bool (*is_supported)(struct dmub_srv *dmub);
369369

370+
bool (*is_psrsu_supported)(struct dmub_srv *dmub);
371+
370372
bool (*is_hw_init)(struct dmub_srv *dmub);
371373

372374
void (*enable_dmub_boot_options)(struct dmub_srv *dmub,

drivers/gpu/drm/amd/display/dmub/src/dmub_dcn31.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,11 @@ bool dmub_dcn31_is_supported(struct dmub_srv *dmub)
302302
return supported;
303303
}
304304

305+
bool dmub_dcn31_is_psrsu_supported(struct dmub_srv *dmub)
306+
{
307+
return dmub->fw_version >= DMUB_FW_VERSION(4, 0, 59);
308+
}
309+
305310
void dmub_dcn31_set_gpint(struct dmub_srv *dmub,
306311
union dmub_gpint_data_register reg)
307312
{

drivers/gpu/drm/amd/display/dmub/src/dmub_dcn31.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,8 @@ bool dmub_dcn31_is_hw_init(struct dmub_srv *dmub);
221221

222222
bool dmub_dcn31_is_supported(struct dmub_srv *dmub);
223223

224+
bool dmub_dcn31_is_psrsu_supported(struct dmub_srv *dmub);
225+
224226
void dmub_dcn31_set_gpint(struct dmub_srv *dmub,
225227
union dmub_gpint_data_register reg);
226228

drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -226,14 +226,16 @@ static bool dmub_srv_hw_setup(struct dmub_srv *dmub, enum dmub_asic asic)
226226
case DMUB_ASIC_DCN314:
227227
case DMUB_ASIC_DCN315:
228228
case DMUB_ASIC_DCN316:
229-
if (asic == DMUB_ASIC_DCN314)
229+
if (asic == DMUB_ASIC_DCN314) {
230230
dmub->regs_dcn31 = &dmub_srv_dcn314_regs;
231-
else if (asic == DMUB_ASIC_DCN315)
231+
} else if (asic == DMUB_ASIC_DCN315) {
232232
dmub->regs_dcn31 = &dmub_srv_dcn315_regs;
233-
else if (asic == DMUB_ASIC_DCN316)
233+
} else if (asic == DMUB_ASIC_DCN316) {
234234
dmub->regs_dcn31 = &dmub_srv_dcn316_regs;
235-
else
235+
} else {
236236
dmub->regs_dcn31 = &dmub_srv_dcn31_regs;
237+
funcs->is_psrsu_supported = dmub_dcn31_is_psrsu_supported;
238+
}
237239
funcs->reset = dmub_dcn31_reset;
238240
funcs->reset_release = dmub_dcn31_reset_release;
239241
funcs->backdoor_load = dmub_dcn31_backdoor_load;

0 commit comments

Comments
 (0)