aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_display.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/intel_display.c')
-rw-r--r--drivers/gpu/drm/i915/intel_display.c49
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
8143static bool
8144is_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
8143static void 8158static void
8144intel_set_config_compute_mode_changes(struct drm_mode_set *set, 8159intel_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
8351fail: 8365fail:
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
8360out_config: 8375out_config:
8361 intel_set_config_free(config); 8376 intel_set_config_free(config);