diff options
Diffstat (limited to 'drivers/gpu/drm/i915/display/intel_ddi.c')
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_ddi.c | 109 | 
1 files changed, 72 insertions, 37 deletions
diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c index 953de42e277c..eccbdd42d223 100644 --- a/drivers/gpu/drm/i915/display/intel_ddi.c +++ b/drivers/gpu/drm/i915/display/intel_ddi.c @@ -31,8 +31,10 @@  #include "intel_audio.h"  #include "intel_combo_phy.h"  #include "intel_connector.h" +#include "intel_crtc.h"  #include "intel_ddi.h"  #include "intel_ddi_buf_trans.h" +#include "intel_de.h"  #include "intel_display_types.h"  #include "intel_dp.h"  #include "intel_dp_link_training.h" @@ -113,7 +115,8 @@ void intel_prepare_dp_ddi_buffers(struct intel_encoder *encoder,  							      &n_entries);  	/* If we're boosting the current, set bit 31 of trans1 */ -	if (IS_GEN9_BC(dev_priv) && intel_bios_encoder_dp_boost_level(encoder->devdata)) +	if (DISPLAY_VER(dev_priv) == 9 && !IS_BROXTON(dev_priv) && +	    intel_bios_encoder_dp_boost_level(encoder->devdata))  		iboost_bit = DDI_BUF_BALANCE_LEG_ENABLE;  	for (i = 0; i < n_entries; i++) { @@ -146,7 +149,8 @@ static void intel_prepare_hdmi_ddi_buffers(struct intel_encoder *encoder,  		level = n_entries - 1;  	/* If we're boosting the current, set bit 31 of trans1 */ -	if (IS_GEN9_BC(dev_priv) && intel_bios_encoder_hdmi_boost_level(encoder->devdata)) +	if (DISPLAY_VER(dev_priv) == 9 && !IS_BROXTON(dev_priv) && +	    intel_bios_encoder_hdmi_boost_level(encoder->devdata))  		iboost_bit = DDI_BUF_BALANCE_LEG_ENABLE;  	/* Entry 9 is for HDMI: */ @@ -174,7 +178,7 @@ static void intel_wait_ddi_buf_active(struct drm_i915_private *dev_priv,  				      enum port port)  {  	/* Wait > 518 usecs for DDI_BUF_CTL to be non idle */ -	if (DISPLAY_VER(dev_priv) < 10 && !IS_GEMINILAKE(dev_priv)) { +	if (DISPLAY_VER(dev_priv) < 10) {  		usleep_range(518, 1000);  		return;  	} @@ -471,7 +475,7 @@ intel_ddi_transcoder_func_reg_val_get(struct intel_encoder *encoder,  		temp |= DDI_PORT_WIDTH(crtc_state->lane_count);  	} -	if (IS_DISPLAY_RANGE(dev_priv, 8, 10) && +	if (IS_DISPLAY_VER(dev_priv, 8, 10) &&  	    crtc_state->master_transcoder != INVALID_TRANSCODER) {  		u8 master_select =  			bdw_trans_port_sync_master_select(crtc_state->master_transcoder); @@ -546,7 +550,7 @@ void intel_ddi_disable_transcoder_func(const struct intel_crtc_state *crtc_state  	ctl &= ~TRANS_DDI_FUNC_ENABLE; -	if (IS_DISPLAY_RANGE(dev_priv, 8, 10)) +	if (IS_DISPLAY_VER(dev_priv, 8, 10))  		ctl &= ~(TRANS_DDI_PORT_SYNC_ENABLE |  			 TRANS_DDI_PORT_SYNC_MASTER_SELECT_MASK); @@ -759,7 +763,7 @@ static void intel_ddi_get_encoder_pipes(struct intel_encoder *encoder,  		*is_dp_mst = mst_pipe_mask;  out: -	if (*pipe_mask && IS_GEN9_LP(dev_priv)) { +	if (*pipe_mask && (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv))) {  		tmp = intel_de_read(dev_priv, BXT_PHY_CTL(port));  		if ((tmp & (BXT_PHY_CMNLANE_POWERDOWN_ACK |  			    BXT_PHY_LANE_POWERDOWN_ACK | @@ -850,18 +854,19 @@ void intel_ddi_enable_pipe_clock(struct intel_encoder *encoder,  {  	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);  	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); -	enum port port = encoder->port;  	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder; +	enum phy phy = intel_port_to_phy(dev_priv, encoder->port); +	u32 val;  	if (cpu_transcoder != TRANSCODER_EDP) { -		if (DISPLAY_VER(dev_priv) >= 12) -			intel_de_write(dev_priv, -				       TRANS_CLK_SEL(cpu_transcoder), -				       TGL_TRANS_CLK_SEL_PORT(port)); +		if (DISPLAY_VER(dev_priv) >= 13) +			val = TGL_TRANS_CLK_SEL_PORT(phy); +		else if (DISPLAY_VER(dev_priv) >= 12) +			val = TGL_TRANS_CLK_SEL_PORT(encoder->port);  		else -			intel_de_write(dev_priv, -				       TRANS_CLK_SEL(cpu_transcoder), -				       TRANS_CLK_SEL_PORT(port)); +			val = TRANS_CLK_SEL_PORT(encoder->port); + +		intel_de_write(dev_priv, TRANS_CLK_SEL(cpu_transcoder), val);  	}  } @@ -976,7 +981,7 @@ static u8 intel_ddi_dp_voltage_max(struct intel_dp *intel_dp,  			tgl_get_combo_buf_trans(encoder, crtc_state, &n_entries);  		else  			tgl_get_dkl_buf_trans(encoder, crtc_state, &n_entries); -	} else if (IS_DISPLAY_VER(dev_priv, 11)) { +	} else if (DISPLAY_VER(dev_priv) == 11) {  		if (IS_PLATFORM(dev_priv, INTEL_JASPERLAKE))  			jsl_get_combo_buf_trans(encoder, crtc_state, &n_entries);  		else if (IS_PLATFORM(dev_priv, INTEL_ELKHARTLAKE)) @@ -987,7 +992,7 @@ static u8 intel_ddi_dp_voltage_max(struct intel_dp *intel_dp,  			icl_get_mg_buf_trans(encoder, crtc_state, &n_entries);  	} else if (IS_CANNONLAKE(dev_priv)) {  		cnl_get_buf_trans(encoder, crtc_state, &n_entries); -	} else if (IS_GEN9_LP(dev_priv)) { +	} else if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv)) {  		bxt_get_buf_trans(encoder, crtc_state, &n_entries);  	} else {  		if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP)) @@ -1454,6 +1459,14 @@ tgl_dkl_phy_ddi_vswing_sequence(struct intel_encoder *encoder,  		val = intel_de_read(dev_priv, DKL_TX_DPCNTL2(tc_port));  		val &= ~DKL_TX_DP20BITMODE;  		intel_de_write(dev_priv, DKL_TX_DPCNTL2(tc_port), val); + +		if ((intel_crtc_has_dp_encoder(crtc_state) && +		     crtc_state->port_clock == 162000) || +		    (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI) && +		     crtc_state->port_clock == 594000)) +			val |= DKL_TX_LOADGEN_SHARING_PMD_DISABLE; +		else +			val &= ~DKL_TX_LOADGEN_SHARING_PMD_DISABLE;  	}  } @@ -1555,7 +1568,7 @@ hsw_set_signal_levels(struct intel_dp *intel_dp,  	intel_dp->DP &= ~DDI_BUF_EMP_MASK;  	intel_dp->DP |= signal_levels; -	if (IS_GEN9_BC(dev_priv)) +	if (DISPLAY_VER(dev_priv) == 9 && !IS_BROXTON(dev_priv))  		skl_ddi_set_iboost(encoder, crtc_state, level);  	intel_de_write(dev_priv, DDI_BUF_CTL(port), intel_dp->DP); @@ -2332,8 +2345,8 @@ static void intel_dp_sink_set_msa_timing_par_ignore_state(struct intel_dp *intel  	if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_DOWNSPREAD_CTRL,  			       enable ? DP_MSA_TIMING_PAR_IGNORE_EN : 0) <= 0)  		drm_dbg_kms(&i915->drm, -			    "Failed to set MSA_TIMING_PAR_IGNORE %s in the sink\n", -			    enable ? "enable" : "disable"); +			    "Failed to %s MSA_TIMING_PAR_IGNORE in the sink\n", +			    enabledisable(enable));  }  static void intel_dp_sink_set_fec_ready(struct intel_dp *intel_dp, @@ -2648,7 +2661,7 @@ static void hsw_ddi_pre_enable_dp(struct intel_atomic_state *state,  		icl_ddi_vswing_sequence(encoder, crtc_state, level);  	else if (IS_CANNONLAKE(dev_priv))  		cnl_ddi_vswing_sequence(encoder, crtc_state, level); -	else if (IS_GEN9_LP(dev_priv)) +	else if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv))  		bxt_ddi_vswing_sequence(encoder, crtc_state, level);  	else  		intel_prepare_dp_ddi_buffers(encoder, crtc_state); @@ -3092,20 +3105,20 @@ static void intel_enable_ddi_hdmi(struct intel_atomic_state *state,  	if (DISPLAY_VER(dev_priv) >= 12)  		tgl_ddi_vswing_sequence(encoder, crtc_state, level); -	else if (IS_DISPLAY_VER(dev_priv, 11)) +	else if (DISPLAY_VER(dev_priv) == 11)  		icl_ddi_vswing_sequence(encoder, crtc_state, level);  	else if (IS_CANNONLAKE(dev_priv))  		cnl_ddi_vswing_sequence(encoder, crtc_state, level); -	else if (IS_GEN9_LP(dev_priv)) +	else if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv))  		bxt_ddi_vswing_sequence(encoder, crtc_state, level);  	else  		intel_prepare_hdmi_ddi_buffers(encoder, level); -	if (IS_GEN9_BC(dev_priv)) +	if (DISPLAY_VER(dev_priv) == 9 && !IS_BROXTON(dev_priv))  		skl_ddi_set_iboost(encoder, crtc_state, level);  	/* Display WA #1143: skl,kbl,cfl */ -	if (IS_GEN9_BC(dev_priv)) { +	if (DISPLAY_VER(dev_priv) == 9 && !IS_BROXTON(dev_priv)) {  		/*  		 * For some reason these chicken bits have been  		 * stuffed into a transcoder register, event though @@ -3321,7 +3334,7 @@ intel_ddi_pre_pll_enable(struct intel_atomic_state *state,  		 * Type-C ports.  Skip this step for TBT.  		 */  		intel_tc_port_set_fia_lane_count(dig_port, crtc_state->lane_count); -	else if (IS_GEN9_LP(dev_priv)) +	else if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv))  		bxt_ddi_phy_set_lane_optim_mask(encoder,  						crtc_state->lane_lat_optim_mask);  } @@ -3679,7 +3692,7 @@ static void intel_ddi_get_config(struct intel_encoder *encoder,  	if (!pipe_config->bigjoiner_slave)  		ddi_dotclock_get(pipe_config); -	if (IS_GEN9_LP(dev_priv)) +	if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv))  		pipe_config->lane_lat_optim_mask =  			bxt_ddi_phy_get_lane_lat_optim_mask(encoder); @@ -3705,6 +3718,8 @@ static void intel_ddi_get_config(struct intel_encoder *encoder,  	intel_read_dp_sdp(encoder, pipe_config, HDMI_PACKET_TYPE_GAMUT_METADATA);  	intel_read_dp_sdp(encoder, pipe_config, DP_SDP_VSC); + +	intel_psr_get_config(encoder, pipe_config);  }  void intel_ddi_get_clock(struct intel_encoder *encoder, @@ -3885,7 +3900,7 @@ static int intel_ddi_compute_config(struct intel_encoder *encoder,  			pipe_config->pch_pfit.enabled ||  			pipe_config->crc_enabled; -	if (IS_GEN9_LP(dev_priv)) +	if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv))  		pipe_config->lane_lat_optim_mask =  			bxt_ddi_phy_calc_lane_lat_optim_mask(pipe_config->lane_count); @@ -4053,7 +4068,7 @@ intel_ddi_init_dp_connector(struct intel_digital_port *dig_port)  		dig_port->dp.set_signal_levels = icl_set_signal_levels;  	else if (IS_CANNONLAKE(dev_priv))  		dig_port->dp.set_signal_levels = cnl_set_signal_levels; -	else if (IS_GEN9_LP(dev_priv)) +	else if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv))  		dig_port->dp.set_signal_levels = bxt_set_signal_levels;  	else  		dig_port->dp.set_signal_levels = hsw_set_signal_levels; @@ -4296,7 +4311,7 @@ static bool intel_ddi_a_force_4_lanes(struct intel_digital_port *dig_port)  	/* Broxton/Geminilake: Bspec says that DDI_A_4_LANES is the only  	 *                     supported configuration  	 */ -	if (IS_GEN9_LP(dev_priv)) +	if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv))  		return true;  	/* Cannonlake: Most of SKUs don't support DDI_E, and the only @@ -4350,6 +4365,17 @@ static bool hti_uses_phy(struct drm_i915_private *i915, enum phy phy)  	       i915->hti_state & HDPORT_DDI_USED(phy);  } +static enum hpd_pin xelpd_hpd_pin(struct drm_i915_private *dev_priv, +				  enum port port) +{ +	if (port >= PORT_D_XELPD) +		return HPD_PORT_D + port - PORT_D_XELPD; +	else if (port >= PORT_TC1) +		return HPD_PORT_TC1 + port - PORT_TC1; +	else +		return HPD_PORT_A + port - PORT_A; +} +  static enum hpd_pin dg1_hpd_pin(struct drm_i915_private *dev_priv,  				enum port port)  { @@ -4489,7 +4515,13 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)  	encoder = &dig_port->base;  	encoder->devdata = devdata; -	if (DISPLAY_VER(dev_priv) >= 12) { +	if (DISPLAY_VER(dev_priv) >= 13 && port >= PORT_D_XELPD) { +		drm_encoder_init(&dev_priv->drm, &encoder->base, &intel_ddi_funcs, +				 DRM_MODE_ENCODER_TMDS, +				 "DDI %c/PHY %c", +				 port_name(port - PORT_D_XELPD + PORT_D), +				 phy_name(phy)); +	} else if (DISPLAY_VER(dev_priv) >= 12) {  		enum tc_port tc_port = intel_port_to_tc(dev_priv, port);  		drm_encoder_init(&dev_priv->drm, &encoder->base, &intel_ddi_funcs, @@ -4585,10 +4617,10 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)  		encoder->disable_clock = cnl_ddi_disable_clock;  		encoder->is_clock_enabled = cnl_ddi_is_clock_enabled;  		encoder->get_config = cnl_ddi_get_config; -	} else if (IS_GEN9_LP(dev_priv)) { +	} else if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv)) {  		/* BXT/GLK have fixed PLL->port mapping */  		encoder->get_config = bxt_ddi_get_config; -	} else if (IS_GEN9_BC(dev_priv)) { +	} else if (DISPLAY_VER(dev_priv) == 9) {  		encoder->enable_clock = skl_ddi_enable_clock;  		encoder->disable_clock = skl_ddi_disable_clock;  		encoder->is_clock_enabled = skl_ddi_is_clock_enabled; @@ -4600,7 +4632,9 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)  		encoder->get_config = hsw_ddi_get_config;  	} -	if (IS_DG1(dev_priv)) +	if (DISPLAY_VER(dev_priv) >= 13) +		encoder->hpd_pin = xelpd_hpd_pin(dev_priv, port); +	else if (IS_DG1(dev_priv))  		encoder->hpd_pin = dg1_hpd_pin(dev_priv, port);  	else if (IS_ROCKETLAKE(dev_priv))  		encoder->hpd_pin = rkl_hpd_pin(dev_priv, port); @@ -4608,11 +4642,11 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)  		encoder->hpd_pin = tgl_hpd_pin(dev_priv, port);  	else if (IS_JSL_EHL(dev_priv))  		encoder->hpd_pin = ehl_hpd_pin(dev_priv, port); -	else if (IS_DISPLAY_VER(dev_priv, 11)) +	else if (DISPLAY_VER(dev_priv) == 11)  		encoder->hpd_pin = icl_hpd_pin(dev_priv, port); -	else if (IS_DISPLAY_VER(dev_priv, 10)) +	else if (IS_CANNONLAKE(dev_priv))  		encoder->hpd_pin = cnl_hpd_pin(dev_priv, port); -	else if (IS_DISPLAY_VER(dev_priv, 9)) +	else if (DISPLAY_VER(dev_priv) == 9 && !IS_BROXTON(dev_priv))  		encoder->hpd_pin = skl_hpd_pin(dev_priv, port);  	else  		encoder->hpd_pin = intel_hpd_pin_default(dev_priv, port); @@ -4672,7 +4706,8 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)  		else  			dig_port->connected = lpt_digital_port_connected;  	} else if (DISPLAY_VER(dev_priv) >= 8) { -		if (port == PORT_A || IS_GEN9_LP(dev_priv)) +		if (port == PORT_A || IS_GEMINILAKE(dev_priv) || +		    IS_BROXTON(dev_priv))  			dig_port->connected = bdw_digital_port_connected;  		else  			dig_port->connected = lpt_digital_port_connected;  | 
