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