|
@@ -955,6 +955,45 @@ drm_atomic_add_affected_connectors(struct drm_atomic_state *state,
|
|
|
}
|
|
|
EXPORT_SYMBOL(drm_atomic_add_affected_connectors);
|
|
|
|
|
|
+/**
|
|
|
+ * drm_atomic_add_affected_planes - add planes for crtc
|
|
|
+ * @state: atomic state
|
|
|
+ * @crtc: DRM crtc
|
|
|
+ *
|
|
|
+ * This function walks the current configuration and adds all planes
|
|
|
+ * currently used by @crtc to the atomic configuration @state. This is useful
|
|
|
+ * when an atomic commit also needs to check all currently enabled plane on
|
|
|
+ * @crtc, e.g. when changing the mode. It's also useful when re-enabling a CRTC
|
|
|
+ * to avoid special code to force-enable all planes.
|
|
|
+ *
|
|
|
+ * Since acquiring a plane state will always also acquire the w/w mutex of the
|
|
|
+ * current CRTC for that plane (if there is any) adding all the plane states for
|
|
|
+ * a CRTC will not reduce parallism of atomic updates.
|
|
|
+ *
|
|
|
+ * Returns:
|
|
|
+ * 0 on success or can fail with -EDEADLK or -ENOMEM. When the error is EDEADLK
|
|
|
+ * then the w/w mutex code has detected a deadlock and the entire atomic
|
|
|
+ * sequence must be restarted. All other errors are fatal.
|
|
|
+ */
|
|
|
+int
|
|
|
+drm_atomic_add_affected_planes(struct drm_atomic_state *state,
|
|
|
+ struct drm_crtc *crtc)
|
|
|
+{
|
|
|
+ struct drm_plane *plane;
|
|
|
+
|
|
|
+ WARN_ON(!drm_atomic_get_existing_crtc_state(state, crtc));
|
|
|
+
|
|
|
+ drm_for_each_plane_mask(plane, state->dev, crtc->state->plane_mask) {
|
|
|
+ struct drm_plane_state *plane_state =
|
|
|
+ drm_atomic_get_plane_state(state, plane);
|
|
|
+
|
|
|
+ if (IS_ERR(plane_state))
|
|
|
+ return PTR_ERR(plane_state);
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(drm_atomic_add_affected_planes);
|
|
|
+
|
|
|
/**
|
|
|
* drm_atomic_connectors_for_crtc - count number of connected outputs
|
|
|
* @state: atomic state
|