diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_pm.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 25 | 
1 files changed, 16 insertions, 9 deletions
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index e6f54ffab3b..e83a1179417 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c @@ -44,6 +44,14 @@   * i915.i915_enable_fbc parameter   */ +static bool intel_crtc_active(struct drm_crtc *crtc) +{ +	/* Be paranoid as we can arrive here with only partial +	 * state retrieved from the hardware during setup. +	 */ +	return to_intel_crtc(crtc)->active && crtc->fb && crtc->mode.clock; +} +  static void i8xx_disable_fbc(struct drm_device *dev)  {  	struct drm_i915_private *dev_priv = dev->dev_private; @@ -405,9 +413,8 @@ void intel_update_fbc(struct drm_device *dev)  	 *   - going to an unsupported config (interlace, pixel multiply, etc.)  	 */  	list_for_each_entry(tmp_crtc, &dev->mode_config.crtc_list, head) { -		if (to_intel_crtc(tmp_crtc)->active && -		    !to_intel_crtc(tmp_crtc)->primary_disabled && -		    tmp_crtc->fb) { +		if (intel_crtc_active(tmp_crtc) && +		    !to_intel_crtc(tmp_crtc)->primary_disabled) {  			if (crtc) {  				DRM_DEBUG_KMS("more than one pipe active, disabling compression\n");  				dev_priv->no_fbc_reason = FBC_MULTIPLE_PIPES; @@ -992,7 +999,7 @@ static struct drm_crtc *single_enabled_crtc(struct drm_device *dev)  	struct drm_crtc *crtc, *enabled = NULL;  	list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { -		if (to_intel_crtc(crtc)->active && crtc->fb) { +		if (intel_crtc_active(crtc)) {  			if (enabled)  				return NULL;  			enabled = crtc; @@ -1086,7 +1093,7 @@ static bool g4x_compute_wm0(struct drm_device *dev,  	int entries, tlb_miss;  	crtc = intel_get_crtc_for_plane(dev, plane); -	if (crtc->fb == NULL || !to_intel_crtc(crtc)->active) { +	if (!intel_crtc_active(crtc)) {  		*cursor_wm = cursor->guard_size;  		*plane_wm = display->guard_size;  		return false; @@ -1215,7 +1222,7 @@ static bool vlv_compute_drain_latency(struct drm_device *dev,  	int entries;  	crtc = intel_get_crtc_for_plane(dev, plane); -	if (crtc->fb == NULL || !to_intel_crtc(crtc)->active) +	if (!intel_crtc_active(crtc))  		return false;  	clock = crtc->mode.clock;	/* VESA DOT Clock */ @@ -1476,7 +1483,7 @@ static void i9xx_update_wm(struct drm_device *dev)  	fifo_size = dev_priv->display.get_fifo_size(dev, 0);  	crtc = intel_get_crtc_for_plane(dev, 0); -	if (to_intel_crtc(crtc)->active && crtc->fb) { +	if (intel_crtc_active(crtc)) {  		int cpp = crtc->fb->bits_per_pixel / 8;  		if (IS_GEN2(dev))  			cpp = 4; @@ -1490,7 +1497,7 @@ static void i9xx_update_wm(struct drm_device *dev)  	fifo_size = dev_priv->display.get_fifo_size(dev, 1);  	crtc = intel_get_crtc_for_plane(dev, 1); -	if (to_intel_crtc(crtc)->active && crtc->fb) { +	if (intel_crtc_active(crtc)) {  		int cpp = crtc->fb->bits_per_pixel / 8;  		if (IS_GEN2(dev))  			cpp = 4; @@ -2044,7 +2051,7 @@ sandybridge_compute_sprite_wm(struct drm_device *dev, int plane,  	int entries, tlb_miss;  	crtc = intel_get_crtc_for_plane(dev, plane); -	if (crtc->fb == NULL || !to_intel_crtc(crtc)->active) { +	if (!intel_crtc_active(crtc)) {  		*sprite_wm = display->guard_size;  		return false;  	}  | 
