Lines Matching +full:tv +full:- +full:set
38 #include <linux/dma-fence.h>
56 * drm_atomic_set_mode_for_crtc - set mode for CRTC
58 * @mode: kernel-internal mode to use for the CRTC, or NULL to disable
60 * Set a mode (originating from the kernel) on the desired CRTC state and update
64 * Zero on success, error code on failure. Cannot return -EDEADLK.
69 struct drm_crtc *crtc = state->crtc; in drm_atomic_set_mode_for_crtc()
73 if (mode && memcmp(&state->mode, mode, sizeof(*mode)) == 0) in drm_atomic_set_mode_for_crtc()
76 drm_property_blob_put(state->mode_blob); in drm_atomic_set_mode_for_crtc()
77 state->mode_blob = NULL; in drm_atomic_set_mode_for_crtc()
83 blob = drm_property_create_blob(crtc->dev, in drm_atomic_set_mode_for_crtc()
88 drm_mode_copy(&state->mode, mode); in drm_atomic_set_mode_for_crtc()
90 state->mode_blob = blob; in drm_atomic_set_mode_for_crtc()
91 state->enable = true; in drm_atomic_set_mode_for_crtc()
92 drm_dbg_atomic(crtc->dev, in drm_atomic_set_mode_for_crtc()
93 "Set [MODE:%s] for [CRTC:%d:%s] state %p\n", in drm_atomic_set_mode_for_crtc()
94 mode->name, crtc->base.id, crtc->name, state); in drm_atomic_set_mode_for_crtc()
96 memset(&state->mode, 0, sizeof(state->mode)); in drm_atomic_set_mode_for_crtc()
97 state->enable = false; in drm_atomic_set_mode_for_crtc()
98 drm_dbg_atomic(crtc->dev, in drm_atomic_set_mode_for_crtc()
99 "Set [NOMODE] for [CRTC:%d:%s] state %p\n", in drm_atomic_set_mode_for_crtc()
100 crtc->base.id, crtc->name, state); in drm_atomic_set_mode_for_crtc()
108 * drm_atomic_set_mode_prop_for_crtc - set mode for CRTC
112 * Set a mode (originating from a blob property) on the desired CRTC state.
115 * was set.
118 * Zero on success, error code on failure. Cannot return -EDEADLK.
123 struct drm_crtc *crtc = state->crtc; in drm_atomic_set_mode_prop_for_crtc()
125 if (blob == state->mode_blob) in drm_atomic_set_mode_prop_for_crtc()
128 drm_property_blob_put(state->mode_blob); in drm_atomic_set_mode_prop_for_crtc()
129 state->mode_blob = NULL; in drm_atomic_set_mode_prop_for_crtc()
131 memset(&state->mode, 0, sizeof(state->mode)); in drm_atomic_set_mode_prop_for_crtc()
136 if (blob->length != sizeof(struct drm_mode_modeinfo)) { in drm_atomic_set_mode_prop_for_crtc()
137 drm_dbg_atomic(crtc->dev, in drm_atomic_set_mode_prop_for_crtc()
139 crtc->base.id, crtc->name, in drm_atomic_set_mode_prop_for_crtc()
140 blob->length); in drm_atomic_set_mode_prop_for_crtc()
141 return -EINVAL; in drm_atomic_set_mode_prop_for_crtc()
144 ret = drm_mode_convert_umode(crtc->dev, in drm_atomic_set_mode_prop_for_crtc()
145 &state->mode, blob->data); in drm_atomic_set_mode_prop_for_crtc()
147 drm_dbg_atomic(crtc->dev, in drm_atomic_set_mode_prop_for_crtc()
149 crtc->base.id, crtc->name, in drm_atomic_set_mode_prop_for_crtc()
150 ret, drm_get_mode_status_name(state->mode.status)); in drm_atomic_set_mode_prop_for_crtc()
151 drm_mode_debug_printmodeline(&state->mode); in drm_atomic_set_mode_prop_for_crtc()
152 return -EINVAL; in drm_atomic_set_mode_prop_for_crtc()
155 state->mode_blob = drm_property_blob_get(blob); in drm_atomic_set_mode_prop_for_crtc()
156 state->enable = true; in drm_atomic_set_mode_prop_for_crtc()
157 drm_dbg_atomic(crtc->dev, in drm_atomic_set_mode_prop_for_crtc()
158 "Set [MODE:%s] for [CRTC:%d:%s] state %p\n", in drm_atomic_set_mode_prop_for_crtc()
159 state->mode.name, crtc->base.id, crtc->name, in drm_atomic_set_mode_prop_for_crtc()
162 state->enable = false; in drm_atomic_set_mode_prop_for_crtc()
163 drm_dbg_atomic(crtc->dev, in drm_atomic_set_mode_prop_for_crtc()
164 "Set [NOMODE] for [CRTC:%d:%s] state %p\n", in drm_atomic_set_mode_prop_for_crtc()
165 crtc->base.id, crtc->name, state); in drm_atomic_set_mode_prop_for_crtc()
173 * drm_atomic_set_crtc_for_plane - set CRTC for plane
182 * 0 on success or can fail with -EDEADLK or -ENOMEM. When the error is EDEADLK
190 struct drm_plane *plane = plane_state->plane; in drm_atomic_set_crtc_for_plane()
193 if (plane_state->crtc == crtc) in drm_atomic_set_crtc_for_plane()
195 if (plane_state->crtc) { in drm_atomic_set_crtc_for_plane()
196 crtc_state = drm_atomic_get_crtc_state(plane_state->state, in drm_atomic_set_crtc_for_plane()
197 plane_state->crtc); in drm_atomic_set_crtc_for_plane()
201 crtc_state->plane_mask &= ~drm_plane_mask(plane); in drm_atomic_set_crtc_for_plane()
204 plane_state->crtc = crtc; in drm_atomic_set_crtc_for_plane()
207 crtc_state = drm_atomic_get_crtc_state(plane_state->state, in drm_atomic_set_crtc_for_plane()
211 crtc_state->plane_mask |= drm_plane_mask(plane); in drm_atomic_set_crtc_for_plane()
215 drm_dbg_atomic(plane->dev, in drm_atomic_set_crtc_for_plane()
217 plane->base.id, plane->name, plane_state, in drm_atomic_set_crtc_for_plane()
218 crtc->base.id, crtc->name); in drm_atomic_set_crtc_for_plane()
220 drm_dbg_atomic(plane->dev, in drm_atomic_set_crtc_for_plane()
222 plane->base.id, plane->name, plane_state); in drm_atomic_set_crtc_for_plane()
229 * drm_atomic_set_fb_for_plane - set framebuffer for plane
242 struct drm_plane *plane = plane_state->plane; in drm_atomic_set_fb_for_plane()
245 drm_dbg_atomic(plane->dev, in drm_atomic_set_fb_for_plane()
246 "Set [FB:%d] for [PLANE:%d:%s] state %p\n", in drm_atomic_set_fb_for_plane()
247 fb->base.id, plane->base.id, plane->name, in drm_atomic_set_fb_for_plane()
250 drm_dbg_atomic(plane->dev, in drm_atomic_set_fb_for_plane()
251 "Set [NOFB] for [PLANE:%d:%s] state %p\n", in drm_atomic_set_fb_for_plane()
252 plane->base.id, plane->name, plane_state); in drm_atomic_set_fb_for_plane()
254 drm_framebuffer_assign(&plane_state->fb, fb); in drm_atomic_set_fb_for_plane()
259 * drm_atomic_set_crtc_for_connector - set CRTC for connector
268 * 0 on success or can fail with -EDEADLK or -ENOMEM. When the error is EDEADLK
276 struct drm_connector *connector = conn_state->connector; in drm_atomic_set_crtc_for_connector()
279 if (conn_state->crtc == crtc) in drm_atomic_set_crtc_for_connector()
282 if (conn_state->crtc) { in drm_atomic_set_crtc_for_connector()
283 crtc_state = drm_atomic_get_new_crtc_state(conn_state->state, in drm_atomic_set_crtc_for_connector()
284 conn_state->crtc); in drm_atomic_set_crtc_for_connector()
286 crtc_state->connector_mask &= in drm_atomic_set_crtc_for_connector()
287 ~drm_connector_mask(conn_state->connector); in drm_atomic_set_crtc_for_connector()
289 drm_connector_put(conn_state->connector); in drm_atomic_set_crtc_for_connector()
290 conn_state->crtc = NULL; in drm_atomic_set_crtc_for_connector()
294 crtc_state = drm_atomic_get_crtc_state(conn_state->state, crtc); in drm_atomic_set_crtc_for_connector()
298 crtc_state->connector_mask |= in drm_atomic_set_crtc_for_connector()
299 drm_connector_mask(conn_state->connector); in drm_atomic_set_crtc_for_connector()
301 drm_connector_get(conn_state->connector); in drm_atomic_set_crtc_for_connector()
302 conn_state->crtc = crtc; in drm_atomic_set_crtc_for_connector()
304 drm_dbg_atomic(connector->dev, in drm_atomic_set_crtc_for_connector()
306 connector->base.id, connector->name, in drm_atomic_set_crtc_for_connector()
307 conn_state, crtc->base.id, crtc->name); in drm_atomic_set_crtc_for_connector()
309 drm_dbg_atomic(connector->dev, in drm_atomic_set_crtc_for_connector()
311 connector->base.id, connector->name, in drm_atomic_set_crtc_for_connector()
322 state->crtcs[drm_crtc_index(crtc)].out_fence_ptr = fence_ptr; in set_out_fence_for_crtc()
330 fence_ptr = state->crtcs[drm_crtc_index(crtc)].out_fence_ptr; in get_out_fence_for_crtc()
331 state->crtcs[drm_crtc_index(crtc)].out_fence_ptr = NULL; in get_out_fence_for_crtc()
345 if (put_user(-1, fence_ptr)) in set_out_fence_for_connector()
346 return -EFAULT; in set_out_fence_for_connector()
348 state->connectors[index].out_fence_ptr = fence_ptr; in set_out_fence_for_connector()
359 fence_ptr = state->connectors[index].out_fence_ptr; in get_out_fence_for_connector()
360 state->connectors[index].out_fence_ptr = NULL; in get_out_fence_for_connector()
380 return -EINVAL; in drm_atomic_replace_property_blob_from_id()
384 new_blob->length != expected_size) { in drm_atomic_replace_property_blob_from_id()
387 new_blob->base.id, new_blob->length, expected_size); in drm_atomic_replace_property_blob_from_id()
389 return -EINVAL; in drm_atomic_replace_property_blob_from_id()
392 new_blob->length % expected_elem_size != 0) { in drm_atomic_replace_property_blob_from_id()
395 new_blob->base.id, new_blob->length, expected_elem_size); in drm_atomic_replace_property_blob_from_id()
397 return -EINVAL; in drm_atomic_replace_property_blob_from_id()
411 struct drm_device *dev = crtc->dev; in drm_atomic_crtc_set_property()
412 struct drm_mode_config *config = &dev->mode_config; in drm_atomic_crtc_set_property()
416 if (property == config->prop_active) in drm_atomic_crtc_set_property()
417 state->active = val; in drm_atomic_crtc_set_property()
418 else if (property == config->prop_mode_id) { in drm_atomic_crtc_set_property()
424 } else if (property == config->prop_vrr_enabled) { in drm_atomic_crtc_set_property()
425 state->vrr_enabled = val; in drm_atomic_crtc_set_property()
426 } else if (property == config->degamma_lut_property) { in drm_atomic_crtc_set_property()
428 &state->degamma_lut, in drm_atomic_crtc_set_property()
430 -1, sizeof(struct drm_color_lut), in drm_atomic_crtc_set_property()
432 state->color_mgmt_changed |= replaced; in drm_atomic_crtc_set_property()
434 } else if (property == config->ctm_property) { in drm_atomic_crtc_set_property()
436 &state->ctm, in drm_atomic_crtc_set_property()
438 sizeof(struct drm_color_ctm), -1, in drm_atomic_crtc_set_property()
440 state->color_mgmt_changed |= replaced; in drm_atomic_crtc_set_property()
442 } else if (property == config->gamma_lut_property) { in drm_atomic_crtc_set_property()
444 &state->gamma_lut, in drm_atomic_crtc_set_property()
446 -1, sizeof(struct drm_color_lut), in drm_atomic_crtc_set_property()
448 state->color_mgmt_changed |= replaced; in drm_atomic_crtc_set_property()
450 } else if (property == config->prop_out_fence_ptr) { in drm_atomic_crtc_set_property()
456 if (put_user(-1, fence_ptr)) in drm_atomic_crtc_set_property()
457 return -EFAULT; in drm_atomic_crtc_set_property()
459 set_out_fence_for_crtc(state->state, crtc, fence_ptr); in drm_atomic_crtc_set_property()
460 } else if (property == crtc->scaling_filter_property) { in drm_atomic_crtc_set_property()
461 state->scaling_filter = val; in drm_atomic_crtc_set_property()
462 } else if (crtc->funcs->atomic_set_property) { in drm_atomic_crtc_set_property()
463 return crtc->funcs->atomic_set_property(crtc, state, property, val); in drm_atomic_crtc_set_property()
465 drm_dbg_atomic(crtc->dev, in drm_atomic_crtc_set_property()
467 crtc->base.id, crtc->name, in drm_atomic_crtc_set_property()
468 property->base.id, property->name); in drm_atomic_crtc_set_property()
469 return -EINVAL; in drm_atomic_crtc_set_property()
480 struct drm_device *dev = crtc->dev; in drm_atomic_crtc_get_property()
481 struct drm_mode_config *config = &dev->mode_config; in drm_atomic_crtc_get_property()
483 if (property == config->prop_active) in drm_atomic_crtc_get_property()
485 else if (property == config->prop_mode_id) in drm_atomic_crtc_get_property()
486 *val = (state->mode_blob) ? state->mode_blob->base.id : 0; in drm_atomic_crtc_get_property()
487 else if (property == config->prop_vrr_enabled) in drm_atomic_crtc_get_property()
488 *val = state->vrr_enabled; in drm_atomic_crtc_get_property()
489 else if (property == config->degamma_lut_property) in drm_atomic_crtc_get_property()
490 *val = (state->degamma_lut) ? state->degamma_lut->base.id : 0; in drm_atomic_crtc_get_property()
491 else if (property == config->ctm_property) in drm_atomic_crtc_get_property()
492 *val = (state->ctm) ? state->ctm->base.id : 0; in drm_atomic_crtc_get_property()
493 else if (property == config->gamma_lut_property) in drm_atomic_crtc_get_property()
494 *val = (state->gamma_lut) ? state->gamma_lut->base.id : 0; in drm_atomic_crtc_get_property()
495 else if (property == config->prop_out_fence_ptr) in drm_atomic_crtc_get_property()
497 else if (property == crtc->scaling_filter_property) in drm_atomic_crtc_get_property()
498 *val = state->scaling_filter; in drm_atomic_crtc_get_property()
499 else if (crtc->funcs->atomic_get_property) in drm_atomic_crtc_get_property()
500 return crtc->funcs->atomic_get_property(crtc, state, property, val); in drm_atomic_crtc_get_property()
504 crtc->base.id, crtc->name, in drm_atomic_crtc_get_property()
505 property->base.id, property->name); in drm_atomic_crtc_get_property()
506 return -EINVAL; in drm_atomic_crtc_get_property()
516 struct drm_device *dev = plane->dev; in drm_atomic_plane_set_property()
517 struct drm_mode_config *config = &dev->mode_config; in drm_atomic_plane_set_property()
521 if (property == config->prop_fb_id) { in drm_atomic_plane_set_property()
528 } else if (property == config->prop_in_fence_fd) { in drm_atomic_plane_set_property()
529 if (state->fence) in drm_atomic_plane_set_property()
530 return -EINVAL; in drm_atomic_plane_set_property()
532 if (U642I64(val) == -1) in drm_atomic_plane_set_property()
535 state->fence = sync_file_get_fence(val); in drm_atomic_plane_set_property()
536 if (!state->fence) in drm_atomic_plane_set_property()
537 return -EINVAL; in drm_atomic_plane_set_property()
539 } else if (property == config->prop_crtc_id) { in drm_atomic_plane_set_property()
545 property->base.id, property->name, val); in drm_atomic_plane_set_property()
546 return -EACCES; in drm_atomic_plane_set_property()
549 } else if (property == config->prop_crtc_x) { in drm_atomic_plane_set_property()
550 state->crtc_x = U642I64(val); in drm_atomic_plane_set_property()
551 } else if (property == config->prop_crtc_y) { in drm_atomic_plane_set_property()
552 state->crtc_y = U642I64(val); in drm_atomic_plane_set_property()
553 } else if (property == config->prop_crtc_w) { in drm_atomic_plane_set_property()
554 state->crtc_w = val; in drm_atomic_plane_set_property()
555 } else if (property == config->prop_crtc_h) { in drm_atomic_plane_set_property()
556 state->crtc_h = val; in drm_atomic_plane_set_property()
557 } else if (property == config->prop_src_x) { in drm_atomic_plane_set_property()
558 state->src_x = val; in drm_atomic_plane_set_property()
559 } else if (property == config->prop_src_y) { in drm_atomic_plane_set_property()
560 state->src_y = val; in drm_atomic_plane_set_property()
561 } else if (property == config->prop_src_w) { in drm_atomic_plane_set_property()
562 state->src_w = val; in drm_atomic_plane_set_property()
563 } else if (property == config->prop_src_h) { in drm_atomic_plane_set_property()
564 state->src_h = val; in drm_atomic_plane_set_property()
565 } else if (property == plane->alpha_property) { in drm_atomic_plane_set_property()
566 state->alpha = val; in drm_atomic_plane_set_property()
567 } else if (property == plane->blend_mode_property) { in drm_atomic_plane_set_property()
568 state->pixel_blend_mode = val; in drm_atomic_plane_set_property()
569 } else if (property == plane->rotation_property) { in drm_atomic_plane_set_property()
571 drm_dbg_atomic(plane->dev, in drm_atomic_plane_set_property()
573 plane->base.id, plane->name, val); in drm_atomic_plane_set_property()
574 return -EINVAL; in drm_atomic_plane_set_property()
576 state->rotation = val; in drm_atomic_plane_set_property()
577 } else if (property == plane->zpos_property) { in drm_atomic_plane_set_property()
578 state->zpos = val; in drm_atomic_plane_set_property()
579 } else if (property == plane->color_encoding_property) { in drm_atomic_plane_set_property()
580 state->color_encoding = val; in drm_atomic_plane_set_property()
581 } else if (property == plane->color_range_property) { in drm_atomic_plane_set_property()
582 state->color_range = val; in drm_atomic_plane_set_property()
583 } else if (property == config->prop_fb_damage_clips) { in drm_atomic_plane_set_property()
585 &state->fb_damage_clips, in drm_atomic_plane_set_property()
587 -1, in drm_atomic_plane_set_property()
591 } else if (property == plane->scaling_filter_property) { in drm_atomic_plane_set_property()
592 state->scaling_filter = val; in drm_atomic_plane_set_property()
593 } else if (plane->funcs->atomic_set_property) { in drm_atomic_plane_set_property()
594 return plane->funcs->atomic_set_property(plane, state, in drm_atomic_plane_set_property()
597 drm_dbg_atomic(plane->dev, in drm_atomic_plane_set_property()
599 plane->base.id, plane->name, in drm_atomic_plane_set_property()
600 property->base.id, property->name); in drm_atomic_plane_set_property()
601 return -EINVAL; in drm_atomic_plane_set_property()
612 struct drm_device *dev = plane->dev; in drm_atomic_plane_get_property()
613 struct drm_mode_config *config = &dev->mode_config; in drm_atomic_plane_get_property()
615 if (property == config->prop_fb_id) { in drm_atomic_plane_get_property()
616 *val = (state->fb) ? state->fb->base.id : 0; in drm_atomic_plane_get_property()
617 } else if (property == config->prop_in_fence_fd) { in drm_atomic_plane_get_property()
618 *val = -1; in drm_atomic_plane_get_property()
619 } else if (property == config->prop_crtc_id) { in drm_atomic_plane_get_property()
620 *val = (state->crtc) ? state->crtc->base.id : 0; in drm_atomic_plane_get_property()
621 } else if (property == config->prop_crtc_x) { in drm_atomic_plane_get_property()
622 *val = I642U64(state->crtc_x); in drm_atomic_plane_get_property()
623 } else if (property == config->prop_crtc_y) { in drm_atomic_plane_get_property()
624 *val = I642U64(state->crtc_y); in drm_atomic_plane_get_property()
625 } else if (property == config->prop_crtc_w) { in drm_atomic_plane_get_property()
626 *val = state->crtc_w; in drm_atomic_plane_get_property()
627 } else if (property == config->prop_crtc_h) { in drm_atomic_plane_get_property()
628 *val = state->crtc_h; in drm_atomic_plane_get_property()
629 } else if (property == config->prop_src_x) { in drm_atomic_plane_get_property()
630 *val = state->src_x; in drm_atomic_plane_get_property()
631 } else if (property == config->prop_src_y) { in drm_atomic_plane_get_property()
632 *val = state->src_y; in drm_atomic_plane_get_property()
633 } else if (property == config->prop_src_w) { in drm_atomic_plane_get_property()
634 *val = state->src_w; in drm_atomic_plane_get_property()
635 } else if (property == config->prop_src_h) { in drm_atomic_plane_get_property()
636 *val = state->src_h; in drm_atomic_plane_get_property()
637 } else if (property == plane->alpha_property) { in drm_atomic_plane_get_property()
638 *val = state->alpha; in drm_atomic_plane_get_property()
639 } else if (property == plane->blend_mode_property) { in drm_atomic_plane_get_property()
640 *val = state->pixel_blend_mode; in drm_atomic_plane_get_property()
641 } else if (property == plane->rotation_property) { in drm_atomic_plane_get_property()
642 *val = state->rotation; in drm_atomic_plane_get_property()
643 } else if (property == plane->zpos_property) { in drm_atomic_plane_get_property()
644 *val = state->zpos; in drm_atomic_plane_get_property()
645 } else if (property == plane->color_encoding_property) { in drm_atomic_plane_get_property()
646 *val = state->color_encoding; in drm_atomic_plane_get_property()
647 } else if (property == plane->color_range_property) { in drm_atomic_plane_get_property()
648 *val = state->color_range; in drm_atomic_plane_get_property()
649 } else if (property == config->prop_fb_damage_clips) { in drm_atomic_plane_get_property()
650 *val = (state->fb_damage_clips) ? in drm_atomic_plane_get_property()
651 state->fb_damage_clips->base.id : 0; in drm_atomic_plane_get_property()
652 } else if (property == plane->scaling_filter_property) { in drm_atomic_plane_get_property()
653 *val = state->scaling_filter; in drm_atomic_plane_get_property()
654 } else if (plane->funcs->atomic_get_property) { in drm_atomic_plane_get_property()
655 return plane->funcs->atomic_get_property(plane, state, property, val); in drm_atomic_plane_get_property()
659 plane->base.id, plane->name, in drm_atomic_plane_get_property()
660 property->base.id, property->name); in drm_atomic_plane_get_property()
661 return -EINVAL; in drm_atomic_plane_get_property()
672 struct drm_connector *conn = conn_state->connector; in drm_atomic_set_writeback_fb_for_connector()
679 drm_dbg_atomic(conn->dev, in drm_atomic_set_writeback_fb_for_connector()
680 "Set [FB:%d] for connector state %p\n", in drm_atomic_set_writeback_fb_for_connector()
681 fb->base.id, conn_state); in drm_atomic_set_writeback_fb_for_connector()
683 drm_dbg_atomic(conn->dev, in drm_atomic_set_writeback_fb_for_connector()
684 "Set [NOFB] for connector state %p\n", in drm_atomic_set_writeback_fb_for_connector()
694 struct drm_device *dev = connector->dev; in drm_atomic_connector_set_property()
695 struct drm_mode_config *config = &dev->mode_config; in drm_atomic_connector_set_property()
699 if (property == config->prop_crtc_id) { in drm_atomic_connector_set_property()
705 property->base.id, property->name, val); in drm_atomic_connector_set_property()
706 return -EACCES; in drm_atomic_connector_set_property()
709 } else if (property == config->dpms_property) { in drm_atomic_connector_set_property()
715 "legacy [PROP:%d:%s] can only be set via legacy uAPI\n", in drm_atomic_connector_set_property()
716 property->base.id, property->name); in drm_atomic_connector_set_property()
717 return -EINVAL; in drm_atomic_connector_set_property()
718 } else if (property == config->tv_select_subconnector_property) { in drm_atomic_connector_set_property()
719 state->tv.select_subconnector = val; in drm_atomic_connector_set_property()
720 } else if (property == config->tv_subconnector_property) { in drm_atomic_connector_set_property()
721 state->tv.subconnector = val; in drm_atomic_connector_set_property()
722 } else if (property == config->tv_left_margin_property) { in drm_atomic_connector_set_property()
723 state->tv.margins.left = val; in drm_atomic_connector_set_property()
724 } else if (property == config->tv_right_margin_property) { in drm_atomic_connector_set_property()
725 state->tv.margins.right = val; in drm_atomic_connector_set_property()
726 } else if (property == config->tv_top_margin_property) { in drm_atomic_connector_set_property()
727 state->tv.margins.top = val; in drm_atomic_connector_set_property()
728 } else if (property == config->tv_bottom_margin_property) { in drm_atomic_connector_set_property()
729 state->tv.margins.bottom = val; in drm_atomic_connector_set_property()
730 } else if (property == config->legacy_tv_mode_property) { in drm_atomic_connector_set_property()
731 state->tv.legacy_mode = val; in drm_atomic_connector_set_property()
732 } else if (property == config->tv_mode_property) { in drm_atomic_connector_set_property()
733 state->tv.mode = val; in drm_atomic_connector_set_property()
734 } else if (property == config->tv_brightness_property) { in drm_atomic_connector_set_property()
735 state->tv.brightness = val; in drm_atomic_connector_set_property()
736 } else if (property == config->tv_contrast_property) { in drm_atomic_connector_set_property()
737 state->tv.contrast = val; in drm_atomic_connector_set_property()
738 } else if (property == config->tv_flicker_reduction_property) { in drm_atomic_connector_set_property()
739 state->tv.flicker_reduction = val; in drm_atomic_connector_set_property()
740 } else if (property == config->tv_overscan_property) { in drm_atomic_connector_set_property()
741 state->tv.overscan = val; in drm_atomic_connector_set_property()
742 } else if (property == config->tv_saturation_property) { in drm_atomic_connector_set_property()
743 state->tv.saturation = val; in drm_atomic_connector_set_property()
744 } else if (property == config->tv_hue_property) { in drm_atomic_connector_set_property()
745 state->tv.hue = val; in drm_atomic_connector_set_property()
746 } else if (property == config->link_status_property) { in drm_atomic_connector_set_property()
758 if (state->link_status != DRM_LINK_STATUS_GOOD) in drm_atomic_connector_set_property()
759 state->link_status = val; in drm_atomic_connector_set_property()
760 } else if (property == config->hdr_output_metadata_property) { in drm_atomic_connector_set_property()
762 &state->hdr_output_metadata, in drm_atomic_connector_set_property()
764 sizeof(struct hdr_output_metadata), -1, in drm_atomic_connector_set_property()
767 } else if (property == config->aspect_ratio_property) { in drm_atomic_connector_set_property()
768 state->picture_aspect_ratio = val; in drm_atomic_connector_set_property()
769 } else if (property == config->content_type_property) { in drm_atomic_connector_set_property()
770 state->content_type = val; in drm_atomic_connector_set_property()
771 } else if (property == connector->scaling_mode_property) { in drm_atomic_connector_set_property()
772 state->scaling_mode = val; in drm_atomic_connector_set_property()
773 } else if (property == config->content_protection_property) { in drm_atomic_connector_set_property()
775 drm_dbg_kms(dev, "only drivers can set CP Enabled\n"); in drm_atomic_connector_set_property()
776 return -EINVAL; in drm_atomic_connector_set_property()
778 state->content_protection = val; in drm_atomic_connector_set_property()
779 } else if (property == config->hdcp_content_type_property) { in drm_atomic_connector_set_property()
780 state->hdcp_content_type = val; in drm_atomic_connector_set_property()
781 } else if (property == connector->colorspace_property) { in drm_atomic_connector_set_property()
782 state->colorspace = val; in drm_atomic_connector_set_property()
783 } else if (property == config->writeback_fb_id_property) { in drm_atomic_connector_set_property()
792 } else if (property == config->writeback_out_fence_ptr_property) { in drm_atomic_connector_set_property()
795 return set_out_fence_for_connector(state->state, connector, in drm_atomic_connector_set_property()
797 } else if (property == connector->max_bpc_property) { in drm_atomic_connector_set_property()
798 state->max_requested_bpc = val; in drm_atomic_connector_set_property()
799 } else if (property == connector->privacy_screen_sw_state_property) { in drm_atomic_connector_set_property()
800 state->privacy_screen_sw_state = val; in drm_atomic_connector_set_property()
801 } else if (connector->funcs->atomic_set_property) { in drm_atomic_connector_set_property()
802 return connector->funcs->atomic_set_property(connector, in drm_atomic_connector_set_property()
805 drm_dbg_atomic(connector->dev, in drm_atomic_connector_set_property()
807 connector->base.id, connector->name, in drm_atomic_connector_set_property()
808 property->base.id, property->name); in drm_atomic_connector_set_property()
809 return -EINVAL; in drm_atomic_connector_set_property()
820 struct drm_device *dev = connector->dev; in drm_atomic_connector_get_property()
821 struct drm_mode_config *config = &dev->mode_config; in drm_atomic_connector_get_property()
823 if (property == config->prop_crtc_id) { in drm_atomic_connector_get_property()
824 *val = (state->crtc) ? state->crtc->base.id : 0; in drm_atomic_connector_get_property()
825 } else if (property == config->dpms_property) { in drm_atomic_connector_get_property()
826 if (state->crtc && state->crtc->state->self_refresh_active) in drm_atomic_connector_get_property()
829 *val = connector->dpms; in drm_atomic_connector_get_property()
830 } else if (property == config->tv_select_subconnector_property) { in drm_atomic_connector_get_property()
831 *val = state->tv.select_subconnector; in drm_atomic_connector_get_property()
832 } else if (property == config->tv_subconnector_property) { in drm_atomic_connector_get_property()
833 *val = state->tv.subconnector; in drm_atomic_connector_get_property()
834 } else if (property == config->tv_left_margin_property) { in drm_atomic_connector_get_property()
835 *val = state->tv.margins.left; in drm_atomic_connector_get_property()
836 } else if (property == config->tv_right_margin_property) { in drm_atomic_connector_get_property()
837 *val = state->tv.margins.right; in drm_atomic_connector_get_property()
838 } else if (property == config->tv_top_margin_property) { in drm_atomic_connector_get_property()
839 *val = state->tv.margins.top; in drm_atomic_connector_get_property()
840 } else if (property == config->tv_bottom_margin_property) { in drm_atomic_connector_get_property()
841 *val = state->tv.margins.bottom; in drm_atomic_connector_get_property()
842 } else if (property == config->legacy_tv_mode_property) { in drm_atomic_connector_get_property()
843 *val = state->tv.legacy_mode; in drm_atomic_connector_get_property()
844 } else if (property == config->tv_mode_property) { in drm_atomic_connector_get_property()
845 *val = state->tv.mode; in drm_atomic_connector_get_property()
846 } else if (property == config->tv_brightness_property) { in drm_atomic_connector_get_property()
847 *val = state->tv.brightness; in drm_atomic_connector_get_property()
848 } else if (property == config->tv_contrast_property) { in drm_atomic_connector_get_property()
849 *val = state->tv.contrast; in drm_atomic_connector_get_property()
850 } else if (property == config->tv_flicker_reduction_property) { in drm_atomic_connector_get_property()
851 *val = state->tv.flicker_reduction; in drm_atomic_connector_get_property()
852 } else if (property == config->tv_overscan_property) { in drm_atomic_connector_get_property()
853 *val = state->tv.overscan; in drm_atomic_connector_get_property()
854 } else if (property == config->tv_saturation_property) { in drm_atomic_connector_get_property()
855 *val = state->tv.saturation; in drm_atomic_connector_get_property()
856 } else if (property == config->tv_hue_property) { in drm_atomic_connector_get_property()
857 *val = state->tv.hue; in drm_atomic_connector_get_property()
858 } else if (property == config->link_status_property) { in drm_atomic_connector_get_property()
859 *val = state->link_status; in drm_atomic_connector_get_property()
860 } else if (property == config->aspect_ratio_property) { in drm_atomic_connector_get_property()
861 *val = state->picture_aspect_ratio; in drm_atomic_connector_get_property()
862 } else if (property == config->content_type_property) { in drm_atomic_connector_get_property()
863 *val = state->content_type; in drm_atomic_connector_get_property()
864 } else if (property == connector->colorspace_property) { in drm_atomic_connector_get_property()
865 *val = state->colorspace; in drm_atomic_connector_get_property()
866 } else if (property == connector->scaling_mode_property) { in drm_atomic_connector_get_property()
867 *val = state->scaling_mode; in drm_atomic_connector_get_property()
868 } else if (property == config->hdr_output_metadata_property) { in drm_atomic_connector_get_property()
869 *val = state->hdr_output_metadata ? in drm_atomic_connector_get_property()
870 state->hdr_output_metadata->base.id : 0; in drm_atomic_connector_get_property()
871 } else if (property == config->content_protection_property) { in drm_atomic_connector_get_property()
872 *val = state->content_protection; in drm_atomic_connector_get_property()
873 } else if (property == config->hdcp_content_type_property) { in drm_atomic_connector_get_property()
874 *val = state->hdcp_content_type; in drm_atomic_connector_get_property()
875 } else if (property == config->writeback_fb_id_property) { in drm_atomic_connector_get_property()
876 /* Writeback framebuffer is one-shot, write and forget */ in drm_atomic_connector_get_property()
878 } else if (property == config->writeback_out_fence_ptr_property) { in drm_atomic_connector_get_property()
880 } else if (property == connector->max_bpc_property) { in drm_atomic_connector_get_property()
881 *val = state->max_requested_bpc; in drm_atomic_connector_get_property()
882 } else if (property == connector->privacy_screen_sw_state_property) { in drm_atomic_connector_get_property()
883 *val = state->privacy_screen_sw_state; in drm_atomic_connector_get_property()
884 } else if (connector->funcs->atomic_get_property) { in drm_atomic_connector_get_property()
885 return connector->funcs->atomic_get_property(connector, in drm_atomic_connector_get_property()
890 connector->base.id, connector->name, in drm_atomic_connector_get_property()
891 property->base.id, property->name); in drm_atomic_connector_get_property()
892 return -EINVAL; in drm_atomic_connector_get_property()
901 struct drm_device *dev = property->dev; in drm_atomic_get_property()
904 switch (obj->type) { in drm_atomic_get_property()
908 WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex)); in drm_atomic_get_property()
910 connector->state, property, val); in drm_atomic_get_property()
916 WARN_ON(!drm_modeset_is_locked(&crtc->mutex)); in drm_atomic_get_property()
918 crtc->state, property, val); in drm_atomic_get_property()
924 WARN_ON(!drm_modeset_is_locked(&plane->mutex)); in drm_atomic_get_property()
926 plane->state, property, val); in drm_atomic_get_property()
930 drm_dbg_atomic(dev, "[OBJECT:%d] has no properties\n", obj->id); in drm_atomic_get_property()
931 ret = -EINVAL; in drm_atomic_get_property()
951 e->event.base.type = DRM_EVENT_FLIP_COMPLETE; in create_vblank_event()
952 e->event.base.length = sizeof(e->event); in create_vblank_event()
953 e->event.vbl.crtc_id = crtc->base.id; in create_vblank_event()
954 e->event.vbl.user_data = user_data; in create_vblank_event()
967 int i, ret, old_mode = connector->dpms; in drm_atomic_connector_commit_dpms()
970 ret = drm_modeset_lock(&state->dev->mode_config.connection_mutex, in drm_atomic_connector_commit_dpms()
971 state->acquire_ctx); in drm_atomic_connector_commit_dpms()
978 if (connector->dpms == mode) in drm_atomic_connector_commit_dpms()
981 connector->dpms = mode; in drm_atomic_connector_commit_dpms()
983 crtc = connector->state->crtc; in drm_atomic_connector_commit_dpms()
997 if (new_conn_state->crtc != crtc) in drm_atomic_connector_commit_dpms()
999 if (tmp_connector->dpms == DRM_MODE_DPMS_ON) { in drm_atomic_connector_commit_dpms()
1005 crtc_state->active = active; in drm_atomic_connector_commit_dpms()
1009 connector->dpms = old_mode; in drm_atomic_connector_commit_dpms()
1023 return -EINVAL; in drm_atomic_set_property()
1025 switch (obj->type) { in drm_atomic_set_property()
1071 drm_dbg_atomic(prop->dev, "[OBJECT:%d] has no properties\n", obj->id); in drm_atomic_set_property()
1072 ret = -EINVAL; in drm_atomic_set_property()
1101 * fence_array if a merged fence is received. Passing -1 here means no
1123 * returned will be -1. On a Atomic Commit with the
1124 * DRM_MODE_ATOMIC_TEST_ONLY flag the out fence will also be set to -1.
1126 * Note that out-fences don't have a special interface to drivers and are
1141 fence_state->fd = get_unused_fd_flags(O_CLOEXEC); in setup_out_fence()
1142 if (fence_state->fd < 0) in setup_out_fence()
1143 return fence_state->fd; in setup_out_fence()
1145 if (put_user(fence_state->fd, fence_state->out_fence_ptr)) in setup_out_fence()
1146 return -EFAULT; in setup_out_fence()
1148 fence_state->sync_file = sync_file_create(fence); in setup_out_fence()
1149 if (!fence_state->sync_file) in setup_out_fence()
1150 return -ENOMEM; in setup_out_fence()
1168 if (arg->flags & DRM_MODE_ATOMIC_TEST_ONLY) in prepare_signaling()
1174 fence_ptr = get_out_fence_for_crtc(crtc_state->state, crtc); in prepare_signaling()
1176 if (arg->flags & DRM_MODE_PAGE_FLIP_EVENT || fence_ptr) { in prepare_signaling()
1179 e = create_vblank_event(crtc, arg->user_data); in prepare_signaling()
1181 return -ENOMEM; in prepare_signaling()
1183 crtc_state->event = e; in prepare_signaling()
1186 if (arg->flags & DRM_MODE_PAGE_FLIP_EVENT) { in prepare_signaling()
1187 struct drm_pending_vblank_event *e = crtc_state->event; in prepare_signaling()
1192 ret = drm_event_reserve_init(dev, file_priv, &e->base, in prepare_signaling()
1193 &e->event.base); in prepare_signaling()
1196 crtc_state->event = NULL; in prepare_signaling()
1208 return -ENOMEM; in prepare_signaling()
1217 return -ENOMEM; in prepare_signaling()
1225 crtc_state->event->base.fence = fence; in prepare_signaling()
1237 if (!conn_state->writeback_job) in prepare_signaling()
1247 return -ENOMEM; in prepare_signaling()
1257 return -ENOMEM; in prepare_signaling()
1265 conn_state->writeback_job->out_fence = fence; in prepare_signaling()
1272 if (c == 0 && (arg->flags & DRM_MODE_PAGE_FLIP_EVENT)) { in prepare_signaling()
1274 return -EINVAL; in prepare_signaling()
1293 fence_state[i].sync_file->file); in complete_signaling()
1300 struct drm_pending_vblank_event *event = crtc_state->event; in complete_signaling()
1306 if (event && (event->base.fence || event->base.file_priv)) { in complete_signaling()
1307 drm_event_cancel_free(dev, &event->base); in complete_signaling()
1308 crtc_state->event = NULL; in complete_signaling()
1317 fput(fence_state[i].sync_file->file); in complete_signaling()
1323 put_user(-1, fence_state[i].out_fence_ptr)) in complete_signaling()
1334 uint32_t __user *objs_ptr = (uint32_t __user *)(unsigned long)(arg->objs_ptr); in drm_mode_atomic_ioctl()
1335 uint32_t __user *count_props_ptr = (uint32_t __user *)(unsigned long)(arg->count_props_ptr); in drm_mode_atomic_ioctl()
1336 uint32_t __user *props_ptr = (uint32_t __user *)(unsigned long)(arg->props_ptr); in drm_mode_atomic_ioctl()
1337 uint64_t __user *prop_values_ptr = (uint64_t __user *)(unsigned long)(arg->prop_values_ptr); in drm_mode_atomic_ioctl()
1347 return -EOPNOTSUPP; in drm_mode_atomic_ioctl()
1353 if (!file_priv->atomic) { in drm_mode_atomic_ioctl()
1356 return -EINVAL; in drm_mode_atomic_ioctl()
1359 if (arg->flags & ~DRM_MODE_ATOMIC_FLAGS) { in drm_mode_atomic_ioctl()
1361 return -EINVAL; in drm_mode_atomic_ioctl()
1364 if (arg->reserved) { in drm_mode_atomic_ioctl()
1365 drm_dbg_atomic(dev, "commit failed: reserved field set\n"); in drm_mode_atomic_ioctl()
1366 return -EINVAL; in drm_mode_atomic_ioctl()
1369 if (arg->flags & DRM_MODE_PAGE_FLIP_ASYNC) { in drm_mode_atomic_ioctl()
1372 return -EINVAL; in drm_mode_atomic_ioctl()
1376 if ((arg->flags & DRM_MODE_ATOMIC_TEST_ONLY) && in drm_mode_atomic_ioctl()
1377 (arg->flags & DRM_MODE_PAGE_FLIP_EVENT)) { in drm_mode_atomic_ioctl()
1379 "commit failed: page-flip event requested with test-only commit\n"); in drm_mode_atomic_ioctl()
1380 return -EINVAL; in drm_mode_atomic_ioctl()
1385 return -ENOMEM; in drm_mode_atomic_ioctl()
1388 state->acquire_ctx = &ctx; in drm_mode_atomic_ioctl()
1389 state->allow_modeset = !!(arg->flags & DRM_MODE_ATOMIC_ALLOW_MODESET); in drm_mode_atomic_ioctl()
1397 for (i = 0; i < arg->count_objs; i++) { in drm_mode_atomic_ioctl()
1402 ret = -EFAULT; in drm_mode_atomic_ioctl()
1409 ret = -ENOENT; in drm_mode_atomic_ioctl()
1413 if (!obj->properties) { in drm_mode_atomic_ioctl()
1416 ret = -ENOENT; in drm_mode_atomic_ioctl()
1422 ret = -EFAULT; in drm_mode_atomic_ioctl()
1435 ret = -EFAULT; in drm_mode_atomic_ioctl()
1445 ret = -ENOENT; in drm_mode_atomic_ioctl()
1453 ret = -EFAULT; in drm_mode_atomic_ioctl()
1475 if (arg->flags & DRM_MODE_ATOMIC_TEST_ONLY) { in drm_mode_atomic_ioctl()
1477 } else if (arg->flags & DRM_MODE_ATOMIC_NONBLOCK) { in drm_mode_atomic_ioctl()
1486 if (ret == -EDEADLK) { in drm_mode_atomic_ioctl()