diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_pm.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 119 | 
1 files changed, 83 insertions, 36 deletions
| diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index ecbb3d141632..434b1f8b7fe3 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c @@ -36,7 +36,9 @@  #include "display/intel_atomic_plane.h"  #include "display/intel_bw.h"  #include "display/intel_de.h" +#include "display/intel_display_trace.h"  #include "display/intel_display_types.h" +#include "display/intel_fb.h"  #include "display/intel_fbc.h"  #include "display/intel_sprite.h"  #include "display/skl_universal_plane.h" @@ -46,7 +48,6 @@  #include "i915_drv.h"  #include "i915_fixed.h"  #include "i915_irq.h" -#include "i915_trace.h"  #include "intel_pcode.h"  #include "intel_pm.h"  #include "vlv_sideband.h" @@ -97,7 +98,7 @@ static void gen9_init_clock_gating(struct drm_i915_private *dev_priv)  		 * "Plane N strech max must be programmed to 11b (x1)  		 *  when Async flips are enabled on that plane."  		 */ -		if (!IS_GEMINILAKE(dev_priv) && intel_vtd_active()) +		if (!IS_GEMINILAKE(dev_priv) && intel_vtd_active(dev_priv))  			intel_uncore_rmw(&dev_priv->uncore, CHICKEN_PIPESL_1(pipe),  					 SKL_PLANE1_STRETCH_MAX_MASK, SKL_PLANE1_STRETCH_MAX_X1);  	} @@ -160,7 +161,7 @@ static void bxt_init_clock_gating(struct drm_i915_private *dev_priv)  	 * Display WA #0883: bxt  	 */  	intel_uncore_write(&dev_priv->uncore, ILK_DPFC_CHICKEN, intel_uncore_read(&dev_priv->uncore, ILK_DPFC_CHICKEN) | -		   ILK_DPFC_DISABLE_DUMMY0); +		   DPFC_DISABLE_DUMMY0);  }  static void glk_init_clock_gating(struct drm_i915_private *dev_priv) @@ -988,7 +989,7 @@ static void g4x_write_wm_values(struct drm_i915_private *dev_priv,  	enum pipe pipe;  	for_each_pipe(dev_priv, pipe) -		trace_g4x_wm(intel_get_crtc_for_pipe(dev_priv, pipe), wm); +		trace_g4x_wm(intel_crtc_for_pipe(dev_priv, pipe), wm);  	intel_uncore_write(&dev_priv->uncore, DSPFW1,  		   FW_WM(wm->sr.plane, SR) | @@ -1020,7 +1021,7 @@ static void vlv_write_wm_values(struct drm_i915_private *dev_priv,  	enum pipe pipe;  	for_each_pipe(dev_priv, pipe) { -		trace_vlv_wm(intel_get_crtc_for_pipe(dev_priv, pipe), wm); +		trace_vlv_wm(intel_crtc_for_pipe(dev_priv, pipe), wm);  		intel_uncore_write(&dev_priv->uncore, VLV_DDL(pipe),  			   (wm->ddl[pipe].plane[PLANE_CURSOR] << DDL_CURSOR_SHIFT) | @@ -2335,6 +2336,20 @@ static void i965_update_wm(struct drm_i915_private *dev_priv)  #undef FW_WM +static struct intel_crtc *intel_crtc_for_plane(struct drm_i915_private *i915, +					       enum i9xx_plane_id i9xx_plane) +{ +	struct intel_plane *plane; + +	for_each_intel_plane(&i915->drm, plane) { +		if (plane->id == PLANE_PRIMARY && +		    plane->i9xx_plane == i9xx_plane) +			return intel_crtc_for_pipe(i915, plane->pipe); +	} + +	return NULL; +} +  static void i9xx_update_wm(struct drm_i915_private *dev_priv)  {  	const struct intel_watermark_params *wm_info; @@ -2356,7 +2371,7 @@ static void i9xx_update_wm(struct drm_i915_private *dev_priv)  		fifo_size = i830_get_fifo_size(dev_priv, PLANE_A);  	else  		fifo_size = i9xx_get_fifo_size(dev_priv, PLANE_A); -	crtc = intel_get_crtc_for_plane(dev_priv, PLANE_A); +	crtc = intel_crtc_for_plane(dev_priv, PLANE_A);  	if (intel_crtc_active(crtc)) {  		const struct drm_display_mode *pipe_mode =  			&crtc->config->hw.pipe_mode; @@ -2386,7 +2401,7 @@ static void i9xx_update_wm(struct drm_i915_private *dev_priv)  		fifo_size = i830_get_fifo_size(dev_priv, PLANE_B);  	else  		fifo_size = i9xx_get_fifo_size(dev_priv, PLANE_B); -	crtc = intel_get_crtc_for_plane(dev_priv, PLANE_B); +	crtc = intel_crtc_for_plane(dev_priv, PLANE_B);  	if (intel_crtc_active(crtc)) {  		const struct drm_display_mode *pipe_mode =  			&crtc->config->hw.pipe_mode; @@ -3062,9 +3077,9 @@ static void snb_wm_latency_quirk(struct drm_i915_private *dev_priv)  	 * The BIOS provided WM memory latency values are often  	 * inadequate for high resolution displays. Adjust them.  	 */ -	changed = ilk_increase_wm_latency(dev_priv, dev_priv->wm.pri_latency, 12) | -		ilk_increase_wm_latency(dev_priv, dev_priv->wm.spr_latency, 12) | -		ilk_increase_wm_latency(dev_priv, dev_priv->wm.cur_latency, 12); +	changed = ilk_increase_wm_latency(dev_priv, dev_priv->wm.pri_latency, 12); +	changed |= ilk_increase_wm_latency(dev_priv, dev_priv->wm.spr_latency, 12); +	changed |= ilk_increase_wm_latency(dev_priv, dev_priv->wm.cur_latency, 12);  	if (!changed)  		return; @@ -3368,13 +3383,8 @@ static void ilk_wm_merge(struct drm_i915_private *dev_priv,  	}  	/* ILK: LP2+ must be disabled when FBC WM is disabled but FBC enabled */ -	/* -	 * FIXME this is racy. FBC might get enabled later. -	 * What we should check here is whether FBC can be -	 * enabled sometime later. -	 */ -	if (DISPLAY_VER(dev_priv) == 5 && !merged->fbc_wm_enabled && -	    intel_fbc_is_active(dev_priv)) { +	if (DISPLAY_VER(dev_priv) == 5 && HAS_FBC(dev_priv) && +	    dev_priv->params.enable_fbc && !merged->fbc_wm_enabled) {  		for (level = 2; level <= max_level; level++) {  			struct intel_wm_level *wm = &merged->wm[level]; @@ -5094,6 +5104,18 @@ skl_check_nv12_wm_level(struct skl_wm_level *wm, struct skl_wm_level *uv_wm,  	}  } +static bool icl_need_wm1_wa(struct drm_i915_private *i915, +			    enum plane_id plane_id) +{ +	/* +	 * Wa_1408961008:icl, ehl +	 * Wa_14012656716:tgl, adl +	 * Underruns with WM1+ disabled +	 */ +	return DISPLAY_VER(i915) == 11 || +	       (IS_DISPLAY_VER(i915, 12, 13) && plane_id == PLANE_CURSOR); +} +  static int  skl_allocate_plane_ddb(struct intel_atomic_state *state,  		       struct intel_crtc *crtc) @@ -5264,11 +5286,7 @@ skl_allocate_plane_ddb(struct intel_atomic_state *state,  			skl_check_nv12_wm_level(&wm->wm[level], &wm->uv_wm[level],  						total[plane_id], uv_total[plane_id]); -			/* -			 * Wa_1408961008:icl, ehl -			 * Underruns with WM1+ disabled -			 */ -			if (DISPLAY_VER(dev_priv) == 11 && +			if (icl_need_wm1_wa(dev_priv, plane_id) &&  			    level == 1 && wm->wm[0].enable) {  				wm->wm[level].blocks = wm->wm[0].blocks;  				wm->wm[level].lines = wm->wm[0].lines; @@ -6900,7 +6918,7 @@ void g4x_wm_sanitize(struct drm_i915_private *dev_priv)  	for_each_intel_plane(&dev_priv->drm, plane) {  		struct intel_crtc *crtc = -			intel_get_crtc_for_pipe(dev_priv, plane->pipe); +			intel_crtc_for_pipe(dev_priv, plane->pipe);  		struct intel_crtc_state *crtc_state =  			to_intel_crtc_state(crtc->base.state);  		struct intel_plane_state *plane_state = @@ -7056,7 +7074,7 @@ void vlv_wm_sanitize(struct drm_i915_private *dev_priv)  	for_each_intel_plane(&dev_priv->drm, plane) {  		struct intel_crtc *crtc = -			intel_get_crtc_for_pipe(dev_priv, plane->pipe); +			intel_crtc_for_pipe(dev_priv, plane->pipe);  		struct intel_crtc_state *crtc_state =  			to_intel_crtc_state(crtc->base.state);  		struct intel_plane_state *plane_state = @@ -7434,7 +7452,7 @@ static void icl_init_clock_gating(struct drm_i915_private *dev_priv)  {  	/* Wa_1409120013:icl,ehl */  	intel_uncore_write(&dev_priv->uncore, ILK_DPFC_CHICKEN, -		   ILK_DPFC_CHICKEN_COMP_DUMMY_PIXEL); +		   DPFC_CHICKEN_COMP_DUMMY_PIXEL);  	/*Wa_14010594013:icl, ehl */  	intel_uncore_rmw(&dev_priv->uncore, GEN8_CHICKEN_DCPR_1, @@ -7443,11 +7461,11 @@ static void icl_init_clock_gating(struct drm_i915_private *dev_priv)  static void gen12lp_init_clock_gating(struct drm_i915_private *dev_priv)  { -	/* Wa_1409120013:tgl,rkl,adl-s,dg1 */ +	/* Wa_1409120013:tgl,rkl,adl-s,dg1,dg2 */  	if (IS_TIGERLAKE(dev_priv) || IS_ROCKETLAKE(dev_priv) || -	    IS_ALDERLAKE_S(dev_priv) || IS_DG1(dev_priv)) +	    IS_ALDERLAKE_S(dev_priv) || IS_DG1(dev_priv) || IS_DG2(dev_priv))  		intel_uncore_write(&dev_priv->uncore, ILK_DPFC_CHICKEN, -				   ILK_DPFC_CHICKEN_COMP_DUMMY_PIXEL); +				   DPFC_CHICKEN_COMP_DUMMY_PIXEL);  	/* Wa_1409825376:tgl (pre-prod)*/  	if (IS_TGL_DISPLAY_STEP(dev_priv, STEP_A0, STEP_C0)) @@ -7473,11 +7491,34 @@ static void dg1_init_clock_gating(struct drm_i915_private *dev_priv)  	gen12lp_init_clock_gating(dev_priv);  	/* Wa_1409836686:dg1[a0] */ -	if (IS_DG1_GT_STEP(dev_priv, STEP_A0, STEP_B0)) +	if (IS_DG1_GRAPHICS_STEP(dev_priv, STEP_A0, STEP_B0))  		intel_uncore_write(&dev_priv->uncore, GEN9_CLKGATE_DIS_3, intel_uncore_read(&dev_priv->uncore, GEN9_CLKGATE_DIS_3) |  			   DPT_GATING_DIS);  } +static void xehpsdv_init_clock_gating(struct drm_i915_private *dev_priv) +{ +	/* Wa_22010146351:xehpsdv */ +	if (IS_XEHPSDV_GRAPHICS_STEP(dev_priv, STEP_A0, STEP_B0)) +		intel_uncore_rmw(&dev_priv->uncore, XEHP_CLOCK_GATE_DIS, 0, SGR_DIS); +} + +static void dg2_init_clock_gating(struct drm_i915_private *i915) +{ +	/* Wa_22010954014:dg2_g10 */ +	if (IS_DG2_G10(i915)) +		intel_uncore_rmw(&i915->uncore, XEHP_CLOCK_GATE_DIS, 0, +				 SGSI_SIDECLK_DIS); + +	/* +	 * Wa_14010733611:dg2_g10 +	 * Wa_22010146351:dg2_g10 +	 */ +	if (IS_DG2_GRAPHICS_STEP(i915, G10, STEP_A0, STEP_B0)) +		intel_uncore_rmw(&i915->uncore, XEHP_CLOCK_GATE_DIS, 0, +				 SGR_DIS | SGGI_DIS); +} +  static void cnp_init_clock_gating(struct drm_i915_private *dev_priv)  {  	if (!HAS_PCH_CNP(dev_priv)) @@ -7509,7 +7550,7 @@ static void cfl_init_clock_gating(struct drm_i915_private *dev_priv)  	 * Display WA #0873: cfl  	 */  	intel_uncore_write(&dev_priv->uncore, ILK_DPFC_CHICKEN, intel_uncore_read(&dev_priv->uncore, ILK_DPFC_CHICKEN) | -		   ILK_DPFC_NUKE_ON_ANY_MODIFICATION); +		   DPFC_NUKE_ON_ANY_MODIFICATION);  }  static void kbl_init_clock_gating(struct drm_i915_private *dev_priv) @@ -7521,12 +7562,12 @@ static void kbl_init_clock_gating(struct drm_i915_private *dev_priv)  		   FBC_LLC_FULLY_OPEN);  	/* WaDisableSDEUnitClockGating:kbl */ -	if (IS_KBL_GT_STEP(dev_priv, 0, STEP_C0)) +	if (IS_KBL_GRAPHICS_STEP(dev_priv, 0, STEP_C0))  		intel_uncore_write(&dev_priv->uncore, GEN8_UCGCTL6, intel_uncore_read(&dev_priv->uncore, GEN8_UCGCTL6) |  			   GEN8_SDEUNIT_CLOCK_GATE_DISABLE);  	/* WaDisableGamClockGating:kbl */ -	if (IS_KBL_GT_STEP(dev_priv, 0, STEP_C0)) +	if (IS_KBL_GRAPHICS_STEP(dev_priv, 0, STEP_C0))  		intel_uncore_write(&dev_priv->uncore, GEN6_UCGCTL1, intel_uncore_read(&dev_priv->uncore, GEN6_UCGCTL1) |  			   GEN6_GAMUNIT_CLOCK_GATE_DISABLE); @@ -7542,7 +7583,7 @@ static void kbl_init_clock_gating(struct drm_i915_private *dev_priv)  	 * Display WA #0873: kbl  	 */  	intel_uncore_write(&dev_priv->uncore, ILK_DPFC_CHICKEN, intel_uncore_read(&dev_priv->uncore, ILK_DPFC_CHICKEN) | -		   ILK_DPFC_NUKE_ON_ANY_MODIFICATION); +		   DPFC_NUKE_ON_ANY_MODIFICATION);  }  static void skl_init_clock_gating(struct drm_i915_private *dev_priv) @@ -7569,14 +7610,14 @@ static void skl_init_clock_gating(struct drm_i915_private *dev_priv)  	 * Display WA #0873: skl  	 */  	intel_uncore_write(&dev_priv->uncore, ILK_DPFC_CHICKEN, intel_uncore_read(&dev_priv->uncore, ILK_DPFC_CHICKEN) | -		   ILK_DPFC_NUKE_ON_ANY_MODIFICATION); +		   DPFC_NUKE_ON_ANY_MODIFICATION);  	/*  	 * WaFbcHighMemBwCorruptionAvoidance:skl  	 * Display WA #0883: skl  	 */  	intel_uncore_write(&dev_priv->uncore, ILK_DPFC_CHICKEN, intel_uncore_read(&dev_priv->uncore, ILK_DPFC_CHICKEN) | -		   ILK_DPFC_DISABLE_DUMMY0); +		   DPFC_DISABLE_DUMMY0);  }  static void bdw_init_clock_gating(struct drm_i915_private *dev_priv) @@ -7888,6 +7929,8 @@ static const struct drm_i915_clock_gating_funcs platform##_clock_gating_funcs =  	.init_clock_gating = platform##_init_clock_gating,		\  } +CG_FUNCS(dg2); +CG_FUNCS(xehpsdv);  CG_FUNCS(adlp);  CG_FUNCS(dg1);  CG_FUNCS(gen12lp); @@ -7924,7 +7967,11 @@ CG_FUNCS(nop);   */  void intel_init_clock_gating_hooks(struct drm_i915_private *dev_priv)  { -	if (IS_ALDERLAKE_P(dev_priv)) +	if (IS_DG2(dev_priv)) +		dev_priv->clock_gating_funcs = &dg2_clock_gating_funcs; +	else if (IS_XEHPSDV(dev_priv)) +		dev_priv->clock_gating_funcs = &xehpsdv_clock_gating_funcs; +	else if (IS_ALDERLAKE_P(dev_priv))  		dev_priv->clock_gating_funcs = &adlp_clock_gating_funcs;  	else if (IS_DG1(dev_priv))  		dev_priv->clock_gating_funcs = &dg1_clock_gating_funcs; |