[Intel-gfx] [RFC 6/8] drm/i915/bxt: Enable/Disable DSC and programme PPS.

vikas.korjani at intel.com vikas.korjani at intel.com
Wed Aug 12 02:53:51 PDT 2015


From: vkorjani <vikas.korjani at intel.com>

Program the PPS data from intel_dsc->vesa_dsc_pps_data
into display controller register DSCx_PICTURE_PARAMETER_SET_x.
DSC should be enabled in MIPI Port control register, after
programming PPS register
Disable DSC in disable sequence after disabling port.

Signed-off-by: vkorjani <vikas.korjani at intel.com>
---
 drivers/gpu/drm/i915/intel_dsi.c |  197 +++++++++++++++++++++++++++++++++++++-
 1 file changed, 196 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/intel_dsi.c b/drivers/gpu/drm/i915/intel_dsi.c
index 9963ec2..c011966 100644
--- a/drivers/gpu/drm/i915/intel_dsi.c
+++ b/drivers/gpu/drm/i915/intel_dsi.c
@@ -411,7 +411,12 @@ static void intel_dsi_port_disable(struct intel_encoder *encoder)
 		/* de-assert ip_tg_enable signal */
 		port_ctrl = GET_DSI_PORT_CTRL(dev);
 		temp = I915_READ(port_ctrl);
-		I915_WRITE(port_ctrl, temp & ~DPI_ENABLE);
+		temp &= ~DPI_ENABLE;
+		if (intel_dsi->dsc_enable) {
+			temp &= ~BXT_DSC_ENABLE;
+			temp &= ~RGB_FLIP_TO_BGR;
+		}
+		I915_WRITE(port_ctrl, temp);
 		POSTING_READ(port_ctrl);
 	}
 }
@@ -876,6 +881,188 @@ static void set_dsi_timings(struct drm_encoder *encoder,
 	}
 }
 
+static void intel_dsi_program_pps(struct drm_encoder *encoder, int port)
+{
+	struct drm_device *dev = encoder->dev;
+	struct drm_i915_private *dev_priv = dev->dev_private;
+	struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
+	u32 tmp = 0;
+
+	tmp |= intel_dsi->pps_data.dsc_ver_major << 0;
+	tmp |= intel_dsi->pps_data.dsc_ver_minor << 4;
+	tmp |= intel_dsi->pps_data.bit_per_comp << 8;
+	tmp |= intel_dsi->pps_data.line_buf_depth << 12;
+	tmp |= intel_dsi->pps_data.block_pred_enable << 16;
+	tmp |= intel_dsi->pps_data.convert_rgb << 17;
+	tmp |= intel_dsi->pps_data.enable_422 << 18;
+	tmp |= intel_dsi->pps_data.enable_vbr << 19;
+	I915_WRITE(DSC_PICTURE_PARAMETER_SET_0(port), tmp);
+
+	tmp = 0;
+	tmp |= intel_dsi->pps_data.bits_per_pixel << 0;
+	I915_WRITE(DSC_PICTURE_PARAMETER_SET_1(port), tmp);
+
+	tmp = 0;
+	tmp |= intel_dsi->pps_data.pic_height << 0;
+	tmp |= intel_dsi->pps_data.pic_width << 16;
+	I915_WRITE(DSC_PICTURE_PARAMETER_SET_2(port), tmp);
+
+	tmp = 0;
+	tmp |= intel_dsi->pps_data.slice_height << 0;
+	tmp |= intel_dsi->pps_data.slice_width << 16;
+	I915_WRITE(DSC_PICTURE_PARAMETER_SET_3(port), tmp);
+
+	tmp = 0;
+	tmp |= intel_dsi->pps_data.initial_xmit_delay << 0;
+	tmp |= intel_dsi->pps_data.initial_dec_delay << 16;
+	I915_WRITE(DSC_PICTURE_PARAMETER_SET_4(port), tmp);
+
+	tmp = 0;
+	tmp |= intel_dsi->pps_data.scale_increment_interval << 0;
+	tmp |= intel_dsi->pps_data.scale_decrement_interval << 16;
+	I915_WRITE(DSC_PICTURE_PARAMETER_SET_5(port), tmp);
+
+	tmp = 0;
+	tmp |= intel_dsi->pps_data.initial_scale_value << 0;
+	tmp |= intel_dsi->pps_data.first_line_bpg_offset << 8;
+	tmp |= intel_dsi->pps_data.flatness_min_qp << 16;
+	tmp |= intel_dsi->pps_data.flatness_max_qp << 24;
+	I915_WRITE(DSC_PICTURE_PARAMETER_SET_6(port), tmp);
+
+	tmp = 0;
+	tmp |= intel_dsi->pps_data.slice_bpg_offset << 0;
+	tmp |= intel_dsi->pps_data.nfl_bpg_offset << 16;
+	I915_WRITE(DSC_PICTURE_PARAMETER_SET_7(port), tmp);
+
+	tmp = 0;
+	tmp |= intel_dsi->pps_data.final_offset << 0;
+	tmp |= intel_dsi->pps_data.initial_offset << 16;
+	I915_WRITE(DSC_PICTURE_PARAMETER_SET_8(port), tmp);
+
+	tmp = 0;
+	tmp |= intel_dsi->pps_data.rc_param.model_size << 0;
+	tmp |= intel_dsi->pps_data.rc_param.rc_edge_factor << 16;
+	I915_WRITE(DSC_PICTURE_PARAMETER_SET_9(port), tmp);
+
+	tmp = 0;
+	tmp |= intel_dsi->pps_data.rc_param.rc_quant_incr_limit0 << 0;
+	tmp |= intel_dsi->pps_data.rc_param.rc_quant_incr_limit1 << 8;
+	tmp |= intel_dsi->pps_data.rc_param.rc_tgt_offset_hi << 16;
+	tmp |= intel_dsi->pps_data.rc_param.rc_tgt_offset_lo << 20;
+	I915_WRITE(DSC_PICTURE_PARAMETER_SET_10(port), tmp);
+
+	tmp = 0;
+	tmp |= intel_dsi->pps_data.chunk_size << 0;
+	tmp |= 0x04 << 16;
+	tmp |= 0x78 << 20;
+	I915_WRITE(DSC_PICTURE_PARAMETER_SET_16(port), tmp);
+
+	tmp = 0;
+	tmp = intel_dsi->pps_data.rc_param.rc_buf_thresh[0] << 0 |
+		intel_dsi->pps_data.rc_param.rc_buf_thresh[1] << 8 |
+		intel_dsi->pps_data.rc_param.rc_buf_thresh[2] << 16|
+		intel_dsi->pps_data.rc_param.rc_buf_thresh[3] << 24;
+	I915_WRITE(DSC_RC_BUF_THRESH_0_3(port), tmp);
+
+	tmp = 0;
+	tmp = intel_dsi->pps_data.rc_param.rc_buf_thresh[4] << 0 |
+		intel_dsi->pps_data.rc_param.rc_buf_thresh[5] << 8 |
+		intel_dsi->pps_data.rc_param.rc_buf_thresh[6] << 16 |
+		intel_dsi->pps_data.rc_param.rc_buf_thresh[7] << 24;
+	I915_WRITE(DSC_RC_BUF_THRESH_4_7(port), tmp);
+
+	tmp = 0;
+	tmp = intel_dsi->pps_data.rc_param.rc_buf_thresh[8]  << 0 |
+		intel_dsi->pps_data.rc_param.rc_buf_thresh[9] << 8 |
+		intel_dsi->pps_data.rc_param.rc_buf_thresh[10] << 16 |
+		intel_dsi->pps_data.rc_param.rc_buf_thresh[11] << 24;
+	I915_WRITE(DSC_RC_BUF_THRESH_8_11(port), tmp);
+
+	tmp = 0;
+	tmp = intel_dsi->pps_data.rc_param.rc_buf_thresh[12] << 0 |
+		intel_dsi->pps_data.rc_param.rc_buf_thresh[13] << 8;
+	I915_WRITE(DSC_RC_BUF_THRESH_12_13(port), tmp);
+
+	tmp = 0;
+	tmp = intel_dsi->pps_data.rc_param.rc_range[0].range_min_qp|
+		intel_dsi->pps_data.rc_param.rc_range[0].range_max_qp << 5|
+		intel_dsi->pps_data.rc_param.rc_range[0].range_bpg_offset << 10|
+		intel_dsi->pps_data.rc_param.rc_range[1].range_min_qp << 16|
+		intel_dsi->pps_data.rc_param.rc_range[1].range_max_qp << 21|
+		intel_dsi->pps_data.rc_param.rc_range[1].
+		range_bpg_offset << 26;
+	I915_WRITE(DSC_RC_RANGE_PARAMETERS_0(port), tmp);
+
+	tmp = 0;
+	tmp = intel_dsi->pps_data.rc_param.rc_range[2].range_min_qp|
+		intel_dsi->pps_data.rc_param.rc_range[2].range_max_qp << 5|
+		intel_dsi->pps_data.rc_param.rc_range[2].range_bpg_offset << 10|
+		intel_dsi->pps_data.rc_param.rc_range[3].range_min_qp << 16 |
+		intel_dsi->pps_data.rc_param.rc_range[3].range_max_qp << 21 |
+		intel_dsi->pps_data.rc_param.rc_range[3].range_bpg_offset << 26;
+	I915_WRITE(DSC_RC_RANGE_PARAMETERS_1(port), tmp);
+
+	tmp = 0;
+	tmp = intel_dsi->pps_data.rc_param.rc_range[4].range_min_qp |
+		intel_dsi->pps_data.rc_param.rc_range[4].range_max_qp << 5 |
+		intel_dsi->pps_data.rc_param.rc_range[4].range_bpg_offset << 10|
+		intel_dsi->pps_data.rc_param.rc_range[5].range_min_qp << 16 |
+		intel_dsi->pps_data.rc_param.rc_range[5].range_max_qp << 21 |
+		intel_dsi->pps_data.rc_param.rc_range[5].range_bpg_offset << 26;
+	I915_WRITE(DSC_RC_RANGE_PARAMETERS_2(port), tmp);
+
+	tmp = 0;
+	tmp = intel_dsi->pps_data.rc_param.rc_range[6].range_min_qp |
+		intel_dsi->pps_data.rc_param.rc_range[6].range_max_qp << 5 |
+		intel_dsi->pps_data.rc_param.rc_range[6].range_bpg_offset << 10|
+		intel_dsi->pps_data.rc_param.rc_range[7].range_min_qp << 16 |
+		intel_dsi->pps_data.rc_param.rc_range[7].range_max_qp << 21 |
+		intel_dsi->pps_data.rc_param.rc_range[7].range_bpg_offset << 26;
+	I915_WRITE(DSC_RC_RANGE_PARAMETERS_3(port), tmp);
+
+	tmp = 0;
+	tmp = intel_dsi->pps_data.rc_param.rc_range[8].range_min_qp |
+		intel_dsi->pps_data.rc_param.rc_range[8].range_max_qp << 5 |
+		intel_dsi->pps_data.rc_param.rc_range[8].range_bpg_offset << 10|
+		intel_dsi->pps_data.rc_param.rc_range[9].range_min_qp << 16 |
+		intel_dsi->pps_data.rc_param.rc_range[9].range_max_qp << 21 |
+		intel_dsi->pps_data.rc_param.rc_range[9].range_bpg_offset << 26;
+	I915_WRITE(DSC_RC_RANGE_PARAMETERS_4(port), tmp);
+
+	tmp = 0;
+	tmp = intel_dsi->pps_data.rc_param.rc_range[10].range_min_qp |
+		intel_dsi->pps_data.rc_param.rc_range[10].range_max_qp << 5 |
+		intel_dsi->pps_data.rc_param.rc_range[10].
+		range_bpg_offset << 10|
+		intel_dsi->pps_data.rc_param.rc_range[11].range_min_qp << 16 |
+		intel_dsi->pps_data.rc_param.rc_range[11].range_max_qp << 21 |
+		intel_dsi->pps_data.rc_param.rc_range[11].
+		range_bpg_offset << 26;
+	I915_WRITE(DSC_RC_RANGE_PARAMETERS_5(port), tmp);
+
+	tmp = 0;
+	tmp = intel_dsi->pps_data.rc_param.rc_range[12].range_min_qp |
+		intel_dsi->pps_data.rc_param.rc_range[12].range_max_qp << 5 |
+		intel_dsi->pps_data.rc_param.rc_range[12].
+		range_bpg_offset << 10|
+		intel_dsi->pps_data.rc_param.rc_range[13].range_min_qp << 16 |
+		intel_dsi->pps_data.rc_param.rc_range[13].range_max_qp << 21 |
+		intel_dsi->pps_data.rc_param.rc_range[13].
+		range_bpg_offset << 26;
+	I915_WRITE(DSC_RC_RANGE_PARAMETERS_6(port), tmp);
+
+	tmp = 0;
+	tmp = intel_dsi->pps_data.rc_param.rc_range[14].range_min_qp |
+	       intel_dsi->pps_data.rc_param.rc_range[14].range_max_qp << 5 |
+	       intel_dsi->pps_data.rc_param.rc_range[14].
+	       range_bpg_offset << 10|
+	       intel_dsi->pps_data.rc_param.rc_range[15].range_min_qp << 16 |
+	       intel_dsi->pps_data.rc_param.rc_range[15].range_max_qp << 21 |
+	       intel_dsi->pps_data.rc_param.rc_range[15].
+	       range_bpg_offset << 26;
+	I915_WRITE(DSC_RC_RANGE_PARAMETERS_7(port), tmp);
+}
+
 static void intel_dsi_prepare(struct intel_encoder *intel_encoder)
 {
 	struct drm_encoder *encoder = &intel_encoder->base;
@@ -932,6 +1119,14 @@ static void intel_dsi_prepare(struct intel_encoder *intel_encoder)
 			tmp &= ~BXT_PIPE_SELECT_MASK;
 			(port == PORT_C) ? (tmp |= BXT_PIPE_SELECT_C) :
 				(tmp |= BXT_PIPE_SELECT_A);
+
+			if (intel_dsi->dsc_enable) {
+				intel_dsi_program_pps(encoder, port);
+				/* Need to verify this delay */
+				msleep(20);
+				tmp |= BXT_DSC_ENABLE;
+				tmp |= RGB_FLIP_TO_BGR;
+			}
 			I915_WRITE(MIPI_CTRL(port), tmp);
 		}
 
-- 
1.7.9.5



More information about the Intel-gfx mailing list