Add a way for client to check the configuration before comitting.

v2:
- Fix docs (Sam)

Reviewed-by: Sam Ravnborg <s...@ravnborg.org>
Signed-off-by: Noralf Trønnes <nor...@tronnes.org>
---
 drivers/gpu/drm/drm_client_modeset.c | 35 ++++++++++++++++++++++++----
 include/drm/drm_client.h             |  1 +
 2 files changed, 32 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/drm_client_modeset.c 
b/drivers/gpu/drm/drm_client_modeset.c
index 7443114bd713..9d1ab69dd8d0 100644
--- a/drivers/gpu/drm/drm_client_modeset.c
+++ b/drivers/gpu/drm/drm_client_modeset.c
@@ -966,7 +966,7 @@ bool drm_client_rotation(struct drm_mode_set *modeset, 
unsigned int *rotation)
 }
 EXPORT_SYMBOL(drm_client_rotation);
 
-static int drm_client_modeset_commit_atomic(struct drm_client_dev *client, 
bool active)
+static int drm_client_modeset_commit_atomic(struct drm_client_dev *client, 
bool active, bool check)
 {
        struct drm_device *dev = client->dev;
        struct drm_plane *plane;
@@ -1033,7 +1033,10 @@ static int drm_client_modeset_commit_atomic(struct 
drm_client_dev *client, bool
                }
        }
 
-       ret = drm_atomic_commit(state);
+       if (check)
+               ret = drm_atomic_check_only(state);
+       else
+               ret = drm_atomic_commit(state);
 
 out_state:
        if (ret == -EDEADLK)
@@ -1094,6 +1097,30 @@ static int drm_client_modeset_commit_legacy(struct 
drm_client_dev *client)
        return ret;
 }
 
+/**
+ * drm_client_modeset_check() - Check modeset configuration
+ * @client: DRM client
+ *
+ * Check modeset configuration.
+ *
+ * Returns:
+ * Zero on success or negative error code on failure.
+ */
+int drm_client_modeset_check(struct drm_client_dev *client)
+{
+       int ret;
+
+       if (!drm_drv_uses_atomic_modeset(client->dev))
+               return 0;
+
+       mutex_lock(&client->modeset_mutex);
+       ret = drm_client_modeset_commit_atomic(client, true, true);
+       mutex_unlock(&client->modeset_mutex);
+
+       return ret;
+}
+EXPORT_SYMBOL(drm_client_modeset_check);
+
 /**
  * drm_client_modeset_commit_locked() - Force commit CRTC configuration
  * @client: DRM client
@@ -1112,7 +1139,7 @@ int drm_client_modeset_commit_locked(struct 
drm_client_dev *client)
 
        mutex_lock(&client->modeset_mutex);
        if (drm_drv_uses_atomic_modeset(dev))
-               ret = drm_client_modeset_commit_atomic(client, true);
+               ret = drm_client_modeset_commit_atomic(client, true, false);
        else
                ret = drm_client_modeset_commit_legacy(client);
        mutex_unlock(&client->modeset_mutex);
@@ -1188,7 +1215,7 @@ int drm_client_modeset_dpms(struct drm_client_dev 
*client, int mode)
 
        mutex_lock(&client->modeset_mutex);
        if (drm_drv_uses_atomic_modeset(dev))
-               ret = drm_client_modeset_commit_atomic(client, mode == 
DRM_MODE_DPMS_ON);
+               ret = drm_client_modeset_commit_atomic(client, mode == 
DRM_MODE_DPMS_ON, false);
        else
                drm_client_modeset_dpms_legacy(client, mode);
        mutex_unlock(&client->modeset_mutex);
diff --git a/include/drm/drm_client.h b/include/drm/drm_client.h
index 9737dd7b147f..76704f48fc46 100644
--- a/include/drm/drm_client.h
+++ b/include/drm/drm_client.h
@@ -164,6 +164,7 @@ int drm_client_modeset_create(struct drm_client_dev 
*client);
 void drm_client_modeset_free(struct drm_client_dev *client);
 int drm_client_modeset_probe(struct drm_client_dev *client, unsigned int 
width, unsigned int height);
 bool drm_client_rotation(struct drm_mode_set *modeset, unsigned int *rotation);
+int drm_client_modeset_check(struct drm_client_dev *client);
 int drm_client_modeset_commit_locked(struct drm_client_dev *client);
 int drm_client_modeset_commit(struct drm_client_dev *client);
 int drm_client_modeset_dpms(struct drm_client_dev *client, int mode);
-- 
2.23.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to