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)) |
