diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_display.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 44 | 
1 files changed, 25 insertions, 19 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 569717a12723..9106ea32b048 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -120,7 +120,8 @@ static void intel_crtc_init_scalers(struct intel_crtc *crtc,  static void skylake_pfit_enable(struct intel_crtc *crtc);  static void ironlake_pfit_disable(struct intel_crtc *crtc, bool force);  static void ironlake_pfit_enable(struct intel_crtc *crtc); -static void intel_modeset_setup_hw_state(struct drm_device *dev); +static void intel_modeset_setup_hw_state(struct drm_device *dev, +					 struct drm_modeset_acquire_ctx *ctx);  static void intel_pre_disable_primary_noatomic(struct drm_crtc *crtc);  struct intel_limit { @@ -3449,7 +3450,7 @@ __intel_display_resume(struct drm_device *dev,  	struct drm_crtc *crtc;  	int i, ret; -	intel_modeset_setup_hw_state(dev); +	intel_modeset_setup_hw_state(dev, ctx);  	i915_redisable_vga(to_i915(dev));  	if (!state) @@ -4598,7 +4599,7 @@ static void cpt_verify_modeset(struct drm_device *dev, int pipe)  static int  skl_update_scaler(struct intel_crtc_state *crtc_state, bool force_detach, -		  unsigned scaler_user, int *scaler_id, unsigned int rotation, +		  unsigned int scaler_user, int *scaler_id,  		  int src_w, int src_h, int dst_w, int dst_h)  {  	struct intel_crtc_scaler_state *scaler_state = @@ -4607,9 +4608,12 @@ skl_update_scaler(struct intel_crtc_state *crtc_state, bool force_detach,  		to_intel_crtc(crtc_state->base.crtc);  	int need_scaling; -	need_scaling = drm_rotation_90_or_270(rotation) ? -		(src_h != dst_w || src_w != dst_h): -		(src_w != dst_w || src_h != dst_h); +	/* +	 * Src coordinates are already rotated by 270 degrees for +	 * the 90/270 degree plane rotation cases (to match the +	 * GTT mapping), hence no need to account for rotation here. +	 */ +	need_scaling = src_w != dst_w || src_h != dst_h;  	/*  	 * if plane is being disabled or scaler is no more required or force detach @@ -4671,7 +4675,7 @@ int skl_update_scaler_crtc(struct intel_crtc_state *state)  	const struct drm_display_mode *adjusted_mode = &state->base.adjusted_mode;  	return skl_update_scaler(state, !state->base.active, SKL_CRTC_INDEX, -		&state->scaler_state.scaler_id, DRM_ROTATE_0, +		&state->scaler_state.scaler_id,  		state->pipe_src_w, state->pipe_src_h,  		adjusted_mode->crtc_hdisplay, adjusted_mode->crtc_vdisplay);  } @@ -4700,7 +4704,6 @@ static int skl_update_scaler_plane(struct intel_crtc_state *crtc_state,  	ret = skl_update_scaler(crtc_state, force_detach,  				drm_plane_index(&intel_plane->base),  				&plane_state->scaler_id, -				plane_state->base.rotation,  				drm_rect_width(&plane_state->base.src) >> 16,  				drm_rect_height(&plane_state->base.src) >> 16,  				drm_rect_width(&plane_state->base.dst), @@ -5823,7 +5826,8 @@ static void i9xx_crtc_disable(struct intel_crtc_state *old_crtc_state,  		intel_update_watermarks(intel_crtc);  } -static void intel_crtc_disable_noatomic(struct drm_crtc *crtc) +static void intel_crtc_disable_noatomic(struct drm_crtc *crtc, +					struct drm_modeset_acquire_ctx *ctx)  {  	struct intel_encoder *encoder;  	struct intel_crtc *intel_crtc = to_intel_crtc(crtc); @@ -5853,7 +5857,7 @@ static void intel_crtc_disable_noatomic(struct drm_crtc *crtc)  		return;  	} -	state->acquire_ctx = crtc->dev->mode_config.acquire_ctx; +	state->acquire_ctx = ctx;  	/* Everything's already locked, -EDEADLK can't happen. */  	crtc_state = intel_atomic_get_crtc_state(state, intel_crtc); @@ -15028,7 +15032,7 @@ int intel_modeset_init(struct drm_device *dev)  	intel_setup_outputs(dev_priv);  	drm_modeset_lock_all(dev); -	intel_modeset_setup_hw_state(dev); +	intel_modeset_setup_hw_state(dev, dev->mode_config.acquire_ctx);  	drm_modeset_unlock_all(dev);  	for_each_intel_crtc(dev, crtc) { @@ -15065,13 +15069,13 @@ int intel_modeset_init(struct drm_device *dev)  	return 0;  } -static void intel_enable_pipe_a(struct drm_device *dev) +static void intel_enable_pipe_a(struct drm_device *dev, +				struct drm_modeset_acquire_ctx *ctx)  {  	struct intel_connector *connector;  	struct drm_connector_list_iter conn_iter;  	struct drm_connector *crt = NULL;  	struct intel_load_detect_pipe load_detect_temp; -	struct drm_modeset_acquire_ctx *ctx = dev->mode_config.acquire_ctx;  	int ret;  	/* We can't just switch on the pipe A, we need to set things up with a @@ -15143,7 +15147,8 @@ static bool has_pch_trancoder(struct drm_i915_private *dev_priv,  		(HAS_PCH_LPT_H(dev_priv) && pch_transcoder == TRANSCODER_A);  } -static void intel_sanitize_crtc(struct intel_crtc *crtc) +static void intel_sanitize_crtc(struct intel_crtc *crtc, +				struct drm_modeset_acquire_ctx *ctx)  {  	struct drm_device *dev = crtc->base.dev;  	struct drm_i915_private *dev_priv = to_i915(dev); @@ -15189,7 +15194,7 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc)  		plane = crtc->plane;  		crtc->base.primary->state->visible = true;  		crtc->plane = !plane; -		intel_crtc_disable_noatomic(&crtc->base); +		intel_crtc_disable_noatomic(&crtc->base, ctx);  		crtc->plane = plane;  	} @@ -15199,13 +15204,13 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc)  		 * resume. Force-enable the pipe to fix this, the update_dpms  		 * call below we restore the pipe to the right state, but leave  		 * the required bits on. */ -		intel_enable_pipe_a(dev); +		intel_enable_pipe_a(dev, ctx);  	}  	/* Adjust the state of the output pipe according to whether we  	 * have active connectors/encoders. */  	if (crtc->active && !intel_crtc_has_encoders(crtc)) -		intel_crtc_disable_noatomic(&crtc->base); +		intel_crtc_disable_noatomic(&crtc->base, ctx);  	if (crtc->active || HAS_GMCH_DISPLAY(dev_priv)) {  		/* @@ -15503,7 +15508,8 @@ get_encoder_power_domains(struct drm_i915_private *dev_priv)   * and sanitizes it to the current state   */  static void -intel_modeset_setup_hw_state(struct drm_device *dev) +intel_modeset_setup_hw_state(struct drm_device *dev, +			     struct drm_modeset_acquire_ctx *ctx)  {  	struct drm_i915_private *dev_priv = to_i915(dev);  	enum pipe pipe; @@ -15523,7 +15529,7 @@ intel_modeset_setup_hw_state(struct drm_device *dev)  	for_each_pipe(dev_priv, pipe) {  		crtc = intel_get_crtc_for_pipe(dev_priv, pipe); -		intel_sanitize_crtc(crtc); +		intel_sanitize_crtc(crtc, ctx);  		intel_dump_pipe_config(crtc, crtc->config,  				       "[setup_hw_state]");  	}  |