diff options
Diffstat (limited to 'drivers/gpu/drm/i915/display/intel_display.c')
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_display.c | 821 | 
1 files changed, 272 insertions, 549 deletions
diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c index 63b4b73f47c6..3c29792137a5 100644 --- a/drivers/gpu/drm/i915/display/intel_display.c +++ b/drivers/gpu/drm/i915/display/intel_display.c @@ -55,6 +55,7 @@  #include "i915_reg.h"  #include "i915_utils.h"  #include "i9xx_plane.h" +#include "i9xx_wm.h"  #include "icl_dsi.h"  #include "intel_acpi.h"  #include "intel_atomic.h" @@ -62,6 +63,7 @@  #include "intel_audio.h"  #include "intel_bw.h"  #include "intel_cdclk.h" +#include "intel_clock_gating.h"  #include "intel_color.h"  #include "intel_crt.h"  #include "intel_crtc.h" @@ -94,6 +96,7 @@  #include "intel_hotplug.h"  #include "intel_hti.h"  #include "intel_lvds.h" +#include "intel_lvds_regs.h"  #include "intel_modeset_setup.h"  #include "intel_modeset_verify.h"  #include "intel_overlay.h" @@ -103,19 +106,19 @@  #include "intel_pcode.h"  #include "intel_pipe_crc.h"  #include "intel_plane_initial.h" -#include "intel_pm.h"  #include "intel_pps.h"  #include "intel_psr.h"  #include "intel_quirks.h"  #include "intel_sdvo.h"  #include "intel_snps_phy.h" -#include "intel_sprite.h"  #include "intel_tc.h"  #include "intel_tv.h"  #include "intel_vblank.h"  #include "intel_vdsc.h" +#include "intel_vdsc_regs.h"  #include "intel_vga.h"  #include "intel_vrr.h" +#include "intel_wm.h"  #include "skl_scaler.h"  #include "skl_universal_plane.h"  #include "skl_watermark.h" @@ -127,104 +130,9 @@  static void intel_set_transcoder_timings(const struct intel_crtc_state *crtc_state);  static void intel_set_pipe_src_size(const struct intel_crtc_state *crtc_state);  static void hsw_set_transconf(const struct intel_crtc_state *crtc_state); -static void bdw_set_pipemisc(const struct intel_crtc_state *crtc_state); +static void bdw_set_pipe_misc(const struct intel_crtc_state *crtc_state);  static void ilk_pfit_enable(const struct intel_crtc_state *crtc_state); -/** - * intel_update_watermarks - update FIFO watermark values based on current modes - * @dev_priv: i915 device - * - * Calculate watermark values for the various WM regs based on current mode - * and plane configuration. - * - * There are several cases to deal with here: - *   - normal (i.e. non-self-refresh) - *   - self-refresh (SR) mode - *   - lines are large relative to FIFO size (buffer can hold up to 2) - *   - lines are small relative to FIFO size (buffer can hold more than 2 - *     lines), so need to account for TLB latency - * - *   The normal calculation is: - *     watermark = dotclock * bytes per pixel * latency - *   where latency is platform & configuration dependent (we assume pessimal - *   values here). - * - *   The SR calculation is: - *     watermark = (trunc(latency/line time)+1) * surface width * - *       bytes per pixel - *   where - *     line time = htotal / dotclock - *     surface width = hdisplay for normal plane and 64 for cursor - *   and latency is assumed to be high, as above. - * - * The final value programmed to the register should always be rounded up, - * and include an extra 2 entries to account for clock crossings. - * - * We don't use the sprite, so we can ignore that.  And on Crestline we have - * to set the non-SR watermarks to 8. - */ -void intel_update_watermarks(struct drm_i915_private *dev_priv) -{ -	if (dev_priv->display.funcs.wm->update_wm) -		dev_priv->display.funcs.wm->update_wm(dev_priv); -} - -static int intel_compute_pipe_wm(struct intel_atomic_state *state, -				 struct intel_crtc *crtc) -{ -	struct drm_i915_private *dev_priv = to_i915(state->base.dev); -	if (dev_priv->display.funcs.wm->compute_pipe_wm) -		return dev_priv->display.funcs.wm->compute_pipe_wm(state, crtc); -	return 0; -} - -static int intel_compute_intermediate_wm(struct intel_atomic_state *state, -					 struct intel_crtc *crtc) -{ -	struct drm_i915_private *dev_priv = to_i915(state->base.dev); -	if (!dev_priv->display.funcs.wm->compute_intermediate_wm) -		return 0; -	if (drm_WARN_ON(&dev_priv->drm, -			!dev_priv->display.funcs.wm->compute_pipe_wm)) -		return 0; -	return dev_priv->display.funcs.wm->compute_intermediate_wm(state, crtc); -} - -static bool intel_initial_watermarks(struct intel_atomic_state *state, -				     struct intel_crtc *crtc) -{ -	struct drm_i915_private *dev_priv = to_i915(state->base.dev); -	if (dev_priv->display.funcs.wm->initial_watermarks) { -		dev_priv->display.funcs.wm->initial_watermarks(state, crtc); -		return true; -	} -	return false; -} - -static void intel_atomic_update_watermarks(struct intel_atomic_state *state, -					   struct intel_crtc *crtc) -{ -	struct drm_i915_private *dev_priv = to_i915(state->base.dev); -	if (dev_priv->display.funcs.wm->atomic_update_watermarks) -		dev_priv->display.funcs.wm->atomic_update_watermarks(state, crtc); -} - -static void intel_optimize_watermarks(struct intel_atomic_state *state, -				      struct intel_crtc *crtc) -{ -	struct drm_i915_private *dev_priv = to_i915(state->base.dev); -	if (dev_priv->display.funcs.wm->optimize_watermarks) -		dev_priv->display.funcs.wm->optimize_watermarks(state, crtc); -} - -static int intel_compute_global_watermarks(struct intel_atomic_state *state) -{ -	struct drm_i915_private *dev_priv = to_i915(state->base.dev); -	if (dev_priv->display.funcs.wm->compute_global_watermarks) -		return dev_priv->display.funcs.wm->compute_global_watermarks(state); -	return 0; -} -  /* returns HPLL frequency in kHz */  int vlv_get_hpll_vco(struct drm_i915_private *dev_priv)  { @@ -293,11 +201,11 @@ static void  skl_wa_827(struct drm_i915_private *dev_priv, enum pipe pipe, bool enable)  {  	if (enable) -		intel_de_write(dev_priv, CLKGATE_DIS_PSL(pipe), -		               intel_de_read(dev_priv, CLKGATE_DIS_PSL(pipe)) | DUPS1_GATING_DIS | DUPS2_GATING_DIS); +		intel_de_rmw(dev_priv, CLKGATE_DIS_PSL(pipe), +			     0, DUPS1_GATING_DIS | DUPS2_GATING_DIS);  	else -		intel_de_write(dev_priv, CLKGATE_DIS_PSL(pipe), -		               intel_de_read(dev_priv, CLKGATE_DIS_PSL(pipe)) & ~(DUPS1_GATING_DIS | DUPS2_GATING_DIS)); +		intel_de_rmw(dev_priv, CLKGATE_DIS_PSL(pipe), +			     DUPS1_GATING_DIS | DUPS2_GATING_DIS, 0);  }  /* Wa_2006604312:icl,ehl */ @@ -306,11 +214,9 @@ icl_wa_scalerclkgating(struct drm_i915_private *dev_priv, enum pipe pipe,  		       bool enable)  {  	if (enable) -		intel_de_write(dev_priv, CLKGATE_DIS_PSL(pipe), -		               intel_de_read(dev_priv, CLKGATE_DIS_PSL(pipe)) | DPFR_GATING_DIS); +		intel_de_rmw(dev_priv, CLKGATE_DIS_PSL(pipe), 0, DPFR_GATING_DIS);  	else -		intel_de_write(dev_priv, CLKGATE_DIS_PSL(pipe), -		               intel_de_read(dev_priv, CLKGATE_DIS_PSL(pipe)) & ~DPFR_GATING_DIS); +		intel_de_rmw(dev_priv, CLKGATE_DIS_PSL(pipe), DPFR_GATING_DIS, 0);  }  /* Wa_1604331009:icl,jsl,ehl */ @@ -395,8 +301,8 @@ intel_wait_for_pipe_off(const struct intel_crtc_state *old_crtc_state)  		enum transcoder cpu_transcoder = old_crtc_state->cpu_transcoder;  		/* Wait for the Pipe State to go off */ -		if (intel_de_wait_for_clear(dev_priv, PIPECONF(cpu_transcoder), -					    PIPECONF_STATE_ENABLE, 100)) +		if (intel_de_wait_for_clear(dev_priv, TRANSCONF(cpu_transcoder), +					    TRANSCONF_STATE_ENABLE, 100))  			drm_WARN(&dev_priv->drm, 1, "pipe_off wait timed out\n");  	} else {  		intel_wait_for_pipe_scanline_stopped(crtc); @@ -417,8 +323,8 @@ void assert_transcoder(struct drm_i915_private *dev_priv,  	power_domain = POWER_DOMAIN_TRANSCODER(cpu_transcoder);  	wakeref = intel_display_power_get_if_enabled(dev_priv, power_domain);  	if (wakeref) { -		u32 val = intel_de_read(dev_priv, PIPECONF(cpu_transcoder)); -		cur_state = !!(val & PIPECONF_ENABLE); +		u32 val = intel_de_read(dev_priv, TRANSCONF(cpu_transcoder)); +		cur_state = !!(val & TRANSCONF_ENABLE);  		intel_display_power_put(dev_priv, power_domain, wakeref);  	} else { @@ -530,15 +436,15 @@ void intel_enable_transcoder(const struct intel_crtc_state *new_crtc_state)  		intel_de_rmw(dev_priv, PIPE_ARB_CTL(pipe),  			     0, PIPE_ARB_USE_PROG_SLOTS); -	reg = PIPECONF(cpu_transcoder); +	reg = TRANSCONF(cpu_transcoder);  	val = intel_de_read(dev_priv, reg); -	if (val & PIPECONF_ENABLE) { +	if (val & TRANSCONF_ENABLE) {  		/* we keep both pipes enabled on 830 */  		drm_WARN_ON(&dev_priv->drm, !IS_I830(dev_priv));  		return;  	} -	intel_de_write(dev_priv, reg, val | PIPECONF_ENABLE); +	intel_de_write(dev_priv, reg, val | TRANSCONF_ENABLE);  	intel_de_posting_read(dev_priv, reg);  	/* @@ -569,9 +475,9 @@ void intel_disable_transcoder(const struct intel_crtc_state *old_crtc_state)  	 */  	assert_planes_disabled(crtc); -	reg = PIPECONF(cpu_transcoder); +	reg = TRANSCONF(cpu_transcoder);  	val = intel_de_read(dev_priv, reg); -	if ((val & PIPECONF_ENABLE) == 0) +	if ((val & TRANSCONF_ENABLE) == 0)  		return;  	/* @@ -579,11 +485,11 @@ void intel_disable_transcoder(const struct intel_crtc_state *old_crtc_state)  	 * so best keep it disabled when not needed.  	 */  	if (old_crtc_state->double_wide) -		val &= ~PIPECONF_DOUBLE_WIDE; +		val &= ~TRANSCONF_DOUBLE_WIDE;  	/* Don't disable pipe or pipe PLLs if needed */  	if (!IS_I830(dev_priv)) -		val &= ~PIPECONF_ENABLE; +		val &= ~TRANSCONF_ENABLE;  	if (DISPLAY_VER(dev_priv) >= 14)  		intel_de_rmw(dev_priv, MTL_CHICKEN_TRANS(cpu_transcoder), @@ -593,7 +499,7 @@ void intel_disable_transcoder(const struct intel_crtc_state *old_crtc_state)  			     FECSTALL_DIS_DPTSTREAM_DPTTG, 0);  	intel_de_write(dev_priv, reg, val); -	if ((val & PIPECONF_ENABLE) == 0) +	if ((val & TRANSCONF_ENABLE) == 0)  		intel_wait_for_pipe_off(old_crtc_state);  } @@ -944,7 +850,7 @@ void intel_display_finish_reset(struct drm_i915_private *i915)  		 */  		intel_pps_unlock_regs_wa(i915);  		intel_modeset_init_hw(i915); -		intel_init_clock_gating(i915); +		intel_clock_gating_init(i915);  		intel_hpd_init(i915);  		ret = __intel_display_resume(i915, state, ctx); @@ -1053,7 +959,7 @@ intel_get_crtc_new_encoder(const struct intel_atomic_state *state,  		num_encoders++;  	} -	drm_WARN(encoder->base.dev, num_encoders != 1, +	drm_WARN(state->base.dev, num_encoders != 1,  		 "%d encoders for pipe %c\n",  		 num_encoders, pipe_name(master_crtc->pipe)); @@ -1255,7 +1161,8 @@ static void intel_crtc_async_flip_disable_wa(struct intel_atomic_state *state,  		intel_atomic_get_old_crtc_state(state, crtc);  	const struct intel_crtc_state *new_crtc_state =  		intel_atomic_get_new_crtc_state(state, crtc); -	u8 update_planes = new_crtc_state->update_planes; +	u8 disable_async_flip_planes = old_crtc_state->async_flip_planes & +				       ~new_crtc_state->async_flip_planes;  	const struct intel_plane_state *old_plane_state;  	struct intel_plane *plane;  	bool need_vbl_wait = false; @@ -1264,7 +1171,7 @@ static void intel_crtc_async_flip_disable_wa(struct intel_atomic_state *state,  	for_each_old_intel_plane_in_state(state, plane, old_plane_state, i) {  		if (plane->need_async_flip_disable_wa &&  		    plane->pipe == crtc->pipe && -		    update_planes & BIT(plane->id)) { +		    disable_async_flip_planes & BIT(plane->id)) {  			/*  			 * Apart from the async flip bit we want to  			 * preserve the old state for the plane. @@ -1381,7 +1288,7 @@ static void intel_pre_plane_update(struct intel_atomic_state *state,  	 * WA for platforms where async address update enable bit  	 * is double buffered and only latched at start of vblank.  	 */ -	if (old_crtc_state->uapi.async_flip && !new_crtc_state->uapi.async_flip) +	if (old_crtc_state->async_flip_planes & ~new_crtc_state->async_flip_planes)  		intel_crtc_async_flip_disable_wa(state, crtc);  } @@ -1413,36 +1320,11 @@ static void intel_crtc_disable_planes(struct intel_atomic_state *state,  	intel_frontbuffer_flip(dev_priv, fb_bits);  } -/* - * intel_connector_primary_encoder - get the primary encoder for a connector - * @connector: connector for which to return the encoder - * - * Returns the primary encoder for a connector. There is a 1:1 mapping from - * all connectors to their encoder, except for DP-MST connectors which have - * both a virtual and a primary encoder. These DP-MST primary encoders can be - * pointed to by as many DP-MST connectors as there are pipes. - */ -static struct intel_encoder * -intel_connector_primary_encoder(struct intel_connector *connector) -{ -	struct intel_encoder *encoder; - -	if (connector->mst_port) -		return &dp_to_dig_port(connector->mst_port)->base; - -	encoder = intel_attached_encoder(connector); -	drm_WARN_ON(connector->base.dev, !encoder); - -	return encoder; -} -  static void intel_encoders_update_prepare(struct intel_atomic_state *state)  {  	struct drm_i915_private *i915 = to_i915(state->base.dev);  	struct intel_crtc_state *new_crtc_state, *old_crtc_state;  	struct intel_crtc *crtc; -	struct drm_connector_state *new_conn_state; -	struct drm_connector *connector;  	int i;  	/* @@ -1458,57 +1340,6 @@ static void intel_encoders_update_prepare(struct intel_atomic_state *state)  			new_crtc_state->dpll_hw_state = old_crtc_state->dpll_hw_state;  		}  	} - -	if (!state->modeset) -		return; - -	for_each_new_connector_in_state(&state->base, connector, new_conn_state, -					i) { -		struct intel_connector *intel_connector; -		struct intel_encoder *encoder; -		struct intel_crtc *crtc; - -		if (!intel_connector_needs_modeset(state, connector)) -			continue; - -		intel_connector = to_intel_connector(connector); -		encoder = intel_connector_primary_encoder(intel_connector); -		if (!encoder->update_prepare) -			continue; - -		crtc = new_conn_state->crtc ? -			to_intel_crtc(new_conn_state->crtc) : NULL; -		encoder->update_prepare(state, encoder, crtc); -	} -} - -static void intel_encoders_update_complete(struct intel_atomic_state *state) -{ -	struct drm_connector_state *new_conn_state; -	struct drm_connector *connector; -	int i; - -	if (!state->modeset) -		return; - -	for_each_new_connector_in_state(&state->base, connector, new_conn_state, -					i) { -		struct intel_connector *intel_connector; -		struct intel_encoder *encoder; -		struct intel_crtc *crtc; - -		if (!intel_connector_needs_modeset(state, connector)) -			continue; - -		intel_connector = to_intel_connector(connector); -		encoder = intel_connector_primary_encoder(intel_connector); -		if (!encoder->update_complete) -			continue; - -		crtc = new_conn_state->crtc ? -			to_intel_crtc(new_conn_state->crtc) : NULL; -		encoder->update_complete(state, encoder, crtc); -	}  }  static void intel_encoders_pre_pll_enable(struct intel_atomic_state *state, @@ -1804,12 +1635,10 @@ static void hsw_set_frame_start_delay(const struct intel_crtc_state *crtc_state)  	enum transcoder transcoder = crtc_state->cpu_transcoder;  	i915_reg_t reg = DISPLAY_VER(dev_priv) >= 14 ? MTL_CHICKEN_TRANS(transcoder) :  			 CHICKEN_TRANS(transcoder); -	u32 val; -	val = intel_de_read(dev_priv, reg); -	val &= ~HSW_FRAME_START_DELAY_MASK; -	val |= HSW_FRAME_START_DELAY(crtc_state->framestart_delay - 1); -	intel_de_write(dev_priv, reg, val); +	intel_de_rmw(dev_priv, reg, +		     HSW_FRAME_START_DELAY_MASK, +		     HSW_FRAME_START_DELAY(crtc_state->framestart_delay - 1));  }  static void icl_ddi_bigjoiner_pre_enable(struct intel_atomic_state *state, @@ -1849,7 +1678,7 @@ static void hsw_configure_cpu_transcoder(const struct intel_crtc_state *crtc_sta  	intel_set_transcoder_timings(crtc_state);  	if (cpu_transcoder != TRANSCODER_EDP) -		intel_de_write(dev_priv, PIPE_MULT(cpu_transcoder), +		intel_de_write(dev_priv, TRANS_MULT(cpu_transcoder),  			       crtc_state->pixel_multiplier - 1);  	hsw_set_frame_start_delay(crtc_state); @@ -1890,7 +1719,7 @@ static void hsw_crtc_enable(struct intel_atomic_state *state,  	intel_set_pipe_src_size(new_crtc_state);  	if (DISPLAY_VER(dev_priv) >= 9 || IS_BROADWELL(dev_priv)) -		bdw_set_pipemisc(new_crtc_state); +		bdw_set_pipe_misc(new_crtc_state);  	if (!intel_crtc_is_bigjoiner_slave(new_crtc_state) &&  	    !transcoder_is_dsi(cpu_transcoder)) @@ -2000,6 +1829,8 @@ static void ilk_crtc_disable(struct intel_atomic_state *state,  	intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, true);  	intel_set_pch_fifo_underrun_reporting(dev_priv, pipe, true); + +	intel_disable_shared_dpll(old_crtc_state);  }  static void hsw_crtc_disable(struct intel_atomic_state *state, @@ -2018,6 +1849,10 @@ static void hsw_crtc_disable(struct intel_atomic_state *state,  		intel_encoders_post_disable(state, crtc);  	} +	intel_disable_shared_dpll(old_crtc_state); + +	intel_encoders_post_pll_disable(state, crtc); +  	intel_dmc_disable_pipe(i915, crtc->pipe);  } @@ -2236,6 +2071,8 @@ static void valleyview_crtc_enable(struct intel_atomic_state *state,  	intel_set_pipe_src_size(new_crtc_state); +	intel_de_write(dev_priv, VLV_PIPE_MSA_MISC(pipe), 0); +  	if (IS_CHERRYVIEW(dev_priv) && pipe == PIPE_B) {  		intel_de_write(dev_priv, CHV_BLEND(pipe), CHV_BLEND_LEGACY);  		intel_de_write(dev_priv, CHV_CANVAS(pipe), 0); @@ -2822,12 +2659,14 @@ static void intel_set_transcoder_timings(const struct intel_crtc_state *crtc_sta  	enum pipe pipe = crtc->pipe;  	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;  	const struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode; -	u32 crtc_vtotal, crtc_vblank_end; +	u32 crtc_vdisplay, crtc_vtotal, crtc_vblank_start, crtc_vblank_end;  	int vsyncshift = 0;  	/* We need to be careful not to changed the adjusted mode, for otherwise  	 * the hw state checker will get angry at the mismatch. */ +	crtc_vdisplay = adjusted_mode->crtc_vdisplay;  	crtc_vtotal = adjusted_mode->crtc_vtotal; +	crtc_vblank_start = adjusted_mode->crtc_vblank_start;  	crtc_vblank_end = adjusted_mode->crtc_vblank_end;  	if (adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE) { @@ -2844,23 +2683,44 @@ static void intel_set_transcoder_timings(const struct intel_crtc_state *crtc_sta  			vsyncshift += adjusted_mode->crtc_htotal;  	} +	/* +	 * VBLANK_START no longer works on ADL+, instead we must use +	 * TRANS_SET_CONTEXT_LATENCY to configure the pipe vblank start. +	 */ +	if (DISPLAY_VER(dev_priv) >= 13) { +		intel_de_write(dev_priv, TRANS_SET_CONTEXT_LATENCY(cpu_transcoder), +			       crtc_vblank_start - crtc_vdisplay); + +		/* +		 * VBLANK_START not used by hw, just clear it +		 * to make it stand out in register dumps. +		 */ +		crtc_vblank_start = 1; +	} +  	if (DISPLAY_VER(dev_priv) > 3) -		intel_de_write(dev_priv, VSYNCSHIFT(cpu_transcoder), -		               vsyncshift); +		intel_de_write(dev_priv, TRANS_VSYNCSHIFT(cpu_transcoder), +			       vsyncshift); -	intel_de_write(dev_priv, HTOTAL(cpu_transcoder), -		       (adjusted_mode->crtc_hdisplay - 1) | ((adjusted_mode->crtc_htotal - 1) << 16)); -	intel_de_write(dev_priv, HBLANK(cpu_transcoder), -		       (adjusted_mode->crtc_hblank_start - 1) | ((adjusted_mode->crtc_hblank_end - 1) << 16)); -	intel_de_write(dev_priv, HSYNC(cpu_transcoder), -		       (adjusted_mode->crtc_hsync_start - 1) | ((adjusted_mode->crtc_hsync_end - 1) << 16)); +	intel_de_write(dev_priv, TRANS_HTOTAL(cpu_transcoder), +		       HACTIVE(adjusted_mode->crtc_hdisplay - 1) | +		       HTOTAL(adjusted_mode->crtc_htotal - 1)); +	intel_de_write(dev_priv, TRANS_HBLANK(cpu_transcoder), +		       HBLANK_START(adjusted_mode->crtc_hblank_start - 1) | +		       HBLANK_END(adjusted_mode->crtc_hblank_end - 1)); +	intel_de_write(dev_priv, TRANS_HSYNC(cpu_transcoder), +		       HSYNC_START(adjusted_mode->crtc_hsync_start - 1) | +		       HSYNC_END(adjusted_mode->crtc_hsync_end - 1)); -	intel_de_write(dev_priv, VTOTAL(cpu_transcoder), -		       (adjusted_mode->crtc_vdisplay - 1) | ((crtc_vtotal - 1) << 16)); -	intel_de_write(dev_priv, VBLANK(cpu_transcoder), -		       (adjusted_mode->crtc_vblank_start - 1) | ((crtc_vblank_end - 1) << 16)); -	intel_de_write(dev_priv, VSYNC(cpu_transcoder), -		       (adjusted_mode->crtc_vsync_start - 1) | ((adjusted_mode->crtc_vsync_end - 1) << 16)); +	intel_de_write(dev_priv, TRANS_VTOTAL(cpu_transcoder), +		       VACTIVE(crtc_vdisplay - 1) | +		       VTOTAL(crtc_vtotal - 1)); +	intel_de_write(dev_priv, TRANS_VBLANK(cpu_transcoder), +		       VBLANK_START(crtc_vblank_start - 1) | +		       VBLANK_END(crtc_vblank_end - 1)); +	intel_de_write(dev_priv, TRANS_VSYNC(cpu_transcoder), +		       VSYNC_START(adjusted_mode->crtc_vsync_start - 1) | +		       VSYNC_END(adjusted_mode->crtc_vsync_end - 1));  	/* Workaround: when the EDP input selection is B, the VTOTAL_B must be  	 * programmed with the VTOTAL_EDP value. Same for VTOTAL_C. This is @@ -2868,9 +2728,9 @@ static void intel_set_transcoder_timings(const struct intel_crtc_state *crtc_sta  	 * bits. */  	if (IS_HASWELL(dev_priv) && cpu_transcoder == TRANSCODER_EDP &&  	    (pipe == PIPE_B || pipe == PIPE_C)) -		intel_de_write(dev_priv, VTOTAL(pipe), -		               intel_de_read(dev_priv, VTOTAL(cpu_transcoder))); - +		intel_de_write(dev_priv, TRANS_VTOTAL(pipe), +			       VACTIVE(crtc_vdisplay - 1) | +			       VTOTAL(crtc_vtotal - 1));  }  static void intel_set_pipe_src_size(const struct intel_crtc_state *crtc_state) @@ -2898,9 +2758,9 @@ static bool intel_pipe_is_interlaced(const struct intel_crtc_state *crtc_state)  	if (DISPLAY_VER(dev_priv) >= 9 ||  	    IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv)) -		return intel_de_read(dev_priv, PIPECONF(cpu_transcoder)) & PIPECONF_INTERLACE_MASK_HSW; +		return intel_de_read(dev_priv, TRANSCONF(cpu_transcoder)) & TRANSCONF_INTERLACE_MASK_HSW;  	else -		return intel_de_read(dev_priv, PIPECONF(cpu_transcoder)) & PIPECONF_INTERLACE_MASK; +		return intel_de_read(dev_priv, TRANSCONF(cpu_transcoder)) & TRANSCONF_INTERLACE_MASK;  }  static void intel_get_transcoder_timings(struct intel_crtc *crtc, @@ -2909,43 +2769,47 @@ static void intel_get_transcoder_timings(struct intel_crtc *crtc,  	struct drm_device *dev = crtc->base.dev;  	struct drm_i915_private *dev_priv = to_i915(dev);  	enum transcoder cpu_transcoder = pipe_config->cpu_transcoder; +	struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode;  	u32 tmp; -	tmp = intel_de_read(dev_priv, HTOTAL(cpu_transcoder)); -	pipe_config->hw.adjusted_mode.crtc_hdisplay = (tmp & 0xffff) + 1; -	pipe_config->hw.adjusted_mode.crtc_htotal = ((tmp >> 16) & 0xffff) + 1; +	tmp = intel_de_read(dev_priv, TRANS_HTOTAL(cpu_transcoder)); +	adjusted_mode->crtc_hdisplay = REG_FIELD_GET(HACTIVE_MASK, tmp) + 1; +	adjusted_mode->crtc_htotal = REG_FIELD_GET(HTOTAL_MASK, tmp) + 1;  	if (!transcoder_is_dsi(cpu_transcoder)) { -		tmp = intel_de_read(dev_priv, HBLANK(cpu_transcoder)); -		pipe_config->hw.adjusted_mode.crtc_hblank_start = -							(tmp & 0xffff) + 1; -		pipe_config->hw.adjusted_mode.crtc_hblank_end = -						((tmp >> 16) & 0xffff) + 1; +		tmp = intel_de_read(dev_priv, TRANS_HBLANK(cpu_transcoder)); +		adjusted_mode->crtc_hblank_start = REG_FIELD_GET(HBLANK_START_MASK, tmp) + 1; +		adjusted_mode->crtc_hblank_end = REG_FIELD_GET(HBLANK_END_MASK, tmp) + 1;  	} -	tmp = intel_de_read(dev_priv, HSYNC(cpu_transcoder)); -	pipe_config->hw.adjusted_mode.crtc_hsync_start = (tmp & 0xffff) + 1; -	pipe_config->hw.adjusted_mode.crtc_hsync_end = ((tmp >> 16) & 0xffff) + 1; -	tmp = intel_de_read(dev_priv, VTOTAL(cpu_transcoder)); -	pipe_config->hw.adjusted_mode.crtc_vdisplay = (tmp & 0xffff) + 1; -	pipe_config->hw.adjusted_mode.crtc_vtotal = ((tmp >> 16) & 0xffff) + 1; +	tmp = intel_de_read(dev_priv, TRANS_HSYNC(cpu_transcoder)); +	adjusted_mode->crtc_hsync_start = REG_FIELD_GET(HSYNC_START_MASK, tmp) + 1; +	adjusted_mode->crtc_hsync_end = REG_FIELD_GET(HSYNC_END_MASK, tmp) + 1; + +	tmp = intel_de_read(dev_priv, TRANS_VTOTAL(cpu_transcoder)); +	adjusted_mode->crtc_vdisplay = REG_FIELD_GET(VACTIVE_MASK, tmp) + 1; +	adjusted_mode->crtc_vtotal = REG_FIELD_GET(VTOTAL_MASK, tmp) + 1; +	/* FIXME TGL+ DSI transcoders have this! */  	if (!transcoder_is_dsi(cpu_transcoder)) { -		tmp = intel_de_read(dev_priv, VBLANK(cpu_transcoder)); -		pipe_config->hw.adjusted_mode.crtc_vblank_start = -							(tmp & 0xffff) + 1; -		pipe_config->hw.adjusted_mode.crtc_vblank_end = -						((tmp >> 16) & 0xffff) + 1; +		tmp = intel_de_read(dev_priv, TRANS_VBLANK(cpu_transcoder)); +		adjusted_mode->crtc_vblank_start = REG_FIELD_GET(VBLANK_START_MASK, tmp) + 1; +		adjusted_mode->crtc_vblank_end = REG_FIELD_GET(VBLANK_END_MASK, tmp) + 1;  	} -	tmp = intel_de_read(dev_priv, VSYNC(cpu_transcoder)); -	pipe_config->hw.adjusted_mode.crtc_vsync_start = (tmp & 0xffff) + 1; -	pipe_config->hw.adjusted_mode.crtc_vsync_end = ((tmp >> 16) & 0xffff) + 1; +	tmp = intel_de_read(dev_priv, TRANS_VSYNC(cpu_transcoder)); +	adjusted_mode->crtc_vsync_start = REG_FIELD_GET(VSYNC_START_MASK, tmp) + 1; +	adjusted_mode->crtc_vsync_end = REG_FIELD_GET(VSYNC_END_MASK, tmp) + 1;  	if (intel_pipe_is_interlaced(pipe_config)) { -		pipe_config->hw.adjusted_mode.flags |= DRM_MODE_FLAG_INTERLACE; -		pipe_config->hw.adjusted_mode.crtc_vtotal += 1; -		pipe_config->hw.adjusted_mode.crtc_vblank_end += 1; +		adjusted_mode->flags |= DRM_MODE_FLAG_INTERLACE; +		adjusted_mode->crtc_vtotal += 1; +		adjusted_mode->crtc_vblank_end += 1;  	} + +	if (DISPLAY_VER(dev_priv) >= 13 && !transcoder_is_dsi(cpu_transcoder)) +		adjusted_mode->crtc_vblank_start = +			adjusted_mode->crtc_vdisplay + +			intel_de_read(dev_priv, TRANS_SET_CONTEXT_LATENCY(cpu_transcoder));  }  static void intel_bigjoiner_adjust_pipe_src(struct intel_crtc_state *crtc_state) @@ -2985,7 +2849,8 @@ void i9xx_set_pipeconf(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); -	u32 pipeconf = 0; +	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder; +	u32 val = 0;  	/*  	 * - We keep both pipes enabled on 830 @@ -2993,18 +2858,18 @@ void i9xx_set_pipeconf(const struct intel_crtc_state *crtc_state)  	 * - During fastset the pipe is already enabled and must remain so  	 */  	if (IS_I830(dev_priv) || !intel_crtc_needs_modeset(crtc_state)) -		pipeconf |= PIPECONF_ENABLE; +		val |= TRANSCONF_ENABLE;  	if (crtc_state->double_wide) -		pipeconf |= PIPECONF_DOUBLE_WIDE; +		val |= TRANSCONF_DOUBLE_WIDE;  	/* only g4x and later have fancy bpc/dither controls */  	if (IS_G4X(dev_priv) || IS_VALLEYVIEW(dev_priv) ||  	    IS_CHERRYVIEW(dev_priv)) {  		/* Bspec claims that we can't use dithering for 30bpp pipes. */  		if (crtc_state->dither && crtc_state->pipe_bpp != 30) -			pipeconf |= PIPECONF_DITHER_EN | -				    PIPECONF_DITHER_TYPE_SP; +			val |= TRANSCONF_DITHER_EN | +				TRANSCONF_DITHER_TYPE_SP;  		switch (crtc_state->pipe_bpp) {  		default: @@ -3012,13 +2877,13 @@ void i9xx_set_pipeconf(const struct intel_crtc_state *crtc_state)  			MISSING_CASE(crtc_state->pipe_bpp);  			fallthrough;  		case 18: -			pipeconf |= PIPECONF_BPC_6; +			val |= TRANSCONF_BPC_6;  			break;  		case 24: -			pipeconf |= PIPECONF_BPC_8; +			val |= TRANSCONF_BPC_8;  			break;  		case 30: -			pipeconf |= PIPECONF_BPC_10; +			val |= TRANSCONF_BPC_10;  			break;  		}  	} @@ -3026,23 +2891,23 @@ void i9xx_set_pipeconf(const struct intel_crtc_state *crtc_state)  	if (crtc_state->hw.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE) {  		if (DISPLAY_VER(dev_priv) < 4 ||  		    intel_crtc_has_type(crtc_state, INTEL_OUTPUT_SDVO)) -			pipeconf |= PIPECONF_INTERLACE_W_FIELD_INDICATION; +			val |= TRANSCONF_INTERLACE_W_FIELD_INDICATION;  		else -			pipeconf |= PIPECONF_INTERLACE_W_SYNC_SHIFT; +			val |= TRANSCONF_INTERLACE_W_SYNC_SHIFT;  	} else { -		pipeconf |= PIPECONF_INTERLACE_PROGRESSIVE; +		val |= TRANSCONF_INTERLACE_PROGRESSIVE;  	}  	if ((IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) &&  	     crtc_state->limited_color_range) -		pipeconf |= PIPECONF_COLOR_RANGE_SELECT; +		val |= TRANSCONF_COLOR_RANGE_SELECT; -	pipeconf |= PIPECONF_GAMMA_MODE(crtc_state->gamma_mode); +	val |= TRANSCONF_GAMMA_MODE(crtc_state->gamma_mode); -	pipeconf |= PIPECONF_FRAME_START_DELAY(crtc_state->framestart_delay - 1); +	val |= TRANSCONF_FRAME_START_DELAY(crtc_state->framestart_delay - 1); -	intel_de_write(dev_priv, PIPECONF(crtc->pipe), pipeconf); -	intel_de_posting_read(dev_priv, PIPECONF(crtc->pipe)); +	intel_de_write(dev_priv, TRANSCONF(cpu_transcoder), val); +	intel_de_posting_read(dev_priv, TRANSCONF(cpu_transcoder));  }  static bool i9xx_has_pfit(struct drm_i915_private *dev_priv) @@ -3143,20 +3008,20 @@ static void chv_crtc_clock_get(struct intel_crtc *crtc,  }  static enum intel_output_format -bdw_get_pipemisc_output_format(struct intel_crtc *crtc) +bdw_get_pipe_misc_output_format(struct intel_crtc *crtc)  {  	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);  	u32 tmp; -	tmp = intel_de_read(dev_priv, PIPEMISC(crtc->pipe)); +	tmp = intel_de_read(dev_priv, PIPE_MISC(crtc->pipe)); -	if (tmp & PIPEMISC_YUV420_ENABLE) { +	if (tmp & PIPE_MISC_YUV420_ENABLE) {  		/* We support 4:2:0 in full blend mode only */  		drm_WARN_ON(&dev_priv->drm, -			    (tmp & PIPEMISC_YUV420_MODE_FULL_BLEND) == 0); +			    (tmp & PIPE_MISC_YUV420_MODE_FULL_BLEND) == 0);  		return INTEL_OUTPUT_FORMAT_YCBCR420; -	} else if (tmp & PIPEMISC_OUTPUT_COLORSPACE_YUV) { +	} else if (tmp & PIPE_MISC_OUTPUT_COLORSPACE_YUV) {  		return INTEL_OUTPUT_FORMAT_YCBCR444;  	} else {  		return INTEL_OUTPUT_FORMAT_RGB; @@ -3201,20 +3066,20 @@ static bool i9xx_get_pipe_config(struct intel_crtc *crtc,  	ret = false; -	tmp = intel_de_read(dev_priv, PIPECONF(crtc->pipe)); -	if (!(tmp & PIPECONF_ENABLE)) +	tmp = intel_de_read(dev_priv, TRANSCONF(pipe_config->cpu_transcoder)); +	if (!(tmp & TRANSCONF_ENABLE))  		goto out;  	if (IS_G4X(dev_priv) || IS_VALLEYVIEW(dev_priv) ||  	    IS_CHERRYVIEW(dev_priv)) { -		switch (tmp & PIPECONF_BPC_MASK) { -		case PIPECONF_BPC_6: +		switch (tmp & TRANSCONF_BPC_MASK) { +		case TRANSCONF_BPC_6:  			pipe_config->pipe_bpp = 18;  			break; -		case PIPECONF_BPC_8: +		case TRANSCONF_BPC_8:  			pipe_config->pipe_bpp = 24;  			break; -		case PIPECONF_BPC_10: +		case TRANSCONF_BPC_10:  			pipe_config->pipe_bpp = 30;  			break;  		default: @@ -3224,12 +3089,12 @@ static bool i9xx_get_pipe_config(struct intel_crtc *crtc,  	}  	if ((IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) && -	    (tmp & PIPECONF_COLOR_RANGE_SELECT)) +	    (tmp & TRANSCONF_COLOR_RANGE_SELECT))  		pipe_config->limited_color_range = true; -	pipe_config->gamma_mode = REG_FIELD_GET(PIPECONF_GAMMA_MODE_MASK_I9XX, tmp); +	pipe_config->gamma_mode = REG_FIELD_GET(TRANSCONF_GAMMA_MODE_MASK_I9XX, tmp); -	pipe_config->framestart_delay = REG_FIELD_GET(PIPECONF_FRAME_START_DELAY_MASK, tmp) + 1; +	pipe_config->framestart_delay = REG_FIELD_GET(TRANSCONF_FRAME_START_DELAY_MASK, tmp) + 1;  	if (IS_CHERRYVIEW(dev_priv))  		pipe_config->cgm_mode = intel_de_read(dev_priv, @@ -3239,7 +3104,7 @@ static bool i9xx_get_pipe_config(struct intel_crtc *crtc,  	intel_color_get_config(pipe_config);  	if (DISPLAY_VER(dev_priv) < 4) -		pipe_config->double_wide = tmp & PIPECONF_DOUBLE_WIDE; +		pipe_config->double_wide = tmp & TRANSCONF_DOUBLE_WIDE;  	intel_get_transcoder_timings(crtc, pipe_config);  	intel_get_pipe_src_size(crtc, pipe_config); @@ -3309,7 +3174,7 @@ void ilk_set_pipeconf(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); -	enum pipe pipe = crtc->pipe; +	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;  	u32 val = 0;  	/* @@ -3317,7 +3182,7 @@ void ilk_set_pipeconf(const struct intel_crtc_state *crtc_state)  	 * - During fastset the pipe is already enabled and must remain so  	 */  	if (!intel_crtc_needs_modeset(crtc_state)) -		val |= PIPECONF_ENABLE; +		val |= TRANSCONF_ENABLE;  	switch (crtc_state->pipe_bpp) {  	default: @@ -3325,26 +3190,26 @@ void ilk_set_pipeconf(const struct intel_crtc_state *crtc_state)  		MISSING_CASE(crtc_state->pipe_bpp);  		fallthrough;  	case 18: -		val |= PIPECONF_BPC_6; +		val |= TRANSCONF_BPC_6;  		break;  	case 24: -		val |= PIPECONF_BPC_8; +		val |= TRANSCONF_BPC_8;  		break;  	case 30: -		val |= PIPECONF_BPC_10; +		val |= TRANSCONF_BPC_10;  		break;  	case 36: -		val |= PIPECONF_BPC_12; +		val |= TRANSCONF_BPC_12;  		break;  	}  	if (crtc_state->dither) -		val |= PIPECONF_DITHER_EN | PIPECONF_DITHER_TYPE_SP; +		val |= TRANSCONF_DITHER_EN | TRANSCONF_DITHER_TYPE_SP;  	if (crtc_state->hw.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE) -		val |= PIPECONF_INTERLACE_IF_ID_ILK; +		val |= TRANSCONF_INTERLACE_IF_ID_ILK;  	else -		val |= PIPECONF_INTERLACE_PF_PD_ILK; +		val |= TRANSCONF_INTERLACE_PF_PD_ILK;  	/*  	 * This would end up with an odd purple hue over @@ -3355,18 +3220,18 @@ void ilk_set_pipeconf(const struct intel_crtc_state *crtc_state)  	if (crtc_state->limited_color_range &&  	    !intel_crtc_has_type(crtc_state, INTEL_OUTPUT_SDVO)) -		val |= PIPECONF_COLOR_RANGE_SELECT; +		val |= TRANSCONF_COLOR_RANGE_SELECT;  	if (crtc_state->output_format != INTEL_OUTPUT_FORMAT_RGB) -		val |= PIPECONF_OUTPUT_COLORSPACE_YUV709; +		val |= TRANSCONF_OUTPUT_COLORSPACE_YUV709; -	val |= PIPECONF_GAMMA_MODE(crtc_state->gamma_mode); +	val |= TRANSCONF_GAMMA_MODE(crtc_state->gamma_mode); -	val |= PIPECONF_FRAME_START_DELAY(crtc_state->framestart_delay - 1); -	val |= PIPECONF_MSA_TIMING_DELAY(crtc_state->msa_timing_delay); +	val |= TRANSCONF_FRAME_START_DELAY(crtc_state->framestart_delay - 1); +	val |= TRANSCONF_MSA_TIMING_DELAY(crtc_state->msa_timing_delay); -	intel_de_write(dev_priv, PIPECONF(pipe), val); -	intel_de_posting_read(dev_priv, PIPECONF(pipe)); +	intel_de_write(dev_priv, TRANSCONF(cpu_transcoder), val); +	intel_de_posting_read(dev_priv, TRANSCONF(cpu_transcoder));  }  static void hsw_set_transconf(const struct intel_crtc_state *crtc_state) @@ -3381,25 +3246,25 @@ static void hsw_set_transconf(const struct intel_crtc_state *crtc_state)  	 * - During fastset the pipe is already enabled and must remain so  	 */  	if (!intel_crtc_needs_modeset(crtc_state)) -		val |= PIPECONF_ENABLE; +		val |= TRANSCONF_ENABLE;  	if (IS_HASWELL(dev_priv) && crtc_state->dither) -		val |= PIPECONF_DITHER_EN | PIPECONF_DITHER_TYPE_SP; +		val |= TRANSCONF_DITHER_EN | TRANSCONF_DITHER_TYPE_SP;  	if (crtc_state->hw.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE) -		val |= PIPECONF_INTERLACE_IF_ID_ILK; +		val |= TRANSCONF_INTERLACE_IF_ID_ILK;  	else -		val |= PIPECONF_INTERLACE_PF_PD_ILK; +		val |= TRANSCONF_INTERLACE_PF_PD_ILK;  	if (IS_HASWELL(dev_priv) &&  	    crtc_state->output_format != INTEL_OUTPUT_FORMAT_RGB) -		val |= PIPECONF_OUTPUT_COLORSPACE_YUV_HSW; +		val |= TRANSCONF_OUTPUT_COLORSPACE_YUV_HSW; -	intel_de_write(dev_priv, PIPECONF(cpu_transcoder), val); -	intel_de_posting_read(dev_priv, PIPECONF(cpu_transcoder)); +	intel_de_write(dev_priv, TRANSCONF(cpu_transcoder), val); +	intel_de_posting_read(dev_priv, TRANSCONF(cpu_transcoder));  } -static void bdw_set_pipemisc(const struct intel_crtc_state *crtc_state) +static void bdw_set_pipe_misc(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); @@ -3407,18 +3272,18 @@ static void bdw_set_pipemisc(const struct intel_crtc_state *crtc_state)  	switch (crtc_state->pipe_bpp) {  	case 18: -		val |= PIPEMISC_BPC_6; +		val |= PIPE_MISC_BPC_6;  		break;  	case 24: -		val |= PIPEMISC_BPC_8; +		val |= PIPE_MISC_BPC_8;  		break;  	case 30: -		val |= PIPEMISC_BPC_10; +		val |= PIPE_MISC_BPC_10;  		break;  	case 36:  		/* Port output 12BPC defined for ADLP+ */  		if (DISPLAY_VER(dev_priv) > 12) -			val |= PIPEMISC_BPC_12_ADLP; +			val |= PIPE_MISC_BPC_12_ADLP;  		break;  	default:  		MISSING_CASE(crtc_state->pipe_bpp); @@ -3426,38 +3291,38 @@ static void bdw_set_pipemisc(const struct intel_crtc_state *crtc_state)  	}  	if (crtc_state->dither) -		val |= PIPEMISC_DITHER_ENABLE | PIPEMISC_DITHER_TYPE_SP; +		val |= PIPE_MISC_DITHER_ENABLE | PIPE_MISC_DITHER_TYPE_SP;  	if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420 ||  	    crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR444) -		val |= PIPEMISC_OUTPUT_COLORSPACE_YUV; +		val |= PIPE_MISC_OUTPUT_COLORSPACE_YUV;  	if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420) -		val |= PIPEMISC_YUV420_ENABLE | -			PIPEMISC_YUV420_MODE_FULL_BLEND; +		val |= PIPE_MISC_YUV420_ENABLE | +			PIPE_MISC_YUV420_MODE_FULL_BLEND;  	if (DISPLAY_VER(dev_priv) >= 11 && is_hdr_mode(crtc_state)) -		val |= PIPEMISC_HDR_MODE_PRECISION; +		val |= PIPE_MISC_HDR_MODE_PRECISION;  	if (DISPLAY_VER(dev_priv) >= 12) -		val |= PIPEMISC_PIXEL_ROUNDING_TRUNC; +		val |= PIPE_MISC_PIXEL_ROUNDING_TRUNC; -	intel_de_write(dev_priv, PIPEMISC(crtc->pipe), val); +	intel_de_write(dev_priv, PIPE_MISC(crtc->pipe), val);  } -int bdw_get_pipemisc_bpp(struct intel_crtc *crtc) +int bdw_get_pipe_misc_bpp(struct intel_crtc *crtc)  {  	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);  	u32 tmp; -	tmp = intel_de_read(dev_priv, PIPEMISC(crtc->pipe)); +	tmp = intel_de_read(dev_priv, PIPE_MISC(crtc->pipe)); -	switch (tmp & PIPEMISC_BPC_MASK) { -	case PIPEMISC_BPC_6: +	switch (tmp & PIPE_MISC_BPC_MASK) { +	case PIPE_MISC_BPC_6:  		return 18; -	case PIPEMISC_BPC_8: +	case PIPE_MISC_BPC_8:  		return 24; -	case PIPEMISC_BPC_10: +	case PIPE_MISC_BPC_10:  		return 30;  	/*  	 * PORT OUTPUT 12 BPC defined for ADLP+. @@ -3469,7 +3334,7 @@ int bdw_get_pipemisc_bpp(struct intel_crtc *crtc)  	 * on older platforms, need to find a workaround for 12 BPC  	 * MIPI DSI HW readout.  	 */ -	case PIPEMISC_BPC_12_ADLP: +	case PIPE_MISC_BPC_12_ADLP:  		if (DISPLAY_VER(dev_priv) > 12)  			return 36;  		fallthrough; @@ -3621,33 +3486,33 @@ static bool ilk_get_pipe_config(struct intel_crtc *crtc,  	pipe_config->shared_dpll = NULL;  	ret = false; -	tmp = intel_de_read(dev_priv, PIPECONF(crtc->pipe)); -	if (!(tmp & PIPECONF_ENABLE)) +	tmp = intel_de_read(dev_priv, TRANSCONF(pipe_config->cpu_transcoder)); +	if (!(tmp & TRANSCONF_ENABLE))  		goto out; -	switch (tmp & PIPECONF_BPC_MASK) { -	case PIPECONF_BPC_6: +	switch (tmp & TRANSCONF_BPC_MASK) { +	case TRANSCONF_BPC_6:  		pipe_config->pipe_bpp = 18;  		break; -	case PIPECONF_BPC_8: +	case TRANSCONF_BPC_8:  		pipe_config->pipe_bpp = 24;  		break; -	case PIPECONF_BPC_10: +	case TRANSCONF_BPC_10:  		pipe_config->pipe_bpp = 30;  		break; -	case PIPECONF_BPC_12: +	case TRANSCONF_BPC_12:  		pipe_config->pipe_bpp = 36;  		break;  	default:  		break;  	} -	if (tmp & PIPECONF_COLOR_RANGE_SELECT) +	if (tmp & TRANSCONF_COLOR_RANGE_SELECT)  		pipe_config->limited_color_range = true; -	switch (tmp & PIPECONF_OUTPUT_COLORSPACE_MASK) { -	case PIPECONF_OUTPUT_COLORSPACE_YUV601: -	case PIPECONF_OUTPUT_COLORSPACE_YUV709: +	switch (tmp & TRANSCONF_OUTPUT_COLORSPACE_MASK) { +	case TRANSCONF_OUTPUT_COLORSPACE_YUV601: +	case TRANSCONF_OUTPUT_COLORSPACE_YUV709:  		pipe_config->output_format = INTEL_OUTPUT_FORMAT_YCBCR444;  		break;  	default: @@ -3655,11 +3520,11 @@ static bool ilk_get_pipe_config(struct intel_crtc *crtc,  		break;  	} -	pipe_config->gamma_mode = REG_FIELD_GET(PIPECONF_GAMMA_MODE_MASK_ILK, tmp); +	pipe_config->gamma_mode = REG_FIELD_GET(TRANSCONF_GAMMA_MODE_MASK_ILK, tmp); -	pipe_config->framestart_delay = REG_FIELD_GET(PIPECONF_FRAME_START_DELAY_MASK, tmp) + 1; +	pipe_config->framestart_delay = REG_FIELD_GET(TRANSCONF_FRAME_START_DELAY_MASK, tmp) + 1; -	pipe_config->msa_timing_delay = REG_FIELD_GET(PIPECONF_MSA_TIMING_DELAY_MASK, tmp); +	pipe_config->msa_timing_delay = REG_FIELD_GET(TRANSCONF_MSA_TIMING_DELAY_MASK, tmp);  	pipe_config->csc_mode = intel_de_read(dev_priv,  					      PIPE_CSC_MODE(crtc->pipe)); @@ -3936,9 +3801,9 @@ static bool hsw_get_transcoder_state(struct intel_crtc *crtc,  			pipe_config->pch_pfit.force_thru = true;  	} -	tmp = intel_de_read(dev_priv, PIPECONF(pipe_config->cpu_transcoder)); +	tmp = intel_de_read(dev_priv, TRANSCONF(pipe_config->cpu_transcoder)); -	return tmp & PIPECONF_ENABLE; +	return tmp & TRANSCONF_ENABLE;  }  static bool bxt_get_dsi_transcoder_state(struct intel_crtc *crtc, @@ -4042,15 +3907,15 @@ static bool hsw_get_pipe_config(struct intel_crtc *crtc,  	if (IS_HASWELL(dev_priv)) {  		u32 tmp = intel_de_read(dev_priv, -					PIPECONF(pipe_config->cpu_transcoder)); +					TRANSCONF(pipe_config->cpu_transcoder)); -		if (tmp & PIPECONF_OUTPUT_COLORSPACE_YUV_HSW) +		if (tmp & TRANSCONF_OUTPUT_COLORSPACE_YUV_HSW)  			pipe_config->output_format = INTEL_OUTPUT_FORMAT_YCBCR444;  		else  			pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;  	} else {  		pipe_config->output_format = -			bdw_get_pipemisc_output_format(crtc); +			bdw_get_pipe_misc_output_format(crtc);  	}  	pipe_config->gamma_mode = intel_de_read(dev_priv, @@ -4093,7 +3958,7 @@ static bool hsw_get_pipe_config(struct intel_crtc *crtc,  	    !transcoder_is_dsi(pipe_config->cpu_transcoder)) {  		pipe_config->pixel_multiplier =  			intel_de_read(dev_priv, -				      PIPE_MULT(pipe_config->cpu_transcoder)) + 1; +				      TRANS_MULT(pipe_config->cpu_transcoder)) + 1;  	} else {  		pipe_config->pixel_multiplier = 1;  	} @@ -5443,6 +5308,20 @@ pipe_config_dp_vsc_sdp_mismatch(struct drm_i915_private *dev_priv,  	}  } +/* Returns the length up to and including the last differing byte */ +static size_t +memcmp_diff_len(const u8 *a, const u8 *b, size_t len) +{ +	int i; + +	for (i = len - 1; i >= 0; i--) { +		if (a[i] != b[i]) +			return i + 1; +	} + +	return 0; +} +  static void  pipe_config_buffer_mismatch(struct drm_i915_private *dev_priv,  			    bool fastset, const char *name, @@ -5452,6 +5331,9 @@ pipe_config_buffer_mismatch(struct drm_i915_private *dev_priv,  		if (!drm_debug_enabled(DRM_UT_KMS))  			return; +		/* only dump up to the last difference */ +		len = memcmp_diff_len(a, b, len); +  		drm_dbg_kms(&dev_priv->drm,  			    "fastset mismatch in %s buffer\n", name);  		print_hex_dump(KERN_DEBUG, "expected: ", DUMP_PREFIX_NONE, @@ -5459,6 +5341,9 @@ pipe_config_buffer_mismatch(struct drm_i915_private *dev_priv,  		print_hex_dump(KERN_DEBUG, "found: ", DUMP_PREFIX_NONE,  			       16, 0, b, len, false);  	} else { +		/* only dump up to the last difference */ +		len = memcmp_diff_len(a, b, len); +  		drm_err(&dev_priv->drm, "mismatch in %s buffer\n", name);  		print_hex_dump(KERN_ERR, "expected: ", DUMP_PREFIX_NONE,  			       16, 0, a, len, false); @@ -5947,73 +5832,13 @@ int intel_modeset_all_pipes(struct intel_atomic_state *state,  			return ret;  		crtc_state->update_planes |= crtc_state->active_planes; +		crtc_state->async_flip_planes = 0; +		crtc_state->do_async_flip = false;  	}  	return 0;  } -void intel_crtc_update_active_timings(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); -	struct drm_display_mode adjusted_mode; - -	drm_mode_init(&adjusted_mode, &crtc_state->hw.adjusted_mode); - -	if (crtc_state->vrr.enable) { -		adjusted_mode.crtc_vtotal = crtc_state->vrr.vmax; -		adjusted_mode.crtc_vblank_end = crtc_state->vrr.vmax; -		adjusted_mode.crtc_vblank_start = intel_vrr_vmin_vblank_start(crtc_state); -		crtc->vmax_vblank_start = intel_vrr_vmax_vblank_start(crtc_state); -	} - -	drm_calc_timestamping_constants(&crtc->base, &adjusted_mode); - -	crtc->mode_flags = crtc_state->mode_flags; - -	/* -	 * The scanline counter increments at the leading edge of hsync. -	 * -	 * On most platforms it starts counting from vtotal-1 on the -	 * first active line. That means the scanline counter value is -	 * always one less than what we would expect. Ie. just after -	 * start of vblank, which also occurs at start of hsync (on the -	 * last active line), the scanline counter will read vblank_start-1. -	 * -	 * On gen2 the scanline counter starts counting from 1 instead -	 * of vtotal-1, so we have to subtract one (or rather add vtotal-1 -	 * to keep the value positive), instead of adding one. -	 * -	 * On HSW+ the behaviour of the scanline counter depends on the output -	 * type. For DP ports it behaves like most other platforms, but on HDMI -	 * there's an extra 1 line difference. So we need to add two instead of -	 * one to the value. -	 * -	 * On VLV/CHV DSI the scanline counter would appear to increment -	 * approx. 1/3 of a scanline before start of vblank. Unfortunately -	 * that means we can't tell whether we're in vblank or not while -	 * we're on that particular line. We must still set scanline_offset -	 * to 1 so that the vblank timestamps come out correct when we query -	 * the scanline counter from within the vblank interrupt handler. -	 * However if queried just before the start of vblank we'll get an -	 * answer that's slightly in the future. -	 */ -	if (DISPLAY_VER(dev_priv) == 2) { -		int vtotal; - -		vtotal = adjusted_mode.crtc_vtotal; -		if (adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE) -			vtotal /= 2; - -		crtc->scanline_offset = vtotal - 1; -	} else if (HAS_DDI(dev_priv) && -		   intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) { -		crtc->scanline_offset = 2; -	} else { -		crtc->scanline_offset = 1; -	} -} -  /*   * This implements the workaround described in the "notes" section of the mode   * set sequence documentation. When going from no pipes or single pipe to @@ -6699,8 +6524,8 @@ static int intel_bigjoiner_add_affected_crtcs(struct intel_atomic_state *state)   * @dev: drm device   * @_state: state to validate   */ -static int intel_atomic_check(struct drm_device *dev, -			      struct drm_atomic_state *_state) +int intel_atomic_check(struct drm_device *dev, +		       struct drm_atomic_state *_state)  {  	struct drm_i915_private *dev_priv = to_i915(dev);  	struct intel_atomic_state *state = to_intel_atomic_state(_state); @@ -7018,7 +6843,7 @@ static void commit_pipe_pre_planes(struct intel_atomic_state *state,  			intel_color_commit_arm(new_crtc_state);  		if (DISPLAY_VER(dev_priv) >= 9 || IS_BROADWELL(dev_priv)) -			bdw_set_pipemisc(new_crtc_state); +			bdw_set_pipe_misc(new_crtc_state);  		if (intel_crtc_needs_fastset(new_crtc_state))  			intel_pipe_fastset(old_crtc_state, new_crtc_state); @@ -7077,6 +6902,12 @@ static void intel_update_crtc(struct intel_atomic_state *state,  		intel_atomic_get_new_crtc_state(state, crtc);  	bool modeset = intel_crtc_needs_modeset(new_crtc_state); +	if (old_crtc_state->inherited || +	    intel_crtc_needs_modeset(new_crtc_state)) { +		if (HAS_DPT(i915)) +			intel_dpt_configure(crtc); +	} +  	if (!modeset) {  		if (new_crtc_state->preload_luts &&  		    intel_crtc_needs_color_update(new_crtc_state)) @@ -7140,7 +6971,6 @@ static void intel_old_crtc_state_disables(struct intel_atomic_state *state,  	dev_priv->display.funcs.display->crtc_disable(state, crtc);  	crtc->active = false;  	intel_fbc_disable(crtc); -	intel_disable_shared_dpll(old_crtc_state);  	if (!new_crtc_state->hw.active)  		intel_initial_watermarks(state, crtc); @@ -7539,8 +7369,6 @@ static void intel_atomic_commit_tail(struct intel_atomic_state *state)  	/* Now enable the clocks, plane, pipe, and connectors that we set up. */  	dev_priv->display.funcs.display->commit_modeset_enables(state); -	intel_encoders_update_complete(state); -  	if (state->modeset)  		intel_set_cdclk_post_plane_update(state); @@ -8382,124 +8210,6 @@ void intel_modeset_init_hw(struct drm_i915_private *i915)  	cdclk_state->logical = cdclk_state->actual = i915->display.cdclk.hw;  } -static int sanitize_watermarks_add_affected(struct drm_atomic_state *state) -{ -	struct drm_plane *plane; -	struct intel_crtc *crtc; - -	for_each_intel_crtc(state->dev, crtc) { -		struct intel_crtc_state *crtc_state; - -		crtc_state = intel_atomic_get_crtc_state(state, crtc); -		if (IS_ERR(crtc_state)) -			return PTR_ERR(crtc_state); - -		if (crtc_state->hw.active) { -			/* -			 * Preserve the inherited flag to avoid -			 * taking the full modeset path. -			 */ -			crtc_state->inherited = true; -		} -	} - -	drm_for_each_plane(plane, state->dev) { -		struct drm_plane_state *plane_state; - -		plane_state = drm_atomic_get_plane_state(state, plane); -		if (IS_ERR(plane_state)) -			return PTR_ERR(plane_state); -	} - -	return 0; -} - -/* - * Calculate what we think the watermarks should be for the state we've read - * out of the hardware and then immediately program those watermarks so that - * we ensure the hardware settings match our internal state. - * - * We can calculate what we think WM's should be by creating a duplicate of the - * current state (which was constructed during hardware readout) and running it - * through the atomic check code to calculate new watermark values in the - * state object. - */ -static void sanitize_watermarks(struct drm_i915_private *dev_priv) -{ -	struct drm_atomic_state *state; -	struct intel_atomic_state *intel_state; -	struct intel_crtc *crtc; -	struct intel_crtc_state *crtc_state; -	struct drm_modeset_acquire_ctx ctx; -	int ret; -	int i; - -	/* Only supported on platforms that use atomic watermark design */ -	if (!dev_priv->display.funcs.wm->optimize_watermarks) -		return; - -	state = drm_atomic_state_alloc(&dev_priv->drm); -	if (drm_WARN_ON(&dev_priv->drm, !state)) -		return; - -	intel_state = to_intel_atomic_state(state); - -	drm_modeset_acquire_init(&ctx, 0); - -retry: -	state->acquire_ctx = &ctx; - -	/* -	 * Hardware readout is the only time we don't want to calculate -	 * intermediate watermarks (since we don't trust the current -	 * watermarks). -	 */ -	if (!HAS_GMCH(dev_priv)) -		intel_state->skip_intermediate_wm = true; - -	ret = sanitize_watermarks_add_affected(state); -	if (ret) -		goto fail; - -	ret = intel_atomic_check(&dev_priv->drm, state); -	if (ret) -		goto fail; - -	/* Write calculated watermark values back */ -	for_each_new_intel_crtc_in_state(intel_state, crtc, crtc_state, i) { -		crtc_state->wm.need_postvbl_update = true; -		intel_optimize_watermarks(intel_state, crtc); - -		to_intel_crtc_state(crtc->base.state)->wm = crtc_state->wm; -	} - -fail: -	if (ret == -EDEADLK) { -		drm_atomic_state_clear(state); -		drm_modeset_backoff(&ctx); -		goto retry; -	} - -	/* -	 * If we fail here, it means that the hardware appears to be -	 * programmed in a way that shouldn't be possible, given our -	 * understanding of watermark requirements.  This might mean a -	 * mistake in the hardware readout code or a mistake in the -	 * watermark calculations for a given platform.  Raise a WARN -	 * so that this is noticeable. -	 * -	 * If this actually happens, we'll have to just leave the -	 * BIOS-programmed watermarks untouched and hope for the best. -	 */ -	drm_WARN(&dev_priv->drm, ret, -		 "Could not determine valid watermarks for inherited state\n"); - -	drm_atomic_state_put(state); - -	drm_modeset_drop_locks(&ctx); -	drm_modeset_acquire_fini(&ctx); -} -  static int intel_initial_commit(struct drm_device *dev)  {  	struct drm_atomic_state *state = NULL; @@ -8660,12 +8370,16 @@ int intel_modeset_init_noirq(struct drm_i915_private *i915)  		goto cleanup_bios;  	/* FIXME: completely on the wrong abstraction layer */ +	ret = intel_power_domains_init(i915); +	if (ret < 0) +		goto cleanup_vga; +  	intel_power_domains_init_hw(i915, false);  	if (!HAS_DISPLAY(i915))  		return 0; -	intel_dmc_ucode_init(i915); +	intel_dmc_init(i915);  	i915->display.wq.modeset = alloc_ordered_workqueue("i915_modeset", 0);  	i915->display.wq.flip = alloc_workqueue("i915_flip", WQ_HIGHPRI | @@ -8700,8 +8414,9 @@ int intel_modeset_init_noirq(struct drm_i915_private *i915)  	return 0;  cleanup_vga_client_pw_domain_dmc: -	intel_dmc_ucode_fini(i915); +	intel_dmc_fini(i915);  	intel_power_domains_driver_remove(i915); +cleanup_vga:  	intel_vga_unregister(i915);  cleanup_bios:  	intel_bios_driver_remove(i915); @@ -8720,7 +8435,7 @@ int intel_modeset_init_nogem(struct drm_i915_private *i915)  	if (!HAS_DISPLAY(i915))  		return 0; -	intel_init_pm(i915); +	intel_wm_init(i915);  	intel_panel_sanitize_ssc(i915); @@ -8776,7 +8491,7 @@ int intel_modeset_init_nogem(struct drm_i915_private *i915)  	 * since the watermark calculation done here will use pstate->fb.  	 */  	if (!HAS_GMCH(i915)) -		sanitize_watermarks(i915); +		ilk_wm_sanitize(i915);  	return 0;  } @@ -8817,6 +8532,7 @@ int intel_modeset_init(struct drm_i915_private *i915)  void i830_enable_pipe(struct drm_i915_private *dev_priv, enum pipe pipe)  {  	struct intel_crtc *crtc = intel_crtc_for_pipe(dev_priv, pipe); +	enum transcoder cpu_transcoder = (enum transcoder)pipe;  	/* 640x480@60Hz, ~25175 kHz */  	struct dpll clock = {  		.m1 = 18, @@ -8843,13 +8559,20 @@ void i830_enable_pipe(struct drm_i915_private *dev_priv, enum pipe pipe)  		PLL_REF_INPUT_DREFCLK |  		DPLL_VCO_ENABLE; -	intel_de_write(dev_priv, HTOTAL(pipe), (640 - 1) | ((800 - 1) << 16)); -	intel_de_write(dev_priv, HBLANK(pipe), (640 - 1) | ((800 - 1) << 16)); -	intel_de_write(dev_priv, HSYNC(pipe), (656 - 1) | ((752 - 1) << 16)); -	intel_de_write(dev_priv, VTOTAL(pipe), (480 - 1) | ((525 - 1) << 16)); -	intel_de_write(dev_priv, VBLANK(pipe), (480 - 1) | ((525 - 1) << 16)); -	intel_de_write(dev_priv, VSYNC(pipe), (490 - 1) | ((492 - 1) << 16)); -	intel_de_write(dev_priv, PIPESRC(pipe), ((640 - 1) << 16) | (480 - 1)); +	intel_de_write(dev_priv, TRANS_HTOTAL(cpu_transcoder), +		       HACTIVE(640 - 1) | HTOTAL(800 - 1)); +	intel_de_write(dev_priv, TRANS_HBLANK(cpu_transcoder), +		       HBLANK_START(640 - 1) | HBLANK_END(800 - 1)); +	intel_de_write(dev_priv, TRANS_HSYNC(cpu_transcoder), +		       HSYNC_START(656 - 1) | HSYNC_END(752 - 1)); +	intel_de_write(dev_priv, TRANS_VTOTAL(cpu_transcoder), +		       VACTIVE(480 - 1) | VTOTAL(525 - 1)); +	intel_de_write(dev_priv, TRANS_VBLANK(cpu_transcoder), +		       VBLANK_START(480 - 1) | VBLANK_END(525 - 1)); +	intel_de_write(dev_priv, TRANS_VSYNC(cpu_transcoder), +		       VSYNC_START(490 - 1) | VSYNC_END(492 - 1)); +	intel_de_write(dev_priv, PIPESRC(pipe), +		       PIPESRC_WIDTH(640 - 1) | PIPESRC_HEIGHT(480 - 1));  	intel_de_write(dev_priv, FP0(pipe), fp);  	intel_de_write(dev_priv, FP1(pipe), fp); @@ -8880,8 +8603,8 @@ void i830_enable_pipe(struct drm_i915_private *dev_priv, enum pipe pipe)  		udelay(150); /* wait for warmup */  	} -	intel_de_write(dev_priv, PIPECONF(pipe), PIPECONF_ENABLE); -	intel_de_posting_read(dev_priv, PIPECONF(pipe)); +	intel_de_write(dev_priv, TRANSCONF(pipe), TRANSCONF_ENABLE); +	intel_de_posting_read(dev_priv, TRANSCONF(pipe));  	intel_wait_for_pipe_scanline_moving(crtc);  } @@ -8904,8 +8627,8 @@ void i830_disable_pipe(struct drm_i915_private *dev_priv, enum pipe pipe)  	drm_WARN_ON(&dev_priv->drm,  		    intel_de_read(dev_priv, CURCNTR(PIPE_B)) & MCURSOR_MODE_MASK); -	intel_de_write(dev_priv, PIPECONF(pipe), 0); -	intel_de_posting_read(dev_priv, PIPECONF(pipe)); +	intel_de_write(dev_priv, TRANSCONF(pipe), 0); +	intel_de_posting_read(dev_priv, TRANSCONF(pipe));  	intel_wait_for_pipe_scanline_stopped(crtc); @@ -9026,7 +8749,7 @@ void intel_modeset_driver_remove_noirq(struct drm_i915_private *i915)  /* part #3: call after gem init */  void intel_modeset_driver_remove_nogem(struct drm_i915_private *i915)  { -	intel_dmc_ucode_fini(i915); +	intel_dmc_fini(i915);  	intel_power_domains_driver_remove(i915); @@ -9061,14 +8784,14 @@ void intel_display_driver_register(struct drm_i915_private *i915)  	if (!HAS_DISPLAY(i915))  		return; -	intel_display_debugfs_register(i915); -  	/* Must be done after probing outputs */  	intel_opregion_register(i915);  	intel_acpi_video_register(i915);  	intel_audio_init(i915); +	intel_display_debugfs_register(i915); +  	/*  	 * Some ports require correctly set-up hpd registers for  	 * detection to work properly (leading to ghost connected @@ -9077,7 +8800,7 @@ void intel_display_driver_register(struct drm_i915_private *i915)  	 * enabled. We do it last so that the async config cannot run  	 * before the connectors are registered.  	 */ -	intel_fbdev_initial_config_async(&i915->drm); +	intel_fbdev_initial_config_async(i915);  	/*  	 * We need to coordinate the hotplugs with the asynchronous  | 
