|
@@ -1000,26 +1000,25 @@ void drm_encoder_cleanup(struct drm_encoder *encoder)
|
|
|
EXPORT_SYMBOL(drm_encoder_cleanup);
|
|
|
|
|
|
/**
|
|
|
- * drm_plane_init - Initialise a new plane object
|
|
|
+ * drm_universal_plane_init - Initialize a new universal plane object
|
|
|
* @dev: DRM device
|
|
|
* @plane: plane object to init
|
|
|
* @possible_crtcs: bitmask of possible CRTCs
|
|
|
* @funcs: callbacks for the new plane
|
|
|
* @formats: array of supported formats (%DRM_FORMAT_*)
|
|
|
* @format_count: number of elements in @formats
|
|
|
- * @priv: plane is private (hidden from userspace)?
|
|
|
+ * @type: type of plane (overlay, primary, cursor)
|
|
|
*
|
|
|
- * Inits a preallocate plane object created as base part of a driver plane
|
|
|
- * object.
|
|
|
+ * Initializes a plane object of type @type.
|
|
|
*
|
|
|
* Returns:
|
|
|
* Zero on success, error code on failure.
|
|
|
*/
|
|
|
-int drm_plane_init(struct drm_device *dev, struct drm_plane *plane,
|
|
|
- unsigned long possible_crtcs,
|
|
|
- const struct drm_plane_funcs *funcs,
|
|
|
- const uint32_t *formats, uint32_t format_count,
|
|
|
- bool priv)
|
|
|
+int drm_universal_plane_init(struct drm_device *dev, struct drm_plane *plane,
|
|
|
+ unsigned long possible_crtcs,
|
|
|
+ const struct drm_plane_funcs *funcs,
|
|
|
+ const uint32_t *formats, uint32_t format_count,
|
|
|
+ enum drm_plane_type type)
|
|
|
{
|
|
|
int ret;
|
|
|
|
|
@@ -1044,26 +1043,49 @@ int drm_plane_init(struct drm_device *dev, struct drm_plane *plane,
|
|
|
memcpy(plane->format_types, formats, format_count * sizeof(uint32_t));
|
|
|
plane->format_count = format_count;
|
|
|
plane->possible_crtcs = possible_crtcs;
|
|
|
- plane->type = DRM_PLANE_TYPE_OVERLAY;
|
|
|
+ plane->type = type;
|
|
|
|
|
|
- /* private planes are not exposed to userspace, but depending on
|
|
|
- * display hardware, might be convenient to allow sharing programming
|
|
|
- * for the scanout engine with the crtc implementation.
|
|
|
- */
|
|
|
- if (!priv) {
|
|
|
- list_add_tail(&plane->head, &dev->mode_config.plane_list);
|
|
|
- dev->mode_config.num_total_plane++;
|
|
|
- if (plane->type == DRM_PLANE_TYPE_OVERLAY)
|
|
|
- dev->mode_config.num_overlay_plane++;
|
|
|
- } else {
|
|
|
- INIT_LIST_HEAD(&plane->head);
|
|
|
- }
|
|
|
+ list_add_tail(&plane->head, &dev->mode_config.plane_list);
|
|
|
+ dev->mode_config.num_total_plane++;
|
|
|
+ if (plane->type == DRM_PLANE_TYPE_OVERLAY)
|
|
|
+ dev->mode_config.num_overlay_plane++;
|
|
|
|
|
|
out:
|
|
|
drm_modeset_unlock_all(dev);
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
|
+EXPORT_SYMBOL(drm_universal_plane_init);
|
|
|
+
|
|
|
+/**
|
|
|
+ * drm_plane_init - Initialize a legacy plane
|
|
|
+ * @dev: DRM device
|
|
|
+ * @plane: plane object to init
|
|
|
+ * @possible_crtcs: bitmask of possible CRTCs
|
|
|
+ * @funcs: callbacks for the new plane
|
|
|
+ * @formats: array of supported formats (%DRM_FORMAT_*)
|
|
|
+ * @format_count: number of elements in @formats
|
|
|
+ * @is_primary: plane type (primary vs overlay)
|
|
|
+ *
|
|
|
+ * Legacy API to initialize a DRM plane.
|
|
|
+ *
|
|
|
+ * New drivers should call drm_universal_plane_init() instead.
|
|
|
+ *
|
|
|
+ * Returns:
|
|
|
+ * Zero on success, error code on failure.
|
|
|
+ */
|
|
|
+int drm_plane_init(struct drm_device *dev, struct drm_plane *plane,
|
|
|
+ unsigned long possible_crtcs,
|
|
|
+ const struct drm_plane_funcs *funcs,
|
|
|
+ const uint32_t *formats, uint32_t format_count,
|
|
|
+ bool is_primary)
|
|
|
+{
|
|
|
+ enum drm_plane_type type;
|
|
|
+
|
|
|
+ type = is_primary ? DRM_PLANE_TYPE_PRIMARY : DRM_PLANE_TYPE_OVERLAY;
|
|
|
+ return drm_universal_plane_init(dev, plane, possible_crtcs, funcs,
|
|
|
+ formats, format_count, type);
|
|
|
+}
|
|
|
EXPORT_SYMBOL(drm_plane_init);
|
|
|
|
|
|
/**
|
|
@@ -1081,13 +1103,13 @@ void drm_plane_cleanup(struct drm_plane *plane)
|
|
|
drm_modeset_lock_all(dev);
|
|
|
kfree(plane->format_types);
|
|
|
drm_mode_object_put(dev, &plane->base);
|
|
|
- /* if not added to a list, it must be a private plane */
|
|
|
- if (!list_empty(&plane->head)) {
|
|
|
- list_del(&plane->head);
|
|
|
- dev->mode_config.num_total_plane--;
|
|
|
- if (plane->type == DRM_PLANE_TYPE_OVERLAY)
|
|
|
- dev->mode_config.num_overlay_plane--;
|
|
|
- }
|
|
|
+
|
|
|
+ BUG_ON(list_empty(&plane->head));
|
|
|
+
|
|
|
+ list_del(&plane->head);
|
|
|
+ dev->mode_config.num_total_plane--;
|
|
|
+ if (plane->type == DRM_PLANE_TYPE_OVERLAY)
|
|
|
+ dev->mode_config.num_overlay_plane--;
|
|
|
drm_modeset_unlock_all(dev);
|
|
|
}
|
|
|
EXPORT_SYMBOL(drm_plane_cleanup);
|