diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_display.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 49 |
1 files changed, 32 insertions, 17 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index efe829919755..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)) |
@@ -8332,11 +8352,6 @@ static int intel_crtc_set_config(struct drm_mode_set *set) | |||
8332 | 8352 | ||
8333 | ret = intel_set_mode(set->crtc, set->mode, | 8353 | ret = intel_set_mode(set->crtc, set->mode, |
8334 | set->x, set->y, set->fb); | 8354 | set->x, set->y, set->fb); |
8335 | if (ret) { | ||
8336 | DRM_ERROR("failed to set mode on [CRTC:%d], err = %d\n", | ||
8337 | set->crtc->base.id, ret); | ||
8338 | goto fail; | ||
8339 | } | ||
8340 | } else if (config->fb_changed) { | 8355 | } else if (config->fb_changed) { |
8341 | intel_crtc_wait_for_pending_flips(set->crtc); | 8356 | intel_crtc_wait_for_pending_flips(set->crtc); |
8342 | 8357 | ||
@@ -8344,18 +8359,18 @@ static int intel_crtc_set_config(struct drm_mode_set *set) | |||
8344 | set->x, set->y, set->fb); | 8359 | set->x, set->y, set->fb); |
8345 | } | 8360 | } |
8346 | 8361 | ||
8347 | intel_set_config_free(config); | 8362 | if (ret) { |
8348 | 8363 | DRM_ERROR("failed to set mode on [CRTC:%d], err = %d\n", | |
8349 | return 0; | 8364 | set->crtc->base.id, ret); |
8350 | |||
8351 | fail: | 8365 | fail: |
8352 | intel_set_config_restore_state(dev, config); | 8366 | intel_set_config_restore_state(dev, config); |
8353 | 8367 | ||
8354 | /* Try to restore the config */ | 8368 | /* Try to restore the config */ |
8355 | if (config->mode_changed && | 8369 | if (config->mode_changed && |
8356 | intel_set_mode(save_set.crtc, save_set.mode, | 8370 | intel_set_mode(save_set.crtc, save_set.mode, |
8357 | save_set.x, save_set.y, save_set.fb)) | 8371 | save_set.x, save_set.y, save_set.fb)) |
8358 | DRM_ERROR("failed to restore config after modeset failure\n"); | 8372 | DRM_ERROR("failed to restore config after modeset failure\n"); |
8373 | } | ||
8359 | 8374 | ||
8360 | out_config: | 8375 | out_config: |
8361 | intel_set_config_free(config); | 8376 | intel_set_config_free(config); |