Lines Matching full:crtc
6 * DRM core CRTC related functions
58 * A CRTC represents the overall display pipeline. It receives pixel data from
60 * to the CRTC, specifying display timings. On the output side the data is fed
64 * To create a CRTC, a KMS driver allocates and zeroes an instance of
68 * The CRTC is also the entry point for legacy modeset operations (see
77 * drm_crtc_from_index - find the registered CRTC at an index
79 * @idx: index of registered CRTC to find for
81 * Given a CRTC index, return the registered CRTC from DRM device's
89 struct drm_crtc *crtc; in drm_crtc_from_index() local
91 drm_for_each_crtc(crtc, dev) in drm_crtc_from_index()
92 if (idx == crtc->index) in drm_crtc_from_index()
93 return crtc; in drm_crtc_from_index()
99 int drm_crtc_force_disable(struct drm_crtc *crtc) in drm_crtc_force_disable() argument
102 .crtc = crtc, in drm_crtc_force_disable()
105 WARN_ON(drm_drv_uses_atomic_modeset(crtc->dev)); in drm_crtc_force_disable()
112 struct drm_crtc *crtc; in drm_crtc_register_all() local
115 drm_for_each_crtc(crtc, dev) { in drm_crtc_register_all()
116 drm_debugfs_crtc_add(crtc); in drm_crtc_register_all()
118 if (crtc->funcs->late_register) in drm_crtc_register_all()
119 ret = crtc->funcs->late_register(crtc); in drm_crtc_register_all()
129 struct drm_crtc *crtc; in drm_crtc_unregister_all() local
131 drm_for_each_crtc(crtc, dev) { in drm_crtc_unregister_all()
132 if (crtc->funcs->early_unregister) in drm_crtc_unregister_all()
133 crtc->funcs->early_unregister(crtc); in drm_crtc_unregister_all()
134 drm_debugfs_crtc_remove(crtc); in drm_crtc_unregister_all()
138 static int drm_crtc_crc_init(struct drm_crtc *crtc) in drm_crtc_crc_init() argument
141 spin_lock_init(&crtc->crc.lock); in drm_crtc_crc_init()
142 init_waitqueue_head(&crtc->crc.wq); in drm_crtc_crc_init()
143 crtc->crc.source = kstrdup("auto", GFP_KERNEL); in drm_crtc_crc_init()
144 if (!crtc->crc.source) in drm_crtc_crc_init()
150 static void drm_crtc_crc_fini(struct drm_crtc *crtc) in drm_crtc_crc_fini() argument
153 kfree(crtc->crc.source); in drm_crtc_crc_fini()
167 struct drm_crtc *crtc = fence_to_crtc(fence); in drm_crtc_fence_get_driver_name() local
169 return crtc->dev->driver->name; in drm_crtc_fence_get_driver_name()
174 struct drm_crtc *crtc = fence_to_crtc(fence); in drm_crtc_fence_get_timeline_name() local
176 return crtc->timeline_name; in drm_crtc_fence_get_timeline_name()
184 struct dma_fence *drm_crtc_create_fence(struct drm_crtc *crtc) in drm_crtc_create_fence() argument
192 dma_fence_init(fence, &drm_crtc_fence_ops, &crtc->fence_lock, in drm_crtc_create_fence()
193 crtc->fence_context, ++crtc->fence_seqno); in drm_crtc_create_fence()
199 * DOC: standard CRTC properties
204 * Atomic property for setting the power state of the CRTC. When set to 1
205 * the CRTC will actively display content. When set to 0 the CRTC will be
206 * powered off. There is no expectation that user-space will reset CRTC
218 * Atomic property for setting the CRTC display timings. The value is the
219 * ID of a blob containing the DRM mode info. To disable the CRTC,
222 * Setting MODE_ID to 0 will release reserved resources for the CRTC.
224 * Atomic property for setting the scaling filter for CRTC scaler
235 static int __drm_crtc_init_with_planes(struct drm_device *dev, struct drm_crtc *crtc, in __drm_crtc_init_with_planes() argument
247 /* crtc index is used with 32bit bitmasks */ in __drm_crtc_init_with_planes()
255 crtc->dev = dev; in __drm_crtc_init_with_planes()
256 crtc->funcs = funcs; in __drm_crtc_init_with_planes()
258 INIT_LIST_HEAD(&crtc->commit_list); in __drm_crtc_init_with_planes()
259 spin_lock_init(&crtc->commit_lock); in __drm_crtc_init_with_planes()
261 drm_modeset_lock_init(&crtc->mutex); in __drm_crtc_init_with_planes()
262 ret = drm_mode_object_add(dev, &crtc->base, DRM_MODE_OBJECT_CRTC); in __drm_crtc_init_with_planes()
267 crtc->name = kvasprintf(GFP_KERNEL, name, ap); in __drm_crtc_init_with_planes()
269 crtc->name = kasprintf(GFP_KERNEL, "crtc-%d", config->num_crtc); in __drm_crtc_init_with_planes()
271 if (!crtc->name) { in __drm_crtc_init_with_planes()
272 drm_mode_object_unregister(dev, &crtc->base); in __drm_crtc_init_with_planes()
276 crtc->fence_context = dma_fence_context_alloc(1); in __drm_crtc_init_with_planes()
277 spin_lock_init(&crtc->fence_lock); in __drm_crtc_init_with_planes()
278 snprintf(crtc->timeline_name, sizeof(crtc->timeline_name), in __drm_crtc_init_with_planes()
279 "CRTC:%d-%s", crtc->base.id, crtc->name); in __drm_crtc_init_with_planes()
281 crtc->base.properties = &crtc->properties; in __drm_crtc_init_with_planes()
283 list_add_tail(&crtc->head, &config->crtc_list); in __drm_crtc_init_with_planes()
284 crtc->index = config->num_crtc++; in __drm_crtc_init_with_planes()
286 crtc->primary = primary; in __drm_crtc_init_with_planes()
287 crtc->cursor = cursor; in __drm_crtc_init_with_planes()
289 primary->possible_crtcs = drm_crtc_mask(crtc); in __drm_crtc_init_with_planes()
291 cursor->possible_crtcs = drm_crtc_mask(crtc); in __drm_crtc_init_with_planes()
293 ret = drm_crtc_crc_init(crtc); in __drm_crtc_init_with_planes()
295 drm_mode_object_unregister(dev, &crtc->base); in __drm_crtc_init_with_planes()
300 drm_object_attach_property(&crtc->base, config->prop_active, 0); in __drm_crtc_init_with_planes()
301 drm_object_attach_property(&crtc->base, config->prop_mode_id, 0); in __drm_crtc_init_with_planes()
302 drm_object_attach_property(&crtc->base, in __drm_crtc_init_with_planes()
304 drm_object_attach_property(&crtc->base, in __drm_crtc_init_with_planes()
312 * drm_crtc_init_with_planes - Initialise a new CRTC object with
315 * @crtc: CRTC object to init
316 * @primary: Primary plane for CRTC
317 * @cursor: Cursor plane for CRTC
318 * @funcs: callbacks for the new CRTC
319 * @name: printf style format string for the CRTC name, or NULL for default name
321 * Inits a new object created as base part of a driver crtc object. Drivers
327 * the crtc structure. The crtc structure should not be allocated with
341 int drm_crtc_init_with_planes(struct drm_device *dev, struct drm_crtc *crtc, in drm_crtc_init_with_planes() argument
353 ret = __drm_crtc_init_with_planes(dev, crtc, primary, cursor, funcs, in drm_crtc_init_with_planes()
364 struct drm_crtc *crtc = ptr; in drmm_crtc_init_with_planes_cleanup() local
366 drm_crtc_cleanup(crtc); in drmm_crtc_init_with_planes_cleanup()
371 struct drm_crtc *crtc, in __drmm_crtc_init_with_planes() argument
382 ret = __drm_crtc_init_with_planes(dev, crtc, primary, cursor, funcs, in __drmm_crtc_init_with_planes()
388 crtc); in __drmm_crtc_init_with_planes()
396 * drmm_crtc_init_with_planes - Initialise a new CRTC object with
399 * @crtc: CRTC object to init
400 * @primary: Primary plane for CRTC
401 * @cursor: Cursor plane for CRTC
402 * @funcs: callbacks for the new CRTC
403 * @name: printf style format string for the CRTC name, or NULL for default name
405 * Inits a new object created as base part of a driver crtc object. Drivers
412 * drmm_crtc_cleanup() with drmm_add_action(). The crtc structure should
423 int drmm_crtc_init_with_planes(struct drm_device *dev, struct drm_crtc *crtc, in drmm_crtc_init_with_planes() argument
433 ret = __drmm_crtc_init_with_planes(dev, crtc, primary, cursor, funcs, in drmm_crtc_init_with_planes()
451 struct drm_crtc *crtc; in __drmm_crtc_alloc_with_planes() local
462 crtc = container + offset; in __drmm_crtc_alloc_with_planes()
465 ret = __drmm_crtc_init_with_planes(dev, crtc, primary, cursor, funcs, in __drmm_crtc_alloc_with_planes()
476 * drm_crtc_cleanup - Clean up the core crtc usage
477 * @crtc: CRTC to cleanup
479 * This function cleans up @crtc and removes it from the DRM mode setting
480 * core. Note that the function does *not* free the crtc structure itself,
483 void drm_crtc_cleanup(struct drm_crtc *crtc) in drm_crtc_cleanup() argument
485 struct drm_device *dev = crtc->dev; in drm_crtc_cleanup()
492 drm_crtc_crc_fini(crtc); in drm_crtc_cleanup()
494 kfree(crtc->gamma_store); in drm_crtc_cleanup()
495 crtc->gamma_store = NULL; in drm_crtc_cleanup()
497 drm_modeset_lock_fini(&crtc->mutex); in drm_crtc_cleanup()
499 drm_mode_object_unregister(dev, &crtc->base); in drm_crtc_cleanup()
500 list_del(&crtc->head); in drm_crtc_cleanup()
503 WARN_ON(crtc->state && !crtc->funcs->atomic_destroy_state); in drm_crtc_cleanup()
504 if (crtc->state && crtc->funcs->atomic_destroy_state) in drm_crtc_cleanup()
505 crtc->funcs->atomic_destroy_state(crtc, crtc->state); in drm_crtc_cleanup()
507 kfree(crtc->name); in drm_crtc_cleanup()
509 memset(crtc, 0, sizeof(*crtc)); in drm_crtc_cleanup()
514 * drm_mode_getcrtc - get CRTC configuration
519 * Construct a CRTC configuration structure to return to the user.
530 struct drm_crtc *crtc; in drm_mode_getcrtc() local
536 crtc = drm_crtc_find(dev, file_priv, crtc_resp->crtc_id); in drm_mode_getcrtc()
537 if (!crtc) in drm_mode_getcrtc()
540 plane = crtc->primary; in drm_mode_getcrtc()
542 crtc_resp->gamma_size = crtc->gamma_size; in drm_mode_getcrtc()
558 drm_modeset_lock(&crtc->mutex, NULL); in drm_mode_getcrtc()
559 if (crtc->state) { in drm_mode_getcrtc()
560 if (crtc->state->enable) { in drm_mode_getcrtc()
561 drm_mode_convert_to_umode(&crtc_resp->mode, &crtc->state->mode); in drm_mode_getcrtc()
567 crtc_resp->x = crtc->x; in drm_mode_getcrtc()
568 crtc_resp->y = crtc->y; in drm_mode_getcrtc()
570 if (crtc->enabled) { in drm_mode_getcrtc()
571 drm_mode_convert_to_umode(&crtc_resp->mode, &crtc->mode); in drm_mode_getcrtc()
580 drm_modeset_unlock(&crtc->mutex); in drm_mode_getcrtc()
588 struct drm_crtc *crtc = set->crtc; in __drm_mode_set_config_internal() local
593 WARN_ON(drm_drv_uses_atomic_modeset(crtc->dev)); in __drm_mode_set_config_internal()
600 drm_for_each_crtc(tmp, crtc->dev) { in __drm_mode_set_config_internal()
608 ret = crtc->funcs->set_config(set, ctx); in __drm_mode_set_config_internal()
610 struct drm_plane *plane = crtc->primary; in __drm_mode_set_config_internal()
612 plane->crtc = fb ? crtc : NULL; in __drm_mode_set_config_internal()
616 drm_for_each_crtc(tmp, crtc->dev) { in __drm_mode_set_config_internal()
644 WARN_ON(drm_drv_uses_atomic_modeset(set->crtc->dev)); in drm_mode_set_config_internal()
652 * CRTC viewport
653 * @crtc: CRTC that framebuffer will be displayed on
659 int drm_crtc_check_viewport(const struct drm_crtc *crtc, in drm_crtc_check_viewport() argument
669 if (crtc->state && in drm_crtc_check_viewport()
670 drm_rotation_90_or_270(crtc->primary->state->rotation)) in drm_crtc_check_viewport()
680 * drm_mode_setcrtc - set CRTC configuration
685 * Build a new CRTC configuration based on user request.
697 struct drm_crtc *crtc; in drm_mode_setcrtc() local
717 crtc = drm_crtc_find(dev, file_priv, crtc_req->crtc_id); in drm_mode_setcrtc()
718 if (!crtc) { in drm_mode_setcrtc()
719 drm_dbg_kms(dev, "Unknown CRTC ID %d\n", crtc_req->crtc_id); in drm_mode_setcrtc()
722 drm_dbg_kms(dev, "[CRTC:%d:%s]\n", crtc->base.id, crtc->name); in drm_mode_setcrtc()
724 plane = crtc->primary; in drm_mode_setcrtc()
745 drm_dbg_kms(dev, "CRTC doesn't have current FB\n"); in drm_mode_setcrtc()
800 ret = drm_crtc_check_viewport(crtc, crtc_req->x, crtc_req->y, in drm_mode_setcrtc()
860 set.crtc = crtc; in drm_mode_setcrtc()
869 ret = crtc->funcs->set_config(&set, &ctx); in drm_mode_setcrtc()
902 struct drm_crtc *crtc = obj_to_crtc(obj); in drm_mode_crtc_set_obj_prop() local
904 if (crtc->funcs->set_property) in drm_mode_crtc_set_obj_prop()
905 ret = crtc->funcs->set_property(crtc, property, value); in drm_mode_crtc_set_obj_prop()
916 * @crtc: drm CRTC
921 * CRTC.
926 int drm_crtc_create_scaling_filter_property(struct drm_crtc *crtc, in drm_crtc_create_scaling_filter_property() argument
930 drm_create_scaling_filter_prop(crtc->dev, supported_filters); in drm_crtc_create_scaling_filter_property()
935 drm_object_attach_property(&crtc->base, prop, in drm_crtc_create_scaling_filter_property()
937 crtc->scaling_filter_property = prop; in drm_crtc_create_scaling_filter_property()