diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_pm.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 45 | 
1 files changed, 33 insertions, 12 deletions
| diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index 570bd603f401..078fd1bfa5ea 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c @@ -3373,20 +3373,26 @@ skl_plane_downscale_amount(const struct intel_crtc_state *cstate,  	/* n.b., src is 16.16 fixed point, dst is whole integer */  	if (plane->id == PLANE_CURSOR) { +		/* +		 * Cursors only support 0/180 degree rotation, +		 * hence no need to account for rotation here. +		 */  		src_w = pstate->base.src_w;  		src_h = pstate->base.src_h;  		dst_w = pstate->base.crtc_w;  		dst_h = pstate->base.crtc_h;  	} else { +		/* +		 * 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. +		 */  		src_w = drm_rect_width(&pstate->base.src);  		src_h = drm_rect_height(&pstate->base.src);  		dst_w = drm_rect_width(&pstate->base.dst);  		dst_h = drm_rect_height(&pstate->base.dst);  	} -	if (drm_rotation_90_or_270(pstate->base.rotation)) -		swap(dst_w, dst_h); -  	downscale_h = max(src_h / dst_h, (uint32_t)DRM_PLANE_HELPER_NO_SCALING);  	downscale_w = max(src_w / dst_w, (uint32_t)DRM_PLANE_HELPER_NO_SCALING); @@ -3417,12 +3423,14 @@ skl_plane_relative_data_rate(const struct intel_crtc_state *cstate,  	if (y && format != DRM_FORMAT_NV12)  		return 0; +	/* +	 * 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. +	 */  	width = drm_rect_width(&intel_pstate->base.src) >> 16;  	height = drm_rect_height(&intel_pstate->base.src) >> 16; -	if (drm_rotation_90_or_270(pstate->rotation)) -		swap(width, height); -  	/* for planar format */  	if (format == DRM_FORMAT_NV12) {  		if (y)  /* y-plane data rate */ @@ -3505,12 +3513,14 @@ skl_ddb_min_alloc(const struct drm_plane_state *pstate,  	    fb->modifier != I915_FORMAT_MOD_Yf_TILED)  		return 8; +	/* +	 * 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. +	 */  	src_w = drm_rect_width(&intel_pstate->base.src) >> 16;  	src_h = drm_rect_height(&intel_pstate->base.src) >> 16; -	if (drm_rotation_90_or_270(pstate->rotation)) -		swap(src_w, src_h); -  	/* Halve UV plane width and height for NV12 */  	if (fb->format->format == DRM_FORMAT_NV12 && !y) {  		src_w /= 2; @@ -3794,13 +3804,15 @@ static int skl_compute_plane_wm(const struct drm_i915_private *dev_priv,  		width = intel_pstate->base.crtc_w;  		height = intel_pstate->base.crtc_h;  	} else { +		/* +		 * 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. +		 */  		width = drm_rect_width(&intel_pstate->base.src) >> 16;  		height = drm_rect_height(&intel_pstate->base.src) >> 16;  	} -	if (drm_rotation_90_or_270(pstate->rotation)) -		swap(width, height); -  	cpp = fb->format->cpp[0];  	plane_pixel_rate = skl_adjusted_plane_pixel_rate(cstate, intel_pstate); @@ -4335,11 +4347,19 @@ skl_compute_wm(struct drm_atomic_state *state)  	struct drm_crtc_state *cstate;  	struct intel_atomic_state *intel_state = to_intel_atomic_state(state);  	struct skl_wm_values *results = &intel_state->wm_results; +	struct drm_device *dev = state->dev;  	struct skl_pipe_wm *pipe_wm;  	bool changed = false;  	int ret, i;  	/* +	 * When we distrust bios wm we always need to recompute to set the +	 * expected DDB allocations for each CRTC. +	 */ +	if (to_i915(dev)->wm.distrust_bios_wm) +		changed = true; + +	/*  	 * If this transaction isn't actually touching any CRTC's, don't  	 * bother with watermark calculation.  Note that if we pass this  	 * test, we're guaranteed to hold at least one CRTC state mutex, @@ -4349,6 +4369,7 @@ skl_compute_wm(struct drm_atomic_state *state)  	 */  	for_each_new_crtc_in_state(state, crtc, cstate, i)  		changed = true; +  	if (!changed)  		return 0; | 
