diff options
Diffstat (limited to 'drivers/gpu/drm/i915/display/intel_ddi.c')
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_ddi.c | 364 | 
1 files changed, 159 insertions, 205 deletions
| diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c index cfb567df71b3..9c9d574f0b8c 100644 --- a/drivers/gpu/drm/i915/display/intel_ddi.c +++ b/drivers/gpu/drm/i915/display/intel_ddi.c @@ -25,6 +25,7 @@   *   */ +#include <drm/drm_privacy_screen_consumer.h>  #include <drm/drm_scdc_helper.h>  #include "i915_drv.h" @@ -321,10 +322,11 @@ static void ddi_dotclock_get(struct intel_crtc_state *pipe_config)  {  	int dotclock; +	/* CRT dotclock is determined via other means */  	if (pipe_config->has_pch_encoder) -		dotclock = intel_dotclock_calculate(pipe_config->port_clock, -						    &pipe_config->fdi_m_n); -	else if (intel_crtc_has_dp_encoder(pipe_config)) +		return; + +	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 > 24) @@ -1039,7 +1041,6 @@ static void icl_ddi_combo_vswing_program(struct intel_encoder *encoder,  					 const struct intel_crtc_state *crtc_state)  {  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); -	int level = intel_ddi_level(encoder, crtc_state, 0);  	const struct intel_ddi_buf_trans *trans;  	enum phy phy = intel_port_to_phy(dev_priv, encoder->port);  	int n_entries, ln; @@ -1068,32 +1069,36 @@ static void icl_ddi_combo_vswing_program(struct intel_encoder *encoder,  	intel_de_write(dev_priv, ICL_PORT_TX_DW5_GRP(phy), val);  	/* Program PORT_TX_DW2 */ -	val = intel_de_read(dev_priv, ICL_PORT_TX_DW2_LN(0, phy)); -	val &= ~(SWING_SEL_LOWER_MASK | SWING_SEL_UPPER_MASK | -		 RCOMP_SCALAR_MASK); -	val |= SWING_SEL_UPPER(trans->entries[level].icl.dw2_swing_sel); -	val |= SWING_SEL_LOWER(trans->entries[level].icl.dw2_swing_sel); -	/* Program Rcomp scalar for every table entry */ -	val |= RCOMP_SCALAR(0x98); -	intel_de_write(dev_priv, ICL_PORT_TX_DW2_GRP(phy), val); +	for (ln = 0; ln < 4; ln++) { +		int level = intel_ddi_level(encoder, crtc_state, ln); + +		intel_de_rmw(dev_priv, ICL_PORT_TX_DW2_LN(ln, phy), +			     SWING_SEL_UPPER_MASK | SWING_SEL_LOWER_MASK | RCOMP_SCALAR_MASK, +			     SWING_SEL_UPPER(trans->entries[level].icl.dw2_swing_sel) | +			     SWING_SEL_LOWER(trans->entries[level].icl.dw2_swing_sel) | +			     RCOMP_SCALAR(0x98)); +	}  	/* Program PORT_TX_DW4 */  	/* We cannot write to GRP. It would overwrite individual loadgen. */  	for (ln = 0; ln < 4; ln++) { -		val = intel_de_read(dev_priv, ICL_PORT_TX_DW4_LN(ln, phy)); -		val &= ~(POST_CURSOR_1_MASK | POST_CURSOR_2_MASK | -			 CURSOR_COEFF_MASK); -		val |= POST_CURSOR_1(trans->entries[level].icl.dw4_post_cursor_1); -		val |= POST_CURSOR_2(trans->entries[level].icl.dw4_post_cursor_2); -		val |= CURSOR_COEFF(trans->entries[level].icl.dw4_cursor_coeff); -		intel_de_write(dev_priv, ICL_PORT_TX_DW4_LN(ln, phy), val); +		int level = intel_ddi_level(encoder, crtc_state, ln); + +		intel_de_rmw(dev_priv, ICL_PORT_TX_DW4_LN(ln, phy), +			     POST_CURSOR_1_MASK | POST_CURSOR_2_MASK | CURSOR_COEFF_MASK, +			     POST_CURSOR_1(trans->entries[level].icl.dw4_post_cursor_1) | +			     POST_CURSOR_2(trans->entries[level].icl.dw4_post_cursor_2) | +			     CURSOR_COEFF(trans->entries[level].icl.dw4_cursor_coeff));  	}  	/* Program PORT_TX_DW7 */ -	val = intel_de_read(dev_priv, ICL_PORT_TX_DW7_LN(0, phy)); -	val &= ~N_SCALAR_MASK; -	val |= N_SCALAR(trans->entries[level].icl.dw7_n_scalar); -	intel_de_write(dev_priv, ICL_PORT_TX_DW7_GRP(phy), val); +	for (ln = 0; ln < 4; ln++) { +		int level = intel_ddi_level(encoder, crtc_state, ln); + +		intel_de_rmw(dev_priv, ICL_PORT_TX_DW7_LN(ln, phy), +			     N_SCALAR_MASK, +			     N_SCALAR(trans->entries[level].icl.dw7_n_scalar)); +	}  }  static void icl_combo_phy_set_signal_levels(struct intel_encoder *encoder, @@ -1124,16 +1129,14 @@ static void icl_combo_phy_set_signal_levels(struct intel_encoder *encoder,  	 * > 6 GHz (LN0=0, LN1=0, LN2=0, LN3=0)  	 */  	for (ln = 0; ln < 4; ln++) { -		val = intel_de_read(dev_priv, ICL_PORT_TX_DW4_LN(ln, phy)); -		val &= ~LOADGEN_SELECT; -		val |= icl_combo_phy_loadgen_select(crtc_state, ln); -		intel_de_write(dev_priv, ICL_PORT_TX_DW4_LN(ln, phy), val); +		intel_de_rmw(dev_priv, ICL_PORT_TX_DW4_LN(ln, phy), +			     LOADGEN_SELECT, +			     icl_combo_phy_loadgen_select(crtc_state, ln));  	}  	/* 3. Set PORT_CL_DW5 SUS Clock Config to 11b */ -	val = intel_de_read(dev_priv, ICL_PORT_CL_DW5(phy)); -	val |= SUS_CLOCK_CONFIG; -	intel_de_write(dev_priv, ICL_PORT_CL_DW5(phy), val); +	intel_de_rmw(dev_priv, ICL_PORT_CL_DW5(phy), +		     0, SUS_CLOCK_CONFIG);  	/* 4. Clear training enable to change swing values */  	val = intel_de_read(dev_priv, ICL_PORT_TX_DW5_LN(0, phy)); @@ -1154,10 +1157,8 @@ static void icl_mg_phy_set_signal_levels(struct intel_encoder *encoder,  {  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);  	enum tc_port tc_port = intel_port_to_tc(dev_priv, encoder->port); -	int level = intel_ddi_level(encoder, crtc_state, 0);  	const struct intel_ddi_buf_trans *trans;  	int n_entries, ln; -	u32 val;  	if (intel_tc_port_in_tbt_alt_mode(enc_to_dig_port(encoder)))  		return; @@ -1166,53 +1167,51 @@ static void icl_mg_phy_set_signal_levels(struct intel_encoder *encoder,  	if (drm_WARN_ON_ONCE(&dev_priv->drm, !trans))  		return; -	/* Set MG_TX_LINK_PARAMS cri_use_fs32 to 0. */  	for (ln = 0; ln < 2; ln++) { -		val = intel_de_read(dev_priv, MG_TX1_LINK_PARAMS(ln, tc_port)); -		val &= ~CRI_USE_FS32; -		intel_de_write(dev_priv, MG_TX1_LINK_PARAMS(ln, tc_port), val); - -		val = intel_de_read(dev_priv, MG_TX2_LINK_PARAMS(ln, tc_port)); -		val &= ~CRI_USE_FS32; -		intel_de_write(dev_priv, MG_TX2_LINK_PARAMS(ln, tc_port), val); +		intel_de_rmw(dev_priv, MG_TX1_LINK_PARAMS(ln, tc_port), +			     CRI_USE_FS32, 0); +		intel_de_rmw(dev_priv, MG_TX2_LINK_PARAMS(ln, tc_port), +			     CRI_USE_FS32, 0);  	}  	/* Program MG_TX_SWINGCTRL with values from vswing table */  	for (ln = 0; ln < 2; ln++) { -		val = intel_de_read(dev_priv, MG_TX1_SWINGCTRL(ln, tc_port)); -		val &= ~CRI_TXDEEMPH_OVERRIDE_17_12_MASK; -		val |= CRI_TXDEEMPH_OVERRIDE_17_12( -			trans->entries[level].mg.cri_txdeemph_override_17_12); -		intel_de_write(dev_priv, MG_TX1_SWINGCTRL(ln, tc_port), val); - -		val = intel_de_read(dev_priv, MG_TX2_SWINGCTRL(ln, tc_port)); -		val &= ~CRI_TXDEEMPH_OVERRIDE_17_12_MASK; -		val |= CRI_TXDEEMPH_OVERRIDE_17_12( -			trans->entries[level].mg.cri_txdeemph_override_17_12); -		intel_de_write(dev_priv, MG_TX2_SWINGCTRL(ln, tc_port), val); +		int level; + +		level = intel_ddi_level(encoder, crtc_state, 2*ln+0); + +		intel_de_rmw(dev_priv, MG_TX1_SWINGCTRL(ln, tc_port), +			     CRI_TXDEEMPH_OVERRIDE_17_12_MASK, +			     CRI_TXDEEMPH_OVERRIDE_17_12(trans->entries[level].mg.cri_txdeemph_override_17_12)); + +		level = intel_ddi_level(encoder, crtc_state, 2*ln+1); + +		intel_de_rmw(dev_priv, MG_TX2_SWINGCTRL(ln, tc_port), +			     CRI_TXDEEMPH_OVERRIDE_17_12_MASK, +			     CRI_TXDEEMPH_OVERRIDE_17_12(trans->entries[level].mg.cri_txdeemph_override_17_12));  	}  	/* Program MG_TX_DRVCTRL with values from vswing table */  	for (ln = 0; ln < 2; ln++) { -		val = intel_de_read(dev_priv, MG_TX1_DRVCTRL(ln, tc_port)); -		val &= ~(CRI_TXDEEMPH_OVERRIDE_11_6_MASK | -			 CRI_TXDEEMPH_OVERRIDE_5_0_MASK); -		val |= CRI_TXDEEMPH_OVERRIDE_5_0( -			trans->entries[level].mg.cri_txdeemph_override_5_0) | -			CRI_TXDEEMPH_OVERRIDE_11_6( -				trans->entries[level].mg.cri_txdeemph_override_11_6) | -			CRI_TXDEEMPH_OVERRIDE_EN; -		intel_de_write(dev_priv, MG_TX1_DRVCTRL(ln, tc_port), val); - -		val = intel_de_read(dev_priv, MG_TX2_DRVCTRL(ln, tc_port)); -		val &= ~(CRI_TXDEEMPH_OVERRIDE_11_6_MASK | -			 CRI_TXDEEMPH_OVERRIDE_5_0_MASK); -		val |= CRI_TXDEEMPH_OVERRIDE_5_0( -			trans->entries[level].mg.cri_txdeemph_override_5_0) | -			CRI_TXDEEMPH_OVERRIDE_11_6( -				trans->entries[level].mg.cri_txdeemph_override_11_6) | -			CRI_TXDEEMPH_OVERRIDE_EN; -		intel_de_write(dev_priv, MG_TX2_DRVCTRL(ln, tc_port), val); +		int level; + +		level = intel_ddi_level(encoder, crtc_state, 2*ln+0); + +		intel_de_rmw(dev_priv, MG_TX1_DRVCTRL(ln, tc_port), +			     CRI_TXDEEMPH_OVERRIDE_11_6_MASK | +			     CRI_TXDEEMPH_OVERRIDE_5_0_MASK, +			     CRI_TXDEEMPH_OVERRIDE_11_6(trans->entries[level].mg.cri_txdeemph_override_11_6) | +			     CRI_TXDEEMPH_OVERRIDE_5_0(trans->entries[level].mg.cri_txdeemph_override_5_0) | +			     CRI_TXDEEMPH_OVERRIDE_EN); + +		level = intel_ddi_level(encoder, crtc_state, 2*ln+1); + +		intel_de_rmw(dev_priv, MG_TX2_DRVCTRL(ln, tc_port), +			     CRI_TXDEEMPH_OVERRIDE_11_6_MASK | +			     CRI_TXDEEMPH_OVERRIDE_5_0_MASK, +			     CRI_TXDEEMPH_OVERRIDE_11_6(trans->entries[level].mg.cri_txdeemph_override_11_6) | +			     CRI_TXDEEMPH_OVERRIDE_5_0(trans->entries[level].mg.cri_txdeemph_override_5_0) | +			     CRI_TXDEEMPH_OVERRIDE_EN);  		/* FIXME: Program CRI_LOADGEN_SEL after the spec is updated */  	} @@ -1223,50 +1222,34 @@ static void icl_mg_phy_set_signal_levels(struct intel_encoder *encoder,  	 * values from table for which TX1 and TX2 enabled.  	 */  	for (ln = 0; ln < 2; ln++) { -		val = intel_de_read(dev_priv, MG_CLKHUB(ln, tc_port)); -		if (crtc_state->port_clock < 300000) -			val |= CFG_LOW_RATE_LKREN_EN; -		else -			val &= ~CFG_LOW_RATE_LKREN_EN; -		intel_de_write(dev_priv, MG_CLKHUB(ln, tc_port), val); +		intel_de_rmw(dev_priv, MG_CLKHUB(ln, tc_port), +			     CFG_LOW_RATE_LKREN_EN, +			     crtc_state->port_clock < 300000 ? CFG_LOW_RATE_LKREN_EN : 0);  	}  	/* Program the MG_TX_DCC<LN, port being used> based on the link frequency */  	for (ln = 0; ln < 2; ln++) { -		val = intel_de_read(dev_priv, MG_TX1_DCC(ln, tc_port)); -		val &= ~CFG_AMI_CK_DIV_OVERRIDE_VAL_MASK; -		if (crtc_state->port_clock <= 500000) { -			val &= ~CFG_AMI_CK_DIV_OVERRIDE_EN; -		} else { -			val |= CFG_AMI_CK_DIV_OVERRIDE_EN | -				CFG_AMI_CK_DIV_OVERRIDE_VAL(1); -		} -		intel_de_write(dev_priv, MG_TX1_DCC(ln, tc_port), val); - -		val = intel_de_read(dev_priv, MG_TX2_DCC(ln, tc_port)); -		val &= ~CFG_AMI_CK_DIV_OVERRIDE_VAL_MASK; -		if (crtc_state->port_clock <= 500000) { -			val &= ~CFG_AMI_CK_DIV_OVERRIDE_EN; -		} else { -			val |= CFG_AMI_CK_DIV_OVERRIDE_EN | -				CFG_AMI_CK_DIV_OVERRIDE_VAL(1); -		} -		intel_de_write(dev_priv, MG_TX2_DCC(ln, tc_port), val); +		intel_de_rmw(dev_priv, MG_TX1_DCC(ln, tc_port), +			     CFG_AMI_CK_DIV_OVERRIDE_VAL_MASK | +			     CFG_AMI_CK_DIV_OVERRIDE_EN, +			     crtc_state->port_clock > 500000 ? +			     CFG_AMI_CK_DIV_OVERRIDE_VAL(1) | +			     CFG_AMI_CK_DIV_OVERRIDE_EN : 0); + +		intel_de_rmw(dev_priv, MG_TX2_DCC(ln, tc_port), +			     CFG_AMI_CK_DIV_OVERRIDE_VAL_MASK | +			     CFG_AMI_CK_DIV_OVERRIDE_EN, +			     crtc_state->port_clock > 500000 ? +			     CFG_AMI_CK_DIV_OVERRIDE_VAL(1) | +			     CFG_AMI_CK_DIV_OVERRIDE_EN : 0);  	}  	/* Program MG_TX_PISO_READLOAD with values from vswing table */  	for (ln = 0; ln < 2; ln++) { -		val = intel_de_read(dev_priv, -				    MG_TX1_PISO_READLOAD(ln, tc_port)); -		val |= CRI_CALCINIT; -		intel_de_write(dev_priv, MG_TX1_PISO_READLOAD(ln, tc_port), -			       val); - -		val = intel_de_read(dev_priv, -				    MG_TX2_PISO_READLOAD(ln, tc_port)); -		val |= CRI_CALCINIT; -		intel_de_write(dev_priv, MG_TX2_PISO_READLOAD(ln, tc_port), -			       val); +		intel_de_rmw(dev_priv, MG_TX1_PISO_READLOAD(ln, tc_port), +			     0, CRI_CALCINIT); +		intel_de_rmw(dev_priv, MG_TX2_PISO_READLOAD(ln, tc_port), +			     0, CRI_CALCINIT);  	}  } @@ -1275,9 +1258,7 @@ static void tgl_dkl_phy_set_signal_levels(struct intel_encoder *encoder,  {  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);  	enum tc_port tc_port = intel_port_to_tc(dev_priv, encoder->port); -	int level = intel_ddi_level(encoder, crtc_state, 0);  	const struct intel_ddi_buf_trans *trans; -	u32 val, dpcnt_mask, dpcnt_val;  	int n_entries, ln;  	if (intel_tc_port_in_tbt_alt_mode(enc_to_dig_port(encoder))) @@ -1287,33 +1268,36 @@ static void tgl_dkl_phy_set_signal_levels(struct intel_encoder *encoder,  	if (drm_WARN_ON_ONCE(&dev_priv->drm, !trans))  		return; -	dpcnt_mask = (DKL_TX_PRESHOOT_COEFF_MASK | -		      DKL_TX_DE_EMPAHSIS_COEFF_MASK | -		      DKL_TX_VSWING_CONTROL_MASK); -	dpcnt_val = DKL_TX_VSWING_CONTROL(trans->entries[level].dkl.vswing); -	dpcnt_val |= DKL_TX_DE_EMPHASIS_COEFF(trans->entries[level].dkl.de_emphasis); -	dpcnt_val |= DKL_TX_PRESHOOT_COEFF(trans->entries[level].dkl.preshoot); -  	for (ln = 0; ln < 2; ln++) { +		int level; +  		intel_de_write(dev_priv, HIP_INDEX_REG(tc_port),  			       HIP_INDEX_VAL(tc_port, ln));  		intel_de_write(dev_priv, DKL_TX_PMD_LANE_SUS(tc_port), 0); -		/* All the registers are RMW */ -		val = intel_de_read(dev_priv, DKL_TX_DPCNTL0(tc_port)); -		val &= ~dpcnt_mask; -		val |= dpcnt_val; -		intel_de_write(dev_priv, DKL_TX_DPCNTL0(tc_port), val); +		level = intel_ddi_level(encoder, crtc_state, 2*ln+0); + +		intel_de_rmw(dev_priv, DKL_TX_DPCNTL0(tc_port), +			     DKL_TX_PRESHOOT_COEFF_MASK | +			     DKL_TX_DE_EMPAHSIS_COEFF_MASK | +			     DKL_TX_VSWING_CONTROL_MASK, +			     DKL_TX_PRESHOOT_COEFF(trans->entries[level].dkl.preshoot) | +			     DKL_TX_DE_EMPHASIS_COEFF(trans->entries[level].dkl.de_emphasis) | +			     DKL_TX_VSWING_CONTROL(trans->entries[level].dkl.vswing)); -		val = intel_de_read(dev_priv, DKL_TX_DPCNTL1(tc_port)); -		val &= ~dpcnt_mask; -		val |= dpcnt_val; -		intel_de_write(dev_priv, DKL_TX_DPCNTL1(tc_port), val); +		level = intel_ddi_level(encoder, crtc_state, 2*ln+1); -		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); +		intel_de_rmw(dev_priv, DKL_TX_DPCNTL1(tc_port), +			     DKL_TX_PRESHOOT_COEFF_MASK | +			     DKL_TX_DE_EMPAHSIS_COEFF_MASK | +			     DKL_TX_VSWING_CONTROL_MASK, +			     DKL_TX_PRESHOOT_COEFF(trans->entries[level].dkl.preshoot) | +			     DKL_TX_DE_EMPHASIS_COEFF(trans->entries[level].dkl.de_emphasis) | +			     DKL_TX_VSWING_CONTROL(trans->entries[level].dkl.vswing)); + +		intel_de_rmw(dev_priv, DKL_TX_DPCNTL2(tc_port), +			     DKL_TX_DP20BITMODE, 0);  	}  } @@ -1938,7 +1922,7 @@ void intel_ddi_enable_clock(struct intel_encoder *encoder,  		encoder->enable_clock(encoder, crtc_state);  } -static void intel_ddi_disable_clock(struct intel_encoder *encoder) +void intel_ddi_disable_clock(struct intel_encoder *encoder)  {  	if (encoder->disable_clock)  		encoder->disable_clock(encoder); @@ -2385,7 +2369,10 @@ static void dg2_ddi_pre_enable_dp(struct intel_atomic_state *state,  	/* 5.k Configure and enable FEC if needed */  	intel_ddi_enable_fec(encoder, crtc_state); -	intel_dsc_enable(encoder, crtc_state); + +	intel_dsc_dp_pps_write(encoder, crtc_state); + +	intel_dsc_enable(crtc_state);  }  static void tgl_ddi_pre_enable_dp(struct intel_atomic_state *state, @@ -2519,8 +2506,11 @@ static void tgl_ddi_pre_enable_dp(struct intel_atomic_state *state,  	/* 7.l Configure and enable FEC if needed */  	intel_ddi_enable_fec(encoder, crtc_state); + +	intel_dsc_dp_pps_write(encoder, crtc_state); +  	if (!crtc_state->bigjoiner) -		intel_dsc_enable(encoder, crtc_state); +		intel_dsc_enable(crtc_state);  }  static void hsw_ddi_pre_enable_dp(struct intel_atomic_state *state, @@ -2585,8 +2575,10 @@ static void hsw_ddi_pre_enable_dp(struct intel_atomic_state *state,  	if (!is_mst)  		intel_ddi_enable_pipe_clock(encoder, crtc_state); +	intel_dsc_dp_pps_write(encoder, crtc_state); +  	if (!crtc_state->bigjoiner) -		intel_dsc_enable(encoder, crtc_state); +		intel_dsc_enable(crtc_state);  }  static void intel_ddi_pre_enable_dp(struct intel_atomic_state *state, @@ -2824,12 +2816,10 @@ static void intel_ddi_post_disable(struct intel_atomic_state *state,  	}  	if (old_crtc_state->bigjoiner_linked_crtc) { -		struct intel_atomic_state *state = -			to_intel_atomic_state(old_crtc_state->uapi.state); -		struct intel_crtc *slave = +		struct intel_crtc *slave_crtc =  			old_crtc_state->bigjoiner_linked_crtc;  		const struct intel_crtc_state *old_slave_crtc_state = -			intel_atomic_get_old_crtc_state(state, slave); +			intel_atomic_get_old_crtc_state(state, slave_crtc);  		intel_crtc_vblank_off(old_slave_crtc_state); @@ -2866,41 +2856,6 @@ static void intel_ddi_post_disable(struct intel_atomic_state *state,  		intel_tc_port_put_link(dig_port);  } -void intel_ddi_fdi_post_disable(struct intel_atomic_state *state, -				struct intel_encoder *encoder, -				const struct intel_crtc_state *old_crtc_state, -				const struct drm_connector_state *old_conn_state) -{ -	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); -	u32 val; - -	/* -	 * Bspec lists this as both step 13 (before DDI_BUF_CTL disable) -	 * and step 18 (after clearing PORT_CLK_SEL). Based on a BUN, -	 * step 13 is the correct place for it. Step 18 is where it was -	 * originally before the BUN. -	 */ -	val = intel_de_read(dev_priv, FDI_RX_CTL(PIPE_A)); -	val &= ~FDI_RX_ENABLE; -	intel_de_write(dev_priv, FDI_RX_CTL(PIPE_A), val); - -	intel_disable_ddi_buf(encoder, old_crtc_state); -	intel_ddi_disable_clock(encoder); - -	val = intel_de_read(dev_priv, FDI_RX_MISC(PIPE_A)); -	val &= ~(FDI_RX_PWRDN_LANE1_MASK | FDI_RX_PWRDN_LANE0_MASK); -	val |= FDI_RX_PWRDN_LANE1_VAL(2) | FDI_RX_PWRDN_LANE0_VAL(2); -	intel_de_write(dev_priv, FDI_RX_MISC(PIPE_A), val); - -	val = intel_de_read(dev_priv, FDI_RX_CTL(PIPE_A)); -	val &= ~FDI_PCDCLK; -	intel_de_write(dev_priv, FDI_RX_CTL(PIPE_A), val); - -	val = intel_de_read(dev_priv, FDI_RX_CTL(PIPE_A)); -	val &= ~FDI_RX_PLL_ENABLE; -	intel_de_write(dev_priv, FDI_RX_CTL(PIPE_A), val); -} -  static void trans_port_sync_stop_link_train(struct intel_atomic_state *state,  					    struct intel_encoder *encoder,  					    const struct intel_crtc_state *crtc_state) @@ -2951,6 +2906,7 @@ static void intel_enable_ddi_dp(struct intel_atomic_state *state,  	if (port == PORT_A && DISPLAY_VER(dev_priv) < 9)  		intel_dp_stop_link_train(intel_dp, crtc_state); +	drm_connector_update_privacy_screen(conn_state);  	intel_edp_backlight_on(crtc_state, conn_state);  	if (!dig_port->lspcon.active || dig_port->dp.has_hdmi_sink) @@ -3095,6 +3051,12 @@ static void intel_disable_ddi_dp(struct intel_atomic_state *state,  	intel_dp->link_trained = false; +	if (old_crtc_state->has_audio) +		intel_audio_codec_disable(encoder, +					  old_crtc_state, old_conn_state); + +	intel_drrs_disable(intel_dp, old_crtc_state); +	intel_psr_disable(intel_dp, old_crtc_state);  	intel_edp_backlight_off(old_conn_state);  	/* Disable the decompression in DP Sink */  	intel_dp_sink_set_decompression_state(intel_dp, old_crtc_state, @@ -3112,6 +3074,10 @@ static void intel_disable_ddi_hdmi(struct intel_atomic_state *state,  	struct drm_i915_private *i915 = to_i915(encoder->base.dev);  	struct drm_connector *connector = old_conn_state->connector; +	if (old_crtc_state->has_audio) +		intel_audio_codec_disable(encoder, +					  old_crtc_state, old_conn_state); +  	if (!intel_hdmi_handle_sink_scrambling(encoder, connector,  					       false, false))  		drm_dbg_kms(&i915->drm, @@ -3119,25 +3085,6 @@ static void intel_disable_ddi_hdmi(struct intel_atomic_state *state,  			    connector->base.id, connector->name);  } -static void intel_pre_disable_ddi(struct intel_atomic_state *state, -				  struct intel_encoder *encoder, -				  const struct intel_crtc_state *old_crtc_state, -				  const struct drm_connector_state *old_conn_state) -{ -	struct intel_dp *intel_dp; - -	if (old_crtc_state->has_audio) -		intel_audio_codec_disable(encoder, old_crtc_state, -					  old_conn_state); - -	if (intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_HDMI)) -		return; - -	intel_dp = enc_to_intel_dp(encoder); -	intel_drrs_disable(intel_dp, old_crtc_state); -	intel_psr_disable(intel_dp, old_crtc_state); -} -  static void intel_disable_ddi(struct intel_atomic_state *state,  			      struct intel_encoder *encoder,  			      const struct intel_crtc_state *old_crtc_state, @@ -3166,6 +3113,7 @@ static void intel_ddi_update_pipe_dp(struct intel_atomic_state *state,  	intel_drrs_update(intel_dp, crtc_state);  	intel_backlight_update(state, encoder, crtc_state, conn_state); +	drm_connector_update_privacy_screen(conn_state);  }  void intel_ddi_update_pipe(struct intel_atomic_state *state, @@ -3195,8 +3143,14 @@ intel_ddi_update_prepare(struct intel_atomic_state *state,  	intel_tc_port_get_link(enc_to_dig_port(encoder),  		               required_lanes); -	if (crtc_state && crtc_state->hw.active) +	if (crtc_state && crtc_state->hw.active) { +		struct intel_crtc *slave_crtc = crtc_state->bigjoiner_linked_crtc; +  		intel_update_active_dpll(state, crtc, encoder); + +		if (slave_crtc) +			intel_update_active_dpll(state, slave_crtc, encoder); +	}  }  static void @@ -3552,18 +3506,7 @@ static void intel_ddi_get_config(struct intel_encoder *encoder,  	if (drm_WARN_ON(&dev_priv->drm, transcoder_is_dsi(cpu_transcoder)))  		return; -	if (pipe_config->bigjoiner_slave) { -		/* read out pipe settings from master */ -		enum transcoder save = pipe_config->cpu_transcoder; - -		/* Our own transcoder needs to be disabled when reading it in intel_ddi_read_func_ctl() */ -		WARN_ON(pipe_config->output_types); -		pipe_config->cpu_transcoder = (enum transcoder)pipe_config->bigjoiner_linked_crtc->pipe; -		intel_ddi_read_func_ctl(encoder, pipe_config); -		pipe_config->cpu_transcoder = save; -	} else { -		intel_ddi_read_func_ctl(encoder, pipe_config); -	} +	intel_ddi_read_func_ctl(encoder, pipe_config);  	intel_ddi_mso_get_config(encoder, pipe_config); @@ -3591,8 +3534,7 @@ static void intel_ddi_get_config(struct intel_encoder *encoder,  		dev_priv->vbt.edp.bpp = pipe_config->pipe_bpp;  	} -	if (!pipe_config->bigjoiner_slave) -		ddi_dotclock_get(pipe_config); +	ddi_dotclock_get(pipe_config);  	if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv))  		pipe_config->lane_lat_optim_mask = @@ -3983,6 +3925,19 @@ intel_ddi_init_dp_connector(struct intel_digital_port *dig_port)  		return NULL;  	} +	if (dig_port->base.type == INTEL_OUTPUT_EDP) { +		struct drm_device *dev = dig_port->base.base.dev; +		struct drm_privacy_screen *privacy_screen; + +		privacy_screen = drm_privacy_screen_get(dev->dev, NULL); +		if (!IS_ERR(privacy_screen)) { +			drm_connector_attach_privacy_screen_provider(&connector->base, +								     privacy_screen); +		} else if (PTR_ERR(privacy_screen) != -ENODEV) { +			drm_warn(dev, "Error getting privacy-screen\n"); +		} +	} +  	return connector;  } @@ -4472,7 +4427,6 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)  	encoder->enable = intel_enable_ddi;  	encoder->pre_pll_enable = intel_ddi_pre_pll_enable;  	encoder->pre_enable = intel_ddi_pre_enable; -	encoder->pre_disable = intel_pre_disable_ddi;  	encoder->disable = intel_disable_ddi;  	encoder->post_disable = intel_ddi_post_disable;  	encoder->update_pipe = intel_ddi_update_pipe; |