[PATCH 10/10] drm/amd/display: Enable Replay for static screen use cases

Harry Wentland harry.wentland at amd.com
Wed Jul 19 19:33:39 UTC 2023



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 at amd.com>
> ---
>  .../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;



More information about the amd-gfx mailing list