diff options
Diffstat (limited to 'drivers/gpu/drm/i915/display')
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_bios.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_bw.c | 15 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_cdclk.c | 11 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_ddi.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_display.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_display_power.c | 11 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_dp.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_dp_mst.c | 20 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_hdcp.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_vbt_defs.h | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_vdsc.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/display/vlv_dsi_pll.c | 4 | 
12 files changed, 63 insertions, 22 deletions
| diff --git a/drivers/gpu/drm/i915/display/intel_bios.c b/drivers/gpu/drm/i915/display/intel_bios.c index c4710889cb32..3ef4e9f573cf 100644 --- a/drivers/gpu/drm/i915/display/intel_bios.c +++ b/drivers/gpu/drm/i915/display/intel_bios.c @@ -765,7 +765,7 @@ parse_psr(struct drm_i915_private *dev_priv, const struct bdb_header *bdb)  	}  	if (bdb->version >= 226) { -		u32 wakeup_time = psr_table->psr2_tp2_tp3_wakeup_time; +		u32 wakeup_time = psr->psr2_tp2_tp3_wakeup_time;  		wakeup_time = (wakeup_time >> (2 * panel_type)) & 0x3;  		switch (wakeup_time) { diff --git a/drivers/gpu/drm/i915/display/intel_bw.c b/drivers/gpu/drm/i915/display/intel_bw.c index 753ac3165061..7b908e10d32e 100644 --- a/drivers/gpu/drm/i915/display/intel_bw.c +++ b/drivers/gpu/drm/i915/display/intel_bw.c @@ -178,6 +178,8 @@ static int icl_get_bw_info(struct drm_i915_private *dev_priv)  		clpchgroup = (sa->deburst * deinterleave / num_channels) << i;  		bi->num_planes = (ipqdepth - clpchgroup) / clpchgroup + 1; +		bi->num_qgv_points = qi.num_points; +  		for (j = 0; j < qi.num_points; j++) {  			const struct intel_qgv_point *sp = &qi.points[j];  			int ct, bw; @@ -195,7 +197,7 @@ static int icl_get_bw_info(struct drm_i915_private *dev_priv)  			bi->deratedbw[j] = min(maxdebw,  					       bw * 9 / 10); /* 90% */ -			DRM_DEBUG_KMS("BW%d / QGV %d: num_planes=%d deratedbw=%d\n", +			DRM_DEBUG_KMS("BW%d / QGV %d: num_planes=%d deratedbw=%u\n",  				      i, j, bi->num_planes, bi->deratedbw[j]);  		} @@ -211,14 +213,17 @@ static unsigned int icl_max_bw(struct drm_i915_private *dev_priv,  {  	int i; -	/* Did we initialize the bw limits successfully? */ -	if (dev_priv->max_bw[0].num_planes == 0) -		return UINT_MAX; -  	for (i = 0; i < ARRAY_SIZE(dev_priv->max_bw); i++) {  		const struct intel_bw_info *bi =  			&dev_priv->max_bw[i]; +		/* +		 * Pcode will not expose all QGV points when +		 * SAGV is forced to off/min/med/max. +		 */ +		if (qgv_point >= bi->num_qgv_points) +			return UINT_MAX; +  		if (num_planes >= bi->num_planes)  			return bi->deratedbw[qgv_point];  	} diff --git a/drivers/gpu/drm/i915/display/intel_cdclk.c b/drivers/gpu/drm/i915/display/intel_cdclk.c index 8993ab283562..0d19bbd08122 100644 --- a/drivers/gpu/drm/i915/display/intel_cdclk.c +++ b/drivers/gpu/drm/i915/display/intel_cdclk.c @@ -2240,6 +2240,17 @@ int intel_crtc_compute_min_cdclk(const struct intel_crtc_state *crtc_state)  		min_cdclk = max(2 * 96000, min_cdclk);  	/* +	 * "For DP audio configuration, cdclk frequency shall be set to +	 *  meet the following requirements: +	 *  DP Link Frequency(MHz) | Cdclk frequency(MHz) +	 *  270                    | 320 or higher +	 *  162                    | 200 or higher" +	 */ +	if ((IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) && +	    intel_crtc_has_dp_encoder(crtc_state) && crtc_state->has_audio) +		min_cdclk = max(crtc_state->port_clock, min_cdclk); + +	/*  	 * On Valleyview some DSI panels lose (v|h)sync when the clock is lower  	 * than 320000KHz.  	 */ diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c index 7925a176f900..1cb1fa74cfbc 100644 --- a/drivers/gpu/drm/i915/display/intel_ddi.c +++ b/drivers/gpu/drm/i915/display/intel_ddi.c @@ -1465,8 +1465,8 @@ static void ddi_dotclock_get(struct intel_crtc_state *pipe_config)  	else if (intel_crtc_has_dp_encoder(pipe_config))  		dotclock = intel_dotclock_calculate(pipe_config->port_clock,  						    &pipe_config->dp_m_n); -	else if (pipe_config->has_hdmi_sink && pipe_config->pipe_bpp == 36) -		dotclock = pipe_config->port_clock * 2 / 3; +	else if (pipe_config->has_hdmi_sink && pipe_config->pipe_bpp > 24) +		dotclock = pipe_config->port_clock * 24 / pipe_config->pipe_bpp;  	else  		dotclock = pipe_config->port_clock; diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c index 8592a7d422de..592b92782fab 100644 --- a/drivers/gpu/drm/i915/display/intel_display.c +++ b/drivers/gpu/drm/i915/display/intel_display.c @@ -1839,7 +1839,7 @@ static void intel_enable_pipe(const struct intel_crtc_state *new_crtc_state)  		/* FIXME: assert CPU port conditions for SNB+ */  	} -	trace_intel_pipe_enable(dev_priv, pipe); +	trace_intel_pipe_enable(crtc);  	reg = PIPECONF(cpu_transcoder);  	val = I915_READ(reg); @@ -1880,7 +1880,7 @@ static void intel_disable_pipe(const struct intel_crtc_state *old_crtc_state)  	 */  	assert_planes_disabled(crtc); -	trace_intel_pipe_disable(dev_priv, pipe); +	trace_intel_pipe_disable(crtc);  	reg = PIPECONF(cpu_transcoder);  	val = I915_READ(reg); @@ -12042,7 +12042,7 @@ static bool check_digital_port_conflicts(struct intel_atomic_state *state)  		case INTEL_OUTPUT_DDI:  			if (WARN_ON(!HAS_DDI(to_i915(dev))))  				break; -			/* else: fall through */ +			/* else, fall through */  		case INTEL_OUTPUT_DP:  		case INTEL_OUTPUT_HDMI:  		case INTEL_OUTPUT_EDP: diff --git a/drivers/gpu/drm/i915/display/intel_display_power.c b/drivers/gpu/drm/i915/display/intel_display_power.c index c93ad512014c..2d1939db108f 100644 --- a/drivers/gpu/drm/i915/display/intel_display_power.c +++ b/drivers/gpu/drm/i915/display/intel_display_power.c @@ -438,16 +438,23 @@ icl_combo_phy_aux_power_well_disable(struct drm_i915_private *dev_priv,  #define ICL_AUX_PW_TO_CH(pw_idx)	\  	((pw_idx) - ICL_PW_CTL_IDX_AUX_A + AUX_CH_A) +#define ICL_TBT_AUX_PW_TO_CH(pw_idx)	\ +	((pw_idx) - ICL_PW_CTL_IDX_AUX_TBT1 + AUX_CH_C) +  static void  icl_tc_phy_aux_power_well_enable(struct drm_i915_private *dev_priv,  				 struct i915_power_well *power_well)  { -	enum aux_ch aux_ch = ICL_AUX_PW_TO_CH(power_well->desc->hsw.idx); +	int pw_idx = power_well->desc->hsw.idx; +	bool is_tbt = power_well->desc->hsw.is_tc_tbt; +	enum aux_ch aux_ch;  	u32 val; +	aux_ch = is_tbt ? ICL_TBT_AUX_PW_TO_CH(pw_idx) : +			  ICL_AUX_PW_TO_CH(pw_idx);  	val = I915_READ(DP_AUX_CH_CTL(aux_ch));  	val &= ~DP_AUX_CH_CTL_TBT_IO; -	if (power_well->desc->hsw.is_tc_tbt) +	if (is_tbt)  		val |= DP_AUX_CH_CTL_TBT_IO;  	I915_WRITE(DP_AUX_CH_CTL(aux_ch), val); diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c index 4336df46fe78..d0fc34826771 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -231,6 +231,7 @@ static int intel_dp_get_fia_supported_lane_count(struct intel_dp *intel_dp)  	switch (lane_info) {  	default:  		MISSING_CASE(lane_info); +		/* fall through */  	case 1:  	case 2:  	case 4: diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c index 60652ebbdf61..8aa6a31e8ad0 100644 --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c @@ -128,7 +128,15 @@ static int intel_dp_mst_compute_config(struct intel_encoder *encoder,  	limits.max_lane_count = intel_dp_max_lane_count(intel_dp);  	limits.min_bpp = intel_dp_min_bpp(pipe_config); -	limits.max_bpp = pipe_config->pipe_bpp; +	/* +	 * FIXME: If all the streams can't fit into the link with +	 * their current pipe_bpp we should reduce pipe_bpp across +	 * the board until things start to fit. Until then we +	 * limit to <= 8bpc since that's what was hardcoded for all +	 * MST streams previously. This hack should be removed once +	 * we have the proper retry logic in place. +	 */ +	limits.max_bpp = min(pipe_config->pipe_bpp, 24);  	intel_dp_adjust_compliance_config(intel_dp, pipe_config, &limits); @@ -539,7 +547,15 @@ static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topolo  	intel_attach_force_audio_property(connector);  	intel_attach_broadcast_rgb_property(connector); -	drm_connector_attach_max_bpc_property(connector, 6, 12); + +	/* +	 * Reuse the prop from the SST connector because we're +	 * not allowed to create new props after device registration. +	 */ +	connector->max_bpc_property = +		intel_dp->attached_connector->base.max_bpc_property; +	if (connector->max_bpc_property) +		drm_connector_attach_max_bpc_property(connector, 6, 12);  	return connector; diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c b/drivers/gpu/drm/i915/display/intel_hdcp.c index bc3a94d491c4..27bd7276a82d 100644 --- a/drivers/gpu/drm/i915/display/intel_hdcp.c +++ b/drivers/gpu/drm/i915/display/intel_hdcp.c @@ -536,7 +536,8 @@ int intel_hdcp_auth_downstream(struct intel_connector *connector)  	if (drm_hdcp_check_ksvs_revoked(dev, ksv_fifo, num_downstream)) {  		DRM_ERROR("Revoked Ksv(s) in ksv_fifo\n"); -		return -EPERM; +		ret = -EPERM; +		goto err;  	}  	/* diff --git a/drivers/gpu/drm/i915/display/intel_vbt_defs.h b/drivers/gpu/drm/i915/display/intel_vbt_defs.h index 2f4894e9a03d..5ddbe71ab423 100644 --- a/drivers/gpu/drm/i915/display/intel_vbt_defs.h +++ b/drivers/gpu/drm/i915/display/intel_vbt_defs.h @@ -478,13 +478,13 @@ struct psr_table {  	/* TP wake up time in multiple of 100 */  	u16 tp1_wakeup_time;  	u16 tp2_tp3_wakeup_time; - -	/* PSR2 TP2/TP3 wakeup time for 16 panels */ -	u32 psr2_tp2_tp3_wakeup_time;  } __packed;  struct bdb_psr {  	struct psr_table psr_table[16]; + +	/* PSR2 TP2/TP3 wakeup time for 16 panels */ +	u32 psr2_tp2_tp3_wakeup_time;  } __packed;  /* diff --git a/drivers/gpu/drm/i915/display/intel_vdsc.c b/drivers/gpu/drm/i915/display/intel_vdsc.c index ffec807b8960..f413904a3e96 100644 --- a/drivers/gpu/drm/i915/display/intel_vdsc.c +++ b/drivers/gpu/drm/i915/display/intel_vdsc.c @@ -541,7 +541,7 @@ static void intel_configure_pps_for_dsc_encoder(struct intel_encoder *encoder,  	pps_val |= DSC_PIC_HEIGHT(vdsc_cfg->pic_height) |  		DSC_PIC_WIDTH(vdsc_cfg->pic_width / num_vdsc_instances);  	DRM_INFO("PPS2 = 0x%08x\n", pps_val); -	if (encoder->type == INTEL_OUTPUT_EDP) { +	if (cpu_transcoder == TRANSCODER_EDP) {  		I915_WRITE(DSCA_PICTURE_PARAMETER_SET_2, pps_val);  		/*  		 * If 2 VDSC instances are needed, configure PPS for second diff --git a/drivers/gpu/drm/i915/display/vlv_dsi_pll.c b/drivers/gpu/drm/i915/display/vlv_dsi_pll.c index 99cc3e2e9c2c..f016a776a39e 100644 --- a/drivers/gpu/drm/i915/display/vlv_dsi_pll.c +++ b/drivers/gpu/drm/i915/display/vlv_dsi_pll.c @@ -396,8 +396,8 @@ static void glk_dsi_program_esc_clock(struct drm_device *dev,  	else  		txesc2_div = 10; -	I915_WRITE(MIPIO_TXESC_CLK_DIV1, txesc1_div & GLK_TX_ESC_CLK_DIV1_MASK); -	I915_WRITE(MIPIO_TXESC_CLK_DIV2, txesc2_div & GLK_TX_ESC_CLK_DIV2_MASK); +	I915_WRITE(MIPIO_TXESC_CLK_DIV1, (1 << (txesc1_div - 1)) & GLK_TX_ESC_CLK_DIV1_MASK); +	I915_WRITE(MIPIO_TXESC_CLK_DIV2, (1 << (txesc2_div - 1)) & GLK_TX_ESC_CLK_DIV2_MASK);  }  /* Program BXT Mipi clocks and dividers */ | 
