|
@@ -692,9 +692,12 @@ void drm_framebuffer_remove(struct drm_framebuffer *fb)
|
|
|
EXPORT_SYMBOL(drm_framebuffer_remove);
|
|
|
|
|
|
/**
|
|
|
- * drm_crtc_init - Initialise a new CRTC object
|
|
|
+ * drm_crtc_init_with_planes - Initialise a new CRTC object with
|
|
|
+ * specified primary and cursor planes.
|
|
|
* @dev: DRM device
|
|
|
* @crtc: CRTC object to init
|
|
|
+ * @primary: Primary plane for CRTC
|
|
|
+ * @cursor: Cursor plane for CRTC
|
|
|
* @funcs: callbacks for the new CRTC
|
|
|
*
|
|
|
* Inits a new object created as base part of a driver crtc object.
|
|
@@ -702,8 +705,10 @@ EXPORT_SYMBOL(drm_framebuffer_remove);
|
|
|
* Returns:
|
|
|
* Zero on success, error code on failure.
|
|
|
*/
|
|
|
-int drm_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
|
|
|
- const struct drm_crtc_funcs *funcs)
|
|
|
+int drm_crtc_init_with_planes(struct drm_device *dev, struct drm_crtc *crtc,
|
|
|
+ struct drm_plane *primary,
|
|
|
+ void *cursor,
|
|
|
+ const struct drm_crtc_funcs *funcs)
|
|
|
{
|
|
|
int ret;
|
|
|
|
|
@@ -724,12 +729,16 @@ int drm_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
|
|
|
list_add_tail(&crtc->head, &dev->mode_config.crtc_list);
|
|
|
dev->mode_config.num_crtc++;
|
|
|
|
|
|
+ crtc->primary = primary;
|
|
|
+ if (primary)
|
|
|
+ primary->possible_crtcs = 1 << drm_crtc_index(crtc);
|
|
|
+
|
|
|
out:
|
|
|
drm_modeset_unlock_all(dev);
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
|
-EXPORT_SYMBOL(drm_crtc_init);
|
|
|
+EXPORT_SYMBOL(drm_crtc_init_with_planes);
|
|
|
|
|
|
/**
|
|
|
* drm_crtc_cleanup - Clean up the core crtc usage
|
|
@@ -2219,6 +2228,8 @@ int drm_mode_set_config_internal(struct drm_mode_set *set)
|
|
|
|
|
|
ret = crtc->funcs->set_config(set);
|
|
|
if (ret == 0) {
|
|
|
+ crtc->primary->crtc = crtc;
|
|
|
+
|
|
|
/* crtc->fb must be updated by ->set_config, enforces this. */
|
|
|
WARN_ON(fb != crtc->fb);
|
|
|
}
|