On 2023-07-10 15:27, Bhawanpreet Lakha wrote: > - Setup replay config on device init. > - Enable replay if feature is enabled (prioritize replay over PSR, since > it can be enabled in more usecases) > - Add debug masks to enable replay on supported ASICs > > Signed-off-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@xxxxxxx> > --- > .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 23 +++++++++++++++++++ > .../amd/display/amdgpu_dm/amdgpu_dm_crtc.c | 9 +++++++- > drivers/gpu/drm/amd/include/amd_shared.h | 2 ++ > 3 files changed, 33 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c > index 90bc32a29356..b5aeae693417 100644 > --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c > +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c > @@ -65,6 +65,7 @@ > #include "amdgpu_dm_debugfs.h" > #endif > #include "amdgpu_dm_psr.h" > +#include "amdgpu_dm_replay.h" > > #include "ivsrcid/ivsrcid_vislands30.h" > > @@ -4315,6 +4316,7 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev) > enum dc_connection_type new_connection_type = dc_connection_none; > const struct dc_plane_cap *plane; > bool psr_feature_enabled = false; > + bool replay_feature_enabled = false; > int max_overlay = dm->dc->caps.max_slave_planes; > > dm->display_indexes_num = dm->dc->caps.max_streams; > @@ -4424,6 +4426,20 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev) > } > } > > + if (!(amdgpu_dc_debug_mask & DC_DISABLE_REPLAY)) { > + switch (adev->ip_versions[DCE_HWIP][0]) { > + case IP_VERSION(3, 1, 4): > + case IP_VERSION(3, 1, 5): > + case IP_VERSION(3, 1, 6): > + case IP_VERSION(3, 2, 0): > + case IP_VERSION(3, 2, 1): I imagine we'll want to support replay on all generations going forward. Can was just do a check for >= IP_VERSION(3, 1, 4)? > + replay_feature_enabled = true; > + break; > + default: > + replay_feature_enabled = amdgpu_dc_feature_mask & DC_REPLAY_MASK; > + break; > + } > + } > /* loops over all connectors on the board */ > for (i = 0; i < link_cnt; i++) { > struct dc_link *link = NULL; > @@ -4472,6 +4488,12 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev) > amdgpu_dm_update_connector_after_detect(aconnector); > setup_backlight_device(dm, aconnector); > > + /* > + * Disable psr if replay can be enabled > + */ > + if (replay_feature_enabled && amdgpu_dm_setup_replay(link, aconnector)) > + psr_feature_enabled = false; > + > if (psr_feature_enabled) > amdgpu_dm_set_psr_caps(link); > > @@ -4480,6 +4502,7 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev) > */ > if (link->psr_settings.psr_feature_enabled) > adev_to_drm(adev)->vblank_disable_immediate = false; > + nit: stray newline > } > } > amdgpu_set_panel_orientation(&aconnector->base); > diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c > index 440fc0869a34..fb51ec4f8d31 100644 > --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c > +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c > @@ -29,6 +29,7 @@ > #include "dc.h" > #include "amdgpu.h" > #include "amdgpu_dm_psr.h" > +#include "amdgpu_dm_replay.h" > #include "amdgpu_dm_crtc.h" > #include "amdgpu_dm_plane.h" > #include "amdgpu_dm_trace.h" > @@ -123,7 +124,12 @@ static void vblank_control_worker(struct work_struct *work) > * fill_dc_dirty_rects(). > */ > if (vblank_work->stream && vblank_work->stream->link) { > - if (vblank_work->enable) { > + /* > + * Prioritize replay, instead of psr > + */ > + if (vblank_work->stream->link->replay_settings.replay_feature_enabled) > + amdgpu_dm_replay_enable(vblank_work->stream, false); > + else if (vblank_work->enable) { > if (vblank_work->stream->link->psr_settings.psr_version < DC_PSR_VERSION_SU_1 && > vblank_work->stream->link->psr_settings.psr_allow_active) > amdgpu_dm_psr_disable(vblank_work->stream); > @@ -132,6 +138,7 @@ static void vblank_control_worker(struct work_struct *work) > #ifdef CONFIG_DRM_AMD_SECURE_DISPLAY > !amdgpu_dm_crc_window_is_activated(&vblank_work->acrtc->base) && > #endif > + vblank_work->stream->link->panel_config.psr.disallow_replay && > vblank_work->acrtc->dm_irq_params.allow_psr_entry) { > amdgpu_dm_psr_enable(vblank_work->stream); > } > diff --git a/drivers/gpu/drm/amd/include/amd_shared.h b/drivers/gpu/drm/amd/include/amd_shared.h > index f175e65b853a..c6d4cca646c2 100644 > --- a/drivers/gpu/drm/amd/include/amd_shared.h > +++ b/drivers/gpu/drm/amd/include/amd_shared.h > @@ -240,6 +240,7 @@ enum DC_FEATURE_MASK { > DC_DISABLE_LTTPR_DP2_0 = (1 << 6), //0x40, disabled by default > DC_PSR_ALLOW_SMU_OPT = (1 << 7), //0x80, disabled by default > DC_PSR_ALLOW_MULTI_DISP_OPT = (1 << 8), //0x100, disabled by default > + DC_REPLAY_MASK = (1 << 9), //0x200, disabled by default for dcn < 3.1.4 That "<" should be a ">=", right? Harry > }; > > enum DC_DEBUG_MASK { > @@ -250,6 +251,7 @@ enum DC_DEBUG_MASK { > DC_DISABLE_PSR = 0x10, > DC_FORCE_SUBVP_MCLK_SWITCH = 0x20, > DC_DISABLE_MPO = 0x40, > + DC_DISABLE_REPLAY = 0x50, > }; > > enum amd_dpm_forced_level;