diff options
Diffstat (limited to 'drivers/gpu/drm/amd/display/amdgpu_dm')
| -rw-r--r-- | drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 22 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c | 9 | 
2 files changed, 30 insertions, 1 deletions
| 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 268cb99a4c4b..f2b4f1720abd 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" @@ -4265,6 +4266,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; @@ -4374,6 +4376,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): +			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; @@ -4422,6 +4438,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); 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 30d4c6fd95f5..97b7a0b8a1c2 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);  		} |