drm/i915: Move SAGV block time to dev_priv
In prep for newer platforms having more complicated ways to determine the SAGV block time, move the variable to dev_priv, and extract the setting to an initial setup function. While we're at it, update the if ladder to follow the new gen -> old gen order preference, and warn on any non-specified gen. v2: Shorten the function name (Ville), return directly (Ville), move sagv_block_time_us value to dev_priv (Ville) v3: Change sagv_block_time_us to u32 (Lucas), Change fallback value to -1 (Lucas), use intel_has_sagv for setup check rather than hand-rolling (Lucas) Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Cc: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com> Cc: Lucas De Marchi <lucas.demarchi@intel.com> Signed-off-by: James Ausmus <james.ausmus@intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20191004221449.1317-1-james.ausmus@intel.com Link: https://patchwork.freedesktop.org/patch/msgid/20191009172315.11004-1-lucas.demarchi@intel.com
This commit is contained in:
		
							parent
							
								
									52111c4628
								
							
						
					
					
						commit
						b068a86071
					
				| @ -1267,6 +1267,8 @@ struct drm_i915_private { | ||||
| 		I915_SAGV_NOT_CONTROLLED | ||||
| 	} sagv_status; | ||||
| 
 | ||||
| 	u32 sagv_block_time_us; | ||||
| 
 | ||||
| 	struct { | ||||
| 		/*
 | ||||
| 		 * Raw watermark latency values: | ||||
|  | ||||
| @ -3638,6 +3638,26 @@ intel_has_sagv(struct drm_i915_private *dev_priv) | ||||
| 		dev_priv->sagv_status != I915_SAGV_NOT_CONTROLLED; | ||||
| } | ||||
| 
 | ||||
| static void | ||||
| skl_setup_sagv_block_time(struct drm_i915_private *dev_priv) | ||||
| { | ||||
| 	if (IS_GEN(dev_priv, 11)) { | ||||
| 		dev_priv->sagv_block_time_us = 10; | ||||
| 		return; | ||||
| 	} else if (IS_GEN(dev_priv, 10)) { | ||||
| 		dev_priv->sagv_block_time_us = 20; | ||||
| 		return; | ||||
| 	} else if (IS_GEN(dev_priv, 9)) { | ||||
| 		dev_priv->sagv_block_time_us = 30; | ||||
| 		return; | ||||
| 	} else { | ||||
| 		MISSING_CASE(INTEL_GEN(dev_priv)); | ||||
| 	} | ||||
| 
 | ||||
| 	/* Default to an unusable block time */ | ||||
| 	dev_priv->sagv_block_time_us = -1; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * SAGV dynamically adjusts the system agent voltage and clock frequencies | ||||
|  * depending on power and performance requirements. The display engine access | ||||
| @ -3726,18 +3746,10 @@ bool intel_can_enable_sagv(struct intel_atomic_state *state) | ||||
| 	struct intel_crtc_state *crtc_state; | ||||
| 	enum pipe pipe; | ||||
| 	int level, latency; | ||||
| 	int sagv_block_time_us; | ||||
| 
 | ||||
| 	if (!intel_has_sagv(dev_priv)) | ||||
| 		return false; | ||||
| 
 | ||||
| 	if (IS_GEN(dev_priv, 9)) | ||||
| 		sagv_block_time_us = 30; | ||||
| 	else if (IS_GEN(dev_priv, 10)) | ||||
| 		sagv_block_time_us = 20; | ||||
| 	else | ||||
| 		sagv_block_time_us = 10; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * If there are no active CRTCs, no additional checks need be performed | ||||
| 	 */ | ||||
| @ -3784,7 +3796,7 @@ bool intel_can_enable_sagv(struct intel_atomic_state *state) | ||||
| 		 * incur memory latencies higher than sagv_block_time_us we | ||||
| 		 * can't enable SAGV. | ||||
| 		 */ | ||||
| 		if (latency < sagv_block_time_us) | ||||
| 		if (latency < dev_priv->sagv_block_time_us) | ||||
| 			return false; | ||||
| 	} | ||||
| 
 | ||||
| @ -8985,6 +8997,9 @@ void intel_init_pm(struct drm_i915_private *dev_priv) | ||||
| 	else if (IS_GEN(dev_priv, 5)) | ||||
| 		i915_ironlake_get_mem_freq(dev_priv); | ||||
| 
 | ||||
| 	if (intel_has_sagv(dev_priv)) | ||||
| 		skl_setup_sagv_block_time(dev_priv); | ||||
| 
 | ||||
| 	/* For FIFO watermark updates */ | ||||
| 	if (INTEL_GEN(dev_priv) >= 9) { | ||||
| 		skl_setup_wm_latency(dev_priv); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user