diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_display.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 24 | 
1 files changed, 22 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 300942a7d14..ad1117bebd7 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -8140,6 +8140,21 @@ static void intel_set_config_restore_state(struct drm_device *dev,  	}  } +static bool +is_crtc_connector_off(struct drm_crtc *crtc, struct drm_connector *connectors, +		      int num_connectors) +{ +	int i; + +	for (i = 0; i < num_connectors; i++) +		if (connectors[i].encoder && +		    connectors[i].encoder->crtc == crtc && +		    connectors[i].dpms != DRM_MODE_DPMS_ON) +			return true; + +	return false; +} +  static void  intel_set_config_compute_mode_changes(struct drm_mode_set *set,  				      struct intel_set_config *config) @@ -8147,7 +8162,11 @@ intel_set_config_compute_mode_changes(struct drm_mode_set *set,  	/* We should be able to check here if the fb has the same properties  	 * and then just flip_or_move it */ -	if (set->crtc->fb != set->fb) { +	if (set->connectors != NULL && +	    is_crtc_connector_off(set->crtc, *set->connectors, +				  set->num_connectors)) { +			config->mode_changed = true; +	} else if (set->crtc->fb != set->fb) {  		/* If we have no fb then treat it as a full mode set */  		if (set->crtc->fb == NULL) {  			DRM_DEBUG_KMS("crtc has no fb, full mode set\n"); @@ -8157,8 +8176,9 @@ intel_set_config_compute_mode_changes(struct drm_mode_set *set,  		} else if (set->fb->pixel_format !=  			   set->crtc->fb->pixel_format) {  			config->mode_changed = true; -		} else +		} else {  			config->fb_changed = true; +		}  	}  	if (set->fb && (set->x != set->crtc->x || set->y != set->crtc->y))  |