diff options
Diffstat (limited to 'drivers/gpu/drm/amd/display')
3 files changed, 34 insertions, 17 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 14ba5eeb974f..deb8010efc69 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -6794,14 +6794,15 @@ const struct drm_encoder_helper_funcs amdgpu_dm_encoder_helper_funcs = {  #if defined(CONFIG_DRM_AMD_DC_DCN)  static int dm_update_mst_vcpi_slots_for_dsc(struct drm_atomic_state *state, -					    struct dc_state *dc_state) +					    struct dc_state *dc_state, +					    struct dsc_mst_fairness_vars *vars)  {  	struct dc_stream_state *stream = NULL;  	struct drm_connector *connector;  	struct drm_connector_state *new_con_state;  	struct amdgpu_dm_connector *aconnector;  	struct dm_connector_state *dm_conn_state; -	int i, j, clock, bpp; +	int i, j, clock;  	int vcpi, pbn_div, pbn = 0;  	for_each_new_connector_in_state(state, connector, new_con_state, i) { @@ -6840,9 +6841,15 @@ static int dm_update_mst_vcpi_slots_for_dsc(struct drm_atomic_state *state,  		}  		pbn_div = dm_mst_get_pbn_divider(stream->link); -		bpp = stream->timing.dsc_cfg.bits_per_pixel;  		clock = stream->timing.pix_clk_100hz / 10; -		pbn = drm_dp_calc_pbn_mode(clock, bpp, true); +		/* pbn is calculated by compute_mst_dsc_configs_for_state*/ +		for (j = 0; j < dc_state->stream_count; j++) { +			if (vars[j].aconnector == aconnector) { +				pbn = vars[j].pbn; +				break; +			} +		} +  		vcpi = drm_dp_mst_atomic_enable_dsc(state,  						    aconnector->port,  						    pbn, pbn_div, @@ -10247,6 +10254,9 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,  	int ret, i;  	bool lock_and_validation_needed = false;  	struct dm_crtc_state *dm_old_crtc_state; +#if defined(CONFIG_DRM_AMD_DC_DCN) +	struct dsc_mst_fairness_vars vars[MAX_PIPES]; +#endif  	trace_amdgpu_dm_atomic_check_begin(state); @@ -10477,10 +10487,10 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,  			goto fail;  #if defined(CONFIG_DRM_AMD_DC_DCN) -		if (!compute_mst_dsc_configs_for_state(state, dm_state->context)) +		if (!compute_mst_dsc_configs_for_state(state, dm_state->context, vars))  			goto fail; -		ret = dm_update_mst_vcpi_slots_for_dsc(state, dm_state->context); +		ret = dm_update_mst_vcpi_slots_for_dsc(state, dm_state->context, vars);  		if (ret)  			goto fail;  #endif diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c index 1bcba6943fd7..7af0d58c231b 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c @@ -518,12 +518,7 @@ struct dsc_mst_fairness_params {  	uint32_t num_slices_h;  	uint32_t num_slices_v;  	uint32_t bpp_overwrite; -}; - -struct dsc_mst_fairness_vars { -	int pbn; -	bool dsc_enabled; -	int bpp_x16; +	struct amdgpu_dm_connector *aconnector;  };  static int kbps_to_peak_pbn(int kbps) @@ -750,12 +745,12 @@ static void try_disable_dsc(struct drm_atomic_state *state,  static bool compute_mst_dsc_configs_for_link(struct drm_atomic_state *state,  					     struct dc_state *dc_state, -					     struct dc_link *dc_link) +					     struct dc_link *dc_link, +					     struct dsc_mst_fairness_vars *vars)  {  	int i;  	struct dc_stream_state *stream;  	struct dsc_mst_fairness_params params[MAX_PIPES]; -	struct dsc_mst_fairness_vars vars[MAX_PIPES];  	struct amdgpu_dm_connector *aconnector;  	int count = 0;  	bool debugfs_overwrite = false; @@ -776,6 +771,7 @@ static bool compute_mst_dsc_configs_for_link(struct drm_atomic_state *state,  		params[count].timing = &stream->timing;  		params[count].sink = stream->sink;  		aconnector = (struct amdgpu_dm_connector *)stream->dm_stream_context; +		params[count].aconnector = aconnector;  		params[count].port = aconnector->port;  		params[count].clock_force_enable = aconnector->dsc_settings.dsc_force_enable;  		if (params[count].clock_force_enable == DSC_CLK_FORCE_ENABLE) @@ -798,6 +794,7 @@ static bool compute_mst_dsc_configs_for_link(struct drm_atomic_state *state,  	}  	/* Try no compression */  	for (i = 0; i < count; i++) { +		vars[i].aconnector = params[i].aconnector;  		vars[i].pbn = kbps_to_peak_pbn(params[i].bw_range.stream_kbps);  		vars[i].dsc_enabled = false;  		vars[i].bpp_x16 = 0; @@ -851,7 +848,8 @@ static bool compute_mst_dsc_configs_for_link(struct drm_atomic_state *state,  }  bool compute_mst_dsc_configs_for_state(struct drm_atomic_state *state, -				       struct dc_state *dc_state) +				       struct dc_state *dc_state, +				       struct dsc_mst_fairness_vars *vars)  {  	int i, j;  	struct dc_stream_state *stream; @@ -882,7 +880,7 @@ bool compute_mst_dsc_configs_for_state(struct drm_atomic_state *state,  			return false;  		mutex_lock(&aconnector->mst_mgr.lock); -		if (!compute_mst_dsc_configs_for_link(state, dc_state, stream->link)) { +		if (!compute_mst_dsc_configs_for_link(state, dc_state, stream->link, vars)) {  			mutex_unlock(&aconnector->mst_mgr.lock);  			return false;  		} diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.h index b38bd68121ce..900d3f7a8498 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.h +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.h @@ -39,8 +39,17 @@ void  dm_dp_create_fake_mst_encoders(struct amdgpu_device *adev);  #if defined(CONFIG_DRM_AMD_DC_DCN) + +struct dsc_mst_fairness_vars { +	int pbn; +	bool dsc_enabled; +	int bpp_x16; +	struct amdgpu_dm_connector *aconnector; +}; +  bool compute_mst_dsc_configs_for_state(struct drm_atomic_state *state, -				       struct dc_state *dc_state); +				       struct dc_state *dc_state, +				       struct dsc_mst_fairness_vars *vars);  #endif  #endif | 
