Commit dc415ff9 authored by Matt Roper's avatar Matt Roper Committed by Rob Clark

drm: Add drm_universal_plane_init()

Add a new plane initialization interface for universal plane support
that allows a specific plane type (primary, cursor, or overlay) to
be specified.

drm_plane_init() remains as a compatibility API to reduce churn in
existing drivers.  The 'bool priv' parameter has been changed to
'bool is_primary' under the assumption that all existing uses of
private planes were representing primary planes.
Signed-off-by: default avatarMatt Roper <matthew.d.roper@intel.com>
Reviewed-by: default avatarRob Clark <robdclark@gmail.com>
parent c103d1cf
...@@ -1000,26 +1000,25 @@ void drm_encoder_cleanup(struct drm_encoder *encoder) ...@@ -1000,26 +1000,25 @@ void drm_encoder_cleanup(struct drm_encoder *encoder)
EXPORT_SYMBOL(drm_encoder_cleanup); 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 * @dev: DRM device
* @plane: plane object to init * @plane: plane object to init
* @possible_crtcs: bitmask of possible CRTCs * @possible_crtcs: bitmask of possible CRTCs
* @funcs: callbacks for the new plane * @funcs: callbacks for the new plane
* @formats: array of supported formats (%DRM_FORMAT_*) * @formats: array of supported formats (%DRM_FORMAT_*)
* @format_count: number of elements in @formats * @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 * Initializes a plane object of type @type.
* object.
* *
* Returns: * Returns:
* Zero on success, error code on failure. * Zero on success, error code on failure.
*/ */
int drm_plane_init(struct drm_device *dev, struct drm_plane *plane, int drm_universal_plane_init(struct drm_device *dev, struct drm_plane *plane,
unsigned long possible_crtcs, unsigned long possible_crtcs,
const struct drm_plane_funcs *funcs, const struct drm_plane_funcs *funcs,
const uint32_t *formats, uint32_t format_count, const uint32_t *formats, uint32_t format_count,
bool priv) enum drm_plane_type type)
{ {
int ret; int ret;
...@@ -1044,26 +1043,49 @@ int drm_plane_init(struct drm_device *dev, struct drm_plane *plane, ...@@ -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)); memcpy(plane->format_types, formats, format_count * sizeof(uint32_t));
plane->format_count = format_count; plane->format_count = format_count;
plane->possible_crtcs = possible_crtcs; plane->possible_crtcs = possible_crtcs;
plane->type = DRM_PLANE_TYPE_OVERLAY; plane->type = type;
/* private planes are not exposed to userspace, but depending on list_add_tail(&plane->head, &dev->mode_config.plane_list);
* display hardware, might be convenient to allow sharing programming dev->mode_config.num_total_plane++;
* for the scanout engine with the crtc implementation. if (plane->type == DRM_PLANE_TYPE_OVERLAY)
*/ dev->mode_config.num_overlay_plane++;
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);
}
out: out:
drm_modeset_unlock_all(dev); drm_modeset_unlock_all(dev);
return ret; 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); EXPORT_SYMBOL(drm_plane_init);
/** /**
...@@ -1081,13 +1103,13 @@ void drm_plane_cleanup(struct drm_plane *plane) ...@@ -1081,13 +1103,13 @@ void drm_plane_cleanup(struct drm_plane *plane)
drm_modeset_lock_all(dev); drm_modeset_lock_all(dev);
kfree(plane->format_types); kfree(plane->format_types);
drm_mode_object_put(dev, &plane->base); drm_mode_object_put(dev, &plane->base);
/* if not added to a list, it must be a private plane */
if (!list_empty(&plane->head)) { BUG_ON(list_empty(&plane->head));
list_del(&plane->head);
dev->mode_config.num_total_plane--; list_del(&plane->head);
if (plane->type == DRM_PLANE_TYPE_OVERLAY) dev->mode_config.num_total_plane--;
dev->mode_config.num_overlay_plane--; if (plane->type == DRM_PLANE_TYPE_OVERLAY)
} dev->mode_config.num_overlay_plane--;
drm_modeset_unlock_all(dev); drm_modeset_unlock_all(dev);
} }
EXPORT_SYMBOL(drm_plane_cleanup); EXPORT_SYMBOL(drm_plane_cleanup);
......
...@@ -874,12 +874,19 @@ static inline bool drm_encoder_crtc_ok(struct drm_encoder *encoder, ...@@ -874,12 +874,19 @@ static inline bool drm_encoder_crtc_ok(struct drm_encoder *encoder,
return !!(encoder->possible_crtcs & drm_crtc_mask(crtc)); return !!(encoder->possible_crtcs & drm_crtc_mask(crtc));
} }
extern 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);
extern int drm_plane_init(struct drm_device *dev, extern int drm_plane_init(struct drm_device *dev,
struct drm_plane *plane, struct drm_plane *plane,
unsigned long possible_crtcs, unsigned long possible_crtcs,
const struct drm_plane_funcs *funcs, const struct drm_plane_funcs *funcs,
const uint32_t *formats, uint32_t format_count, const uint32_t *formats, uint32_t format_count,
bool priv); bool is_primary);
extern void drm_plane_cleanup(struct drm_plane *plane); extern void drm_plane_cleanup(struct drm_plane *plane);
extern void drm_plane_force_disable(struct drm_plane *plane); extern void drm_plane_force_disable(struct drm_plane *plane);
extern int drm_crtc_check_viewport(const struct drm_crtc *crtc, extern int drm_crtc_check_viewport(const struct drm_crtc *crtc,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment