diff options
-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 300942a7d144..ad1117bebd7e 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, | |||
8140 | } | 8140 | } |
8141 | } | 8141 | } |
8142 | 8142 | ||
8143 | static bool | ||
8144 | is_crtc_connector_off(struct drm_crtc *crtc, struct drm_connector *connectors, | ||
8145 | int num_connectors) | ||
8146 | { | ||
8147 | int i; | ||
8148 | |||
8149 | for (i = 0; i < num_connectors; i++) | ||
8150 | if (connectors[i].encoder && | ||
8151 | connectors[i].encoder->crtc == crtc && | ||
8152 | connectors[i].dpms != DRM_MODE_DPMS_ON) | ||
8153 | return true; | ||
8154 | |||
8155 | return false; | ||
8156 | } | ||
8157 | |||
8143 | static void | 8158 | static void |
8144 | intel_set_config_compute_mode_changes(struct drm_mode_set *set, | 8159 | intel_set_config_compute_mode_changes(struct drm_mode_set *set, |
8145 | struct intel_set_config *config) | 8160 | struct intel_set_config *config) |
@@ -8147,7 +8162,11 @@ intel_set_config_compute_mode_changes(struct drm_mode_set *set, | |||
8147 | 8162 | ||
8148 | /* We should be able to check here if the fb has the same properties | 8163 | /* We should be able to check here if the fb has the same properties |
8149 | * and then just flip_or_move it */ | 8164 | * and then just flip_or_move it */ |
8150 | if (set->crtc->fb != set->fb) { | 8165 | if (set->connectors != NULL && |
8166 | is_crtc_connector_off(set->crtc, *set->connectors, | ||
8167 | set->num_connectors)) { | ||
8168 | config->mode_changed = true; | ||
8169 | } else if (set->crtc->fb != set->fb) { | ||
8151 | /* If we have no fb then treat it as a full mode set */ | 8170 | /* If we have no fb then treat it as a full mode set */ |
8152 | if (set->crtc->fb == NULL) { | 8171 | if (set->crtc->fb == NULL) { |
8153 | DRM_DEBUG_KMS("crtc has no fb, full mode set\n"); | 8172 | 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, | |||
8157 | } else if (set->fb->pixel_format != | 8176 | } else if (set->fb->pixel_format != |
8158 | set->crtc->fb->pixel_format) { | 8177 | set->crtc->fb->pixel_format) { |
8159 | config->mode_changed = true; | 8178 | config->mode_changed = true; |
8160 | } else | 8179 | } else { |
8161 | config->fb_changed = true; | 8180 | config->fb_changed = true; |
8181 | } | ||
8162 | } | 8182 | } |
8163 | 8183 | ||
8164 | if (set->fb && (set->x != set->crtc->x || set->y != set->crtc->y)) | 8184 | if (set->fb && (set->x != set->crtc->x || set->y != set->crtc->y)) |