diff options
Diffstat (limited to 'drivers/gpu/drm/i915/display/intel_vdsc.c')
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_vdsc.c | 82 | 
1 files changed, 36 insertions, 46 deletions
| diff --git a/drivers/gpu/drm/i915/display/intel_vdsc.c b/drivers/gpu/drm/i915/display/intel_vdsc.c index 2275f99ce9d7..9b05f93ed8bc 100644 --- a/drivers/gpu/drm/i915/display/intel_vdsc.c +++ b/drivers/gpu/drm/i915/display/intel_vdsc.c @@ -6,12 +6,14 @@   *         Manasi Navare <[email protected]>   */  #include <linux/limits.h> +  #include "i915_drv.h" +#include "intel_crtc.h"  #include "intel_de.h"  #include "intel_display_types.h"  #include "intel_dsi.h" -#include "intel_vdsc.h"  #include "intel_qp_tables.h" +#include "intel_vdsc.h"  enum ROW_INDEX_BPP {  	ROW_INDEX_6BPP = 0, @@ -442,10 +444,10 @@ calculate_rc_params(struct rc_parameters *rc,  	}  } -int intel_dsc_compute_params(struct intel_encoder *encoder, -			     struct intel_crtc_state *pipe_config) +int intel_dsc_compute_params(struct intel_crtc_state *pipe_config)  { -	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); +	struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc); +	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);  	struct drm_dsc_config *vdsc_cfg = &pipe_config->dsc.config;  	u16 compressed_bpp = pipe_config->dsc.compressed_bpp;  	const struct rc_parameters *rc_params; @@ -598,7 +600,7 @@ static void intel_dsc_pps_configure(const struct intel_crtc_state *crtc_state)  		pps_val |= DSC_422_ENABLE;  	if (vdsc_cfg->vbr_enable)  		pps_val |= DSC_VBR_ENABLE; -	drm_info(&dev_priv->drm, "PPS0 = 0x%08x\n", pps_val); +	drm_dbg_kms(&dev_priv->drm, "PPS0 = 0x%08x\n", pps_val);  	if (!is_pipe_dsc(crtc, cpu_transcoder)) {  		intel_de_write(dev_priv, DSCA_PICTURE_PARAMETER_SET_0,  			       pps_val); @@ -622,7 +624,7 @@ static void intel_dsc_pps_configure(const struct intel_crtc_state *crtc_state)  	/* Populate PICTURE_PARAMETER_SET_1 registers */  	pps_val = 0;  	pps_val |= DSC_BPP(vdsc_cfg->bits_per_pixel); -	drm_info(&dev_priv->drm, "PPS1 = 0x%08x\n", pps_val); +	drm_dbg_kms(&dev_priv->drm, "PPS1 = 0x%08x\n", pps_val);  	if (!is_pipe_dsc(crtc, cpu_transcoder)) {  		intel_de_write(dev_priv, DSCA_PICTURE_PARAMETER_SET_1,  			       pps_val); @@ -647,7 +649,7 @@ static void intel_dsc_pps_configure(const struct intel_crtc_state *crtc_state)  	pps_val = 0;  	pps_val |= DSC_PIC_HEIGHT(vdsc_cfg->pic_height) |  		DSC_PIC_WIDTH(vdsc_cfg->pic_width / num_vdsc_instances); -	drm_info(&dev_priv->drm, "PPS2 = 0x%08x\n", pps_val); +	drm_dbg_kms(&dev_priv->drm, "PPS2 = 0x%08x\n", pps_val);  	if (!is_pipe_dsc(crtc, cpu_transcoder)) {  		intel_de_write(dev_priv, DSCA_PICTURE_PARAMETER_SET_2,  			       pps_val); @@ -672,7 +674,7 @@ static void intel_dsc_pps_configure(const struct intel_crtc_state *crtc_state)  	pps_val = 0;  	pps_val |= DSC_SLICE_HEIGHT(vdsc_cfg->slice_height) |  		DSC_SLICE_WIDTH(vdsc_cfg->slice_width); -	drm_info(&dev_priv->drm, "PPS3 = 0x%08x\n", pps_val); +	drm_dbg_kms(&dev_priv->drm, "PPS3 = 0x%08x\n", pps_val);  	if (!is_pipe_dsc(crtc, cpu_transcoder)) {  		intel_de_write(dev_priv, DSCA_PICTURE_PARAMETER_SET_3,  			       pps_val); @@ -697,7 +699,7 @@ static void intel_dsc_pps_configure(const struct intel_crtc_state *crtc_state)  	pps_val = 0;  	pps_val |= DSC_INITIAL_XMIT_DELAY(vdsc_cfg->initial_xmit_delay) |  		DSC_INITIAL_DEC_DELAY(vdsc_cfg->initial_dec_delay); -	drm_info(&dev_priv->drm, "PPS4 = 0x%08x\n", pps_val); +	drm_dbg_kms(&dev_priv->drm, "PPS4 = 0x%08x\n", pps_val);  	if (!is_pipe_dsc(crtc, cpu_transcoder)) {  		intel_de_write(dev_priv, DSCA_PICTURE_PARAMETER_SET_4,  			       pps_val); @@ -722,7 +724,7 @@ static void intel_dsc_pps_configure(const struct intel_crtc_state *crtc_state)  	pps_val = 0;  	pps_val |= DSC_SCALE_INC_INT(vdsc_cfg->scale_increment_interval) |  		DSC_SCALE_DEC_INT(vdsc_cfg->scale_decrement_interval); -	drm_info(&dev_priv->drm, "PPS5 = 0x%08x\n", pps_val); +	drm_dbg_kms(&dev_priv->drm, "PPS5 = 0x%08x\n", pps_val);  	if (!is_pipe_dsc(crtc, cpu_transcoder)) {  		intel_de_write(dev_priv, DSCA_PICTURE_PARAMETER_SET_5,  			       pps_val); @@ -749,7 +751,7 @@ static void intel_dsc_pps_configure(const struct intel_crtc_state *crtc_state)  		DSC_FIRST_LINE_BPG_OFFSET(vdsc_cfg->first_line_bpg_offset) |  		DSC_FLATNESS_MIN_QP(vdsc_cfg->flatness_min_qp) |  		DSC_FLATNESS_MAX_QP(vdsc_cfg->flatness_max_qp); -	drm_info(&dev_priv->drm, "PPS6 = 0x%08x\n", pps_val); +	drm_dbg_kms(&dev_priv->drm, "PPS6 = 0x%08x\n", pps_val);  	if (!is_pipe_dsc(crtc, cpu_transcoder)) {  		intel_de_write(dev_priv, DSCA_PICTURE_PARAMETER_SET_6,  			       pps_val); @@ -774,7 +776,7 @@ static void intel_dsc_pps_configure(const struct intel_crtc_state *crtc_state)  	pps_val = 0;  	pps_val |= DSC_SLICE_BPG_OFFSET(vdsc_cfg->slice_bpg_offset) |  		DSC_NFL_BPG_OFFSET(vdsc_cfg->nfl_bpg_offset); -	drm_info(&dev_priv->drm, "PPS7 = 0x%08x\n", pps_val); +	drm_dbg_kms(&dev_priv->drm, "PPS7 = 0x%08x\n", pps_val);  	if (!is_pipe_dsc(crtc, cpu_transcoder)) {  		intel_de_write(dev_priv, DSCA_PICTURE_PARAMETER_SET_7,  			       pps_val); @@ -799,7 +801,7 @@ static void intel_dsc_pps_configure(const struct intel_crtc_state *crtc_state)  	pps_val = 0;  	pps_val |= DSC_FINAL_OFFSET(vdsc_cfg->final_offset) |  		DSC_INITIAL_OFFSET(vdsc_cfg->initial_offset); -	drm_info(&dev_priv->drm, "PPS8 = 0x%08x\n", pps_val); +	drm_dbg_kms(&dev_priv->drm, "PPS8 = 0x%08x\n", pps_val);  	if (!is_pipe_dsc(crtc, cpu_transcoder)) {  		intel_de_write(dev_priv, DSCA_PICTURE_PARAMETER_SET_8,  			       pps_val); @@ -824,7 +826,7 @@ static void intel_dsc_pps_configure(const struct intel_crtc_state *crtc_state)  	pps_val = 0;  	pps_val |= DSC_RC_MODEL_SIZE(vdsc_cfg->rc_model_size) |  		DSC_RC_EDGE_FACTOR(DSC_RC_EDGE_FACTOR_CONST); -	drm_info(&dev_priv->drm, "PPS9 = 0x%08x\n", pps_val); +	drm_dbg_kms(&dev_priv->drm, "PPS9 = 0x%08x\n", pps_val);  	if (!is_pipe_dsc(crtc, cpu_transcoder)) {  		intel_de_write(dev_priv, DSCA_PICTURE_PARAMETER_SET_9,  			       pps_val); @@ -851,7 +853,7 @@ static void intel_dsc_pps_configure(const struct intel_crtc_state *crtc_state)  		DSC_RC_QUANT_INC_LIMIT1(vdsc_cfg->rc_quant_incr_limit1) |  		DSC_RC_TARGET_OFF_HIGH(DSC_RC_TGT_OFFSET_HI_CONST) |  		DSC_RC_TARGET_OFF_LOW(DSC_RC_TGT_OFFSET_LO_CONST); -	drm_info(&dev_priv->drm, "PPS10 = 0x%08x\n", pps_val); +	drm_dbg_kms(&dev_priv->drm, "PPS10 = 0x%08x\n", pps_val);  	if (!is_pipe_dsc(crtc, cpu_transcoder)) {  		intel_de_write(dev_priv, DSCA_PICTURE_PARAMETER_SET_10,  			       pps_val); @@ -879,7 +881,7 @@ static void intel_dsc_pps_configure(const struct intel_crtc_state *crtc_state)  				   vdsc_cfg->slice_width) |  		DSC_SLICE_ROW_PER_FRAME(vdsc_cfg->pic_height /  					vdsc_cfg->slice_height); -	drm_info(&dev_priv->drm, "PPS16 = 0x%08x\n", pps_val); +	drm_dbg_kms(&dev_priv->drm, "PPS16 = 0x%08x\n", pps_val);  	if (!is_pipe_dsc(crtc, cpu_transcoder)) {  		intel_de_write(dev_priv, DSCA_PICTURE_PARAMETER_SET_16,  			       pps_val); @@ -906,8 +908,8 @@ static void intel_dsc_pps_configure(const struct intel_crtc_state *crtc_state)  		rc_buf_thresh_dword[i / 4] |=  			(u32)(vdsc_cfg->rc_buf_thresh[i] <<  			      BITS_PER_BYTE * (i % 4)); -		drm_info(&dev_priv->drm, " RC_BUF_THRESH%d = 0x%08x\n", i, -			 rc_buf_thresh_dword[i / 4]); +		drm_dbg_kms(&dev_priv->drm, "RC_BUF_THRESH_%d = 0x%08x\n", i, +			    rc_buf_thresh_dword[i / 4]);  	}  	if (!is_pipe_dsc(crtc, cpu_transcoder)) {  		intel_de_write(dev_priv, DSCA_RC_BUF_THRESH_0, @@ -963,8 +965,8 @@ static void intel_dsc_pps_configure(const struct intel_crtc_state *crtc_state)  				RC_MAX_QP_SHIFT) |  			       (vdsc_cfg->rc_range_params[i].range_min_qp <<  				RC_MIN_QP_SHIFT)) << 16 * (i % 2)); -		drm_info(&dev_priv->drm, " RC_RANGE_PARAM_%d = 0x%08x\n", i, -			 rc_range_params_dword[i / 2]); +		drm_dbg_kms(&dev_priv->drm, "RC_RANGE_PARAM_%d = 0x%08x\n", i, +			    rc_range_params_dword[i / 2]);  	}  	if (!is_pipe_dsc(crtc, cpu_transcoder)) {  		intel_de_write(dev_priv, DSCA_RC_RANGE_PARAMETERS_0, @@ -1055,8 +1057,8 @@ static void intel_dsc_pps_configure(const struct intel_crtc_state *crtc_state)  	}  } -static void intel_dsc_dsi_pps_write(struct intel_encoder *encoder, -				    const struct intel_crtc_state *crtc_state) +void intel_dsc_dsi_pps_write(struct intel_encoder *encoder, +			     const struct intel_crtc_state *crtc_state)  {  	const struct drm_dsc_config *vdsc_cfg = &crtc_state->dsc.config;  	struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder); @@ -1064,6 +1066,9 @@ static void intel_dsc_dsi_pps_write(struct intel_encoder *encoder,  	struct drm_dsc_picture_parameter_set pps;  	enum port port; +	if (!crtc_state->dsc.compression_enable) +		return; +  	drm_dsc_pps_payload_pack(&pps, vdsc_cfg);  	for_each_dsi_port(port, intel_dsi->ports) { @@ -1074,14 +1079,16 @@ static void intel_dsc_dsi_pps_write(struct intel_encoder *encoder,  	}  } -static void intel_dsc_dp_pps_write(struct intel_encoder *encoder, -				   const struct intel_crtc_state *crtc_state) +void intel_dsc_dp_pps_write(struct intel_encoder *encoder, +			    const struct intel_crtc_state *crtc_state)  { -	struct intel_dp *intel_dp = enc_to_intel_dp(encoder); -	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); +	struct intel_digital_port *dig_port = enc_to_dig_port(encoder);  	const struct drm_dsc_config *vdsc_cfg = &crtc_state->dsc.config;  	struct drm_dsc_pps_infoframe dp_dsc_pps_sdp; +	if (!crtc_state->dsc.compression_enable) +		return; +  	/* Prepare DP SDP PPS header as per DP 1.4 spec, Table 2-123 */  	drm_dsc_dp_pps_header_init(&dp_dsc_pps_sdp.pps_header); @@ -1105,25 +1112,16 @@ static i915_reg_t dss_ctl2_reg(struct intel_crtc *crtc, enum transcoder cpu_tran  		ICL_PIPE_DSS_CTL2(crtc->pipe) : DSS_CTL2;  } -static struct intel_crtc * -_get_crtc_for_pipe(struct drm_i915_private *i915, enum pipe pipe) -{ -	if (!intel_pipe_valid(i915, pipe)) -		return NULL; - -	return intel_get_crtc_for_pipe(i915, pipe); -} -  struct intel_crtc *  intel_dsc_get_bigjoiner_secondary(const struct intel_crtc *primary_crtc)  { -	return _get_crtc_for_pipe(to_i915(primary_crtc->base.dev), primary_crtc->pipe + 1); +	return intel_crtc_for_pipe(to_i915(primary_crtc->base.dev), primary_crtc->pipe + 1);  }  static struct intel_crtc *  intel_dsc_get_bigjoiner_primary(const struct intel_crtc *secondary_crtc)  { -	return _get_crtc_for_pipe(to_i915(secondary_crtc->base.dev), secondary_crtc->pipe - 1); +	return intel_crtc_for_pipe(to_i915(secondary_crtc->base.dev), secondary_crtc->pipe - 1);  }  void intel_uncompressed_joiner_enable(const struct intel_crtc_state *crtc_state) @@ -1142,8 +1140,7 @@ void intel_uncompressed_joiner_enable(const struct intel_crtc_state *crtc_state)  	}  } -void intel_dsc_enable(struct intel_encoder *encoder, -		      const struct intel_crtc_state *crtc_state) +void intel_dsc_enable(const struct intel_crtc_state *crtc_state)  {  	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);  	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); @@ -1155,13 +1152,6 @@ void intel_dsc_enable(struct intel_encoder *encoder,  	intel_dsc_pps_configure(crtc_state); -	if (!crtc_state->bigjoiner_slave) { -		if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DSI)) -			intel_dsc_dsi_pps_write(encoder, crtc_state); -		else -			intel_dsc_dp_pps_write(encoder, crtc_state); -	} -  	dss_ctl2_val |= LEFT_BRANCH_VDSC_ENABLE;  	if (crtc_state->dsc.dsc_split) {  		dss_ctl2_val |= RIGHT_BRANCH_VDSC_ENABLE; |