[mutter] kms: Don't enter power saving via updates



commit 2d7a8c3ce9a6244e9e9019672b1c900626ba7c56
Author: Jonas Ã…dahl <jadahl gmail com>
Date:   Mon Jun 28 10:11:31 2021 +0200

    kms: Don't enter power saving via updates
    
    The way device backends implement power saving differ, and power saving
    needs to contain nothing incompatible in the same update. Make it
    impossible to e.g. mode set, page flip, etc while entering power save by
    not using MetaKmsUpdate's at all for this.
    
    Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2159>

 src/backends/native/meta-kms-connector-private.h  |  2 +
 src/backends/native/meta-kms-connector.c          | 15 ++++-
 src/backends/native/meta-kms-crtc-private.h       |  2 +
 src/backends/native/meta-kms-crtc.c               | 17 ++---
 src/backends/native/meta-kms-device.c             | 22 +++++++
 src/backends/native/meta-kms-device.h             |  3 +
 src/backends/native/meta-kms-impl-device-atomic.c | 78 ++++++++++++++---------
 src/backends/native/meta-kms-impl-device-simple.c | 78 +++++++++++++----------
 src/backends/native/meta-kms-impl-device.c        | 17 +++++
 src/backends/native/meta-kms-impl-device.h        |  3 +
 src/backends/native/meta-kms-update-private.h     |  3 -
 src/backends/native/meta-kms-update.c             | 28 --------
 src/backends/native/meta-monitor-manager-native.c | 23 +------
 src/tests/native-kms-device.c                     |  6 +-
 src/tests/native-kms-updates.c                    |  1 -
 15 files changed, 165 insertions(+), 133 deletions(-)
---
diff --git a/src/backends/native/meta-kms-connector-private.h 
b/src/backends/native/meta-kms-connector-private.h
index a9201f3f4c..b9a2e21bd8 100644
--- a/src/backends/native/meta-kms-connector-private.h
+++ b/src/backends/native/meta-kms-connector-private.h
@@ -43,6 +43,8 @@ const char * meta_kms_connector_get_prop_name (MetaKmsConnector     *connector,
 MetaKmsUpdateChanges meta_kms_connector_update_state (MetaKmsConnector *connector,
                                                       drmModeRes       *drm_resources);
 
+void meta_kms_connector_disable (MetaKmsConnector *connector);
+
 void meta_kms_connector_predict_state (MetaKmsConnector *connector,
                                        MetaKmsUpdate    *update);
 
diff --git a/src/backends/native/meta-kms-connector.c b/src/backends/native/meta-kms-connector.c
index 7d10dcb3cd..b7550e12ee 100644
--- a/src/backends/native/meta-kms-connector.c
+++ b/src/backends/native/meta-kms-connector.c
@@ -753,6 +753,18 @@ meta_kms_connector_update_state (MetaKmsConnector *connector,
   return changes;
 }
 
+void
+meta_kms_connector_disable (MetaKmsConnector *connector)
+{
+  MetaKmsConnectorState *current_state;
+
+  current_state = connector->current_state;
+  if (!current_state)
+    return;
+
+  current_state->current_crtc_id = 0;
+}
+
 void
 meta_kms_connector_predict_state (MetaKmsConnector *connector,
                                   MetaKmsUpdate    *update)
@@ -766,9 +778,6 @@ meta_kms_connector_predict_state (MetaKmsConnector *connector,
   if (!current_state)
     return;
 
-  if (meta_kms_update_is_power_save (update))
-    current_state->current_crtc_id = 0;
-
   mode_sets = meta_kms_update_get_mode_sets (update);
   for (l = mode_sets; l; l = l->next)
     {
diff --git a/src/backends/native/meta-kms-crtc-private.h b/src/backends/native/meta-kms-crtc-private.h
index f91731a002..65bda3f10b 100644
--- a/src/backends/native/meta-kms-crtc-private.h
+++ b/src/backends/native/meta-kms-crtc-private.h
@@ -40,6 +40,8 @@ MetaKmsCrtc * meta_kms_crtc_new (MetaKmsImplDevice  *impl_device,
 
 MetaKmsUpdateChanges meta_kms_crtc_update_state (MetaKmsCrtc *crtc);
 
+void meta_kms_crtc_disable (MetaKmsCrtc *crtc);
+
 void meta_kms_crtc_predict_state (MetaKmsCrtc   *crtc,
                                   MetaKmsUpdate *update);
 
diff --git a/src/backends/native/meta-kms-crtc.c b/src/backends/native/meta-kms-crtc.c
index 7d4706bf1d..685a3737ca 100644
--- a/src/backends/native/meta-kms-crtc.c
+++ b/src/backends/native/meta-kms-crtc.c
@@ -277,6 +277,15 @@ out:
   return changes;
 }
 
+void
+meta_kms_crtc_disable (MetaKmsCrtc *crtc)
+{
+  crtc->current_state.is_active = FALSE;
+  crtc->current_state.rect = (MetaRectangle) { 0 };
+  crtc->current_state.is_drm_mode_valid = FALSE;
+  crtc->current_state.drm_mode = (drmModeModeInfo) { 0 };
+}
+
 void
 meta_kms_crtc_predict_state (MetaKmsCrtc   *crtc,
                              MetaKmsUpdate *update)
@@ -285,14 +294,6 @@ meta_kms_crtc_predict_state (MetaKmsCrtc   *crtc,
   GList *crtc_gammas;
   GList *l;
 
-  if (meta_kms_update_is_power_save (update))
-    {
-      crtc->current_state.is_active = FALSE;
-      crtc->current_state.rect = (MetaRectangle) { 0 };
-      crtc->current_state.is_drm_mode_valid = FALSE;
-      crtc->current_state.drm_mode = (drmModeModeInfo) { 0 };
-    }
-
   mode_sets = meta_kms_update_get_mode_sets (update);
   for (l = mode_sets; l; l = l->next)
     {
diff --git a/src/backends/native/meta-kms-device.c b/src/backends/native/meta-kms-device.c
index f9d594eb7d..bef1e20657 100644
--- a/src/backends/native/meta-kms-device.c
+++ b/src/backends/native/meta-kms-device.c
@@ -231,6 +231,28 @@ meta_kms_device_get_fallback_modes (MetaKmsDevice *device)
   return device->fallback_modes;
 }
 
+static gpointer
+disable_device_in_impl (MetaKmsImpl  *impl,
+                        gpointer      user_data,
+                        GError      **error)
+{
+  MetaKmsImplDevice *impl_device = user_data;
+
+  meta_kms_impl_device_disable (impl_device);
+
+  return GINT_TO_POINTER (TRUE);
+}
+
+void
+meta_kms_device_disable (MetaKmsDevice *device)
+{
+  meta_assert_not_in_kms_impl (device->kms);
+
+  meta_kms_run_impl_task_sync (device->kms, disable_device_in_impl,
+                               device->impl_device,
+                               NULL);
+}
+
 MetaKmsUpdateChanges
 meta_kms_device_update_states_in_impl (MetaKmsDevice *device,
                                        uint32_t       crtc_id,
diff --git a/src/backends/native/meta-kms-device.h b/src/backends/native/meta-kms-device.h
index 288119fbbb..6eeb84cec5 100644
--- a/src/backends/native/meta-kms-device.h
+++ b/src/backends/native/meta-kms-device.h
@@ -77,6 +77,9 @@ MetaKmsFeedback * meta_kms_device_process_update_sync (MetaKmsDevice     *device
                                                        MetaKmsUpdate     *update,
                                                        MetaKmsUpdateFlag  flags);
 
+META_EXPORT_TEST
+void meta_kms_device_disable (MetaKmsDevice *device);
+
 MetaKmsDevice * meta_kms_device_new (MetaKms            *kms,
                                      const char         *path,
                                      MetaKmsDeviceFlag   flags,
diff --git a/src/backends/native/meta-kms-impl-device-atomic.c 
b/src/backends/native/meta-kms-impl-device-atomic.c
index bf1abf5727..a3ae83e547 100644
--- a/src/backends/native/meta-kms-impl-device-atomic.c
+++ b/src/backends/native/meta-kms-impl-device-atomic.c
@@ -904,21 +904,6 @@ disable_planes_and_connectors (MetaKmsImplDevice  *impl_device,
   return TRUE;
 }
 
-static gboolean
-process_power_save (MetaKmsImplDevice *impl_device,
-                   drmModeAtomicReq   *req,
-                   GError            **error)
-{
-  if (!disable_connectors (impl_device, req, error))
-    return FALSE;
-  if (!disable_planes (impl_device, req, error))
-    return FALSE;
-  if (!disable_crtcs (impl_device, req, error))
-    return FALSE;
-
-  return TRUE;
-}
-
 static MetaKmsFeedback *
 meta_kms_impl_device_atomic_process_update (MetaKmsImplDevice *impl_device,
                                             MetaKmsUpdate     *update,
@@ -953,19 +938,6 @@ meta_kms_impl_device_atomic_process_update (MetaKmsImplDevice *impl_device,
         goto err;
     }
 
-  if (meta_kms_update_is_power_save (update))
-    {
-      meta_topic (META_DEBUG_KMS,
-                  "[atomic] Entering power save mode for %s",
-                  meta_kms_impl_device_get_path (impl_device));
-
-      if (!process_power_save (impl_device, req, &error))
-        goto err;
-
-      commit_flags = DRM_MODE_ATOMIC_ALLOW_MODESET;
-      goto commit;
-    }
-
   if (!process_entries (impl_device,
                         update,
                         req,
@@ -1017,7 +989,6 @@ meta_kms_impl_device_atomic_process_update (MetaKmsImplDevice *impl_device,
   if (flags & META_KMS_UPDATE_FLAG_TEST_ONLY)
     commit_flags |= DRM_MODE_ATOMIC_TEST_ONLY;
 
-commit:
   meta_topic (META_DEBUG_KMS,
               "[atomic] Committing update %" G_GUINT64_FORMAT ", flags: %s",
               meta_kms_update_get_sequence_number (update),
@@ -1066,6 +1037,53 @@ err:
   return meta_kms_feedback_new_failed (failed_planes, error);
 }
 
+static void
+meta_kms_impl_device_atomic_disable (MetaKmsImplDevice *impl_device)
+{
+  g_autoptr (GError) error = NULL;
+  drmModeAtomicReq *req;
+  int fd;
+  int ret;
+
+  meta_topic (META_DEBUG_KMS, "[atomic] Disabling '%s'",
+              meta_kms_impl_device_get_path (impl_device));
+
+  req = drmModeAtomicAlloc ();
+  if (!req)
+    {
+      g_set_error (&error, G_IO_ERROR, G_IO_ERROR_FAILED,
+                   "Failed to create atomic transaction request: %s",
+                   g_strerror (errno));
+      goto err;
+    }
+
+  if (!disable_connectors (impl_device, req, &error))
+    goto err;
+  if (!disable_planes (impl_device, req, &error))
+    goto err;
+  if (!disable_crtcs (impl_device, req, &error))
+    goto err;
+
+  meta_topic (META_DEBUG_KMS, "[atomic] Committing disable-device transaction");
+
+  fd = meta_kms_impl_device_get_fd (impl_device);
+  ret = drmModeAtomicCommit (fd, req, DRM_MODE_ATOMIC_ALLOW_MODESET, impl_device);
+  drmModeAtomicFree (req);
+  if (ret < 0)
+    {
+      g_set_error (&error, G_IO_ERROR, g_io_error_from_errno (-ret),
+                   "drmModeAtomicCommit: %s", g_strerror (-ret));
+      goto err;
+    }
+
+  return;
+
+err:
+  g_warning ("[atomic] Failed to disable device '%s': %s",
+             meta_kms_impl_device_get_path (impl_device),
+             error->message);
+}
+
 static void
 meta_kms_impl_device_atomic_handle_page_flip_callback (MetaKmsImplDevice   *impl_device,
                                                        MetaKmsPageFlipData *page_flip_data)
@@ -1246,6 +1264,8 @@ meta_kms_impl_device_atomic_class_init (MetaKmsImplDeviceAtomicClass *klass)
     meta_kms_impl_device_atomic_setup_drm_event_context;
   impl_device_class->process_update =
     meta_kms_impl_device_atomic_process_update;
+  impl_device_class->disable =
+    meta_kms_impl_device_atomic_disable;
   impl_device_class->handle_page_flip_callback =
     meta_kms_impl_device_atomic_handle_page_flip_callback;
   impl_device_class->discard_pending_page_flips =
diff --git a/src/backends/native/meta-kms-impl-device-simple.c 
b/src/backends/native/meta-kms-impl-device-simple.c
index e201e80fbd..882cd97cc9 100644
--- a/src/backends/native/meta-kms-impl-device-simple.c
+++ b/src/backends/native/meta-kms-impl-device-simple.c
@@ -180,32 +180,6 @@ set_connector_property (MetaKmsImplDevice     *impl_device,
   return TRUE;
 }
 
-static gboolean
-process_power_save (MetaKmsImplDevice  *impl_device,
-                    GError            **error)
-{
-  GList *l;
-
-  for (l = meta_kms_impl_device_peek_connectors (impl_device); l; l = l->next)
-    {
-      MetaKmsConnector *connector = l->data;
-
-      meta_topic (META_DEBUG_KMS,
-                  "[simple] Setting DPMS of connector %u (%s) to OFF",
-                  meta_kms_connector_get_id (connector),
-                  meta_kms_impl_device_get_path (impl_device));
-
-      if (!set_connector_property (impl_device,
-                                   connector,
-                                   META_KMS_CONNECTOR_PROP_DPMS,
-                                   DRM_MODE_DPMS_OFF,
-                                   error))
-        return FALSE;
-    }
-
-  return TRUE;
-}
-
 static gboolean
 process_connector_update (MetaKmsImplDevice  *impl_device,
                           MetaKmsUpdate      *update,
@@ -1508,13 +1482,6 @@ meta_kms_impl_device_simple_process_update (MetaKmsImplDevice *impl_device,
   if (flags & META_KMS_UPDATE_FLAG_TEST_ONLY)
     return perform_update_test (impl_device, update);
 
-  if (meta_kms_update_is_power_save (update))
-    {
-      if (!process_power_save (impl_device, &error))
-        goto err;
-      goto out;
-    }
-
   if (!process_entries (impl_device,
                         update,
                         meta_kms_update_get_mode_sets (update),
@@ -1543,13 +1510,54 @@ meta_kms_impl_device_simple_process_update (MetaKmsImplDevice *impl_device,
                                   &error))
     goto err;
 
-out:
   return meta_kms_feedback_new_passed (failed_planes);
 
 err:
   return meta_kms_feedback_new_failed (failed_planes, error);
 }
 
+static gboolean
+set_dpms_to_off (MetaKmsImplDevice  *impl_device,
+                 GError            **error)
+{
+  GList *l;
+
+  for (l = meta_kms_impl_device_peek_connectors (impl_device); l; l = l->next)
+    {
+      MetaKmsConnector *connector = l->data;
+
+      meta_topic (META_DEBUG_KMS,
+                  "[simple] Setting DPMS of connector %u (%s) to OFF",
+                  meta_kms_connector_get_id (connector),
+                  meta_kms_impl_device_get_path (impl_device));
+
+      if (!set_connector_property (impl_device,
+                                   connector,
+                                   META_KMS_CONNECTOR_PROP_DPMS,
+                                   DRM_MODE_DPMS_OFF,
+                                   error))
+        return FALSE;
+    }
+
+  return TRUE;
+}
+
+static void
+meta_kms_impl_device_simple_disable (MetaKmsImplDevice *impl_device)
+{
+  g_autoptr (GError) error = NULL;
+
+  meta_topic (META_DEBUG_KMS, "[simple] Disabling '%s'",
+              meta_kms_impl_device_get_path (impl_device));
+
+  if (!set_dpms_to_off (impl_device, &error))
+    {
+      g_warning ("Failed to set DPMS to off on device '%s': %s",
+                 meta_kms_impl_device_get_path (impl_device),
+                 error->message);
+    }
+}
+
 static void
 flush_postponed_page_flip_datas (MetaKmsImplDeviceSimple *impl_device_simple)
 {
@@ -1778,6 +1786,8 @@ meta_kms_impl_device_simple_class_init (MetaKmsImplDeviceSimpleClass *klass)
     meta_kms_impl_device_simple_setup_drm_event_context;
   impl_device_class->process_update =
     meta_kms_impl_device_simple_process_update;
+  impl_device_class->disable =
+    meta_kms_impl_device_simple_disable;
   impl_device_class->handle_page_flip_callback =
     meta_kms_impl_device_simple_handle_page_flip_callback;
   impl_device_class->discard_pending_page_flips =
diff --git a/src/backends/native/meta-kms-impl-device.c b/src/backends/native/meta-kms-impl-device.c
index c8b0fc9b73..b05bf5fdab 100644
--- a/src/backends/native/meta-kms-impl-device.c
+++ b/src/backends/native/meta-kms-impl-device.c
@@ -823,6 +823,23 @@ meta_kms_impl_device_process_update (MetaKmsImplDevice *impl_device,
   return feedback;
 }
 
+void
+meta_kms_impl_device_disable (MetaKmsImplDevice *impl_device)
+{
+  MetaKmsImplDevicePrivate *priv =
+    meta_kms_impl_device_get_instance_private (impl_device);
+  MetaKmsImplDeviceClass *klass = META_KMS_IMPL_DEVICE_GET_CLASS (impl_device);
+
+  if (!priv->device_file)
+    return;
+
+  meta_kms_impl_device_hold_fd (impl_device);
+  klass->disable (impl_device);
+  g_list_foreach (priv->crtcs, (GFunc) meta_kms_crtc_disable, NULL);
+  g_list_foreach (priv->connectors, (GFunc) meta_kms_connector_disable, NULL);
+  meta_kms_impl_device_unhold_fd (impl_device);
+}
+
 void
 meta_kms_impl_device_handle_page_flip_callback (MetaKmsImplDevice   *impl_device,
                                                 MetaKmsPageFlipData *page_flip_data)
diff --git a/src/backends/native/meta-kms-impl-device.h b/src/backends/native/meta-kms-impl-device.h
index 48c3ac50bc..e81f00e39c 100644
--- a/src/backends/native/meta-kms-impl-device.h
+++ b/src/backends/native/meta-kms-impl-device.h
@@ -75,6 +75,7 @@ struct _MetaKmsImplDeviceClass
   MetaKmsFeedback * (* process_update) (MetaKmsImplDevice *impl_device,
                                         MetaKmsUpdate     *update,
                                         MetaKmsUpdateFlag  flags);
+  void (* disable) (MetaKmsImplDevice *impl_device);
   void (* handle_page_flip_callback) (MetaKmsImplDevice   *impl_device,
                                       MetaKmsPageFlipData *page_flip_data);
   void (* discard_pending_page_flips) (MetaKmsImplDevice *impl_device);
@@ -124,6 +125,8 @@ const char * meta_kms_impl_device_get_path (MetaKmsImplDevice *impl_device);
 gboolean meta_kms_impl_device_dispatch (MetaKmsImplDevice  *impl_device,
                                         GError            **error);
 
+void meta_kms_impl_device_disable (MetaKmsImplDevice *impl_device);
+
 drmModePropertyPtr meta_kms_impl_device_find_property (MetaKmsImplDevice       *impl_device,
                                                        drmModeObjectProperties *props,
                                                        const char              *prop_name,
diff --git a/src/backends/native/meta-kms-update-private.h b/src/backends/native/meta-kms-update-private.h
index b7a0753857..a613cbc5d6 100644
--- a/src/backends/native/meta-kms-update-private.h
+++ b/src/backends/native/meta-kms-update-private.h
@@ -160,9 +160,6 @@ GList * meta_kms_update_get_connector_updates (MetaKmsUpdate *update);
 META_EXPORT_TEST
 GList * meta_kms_update_get_crtc_gammas (MetaKmsUpdate *update);
 
-META_EXPORT_TEST
-gboolean meta_kms_update_is_power_save (MetaKmsUpdate *update);
-
 MetaKmsCustomPageFlip * meta_kms_update_take_custom_page_flip_func (MetaKmsUpdate *update);
 
 void meta_kms_update_drop_plane_assignment (MetaKmsUpdate *update,
diff --git a/src/backends/native/meta-kms-update.c b/src/backends/native/meta-kms-update.c
index d3a6b85a29..53fc92eb86 100644
--- a/src/backends/native/meta-kms-update.c
+++ b/src/backends/native/meta-kms-update.c
@@ -35,8 +35,6 @@ struct _MetaKmsUpdate
   gboolean is_locked;
   uint64_t sequence_number;
 
-  gboolean power_save;
-
   GList *mode_sets;
   GList *plane_assignments;
   GList *connector_updates;
@@ -214,7 +212,6 @@ meta_kms_update_assign_plane (MetaKmsUpdate          *update,
 
   g_assert (!meta_kms_update_is_locked (update));
   g_assert (meta_kms_crtc_get_device (crtc) == update->device);
-  g_assert (!update->power_save);
   g_assert (meta_kms_plane_get_device (plane) == update->device);
   g_assert (meta_kms_plane_get_plane_type (plane) !=
             META_KMS_PLANE_TYPE_PRIMARY ||
@@ -253,7 +250,6 @@ meta_kms_update_unassign_plane (MetaKmsUpdate *update,
   g_assert (!meta_kms_update_is_locked (update));
   g_assert (meta_kms_crtc_get_device (crtc) == update->device);
   g_assert (meta_kms_plane_get_device (plane) == update->device);
-  g_assert (!update->power_save);
 
   plane_assignment = g_new0 (MetaKmsPlaneAssignment, 1);
   *plane_assignment = (MetaKmsPlaneAssignment) {
@@ -279,7 +275,6 @@ meta_kms_update_mode_set (MetaKmsUpdate *update,
 
   g_assert (!meta_kms_update_is_locked (update));
   g_assert (meta_kms_crtc_get_device (crtc) == update->device);
-  g_assert (!update->power_save);
 
   mode_set = g_new0 (MetaKmsModeSet, 1);
   *mode_set = (MetaKmsModeSet) {
@@ -325,7 +320,6 @@ meta_kms_update_set_underscanning (MetaKmsUpdate    *update,
 
   g_assert (!meta_kms_update_is_locked (update));
   g_assert (meta_kms_connector_get_device (connector) == update->device);
-  g_assert (!update->power_save);
 
   connector_update = ensure_connector_update (update, connector);
   connector_update->underscanning.has_update = TRUE;
@@ -342,7 +336,6 @@ meta_kms_update_unset_underscanning (MetaKmsUpdate    *update,
 
   g_assert (!meta_kms_update_is_locked (update));
   g_assert (meta_kms_connector_get_device (connector) == update->device);
-  g_assert (!update->power_save);
 
   connector_update = ensure_connector_update (update, connector);
   connector_update->underscanning.has_update = TRUE;
@@ -357,25 +350,12 @@ meta_kms_update_set_privacy_screen (MetaKmsUpdate    *update,
   MetaKmsConnectorUpdate *connector_update;
 
   g_assert (meta_kms_connector_get_device (connector) == update->device);
-  g_assert (!update->power_save);
 
   connector_update = ensure_connector_update (update, connector);
   connector_update->privacy_screen.has_update = TRUE;
   connector_update->privacy_screen.is_enabled = enabled;
 }
 
-void
-meta_kms_update_set_power_save (MetaKmsUpdate *update)
-{
-  g_assert (!meta_kms_update_is_locked (update));
-  g_assert (!update->mode_sets);
-  g_assert (!update->plane_assignments);
-  g_assert (!update->connector_updates);
-  g_assert (!update->crtc_gammas);
-
-  update->power_save = TRUE;
-}
-
 void
 meta_kms_crtc_gamma_free (MetaKmsCrtcGamma *gamma)
 {
@@ -418,7 +398,6 @@ meta_kms_update_set_crtc_gamma (MetaKmsUpdate  *update,
 
   g_assert (!meta_kms_update_is_locked (update));
   g_assert (meta_kms_crtc_get_device (crtc) == update->device);
-  g_assert (!update->power_save);
 
   gamma = meta_kms_crtc_gamma_new (crtc, size, red, green, blue);
 
@@ -481,7 +460,6 @@ meta_kms_update_set_custom_page_flip (MetaKmsUpdate             *update,
   MetaKmsCustomPageFlip *custom_page_flip;
 
   g_assert (!meta_kms_update_is_locked (update));
-  g_assert (!update->power_save);
 
   custom_page_flip = g_new0 (MetaKmsCustomPageFlip, 1);
   custom_page_flip->func = func;
@@ -663,12 +641,6 @@ meta_kms_update_get_crtc_gammas (MetaKmsUpdate *update)
   return update->crtc_gammas;
 }
 
-gboolean
-meta_kms_update_is_power_save (MetaKmsUpdate *update)
-{
-  return update->power_save;
-}
-
 void
 meta_kms_update_lock (MetaKmsUpdate *update)
 {
diff --git a/src/backends/native/meta-monitor-manager-native.c 
b/src/backends/native/meta-monitor-manager-native.c
index 0fa4b02e0e..6f161e1e4c 100644
--- a/src/backends/native/meta-monitor-manager-native.c
+++ b/src/backends/native/meta-monitor-manager-native.c
@@ -52,8 +52,6 @@
 #include "backends/native/meta-crtc-kms.h"
 #include "backends/native/meta-gpu-kms.h"
 #include "backends/native/meta-kms-device.h"
-#include "backends/native/meta-kms-types.h"
-#include "backends/native/meta-kms-update.h"
 #include "backends/native/meta-kms.h"
 #include "backends/native/meta-launcher.h"
 #include "backends/native/meta-output-kms.h"
@@ -150,8 +148,6 @@ meta_monitor_manager_native_set_power_save_mode (MetaMonitorManager *manager,
                                                  MetaPowerSave       mode)
 {
   MetaBackend *backend = meta_monitor_manager_get_backend (manager);
-  MetaBackendNative *backend_native = META_BACKEND_NATIVE (backend);
-  MetaKms *kms = meta_backend_native_get_kms (backend_native);
   GList *l;
 
   for (l = meta_backend_get_gpus (backend); l; l = l->next)
@@ -172,24 +168,7 @@ meta_monitor_manager_native_set_power_save_mode (MetaMonitorManager *manager,
         case META_POWER_SAVE_SUSPEND:
         case META_POWER_SAVE_OFF:
           {
-            MetaKmsDevice *kms_device = meta_gpu_kms_get_kms_device (gpu_kms);
-            MetaKmsUpdate *kms_update;
-            MetaKmsUpdateFlag flags;
-            g_autoptr (MetaKmsFeedback) kms_feedback = NULL;
-
-            kms_update = meta_kms_ensure_pending_update (kms, kms_device);
-            meta_kms_update_set_power_save (kms_update);
-
-            flags = META_KMS_UPDATE_FLAG_NONE;
-            kms_feedback = meta_kms_post_pending_update_sync (kms,
-                                                              kms_device,
-                                                              flags);
-            if (meta_kms_feedback_get_result (kms_feedback) !=
-                META_KMS_FEEDBACK_PASSED)
-              {
-                g_warning ("Failed to enter power saving mode: %s",
-                           meta_kms_feedback_get_error (kms_feedback)->message);
-              }
+            meta_kms_device_disable (meta_gpu_kms_get_kms_device (gpu_kms));
             break;
           }
         }
diff --git a/src/tests/native-kms-device.c b/src/tests/native-kms-device.c
index 6e1c1f5f57..0eb85b7085 100644
--- a/src/tests/native-kms-device.c
+++ b/src/tests/native-kms-device.c
@@ -369,11 +369,7 @@ meta_test_kms_device_power_save (void)
    * Enable power saving mode.
    */
 
-  update = meta_kms_update_new (device);
-  meta_kms_update_set_power_save (update);
-  meta_kms_device_process_update_sync (device, update,
-                                       META_KMS_UPDATE_FLAG_NONE);
-  meta_kms_update_free (update);
+  meta_kms_device_disable (device);
 
   g_assert_false (meta_kms_crtc_is_active (crtc));
   crtc_state = meta_kms_crtc_get_current_state (crtc);
diff --git a/src/tests/native-kms-updates.c b/src/tests/native-kms-updates.c
index 7aa77ce025..6e7de6480e 100644
--- a/src/tests/native-kms-updates.c
+++ b/src/tests/native-kms-updates.c
@@ -44,7 +44,6 @@ meta_test_kms_update_sanity (void)
   update = meta_kms_update_new (device);
   g_assert (meta_kms_update_get_device (update) == device);
   g_assert_false (meta_kms_update_is_locked (update));
-  g_assert_false (meta_kms_update_is_power_save (update));
   g_assert_null (meta_kms_update_get_primary_plane_assignment (update, crtc));
   g_assert_null (meta_kms_update_get_plane_assignments (update));
   g_assert_null (meta_kms_update_get_mode_sets (update));


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]