Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/client: Add drm_client_modeset_check()

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

v2:
- Fix docs (Sam)

Reviewed-by: Sam Ravnborg <sam@ravnborg.org>
Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20200509141619.32970-5-noralf@tronnes.org

+32 -4
+31 -4
drivers/gpu/drm/drm_client_modeset.c
··· 969 969 } 970 970 EXPORT_SYMBOL(drm_client_rotation); 971 971 972 - static int drm_client_modeset_commit_atomic(struct drm_client_dev *client, bool active) 972 + static int drm_client_modeset_commit_atomic(struct drm_client_dev *client, bool active, bool check) 973 973 { 974 974 struct drm_device *dev = client->dev; 975 975 struct drm_plane *plane; ··· 1036 1036 } 1037 1037 } 1038 1038 1039 - ret = drm_atomic_commit(state); 1039 + if (check) 1040 + ret = drm_atomic_check_only(state); 1041 + else 1042 + ret = drm_atomic_commit(state); 1040 1043 1041 1044 out_state: 1042 1045 if (ret == -EDEADLK) ··· 1101 1098 } 1102 1099 1103 1100 /** 1101 + * drm_client_modeset_check() - Check modeset configuration 1102 + * @client: DRM client 1103 + * 1104 + * Check modeset configuration. 1105 + * 1106 + * Returns: 1107 + * Zero on success or negative error code on failure. 1108 + */ 1109 + int drm_client_modeset_check(struct drm_client_dev *client) 1110 + { 1111 + int ret; 1112 + 1113 + if (!drm_drv_uses_atomic_modeset(client->dev)) 1114 + return 0; 1115 + 1116 + mutex_lock(&client->modeset_mutex); 1117 + ret = drm_client_modeset_commit_atomic(client, true, true); 1118 + mutex_unlock(&client->modeset_mutex); 1119 + 1120 + return ret; 1121 + } 1122 + EXPORT_SYMBOL(drm_client_modeset_check); 1123 + 1124 + /** 1104 1125 * drm_client_modeset_commit_locked() - Force commit CRTC configuration 1105 1126 * @client: DRM client 1106 1127 * ··· 1142 1115 1143 1116 mutex_lock(&client->modeset_mutex); 1144 1117 if (drm_drv_uses_atomic_modeset(dev)) 1145 - ret = drm_client_modeset_commit_atomic(client, true); 1118 + ret = drm_client_modeset_commit_atomic(client, true, false); 1146 1119 else 1147 1120 ret = drm_client_modeset_commit_legacy(client); 1148 1121 mutex_unlock(&client->modeset_mutex); ··· 1218 1191 1219 1192 mutex_lock(&client->modeset_mutex); 1220 1193 if (drm_drv_uses_atomic_modeset(dev)) 1221 - ret = drm_client_modeset_commit_atomic(client, mode == DRM_MODE_DPMS_ON); 1194 + ret = drm_client_modeset_commit_atomic(client, mode == DRM_MODE_DPMS_ON, false); 1222 1195 else 1223 1196 drm_client_modeset_dpms_legacy(client, mode); 1224 1197 mutex_unlock(&client->modeset_mutex);
+1
include/drm/drm_client.h
··· 162 162 void drm_client_modeset_free(struct drm_client_dev *client); 163 163 int drm_client_modeset_probe(struct drm_client_dev *client, unsigned int width, unsigned int height); 164 164 bool drm_client_rotation(struct drm_mode_set *modeset, unsigned int *rotation); 165 + int drm_client_modeset_check(struct drm_client_dev *client); 165 166 int drm_client_modeset_commit_locked(struct drm_client_dev *client); 166 167 int drm_client_modeset_commit(struct drm_client_dev *client); 167 168 int drm_client_modeset_dpms(struct drm_client_dev *client, int mode);