Lines Matching refs:plane

77 static int create_in_format_blob(struct drm_device *dev, struct drm_plane *plane)  in create_in_format_blob()  argument
86 formats_size = sizeof(__u32) * plane->format_count; in create_in_format_blob()
93 sizeof(struct drm_format_modifier) * plane->modifier_count; in create_in_format_blob()
109 blob_data->count_formats = plane->format_count; in create_in_format_blob()
111 blob_data->count_modifiers = plane->modifier_count; in create_in_format_blob()
116 memcpy(formats_ptr(blob_data), plane->format_types, formats_size); in create_in_format_blob()
119 if (!plane->funcs->format_mod_supported) in create_in_format_blob()
123 for (i = 0; i < plane->modifier_count; i++) { in create_in_format_blob()
124 for (j = 0; j < plane->format_count; j++) { in create_in_format_blob()
125 if (plane->funcs->format_mod_supported(plane, in create_in_format_blob()
126 plane->format_types[j], in create_in_format_blob()
127 plane->modifiers[i])) { in create_in_format_blob()
133 mod->modifier = plane->modifiers[i]; in create_in_format_blob()
140 drm_object_attach_property(&plane->base, config->modifiers_property, in create_in_format_blob()
164 int drm_universal_plane_init(struct drm_device *dev, struct drm_plane *plane, in drm_universal_plane_init() argument
184 ret = drm_mode_object_add(dev, &plane->base, DRM_MODE_OBJECT_PLANE); in drm_universal_plane_init()
188 drm_modeset_lock_init(&plane->mutex); in drm_universal_plane_init()
190 plane->base.properties = &plane->properties; in drm_universal_plane_init()
191 plane->dev = dev; in drm_universal_plane_init()
192 plane->funcs = funcs; in drm_universal_plane_init()
193 plane->format_types = kmalloc_array(format_count, sizeof(uint32_t), in drm_universal_plane_init()
195 if (!plane->format_types) { in drm_universal_plane_init()
197 drm_mode_object_unregister(dev, &plane->base); in drm_universal_plane_init()
214 plane->modifier_count = format_modifier_count; in drm_universal_plane_init()
215 plane->modifiers = kmalloc_array(format_modifier_count, in drm_universal_plane_init()
219 if (format_modifier_count && !plane->modifiers) { in drm_universal_plane_init()
221 kfree(plane->format_types); in drm_universal_plane_init()
222 drm_mode_object_unregister(dev, &plane->base); in drm_universal_plane_init()
230 plane->name = kvasprintf(GFP_KERNEL, name, ap); in drm_universal_plane_init()
233 plane->name = kasprintf(GFP_KERNEL, "plane-%d", in drm_universal_plane_init()
236 if (!plane->name) { in drm_universal_plane_init()
237 kfree(plane->format_types); in drm_universal_plane_init()
238 kfree(plane->modifiers); in drm_universal_plane_init()
239 drm_mode_object_unregister(dev, &plane->base); in drm_universal_plane_init()
243 memcpy(plane->format_types, formats, format_count * sizeof(uint32_t)); in drm_universal_plane_init()
244 plane->format_count = format_count; in drm_universal_plane_init()
245 memcpy(plane->modifiers, format_modifiers, in drm_universal_plane_init()
247 plane->possible_crtcs = possible_crtcs; in drm_universal_plane_init()
248 plane->type = type; in drm_universal_plane_init()
250 list_add_tail(&plane->head, &config->plane_list); in drm_universal_plane_init()
251 plane->index = config->num_total_plane++; in drm_universal_plane_init()
253 drm_object_attach_property(&plane->base, in drm_universal_plane_init()
255 plane->type); in drm_universal_plane_init()
258 drm_object_attach_property(&plane->base, config->prop_fb_id, 0); in drm_universal_plane_init()
259 drm_object_attach_property(&plane->base, config->prop_in_fence_fd, -1); in drm_universal_plane_init()
260 drm_object_attach_property(&plane->base, config->prop_crtc_id, 0); in drm_universal_plane_init()
261 drm_object_attach_property(&plane->base, config->prop_crtc_x, 0); in drm_universal_plane_init()
262 drm_object_attach_property(&plane->base, config->prop_crtc_y, 0); in drm_universal_plane_init()
263 drm_object_attach_property(&plane->base, config->prop_crtc_w, 0); in drm_universal_plane_init()
264 drm_object_attach_property(&plane->base, config->prop_crtc_h, 0); in drm_universal_plane_init()
265 drm_object_attach_property(&plane->base, config->prop_src_x, 0); in drm_universal_plane_init()
266 drm_object_attach_property(&plane->base, config->prop_src_y, 0); in drm_universal_plane_init()
267 drm_object_attach_property(&plane->base, config->prop_src_w, 0); in drm_universal_plane_init()
268 drm_object_attach_property(&plane->base, config->prop_src_h, 0); in drm_universal_plane_init()
272 create_in_format_blob(dev, plane); in drm_universal_plane_init()
280 struct drm_plane *plane; in drm_plane_register_all() local
283 drm_for_each_plane(plane, dev) { in drm_plane_register_all()
284 if (plane->funcs->late_register) in drm_plane_register_all()
285 ret = plane->funcs->late_register(plane); in drm_plane_register_all()
295 struct drm_plane *plane; in drm_plane_unregister_all() local
297 drm_for_each_plane(plane, dev) { in drm_plane_unregister_all()
298 if (plane->funcs->early_unregister) in drm_plane_unregister_all()
299 plane->funcs->early_unregister(plane); in drm_plane_unregister_all()
320 int drm_plane_init(struct drm_device *dev, struct drm_plane *plane, in drm_plane_init() argument
329 return drm_universal_plane_init(dev, plane, possible_crtcs, funcs, in drm_plane_init()
343 void drm_plane_cleanup(struct drm_plane *plane) in drm_plane_cleanup() argument
345 struct drm_device *dev = plane->dev; in drm_plane_cleanup()
347 drm_modeset_lock_fini(&plane->mutex); in drm_plane_cleanup()
349 kfree(plane->format_types); in drm_plane_cleanup()
350 kfree(plane->modifiers); in drm_plane_cleanup()
351 drm_mode_object_unregister(dev, &plane->base); in drm_plane_cleanup()
353 BUG_ON(list_empty(&plane->head)); in drm_plane_cleanup()
360 list_del(&plane->head); in drm_plane_cleanup()
363 WARN_ON(plane->state && !plane->funcs->atomic_destroy_state); in drm_plane_cleanup()
364 if (plane->state && plane->funcs->atomic_destroy_state) in drm_plane_cleanup()
365 plane->funcs->atomic_destroy_state(plane, plane->state); in drm_plane_cleanup()
367 kfree(plane->name); in drm_plane_cleanup()
369 memset(plane, 0, sizeof(*plane)); in drm_plane_cleanup()
384 struct drm_plane *plane; in drm_plane_from_index() local
386 drm_for_each_plane(plane, dev) in drm_plane_from_index()
387 if (idx == plane->index) in drm_plane_from_index()
388 return plane; in drm_plane_from_index()
409 void drm_plane_force_disable(struct drm_plane *plane) in drm_plane_force_disable() argument
413 if (!plane->fb) in drm_plane_force_disable()
416 WARN_ON(drm_drv_uses_atomic_modeset(plane->dev)); in drm_plane_force_disable()
418 plane->old_fb = plane->fb; in drm_plane_force_disable()
419 ret = plane->funcs->disable_plane(plane, NULL); in drm_plane_force_disable()
422 plane->old_fb = NULL; in drm_plane_force_disable()
426 drm_framebuffer_put(plane->old_fb); in drm_plane_force_disable()
427 plane->old_fb = NULL; in drm_plane_force_disable()
428 plane->fb = NULL; in drm_plane_force_disable()
429 plane->crtc = NULL; in drm_plane_force_disable()
446 int drm_mode_plane_set_obj_prop(struct drm_plane *plane, in drm_mode_plane_set_obj_prop() argument
451 struct drm_mode_object *obj = &plane->base; in drm_mode_plane_set_obj_prop()
453 if (plane->funcs->set_property) in drm_mode_plane_set_obj_prop()
454 ret = plane->funcs->set_property(plane, property, value); in drm_mode_plane_set_obj_prop()
467 struct drm_plane *plane; in drm_mode_getplane_res() local
481 drm_for_each_plane(plane, dev) { in drm_mode_getplane_res()
486 if (plane->type != DRM_PLANE_TYPE_OVERLAY && in drm_mode_getplane_res()
490 if (drm_lease_held(file_priv, plane->base.id)) { in drm_mode_getplane_res()
492 put_user(plane->base.id, plane_ptr + count)) in drm_mode_getplane_res()
506 struct drm_plane *plane; in drm_mode_getplane() local
512 plane = drm_plane_find(dev, file_priv, plane_resp->plane_id); in drm_mode_getplane()
513 if (!plane) in drm_mode_getplane()
516 drm_modeset_lock(&plane->mutex, NULL); in drm_mode_getplane()
517 if (plane->state && plane->state->crtc && drm_lease_held(file_priv, plane->state->crtc->base.id)) in drm_mode_getplane()
518 plane_resp->crtc_id = plane->state->crtc->base.id; in drm_mode_getplane()
519 else if (!plane->state && plane->crtc && drm_lease_held(file_priv, plane->crtc->base.id)) in drm_mode_getplane()
520 plane_resp->crtc_id = plane->crtc->base.id; in drm_mode_getplane()
524 if (plane->state && plane->state->fb) in drm_mode_getplane()
525 plane_resp->fb_id = plane->state->fb->base.id; in drm_mode_getplane()
526 else if (!plane->state && plane->fb) in drm_mode_getplane()
527 plane_resp->fb_id = plane->fb->base.id; in drm_mode_getplane()
530 drm_modeset_unlock(&plane->mutex); in drm_mode_getplane()
532 plane_resp->plane_id = plane->base.id; in drm_mode_getplane()
534 plane->possible_crtcs); in drm_mode_getplane()
542 if (plane->format_count && in drm_mode_getplane()
543 (plane_resp->count_format_types >= plane->format_count)) { in drm_mode_getplane()
546 plane->format_types, in drm_mode_getplane()
547 sizeof(uint32_t) * plane->format_count)) { in drm_mode_getplane()
551 plane_resp->count_format_types = plane->format_count; in drm_mode_getplane()
556 int drm_plane_check_pixel_format(struct drm_plane *plane, in drm_plane_check_pixel_format() argument
561 for (i = 0; i < plane->format_count; i++) { in drm_plane_check_pixel_format()
562 if (format == plane->format_types[i]) in drm_plane_check_pixel_format()
565 if (i == plane->format_count) in drm_plane_check_pixel_format()
568 if (plane->funcs->format_mod_supported) { in drm_plane_check_pixel_format()
569 if (!plane->funcs->format_mod_supported(plane, format, modifier)) in drm_plane_check_pixel_format()
572 if (!plane->modifier_count) in drm_plane_check_pixel_format()
575 for (i = 0; i < plane->modifier_count; i++) { in drm_plane_check_pixel_format()
576 if (modifier == plane->modifiers[i]) in drm_plane_check_pixel_format()
579 if (i == plane->modifier_count) in drm_plane_check_pixel_format()
586 static int __setplane_check(struct drm_plane *plane, in __setplane_check() argument
597 if (!(plane->possible_crtcs & drm_crtc_mask(crtc))) { in __setplane_check()
603 ret = drm_plane_check_pixel_format(plane, fb->format->format, in __setplane_check()
640 static int __setplane_internal(struct drm_plane *plane, in __setplane_internal() argument
652 WARN_ON(drm_drv_uses_atomic_modeset(plane->dev)); in __setplane_internal()
656 plane->old_fb = plane->fb; in __setplane_internal()
657 ret = plane->funcs->disable_plane(plane, ctx); in __setplane_internal()
659 plane->crtc = NULL; in __setplane_internal()
660 plane->fb = NULL; in __setplane_internal()
662 plane->old_fb = NULL; in __setplane_internal()
667 ret = __setplane_check(plane, crtc, fb, in __setplane_internal()
673 plane->old_fb = plane->fb; in __setplane_internal()
674 ret = plane->funcs->update_plane(plane, crtc, fb, in __setplane_internal()
678 plane->crtc = crtc; in __setplane_internal()
679 plane->fb = fb; in __setplane_internal()
680 drm_framebuffer_get(plane->fb); in __setplane_internal()
682 plane->old_fb = NULL; in __setplane_internal()
686 if (plane->old_fb) in __setplane_internal()
687 drm_framebuffer_put(plane->old_fb); in __setplane_internal()
688 plane->old_fb = NULL; in __setplane_internal()
693 static int __setplane_atomic(struct drm_plane *plane, in __setplane_atomic() argument
704 WARN_ON(!drm_drv_uses_atomic_modeset(plane->dev)); in __setplane_atomic()
708 return plane->funcs->disable_plane(plane, ctx); in __setplane_atomic()
717 ret = __setplane_check(plane, crtc, fb, in __setplane_atomic()
723 return plane->funcs->update_plane(plane, crtc, fb, in __setplane_atomic()
728 static int setplane_internal(struct drm_plane *plane, in setplane_internal() argument
742 ret = drm_modeset_lock_all_ctx(plane->dev, &ctx); in setplane_internal()
746 if (drm_drv_uses_atomic_modeset(plane->dev)) in setplane_internal()
747 ret = __setplane_atomic(plane, crtc, fb, in setplane_internal()
751 ret = __setplane_internal(plane, crtc, fb, in setplane_internal()
771 struct drm_plane *plane; in drm_mode_setplane() local
783 plane = drm_plane_find(dev, file_priv, plane_req->plane_id); in drm_mode_setplane()
784 if (!plane) { in drm_mode_setplane()
807 ret = setplane_internal(plane, crtc, fb, in drm_mode_setplane()
825 struct drm_plane *plane = crtc->cursor; in drm_mode_cursor_universal() local
839 BUG_ON(!plane); in drm_mode_cursor_universal()
840 WARN_ON(plane->crtc != crtc && plane->crtc != NULL); in drm_mode_cursor_universal()
861 if (plane->state) in drm_mode_cursor_universal()
862 fb = plane->state->fb; in drm_mode_cursor_universal()
864 fb = plane->fb; in drm_mode_cursor_universal()
886 ret = __setplane_atomic(plane, crtc, fb, in drm_mode_cursor_universal()
890 ret = __setplane_internal(plane, crtc, fb, in drm_mode_cursor_universal()
1011 struct drm_plane *plane; in drm_mode_page_flip_ioctl() local
1040 plane = crtc->primary; in drm_mode_page_flip_ioctl()
1086 ret = drm_modeset_lock(&plane->mutex, &ctx); in drm_mode_page_flip_ioctl()
1090 if (plane->state) in drm_mode_page_flip_ioctl()
1091 old_fb = plane->state->fb; in drm_mode_page_flip_ioctl()
1093 old_fb = plane->fb; in drm_mode_page_flip_ioctl()
1110 if (plane->state) { in drm_mode_page_flip_ioctl()
1111 const struct drm_plane_state *state = plane->state; in drm_mode_page_flip_ioctl()
1151 plane->old_fb = plane->fb; in drm_mode_page_flip_ioctl()
1164 plane->old_fb = NULL; in drm_mode_page_flip_ioctl()
1166 if (!plane->state) { in drm_mode_page_flip_ioctl()
1167 plane->fb = fb; in drm_mode_page_flip_ioctl()
1175 if (plane->old_fb) in drm_mode_page_flip_ioctl()
1176 drm_framebuffer_put(plane->old_fb); in drm_mode_page_flip_ioctl()
1177 plane->old_fb = NULL; in drm_mode_page_flip_ioctl()