Lines Matching +full:bool +full:- +full:property
39 #include <linux/dma-fence.h>
57 * drm_atomic_set_mode_for_crtc - set mode for CRTC
59 * @mode: kernel-internal mode to use for the CRTC, or NULL to disable
62 * the enable property.
65 * Zero on success, error code on failure. Cannot return -EDEADLK.
70 struct drm_crtc *crtc = state->crtc; in drm_atomic_set_mode_for_crtc()
74 if (mode && memcmp(&state->mode, mode, sizeof(*mode)) == 0) in drm_atomic_set_mode_for_crtc()
77 drm_property_blob_put(state->mode_blob); in drm_atomic_set_mode_for_crtc()
78 state->mode_blob = NULL; in drm_atomic_set_mode_for_crtc()
84 blob = drm_property_create_blob(crtc->dev, in drm_atomic_set_mode_for_crtc()
89 drm_mode_copy(&state->mode, mode); in drm_atomic_set_mode_for_crtc()
91 state->mode_blob = blob; in drm_atomic_set_mode_for_crtc()
92 state->enable = true; in drm_atomic_set_mode_for_crtc()
93 drm_dbg_atomic(crtc->dev, in drm_atomic_set_mode_for_crtc()
95 mode->name, crtc->base.id, crtc->name, state); in drm_atomic_set_mode_for_crtc()
97 memset(&state->mode, 0, sizeof(state->mode)); in drm_atomic_set_mode_for_crtc()
98 state->enable = false; in drm_atomic_set_mode_for_crtc()
99 drm_dbg_atomic(crtc->dev, in drm_atomic_set_mode_for_crtc()
101 crtc->base.id, crtc->name, state); in drm_atomic_set_mode_for_crtc()
109 * drm_atomic_set_mode_prop_for_crtc - set mode for CRTC
111 * @blob: pointer to blob property to use for mode
113 * Set a mode (originating from a blob property) on the desired CRTC state.
114 * This function will take a reference on the blob property for the CRTC state,
115 * and release the reference held on the state's existing mode property, if any
119 * Zero on success, error code on failure. Cannot return -EDEADLK.
124 struct drm_crtc *crtc = state->crtc; in drm_atomic_set_mode_prop_for_crtc()
126 if (blob == state->mode_blob) in drm_atomic_set_mode_prop_for_crtc()
129 drm_property_blob_put(state->mode_blob); in drm_atomic_set_mode_prop_for_crtc()
130 state->mode_blob = NULL; in drm_atomic_set_mode_prop_for_crtc()
132 memset(&state->mode, 0, sizeof(state->mode)); in drm_atomic_set_mode_prop_for_crtc()
137 if (blob->length != sizeof(struct drm_mode_modeinfo)) { in drm_atomic_set_mode_prop_for_crtc()
138 drm_dbg_atomic(crtc->dev, in drm_atomic_set_mode_prop_for_crtc()
140 crtc->base.id, crtc->name, in drm_atomic_set_mode_prop_for_crtc()
141 blob->length); in drm_atomic_set_mode_prop_for_crtc()
142 return -EINVAL; in drm_atomic_set_mode_prop_for_crtc()
145 ret = drm_mode_convert_umode(crtc->dev, in drm_atomic_set_mode_prop_for_crtc()
146 &state->mode, blob->data); in drm_atomic_set_mode_prop_for_crtc()
148 drm_dbg_atomic(crtc->dev, in drm_atomic_set_mode_prop_for_crtc()
150 crtc->base.id, crtc->name, in drm_atomic_set_mode_prop_for_crtc()
151 drm_get_mode_status_name(state->mode.status), in drm_atomic_set_mode_prop_for_crtc()
152 ERR_PTR(ret), DRM_MODE_ARG(&state->mode)); in drm_atomic_set_mode_prop_for_crtc()
153 return -EINVAL; in drm_atomic_set_mode_prop_for_crtc()
156 state->mode_blob = drm_property_blob_get(blob); in drm_atomic_set_mode_prop_for_crtc()
157 state->enable = true; in drm_atomic_set_mode_prop_for_crtc()
158 drm_dbg_atomic(crtc->dev, in drm_atomic_set_mode_prop_for_crtc()
160 state->mode.name, crtc->base.id, crtc->name, in drm_atomic_set_mode_prop_for_crtc()
163 state->enable = false; in drm_atomic_set_mode_prop_for_crtc()
164 drm_dbg_atomic(crtc->dev, in drm_atomic_set_mode_prop_for_crtc()
166 crtc->base.id, crtc->name, state); in drm_atomic_set_mode_prop_for_crtc()
174 * drm_atomic_set_crtc_for_plane - set CRTC for plane
183 * 0 on success or can fail with -EDEADLK or -ENOMEM. When the error is EDEADLK
191 struct drm_plane *plane = plane_state->plane; in drm_atomic_set_crtc_for_plane()
194 if (plane_state->crtc == crtc) in drm_atomic_set_crtc_for_plane()
196 if (plane_state->crtc) { in drm_atomic_set_crtc_for_plane()
197 crtc_state = drm_atomic_get_crtc_state(plane_state->state, in drm_atomic_set_crtc_for_plane()
198 plane_state->crtc); in drm_atomic_set_crtc_for_plane()
202 crtc_state->plane_mask &= ~drm_plane_mask(plane); in drm_atomic_set_crtc_for_plane()
205 plane_state->crtc = crtc; in drm_atomic_set_crtc_for_plane()
208 crtc_state = drm_atomic_get_crtc_state(plane_state->state, in drm_atomic_set_crtc_for_plane()
212 crtc_state->plane_mask |= drm_plane_mask(plane); in drm_atomic_set_crtc_for_plane()
216 drm_dbg_atomic(plane->dev, in drm_atomic_set_crtc_for_plane()
218 plane->base.id, plane->name, plane_state, in drm_atomic_set_crtc_for_plane()
219 crtc->base.id, crtc->name); in drm_atomic_set_crtc_for_plane()
221 drm_dbg_atomic(plane->dev, in drm_atomic_set_crtc_for_plane()
223 plane->base.id, plane->name, plane_state); in drm_atomic_set_crtc_for_plane()
230 * drm_atomic_set_fb_for_plane - set framebuffer for plane
243 struct drm_plane *plane = plane_state->plane; in drm_atomic_set_fb_for_plane()
246 drm_dbg_atomic(plane->dev, in drm_atomic_set_fb_for_plane()
248 fb->base.id, plane->base.id, plane->name, in drm_atomic_set_fb_for_plane()
251 drm_dbg_atomic(plane->dev, in drm_atomic_set_fb_for_plane()
253 plane->base.id, plane->name, plane_state); in drm_atomic_set_fb_for_plane()
255 drm_framebuffer_assign(&plane_state->fb, fb); in drm_atomic_set_fb_for_plane()
260 * drm_atomic_set_crtc_for_connector - set CRTC for connector
269 * 0 on success or can fail with -EDEADLK or -ENOMEM. When the error is EDEADLK
277 struct drm_connector *connector = conn_state->connector; in drm_atomic_set_crtc_for_connector()
280 if (conn_state->crtc == crtc) in drm_atomic_set_crtc_for_connector()
283 if (conn_state->crtc) { in drm_atomic_set_crtc_for_connector()
284 crtc_state = drm_atomic_get_new_crtc_state(conn_state->state, in drm_atomic_set_crtc_for_connector()
285 conn_state->crtc); in drm_atomic_set_crtc_for_connector()
287 crtc_state->connector_mask &= in drm_atomic_set_crtc_for_connector()
288 ~drm_connector_mask(conn_state->connector); in drm_atomic_set_crtc_for_connector()
290 drm_connector_put(conn_state->connector); in drm_atomic_set_crtc_for_connector()
291 conn_state->crtc = NULL; in drm_atomic_set_crtc_for_connector()
295 crtc_state = drm_atomic_get_crtc_state(conn_state->state, crtc); in drm_atomic_set_crtc_for_connector()
299 crtc_state->connector_mask |= in drm_atomic_set_crtc_for_connector()
300 drm_connector_mask(conn_state->connector); in drm_atomic_set_crtc_for_connector()
302 drm_connector_get(conn_state->connector); in drm_atomic_set_crtc_for_connector()
303 conn_state->crtc = crtc; in drm_atomic_set_crtc_for_connector()
305 drm_dbg_atomic(connector->dev, in drm_atomic_set_crtc_for_connector()
307 connector->base.id, connector->name, in drm_atomic_set_crtc_for_connector()
308 conn_state, crtc->base.id, crtc->name); in drm_atomic_set_crtc_for_connector()
310 drm_dbg_atomic(connector->dev, in drm_atomic_set_crtc_for_connector()
312 connector->base.id, connector->name, in drm_atomic_set_crtc_for_connector()
323 state->crtcs[drm_crtc_index(crtc)].out_fence_ptr = fence_ptr; in set_out_fence_for_crtc()
331 fence_ptr = state->crtcs[drm_crtc_index(crtc)].out_fence_ptr; in get_out_fence_for_crtc()
332 state->crtcs[drm_crtc_index(crtc)].out_fence_ptr = NULL; in get_out_fence_for_crtc()
346 if (put_user(-1, fence_ptr)) in set_out_fence_for_connector()
347 return -EFAULT; in set_out_fence_for_connector()
349 state->connectors[index].out_fence_ptr = fence_ptr; in set_out_fence_for_connector()
360 fence_ptr = state->connectors[index].out_fence_ptr; in get_out_fence_for_connector()
361 state->connectors[index].out_fence_ptr = NULL; in get_out_fence_for_connector()
367 struct drm_crtc_state *state, struct drm_property *property, in drm_atomic_crtc_set_property() argument
370 struct drm_device *dev = crtc->dev; in drm_atomic_crtc_set_property()
371 struct drm_mode_config *config = &dev->mode_config; in drm_atomic_crtc_set_property()
372 bool replaced = false; in drm_atomic_crtc_set_property()
375 if (property == config->prop_active) in drm_atomic_crtc_set_property()
376 state->active = val; in drm_atomic_crtc_set_property()
377 else if (property == config->prop_mode_id) { in drm_atomic_crtc_set_property()
383 } else if (property == config->prop_vrr_enabled) { in drm_atomic_crtc_set_property()
384 state->vrr_enabled = val; in drm_atomic_crtc_set_property()
385 } else if (property == config->degamma_lut_property) { in drm_atomic_crtc_set_property()
387 &state->degamma_lut, in drm_atomic_crtc_set_property()
389 -1, sizeof(struct drm_color_lut), in drm_atomic_crtc_set_property()
391 state->color_mgmt_changed |= replaced; in drm_atomic_crtc_set_property()
393 } else if (property == config->ctm_property) { in drm_atomic_crtc_set_property()
395 &state->ctm, in drm_atomic_crtc_set_property()
397 sizeof(struct drm_color_ctm), -1, in drm_atomic_crtc_set_property()
399 state->color_mgmt_changed |= replaced; in drm_atomic_crtc_set_property()
401 } else if (property == config->gamma_lut_property) { in drm_atomic_crtc_set_property()
403 &state->gamma_lut, in drm_atomic_crtc_set_property()
405 -1, sizeof(struct drm_color_lut), in drm_atomic_crtc_set_property()
407 state->color_mgmt_changed |= replaced; in drm_atomic_crtc_set_property()
409 } else if (property == config->prop_out_fence_ptr) { in drm_atomic_crtc_set_property()
415 if (put_user(-1, fence_ptr)) in drm_atomic_crtc_set_property()
416 return -EFAULT; in drm_atomic_crtc_set_property()
418 set_out_fence_for_crtc(state->state, crtc, fence_ptr); in drm_atomic_crtc_set_property()
419 } else if (property == crtc->scaling_filter_property) { in drm_atomic_crtc_set_property()
420 state->scaling_filter = val; in drm_atomic_crtc_set_property()
421 } else if (crtc->funcs->atomic_set_property) { in drm_atomic_crtc_set_property()
422 return crtc->funcs->atomic_set_property(crtc, state, property, val); in drm_atomic_crtc_set_property()
424 drm_dbg_atomic(crtc->dev, in drm_atomic_crtc_set_property()
425 "[CRTC:%d:%s] unknown property [PROP:%d:%s]\n", in drm_atomic_crtc_set_property()
426 crtc->base.id, crtc->name, in drm_atomic_crtc_set_property()
427 property->base.id, property->name); in drm_atomic_crtc_set_property()
428 return -EINVAL; in drm_atomic_crtc_set_property()
437 struct drm_property *property, uint64_t *val) in drm_atomic_crtc_get_property() argument
439 struct drm_device *dev = crtc->dev; in drm_atomic_crtc_get_property()
440 struct drm_mode_config *config = &dev->mode_config; in drm_atomic_crtc_get_property()
442 if (property == config->prop_active) in drm_atomic_crtc_get_property()
444 else if (property == config->prop_mode_id) in drm_atomic_crtc_get_property()
445 *val = (state->mode_blob) ? state->mode_blob->base.id : 0; in drm_atomic_crtc_get_property()
446 else if (property == config->prop_vrr_enabled) in drm_atomic_crtc_get_property()
447 *val = state->vrr_enabled; in drm_atomic_crtc_get_property()
448 else if (property == config->degamma_lut_property) in drm_atomic_crtc_get_property()
449 *val = (state->degamma_lut) ? state->degamma_lut->base.id : 0; in drm_atomic_crtc_get_property()
450 else if (property == config->ctm_property) in drm_atomic_crtc_get_property()
451 *val = (state->ctm) ? state->ctm->base.id : 0; in drm_atomic_crtc_get_property()
452 else if (property == config->gamma_lut_property) in drm_atomic_crtc_get_property()
453 *val = (state->gamma_lut) ? state->gamma_lut->base.id : 0; in drm_atomic_crtc_get_property()
454 else if (property == config->prop_out_fence_ptr) in drm_atomic_crtc_get_property()
456 else if (property == crtc->scaling_filter_property) in drm_atomic_crtc_get_property()
457 *val = state->scaling_filter; in drm_atomic_crtc_get_property()
458 else if (crtc->funcs->atomic_get_property) in drm_atomic_crtc_get_property()
459 return crtc->funcs->atomic_get_property(crtc, state, property, val); in drm_atomic_crtc_get_property()
462 "[CRTC:%d:%s] unknown property [PROP:%d:%s]\n", in drm_atomic_crtc_get_property()
463 crtc->base.id, crtc->name, in drm_atomic_crtc_get_property()
464 property->base.id, property->name); in drm_atomic_crtc_get_property()
465 return -EINVAL; in drm_atomic_crtc_get_property()
473 struct drm_property *property, uint64_t val) in drm_atomic_plane_set_property() argument
475 struct drm_device *dev = plane->dev; in drm_atomic_plane_set_property()
476 struct drm_mode_config *config = &dev->mode_config; in drm_atomic_plane_set_property()
477 bool replaced = false; in drm_atomic_plane_set_property()
480 if (property == config->prop_fb_id) { in drm_atomic_plane_set_property()
487 } else if (property == config->prop_in_fence_fd) { in drm_atomic_plane_set_property()
488 if (state->fence) in drm_atomic_plane_set_property()
489 return -EINVAL; in drm_atomic_plane_set_property()
491 if (U642I64(val) == -1) in drm_atomic_plane_set_property()
494 state->fence = sync_file_get_fence(val); in drm_atomic_plane_set_property()
495 if (!state->fence) in drm_atomic_plane_set_property()
496 return -EINVAL; in drm_atomic_plane_set_property()
498 } else if (property == config->prop_crtc_id) { in drm_atomic_plane_set_property()
504 property->base.id, property->name, val); in drm_atomic_plane_set_property()
505 return -EACCES; in drm_atomic_plane_set_property()
508 } else if (property == config->prop_crtc_x) { in drm_atomic_plane_set_property()
509 state->crtc_x = U642I64(val); in drm_atomic_plane_set_property()
510 } else if (property == config->prop_crtc_y) { in drm_atomic_plane_set_property()
511 state->crtc_y = U642I64(val); in drm_atomic_plane_set_property()
512 } else if (property == config->prop_crtc_w) { in drm_atomic_plane_set_property()
513 state->crtc_w = val; in drm_atomic_plane_set_property()
514 } else if (property == config->prop_crtc_h) { in drm_atomic_plane_set_property()
515 state->crtc_h = val; in drm_atomic_plane_set_property()
516 } else if (property == config->prop_src_x) { in drm_atomic_plane_set_property()
517 state->src_x = val; in drm_atomic_plane_set_property()
518 } else if (property == config->prop_src_y) { in drm_atomic_plane_set_property()
519 state->src_y = val; in drm_atomic_plane_set_property()
520 } else if (property == config->prop_src_w) { in drm_atomic_plane_set_property()
521 state->src_w = val; in drm_atomic_plane_set_property()
522 } else if (property == config->prop_src_h) { in drm_atomic_plane_set_property()
523 state->src_h = val; in drm_atomic_plane_set_property()
524 } else if (property == plane->alpha_property) { in drm_atomic_plane_set_property()
525 state->alpha = val; in drm_atomic_plane_set_property()
526 } else if (property == plane->blend_mode_property) { in drm_atomic_plane_set_property()
527 state->pixel_blend_mode = val; in drm_atomic_plane_set_property()
528 } else if (property == plane->rotation_property) { in drm_atomic_plane_set_property()
530 drm_dbg_atomic(plane->dev, in drm_atomic_plane_set_property()
532 plane->base.id, plane->name, val); in drm_atomic_plane_set_property()
533 return -EINVAL; in drm_atomic_plane_set_property()
535 state->rotation = val; in drm_atomic_plane_set_property()
536 } else if (property == plane->zpos_property) { in drm_atomic_plane_set_property()
537 state->zpos = val; in drm_atomic_plane_set_property()
538 } else if (property == plane->color_encoding_property) { in drm_atomic_plane_set_property()
539 state->color_encoding = val; in drm_atomic_plane_set_property()
540 } else if (property == plane->color_range_property) { in drm_atomic_plane_set_property()
541 state->color_range = val; in drm_atomic_plane_set_property()
542 } else if (property == config->prop_fb_damage_clips) { in drm_atomic_plane_set_property()
544 &state->fb_damage_clips, in drm_atomic_plane_set_property()
546 -1, in drm_atomic_plane_set_property()
550 } else if (property == plane->scaling_filter_property) { in drm_atomic_plane_set_property()
551 state->scaling_filter = val; in drm_atomic_plane_set_property()
552 } else if (plane->funcs->atomic_set_property) { in drm_atomic_plane_set_property()
553 return plane->funcs->atomic_set_property(plane, state, in drm_atomic_plane_set_property()
554 property, val); in drm_atomic_plane_set_property()
555 } else if (property == plane->hotspot_x_property) { in drm_atomic_plane_set_property()
556 if (plane->type != DRM_PLANE_TYPE_CURSOR) { in drm_atomic_plane_set_property()
557 drm_dbg_atomic(plane->dev, in drm_atomic_plane_set_property()
559 plane->base.id, plane->name, val); in drm_atomic_plane_set_property()
560 return -EINVAL; in drm_atomic_plane_set_property()
562 state->hotspot_x = val; in drm_atomic_plane_set_property()
563 } else if (property == plane->hotspot_y_property) { in drm_atomic_plane_set_property()
564 if (plane->type != DRM_PLANE_TYPE_CURSOR) { in drm_atomic_plane_set_property()
565 drm_dbg_atomic(plane->dev, in drm_atomic_plane_set_property()
567 plane->base.id, plane->name, val); in drm_atomic_plane_set_property()
568 return -EINVAL; in drm_atomic_plane_set_property()
570 state->hotspot_y = val; in drm_atomic_plane_set_property()
572 drm_dbg_atomic(plane->dev, in drm_atomic_plane_set_property()
573 "[PLANE:%d:%s] unknown property [PROP:%d:%s]\n", in drm_atomic_plane_set_property()
574 plane->base.id, plane->name, in drm_atomic_plane_set_property()
575 property->base.id, property->name); in drm_atomic_plane_set_property()
576 return -EINVAL; in drm_atomic_plane_set_property()
585 struct drm_property *property, uint64_t *val) in drm_atomic_plane_get_property() argument
587 struct drm_device *dev = plane->dev; in drm_atomic_plane_get_property()
588 struct drm_mode_config *config = &dev->mode_config; in drm_atomic_plane_get_property()
590 if (property == config->prop_fb_id) { in drm_atomic_plane_get_property()
591 *val = (state->fb) ? state->fb->base.id : 0; in drm_atomic_plane_get_property()
592 } else if (property == config->prop_in_fence_fd) { in drm_atomic_plane_get_property()
593 *val = -1; in drm_atomic_plane_get_property()
594 } else if (property == config->prop_crtc_id) { in drm_atomic_plane_get_property()
595 *val = (state->crtc) ? state->crtc->base.id : 0; in drm_atomic_plane_get_property()
596 } else if (property == config->prop_crtc_x) { in drm_atomic_plane_get_property()
597 *val = I642U64(state->crtc_x); in drm_atomic_plane_get_property()
598 } else if (property == config->prop_crtc_y) { in drm_atomic_plane_get_property()
599 *val = I642U64(state->crtc_y); in drm_atomic_plane_get_property()
600 } else if (property == config->prop_crtc_w) { in drm_atomic_plane_get_property()
601 *val = state->crtc_w; in drm_atomic_plane_get_property()
602 } else if (property == config->prop_crtc_h) { in drm_atomic_plane_get_property()
603 *val = state->crtc_h; in drm_atomic_plane_get_property()
604 } else if (property == config->prop_src_x) { in drm_atomic_plane_get_property()
605 *val = state->src_x; in drm_atomic_plane_get_property()
606 } else if (property == config->prop_src_y) { in drm_atomic_plane_get_property()
607 *val = state->src_y; in drm_atomic_plane_get_property()
608 } else if (property == config->prop_src_w) { in drm_atomic_plane_get_property()
609 *val = state->src_w; in drm_atomic_plane_get_property()
610 } else if (property == config->prop_src_h) { in drm_atomic_plane_get_property()
611 *val = state->src_h; in drm_atomic_plane_get_property()
612 } else if (property == plane->alpha_property) { in drm_atomic_plane_get_property()
613 *val = state->alpha; in drm_atomic_plane_get_property()
614 } else if (property == plane->blend_mode_property) { in drm_atomic_plane_get_property()
615 *val = state->pixel_blend_mode; in drm_atomic_plane_get_property()
616 } else if (property == plane->rotation_property) { in drm_atomic_plane_get_property()
617 *val = state->rotation; in drm_atomic_plane_get_property()
618 } else if (property == plane->zpos_property) { in drm_atomic_plane_get_property()
619 *val = state->zpos; in drm_atomic_plane_get_property()
620 } else if (property == plane->color_encoding_property) { in drm_atomic_plane_get_property()
621 *val = state->color_encoding; in drm_atomic_plane_get_property()
622 } else if (property == plane->color_range_property) { in drm_atomic_plane_get_property()
623 *val = state->color_range; in drm_atomic_plane_get_property()
624 } else if (property == config->prop_fb_damage_clips) { in drm_atomic_plane_get_property()
625 *val = (state->fb_damage_clips) ? in drm_atomic_plane_get_property()
626 state->fb_damage_clips->base.id : 0; in drm_atomic_plane_get_property()
627 } else if (property == plane->scaling_filter_property) { in drm_atomic_plane_get_property()
628 *val = state->scaling_filter; in drm_atomic_plane_get_property()
629 } else if (plane->funcs->atomic_get_property) { in drm_atomic_plane_get_property()
630 return plane->funcs->atomic_get_property(plane, state, property, val); in drm_atomic_plane_get_property()
631 } else if (property == plane->hotspot_x_property) { in drm_atomic_plane_get_property()
632 *val = state->hotspot_x; in drm_atomic_plane_get_property()
633 } else if (property == plane->hotspot_y_property) { in drm_atomic_plane_get_property()
634 *val = state->hotspot_y; in drm_atomic_plane_get_property()
637 "[PLANE:%d:%s] unknown property [PROP:%d:%s]\n", in drm_atomic_plane_get_property()
638 plane->base.id, plane->name, in drm_atomic_plane_get_property()
639 property->base.id, property->name); in drm_atomic_plane_get_property()
640 return -EINVAL; in drm_atomic_plane_get_property()
651 struct drm_connector *conn = conn_state->connector; in drm_atomic_set_writeback_fb_for_connector()
658 drm_dbg_atomic(conn->dev, in drm_atomic_set_writeback_fb_for_connector()
660 fb->base.id, conn_state); in drm_atomic_set_writeback_fb_for_connector()
662 drm_dbg_atomic(conn->dev, in drm_atomic_set_writeback_fb_for_connector()
671 struct drm_property *property, uint64_t val) in drm_atomic_connector_set_property() argument
673 struct drm_device *dev = connector->dev; in drm_atomic_connector_set_property()
674 struct drm_mode_config *config = &dev->mode_config; in drm_atomic_connector_set_property()
675 bool replaced = false; in drm_atomic_connector_set_property()
678 if (property == config->prop_crtc_id) { in drm_atomic_connector_set_property()
684 property->base.id, property->name, val); in drm_atomic_connector_set_property()
685 return -EACCES; in drm_atomic_connector_set_property()
688 } else if (property == config->dpms_property) { in drm_atomic_connector_set_property()
689 /* setting DPMS property requires special handling, which in drm_atomic_connector_set_property()
691 * now?) atomic writes to DPMS property: in drm_atomic_connector_set_property()
695 property->base.id, property->name); in drm_atomic_connector_set_property()
696 return -EINVAL; in drm_atomic_connector_set_property()
697 } else if (property == config->tv_select_subconnector_property) { in drm_atomic_connector_set_property()
698 state->tv.select_subconnector = val; in drm_atomic_connector_set_property()
699 } else if (property == config->tv_subconnector_property) { in drm_atomic_connector_set_property()
700 state->tv.subconnector = val; in drm_atomic_connector_set_property()
701 } else if (property == config->tv_left_margin_property) { in drm_atomic_connector_set_property()
702 state->tv.margins.left = val; in drm_atomic_connector_set_property()
703 } else if (property == config->tv_right_margin_property) { in drm_atomic_connector_set_property()
704 state->tv.margins.right = val; in drm_atomic_connector_set_property()
705 } else if (property == config->tv_top_margin_property) { in drm_atomic_connector_set_property()
706 state->tv.margins.top = val; in drm_atomic_connector_set_property()
707 } else if (property == config->tv_bottom_margin_property) { in drm_atomic_connector_set_property()
708 state->tv.margins.bottom = val; in drm_atomic_connector_set_property()
709 } else if (property == config->legacy_tv_mode_property) { in drm_atomic_connector_set_property()
710 state->tv.legacy_mode = val; in drm_atomic_connector_set_property()
711 } else if (property == config->tv_mode_property) { in drm_atomic_connector_set_property()
712 state->tv.mode = val; in drm_atomic_connector_set_property()
713 } else if (property == config->tv_brightness_property) { in drm_atomic_connector_set_property()
714 state->tv.brightness = val; in drm_atomic_connector_set_property()
715 } else if (property == config->tv_contrast_property) { in drm_atomic_connector_set_property()
716 state->tv.contrast = val; in drm_atomic_connector_set_property()
717 } else if (property == config->tv_flicker_reduction_property) { in drm_atomic_connector_set_property()
718 state->tv.flicker_reduction = val; in drm_atomic_connector_set_property()
719 } else if (property == config->tv_overscan_property) { in drm_atomic_connector_set_property()
720 state->tv.overscan = val; in drm_atomic_connector_set_property()
721 } else if (property == config->tv_saturation_property) { in drm_atomic_connector_set_property()
722 state->tv.saturation = val; in drm_atomic_connector_set_property()
723 } else if (property == config->tv_hue_property) { in drm_atomic_connector_set_property()
724 state->tv.hue = val; in drm_atomic_connector_set_property()
725 } else if (property == config->link_status_property) { in drm_atomic_connector_set_property()
729 * For an atomic property the userspace doesn't need to be able in drm_atomic_connector_set_property()
737 if (state->link_status != DRM_LINK_STATUS_GOOD) in drm_atomic_connector_set_property()
738 state->link_status = val; in drm_atomic_connector_set_property()
739 } else if (property == config->hdr_output_metadata_property) { in drm_atomic_connector_set_property()
741 &state->hdr_output_metadata, in drm_atomic_connector_set_property()
743 sizeof(struct hdr_output_metadata), -1, in drm_atomic_connector_set_property()
746 } else if (property == config->aspect_ratio_property) { in drm_atomic_connector_set_property()
747 state->picture_aspect_ratio = val; in drm_atomic_connector_set_property()
748 } else if (property == config->content_type_property) { in drm_atomic_connector_set_property()
749 state->content_type = val; in drm_atomic_connector_set_property()
750 } else if (property == connector->scaling_mode_property) { in drm_atomic_connector_set_property()
751 state->scaling_mode = val; in drm_atomic_connector_set_property()
752 } else if (property == config->content_protection_property) { in drm_atomic_connector_set_property()
755 return -EINVAL; in drm_atomic_connector_set_property()
757 state->content_protection = val; in drm_atomic_connector_set_property()
758 } else if (property == config->hdcp_content_type_property) { in drm_atomic_connector_set_property()
759 state->hdcp_content_type = val; in drm_atomic_connector_set_property()
760 } else if (property == connector->colorspace_property) { in drm_atomic_connector_set_property()
761 state->colorspace = val; in drm_atomic_connector_set_property()
762 } else if (property == config->writeback_fb_id_property) { in drm_atomic_connector_set_property()
771 } else if (property == config->writeback_out_fence_ptr_property) { in drm_atomic_connector_set_property()
774 return set_out_fence_for_connector(state->state, connector, in drm_atomic_connector_set_property()
776 } else if (property == connector->max_bpc_property) { in drm_atomic_connector_set_property()
777 state->max_requested_bpc = val; in drm_atomic_connector_set_property()
778 } else if (property == connector->privacy_screen_sw_state_property) { in drm_atomic_connector_set_property()
779 state->privacy_screen_sw_state = val; in drm_atomic_connector_set_property()
780 } else if (property == connector->broadcast_rgb_property) { in drm_atomic_connector_set_property()
781 state->hdmi.broadcast_rgb = val; in drm_atomic_connector_set_property()
782 } else if (connector->funcs->atomic_set_property) { in drm_atomic_connector_set_property()
783 return connector->funcs->atomic_set_property(connector, in drm_atomic_connector_set_property()
784 state, property, val); in drm_atomic_connector_set_property()
786 drm_dbg_atomic(connector->dev, in drm_atomic_connector_set_property()
787 "[CONNECTOR:%d:%s] unknown property [PROP:%d:%s]\n", in drm_atomic_connector_set_property()
788 connector->base.id, connector->name, in drm_atomic_connector_set_property()
789 property->base.id, property->name); in drm_atomic_connector_set_property()
790 return -EINVAL; in drm_atomic_connector_set_property()
799 struct drm_property *property, uint64_t *val) in drm_atomic_connector_get_property() argument
801 struct drm_device *dev = connector->dev; in drm_atomic_connector_get_property()
802 struct drm_mode_config *config = &dev->mode_config; in drm_atomic_connector_get_property()
804 if (property == config->prop_crtc_id) { in drm_atomic_connector_get_property()
805 *val = (state->crtc) ? state->crtc->base.id : 0; in drm_atomic_connector_get_property()
806 } else if (property == config->dpms_property) { in drm_atomic_connector_get_property()
807 if (state->crtc && state->crtc->state->self_refresh_active) in drm_atomic_connector_get_property()
810 *val = connector->dpms; in drm_atomic_connector_get_property()
811 } else if (property == config->tv_select_subconnector_property) { in drm_atomic_connector_get_property()
812 *val = state->tv.select_subconnector; in drm_atomic_connector_get_property()
813 } else if (property == config->tv_subconnector_property) { in drm_atomic_connector_get_property()
814 *val = state->tv.subconnector; in drm_atomic_connector_get_property()
815 } else if (property == config->tv_left_margin_property) { in drm_atomic_connector_get_property()
816 *val = state->tv.margins.left; in drm_atomic_connector_get_property()
817 } else if (property == config->tv_right_margin_property) { in drm_atomic_connector_get_property()
818 *val = state->tv.margins.right; in drm_atomic_connector_get_property()
819 } else if (property == config->tv_top_margin_property) { in drm_atomic_connector_get_property()
820 *val = state->tv.margins.top; in drm_atomic_connector_get_property()
821 } else if (property == config->tv_bottom_margin_property) { in drm_atomic_connector_get_property()
822 *val = state->tv.margins.bottom; in drm_atomic_connector_get_property()
823 } else if (property == config->legacy_tv_mode_property) { in drm_atomic_connector_get_property()
824 *val = state->tv.legacy_mode; in drm_atomic_connector_get_property()
825 } else if (property == config->tv_mode_property) { in drm_atomic_connector_get_property()
826 *val = state->tv.mode; in drm_atomic_connector_get_property()
827 } else if (property == config->tv_brightness_property) { in drm_atomic_connector_get_property()
828 *val = state->tv.brightness; in drm_atomic_connector_get_property()
829 } else if (property == config->tv_contrast_property) { in drm_atomic_connector_get_property()
830 *val = state->tv.contrast; in drm_atomic_connector_get_property()
831 } else if (property == config->tv_flicker_reduction_property) { in drm_atomic_connector_get_property()
832 *val = state->tv.flicker_reduction; in drm_atomic_connector_get_property()
833 } else if (property == config->tv_overscan_property) { in drm_atomic_connector_get_property()
834 *val = state->tv.overscan; in drm_atomic_connector_get_property()
835 } else if (property == config->tv_saturation_property) { in drm_atomic_connector_get_property()
836 *val = state->tv.saturation; in drm_atomic_connector_get_property()
837 } else if (property == config->tv_hue_property) { in drm_atomic_connector_get_property()
838 *val = state->tv.hue; in drm_atomic_connector_get_property()
839 } else if (property == config->link_status_property) { in drm_atomic_connector_get_property()
840 *val = state->link_status; in drm_atomic_connector_get_property()
841 } else if (property == config->aspect_ratio_property) { in drm_atomic_connector_get_property()
842 *val = state->picture_aspect_ratio; in drm_atomic_connector_get_property()
843 } else if (property == config->content_type_property) { in drm_atomic_connector_get_property()
844 *val = state->content_type; in drm_atomic_connector_get_property()
845 } else if (property == connector->colorspace_property) { in drm_atomic_connector_get_property()
846 *val = state->colorspace; in drm_atomic_connector_get_property()
847 } else if (property == connector->scaling_mode_property) { in drm_atomic_connector_get_property()
848 *val = state->scaling_mode; in drm_atomic_connector_get_property()
849 } else if (property == config->hdr_output_metadata_property) { in drm_atomic_connector_get_property()
850 *val = state->hdr_output_metadata ? in drm_atomic_connector_get_property()
851 state->hdr_output_metadata->base.id : 0; in drm_atomic_connector_get_property()
852 } else if (property == config->content_protection_property) { in drm_atomic_connector_get_property()
853 *val = state->content_protection; in drm_atomic_connector_get_property()
854 } else if (property == config->hdcp_content_type_property) { in drm_atomic_connector_get_property()
855 *val = state->hdcp_content_type; in drm_atomic_connector_get_property()
856 } else if (property == config->writeback_fb_id_property) { in drm_atomic_connector_get_property()
857 /* Writeback framebuffer is one-shot, write and forget */ in drm_atomic_connector_get_property()
859 } else if (property == config->writeback_out_fence_ptr_property) { in drm_atomic_connector_get_property()
861 } else if (property == connector->max_bpc_property) { in drm_atomic_connector_get_property()
862 *val = state->max_requested_bpc; in drm_atomic_connector_get_property()
863 } else if (property == connector->privacy_screen_sw_state_property) { in drm_atomic_connector_get_property()
864 *val = state->privacy_screen_sw_state; in drm_atomic_connector_get_property()
865 } else if (property == connector->broadcast_rgb_property) { in drm_atomic_connector_get_property()
866 *val = state->hdmi.broadcast_rgb; in drm_atomic_connector_get_property()
867 } else if (connector->funcs->atomic_get_property) { in drm_atomic_connector_get_property()
868 return connector->funcs->atomic_get_property(connector, in drm_atomic_connector_get_property()
869 state, property, val); in drm_atomic_connector_get_property()
872 "[CONNECTOR:%d:%s] unknown property [PROP:%d:%s]\n", in drm_atomic_connector_get_property()
873 connector->base.id, connector->name, in drm_atomic_connector_get_property()
874 property->base.id, property->name); in drm_atomic_connector_get_property()
875 return -EINVAL; in drm_atomic_connector_get_property()
882 struct drm_property *property, uint64_t *val) in drm_atomic_get_property() argument
884 struct drm_device *dev = property->dev; in drm_atomic_get_property()
887 switch (obj->type) { in drm_atomic_get_property()
891 WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex)); in drm_atomic_get_property()
893 connector->state, property, val); in drm_atomic_get_property()
899 WARN_ON(!drm_modeset_is_locked(&crtc->mutex)); in drm_atomic_get_property()
901 crtc->state, property, val); in drm_atomic_get_property()
907 WARN_ON(!drm_modeset_is_locked(&plane->mutex)); in drm_atomic_get_property()
909 plane->state, property, val); in drm_atomic_get_property()
913 drm_dbg_atomic(dev, "[OBJECT:%d] has no properties\n", obj->id); in drm_atomic_get_property()
914 ret = -EINVAL; in drm_atomic_get_property()
934 e->event.base.type = DRM_EVENT_FLIP_COMPLETE; in create_vblank_event()
935 e->event.base.length = sizeof(e->event); in create_vblank_event()
936 e->event.vbl.crtc_id = crtc->base.id; in create_vblank_event()
937 e->event.vbl.user_data = user_data; in create_vblank_event()
950 int i, ret, old_mode = connector->dpms; in drm_atomic_connector_commit_dpms()
951 bool active = false; in drm_atomic_connector_commit_dpms()
953 ret = drm_modeset_lock(&state->dev->mode_config.connection_mutex, in drm_atomic_connector_commit_dpms()
954 state->acquire_ctx); in drm_atomic_connector_commit_dpms()
961 if (connector->dpms == mode) in drm_atomic_connector_commit_dpms()
964 connector->dpms = mode; in drm_atomic_connector_commit_dpms()
966 crtc = connector->state->crtc; in drm_atomic_connector_commit_dpms()
980 if (new_conn_state->crtc != crtc) in drm_atomic_connector_commit_dpms()
982 if (tmp_connector->dpms == DRM_MODE_DPMS_ON) { in drm_atomic_connector_commit_dpms()
988 crtc_state->active = active; in drm_atomic_connector_commit_dpms()
992 connector->dpms = old_mode; in drm_atomic_connector_commit_dpms()
1000 drm_dbg_atomic(prop->dev, in drm_atomic_check_prop_changes()
1002 prop->base.id, prop->name); in drm_atomic_check_prop_changes()
1003 return -EINVAL; in drm_atomic_check_prop_changes()
1014 bool async_flip) in drm_atomic_set_property()
1021 return -EINVAL; in drm_atomic_set_property()
1023 switch (obj->type) { in drm_atomic_set_property()
1070 struct drm_mode_config *config = &plane->dev->mode_config; in drm_atomic_set_property()
1071 const struct drm_plane_helper_funcs *plane_funcs = plane->helper_private; in drm_atomic_set_property()
1081 if ((prop != config->prop_fb_id && in drm_atomic_set_property()
1082 prop != config->prop_in_fence_fd && in drm_atomic_set_property()
1083 prop != config->prop_fb_damage_clips)) { in drm_atomic_set_property()
1089 /* ask the driver if this non-primary plane is supported */ in drm_atomic_set_property()
1090 if (plane->type != DRM_PLANE_TYPE_PRIMARY) { in drm_atomic_set_property()
1091 ret = -EINVAL; in drm_atomic_set_property()
1093 if (plane_funcs && plane_funcs->atomic_async_check) in drm_atomic_set_property()
1094 ret = plane_funcs->atomic_async_check(plane, state, true); in drm_atomic_set_property()
1097 drm_dbg_atomic(prop->dev, in drm_atomic_set_property()
1099 obj->id, plane->name); in drm_atomic_set_property()
1111 drm_dbg_atomic(prop->dev, "[OBJECT:%d] has no properties\n", obj->id); in drm_atomic_set_property()
1112 ret = -EINVAL; in drm_atomic_set_property()
1137 * Use this property to pass a fence that DRM should wait on before
1141 * fence_array if a merged fence is received. Passing -1 here means no
1154 * Use this property to pass a file descriptor pointer to DRM. Once the
1163 * returned will be -1. On a Atomic Commit with the
1164 * DRM_MODE_ATOMIC_TEST_ONLY flag the out fence will also be set to -1.
1166 * Note that out-fences don't have a special interface to drivers and are
1181 fence_state->fd = get_unused_fd_flags(O_CLOEXEC); in setup_out_fence()
1182 if (fence_state->fd < 0) in setup_out_fence()
1183 return fence_state->fd; in setup_out_fence()
1185 if (put_user(fence_state->fd, fence_state->out_fence_ptr)) in setup_out_fence()
1186 return -EFAULT; in setup_out_fence()
1188 fence_state->sync_file = sync_file_create(fence); in setup_out_fence()
1189 if (!fence_state->sync_file) in setup_out_fence()
1190 return -ENOMEM; in setup_out_fence()
1208 if (arg->flags & DRM_MODE_ATOMIC_TEST_ONLY) in prepare_signaling()
1214 fence_ptr = get_out_fence_for_crtc(crtc_state->state, crtc); in prepare_signaling()
1216 if (arg->flags & DRM_MODE_PAGE_FLIP_EVENT || fence_ptr) { in prepare_signaling()
1219 e = create_vblank_event(crtc, arg->user_data); in prepare_signaling()
1221 return -ENOMEM; in prepare_signaling()
1223 crtc_state->event = e; in prepare_signaling()
1226 if (arg->flags & DRM_MODE_PAGE_FLIP_EVENT) { in prepare_signaling()
1227 struct drm_pending_vblank_event *e = crtc_state->event; in prepare_signaling()
1232 ret = drm_event_reserve_init(dev, file_priv, &e->base, in prepare_signaling()
1233 &e->event.base); in prepare_signaling()
1236 crtc_state->event = NULL; in prepare_signaling()
1248 return -ENOMEM; in prepare_signaling()
1257 return -ENOMEM; in prepare_signaling()
1265 crtc_state->event->base.fence = fence; in prepare_signaling()
1277 if (!conn_state->writeback_job) in prepare_signaling()
1287 return -ENOMEM; in prepare_signaling()
1297 return -ENOMEM; in prepare_signaling()
1305 conn_state->writeback_job->out_fence = fence; in prepare_signaling()
1312 if (c == 0 && (arg->flags & DRM_MODE_PAGE_FLIP_EVENT)) { in prepare_signaling()
1314 return -EINVAL; in prepare_signaling()
1324 bool install_fds) in complete_signaling()
1333 fence_state[i].sync_file->file); in complete_signaling()
1340 struct drm_pending_vblank_event *event = crtc_state->event; in complete_signaling()
1346 if (event && (event->base.fence || event->base.file_priv)) { in complete_signaling()
1347 drm_event_cancel_free(dev, &event->base); in complete_signaling()
1348 crtc_state->event = NULL; in complete_signaling()
1357 fput(fence_state[i].sync_file->file); in complete_signaling()
1363 put_user(-1, fence_state[i].out_fence_ptr)) in complete_signaling()
1378 crtc_state->async_flip = true; in set_async_flip()
1386 uint32_t __user *objs_ptr = (uint32_t __user *)(unsigned long)(arg->objs_ptr); in drm_mode_atomic_ioctl()
1387 uint32_t __user *count_props_ptr = (uint32_t __user *)(unsigned long)(arg->count_props_ptr); in drm_mode_atomic_ioctl()
1388 uint32_t __user *props_ptr = (uint32_t __user *)(unsigned long)(arg->props_ptr); in drm_mode_atomic_ioctl()
1389 uint64_t __user *prop_values_ptr = (uint64_t __user *)(unsigned long)(arg->prop_values_ptr); in drm_mode_atomic_ioctl()
1396 bool async_flip = false; in drm_mode_atomic_ioctl()
1400 return -EOPNOTSUPP; in drm_mode_atomic_ioctl()
1406 if (!file_priv->atomic) { in drm_mode_atomic_ioctl()
1409 return -EINVAL; in drm_mode_atomic_ioctl()
1412 if (arg->flags & ~DRM_MODE_ATOMIC_FLAGS) { in drm_mode_atomic_ioctl()
1414 return -EINVAL; in drm_mode_atomic_ioctl()
1417 if (arg->reserved) { in drm_mode_atomic_ioctl()
1419 return -EINVAL; in drm_mode_atomic_ioctl()
1422 if (arg->flags & DRM_MODE_PAGE_FLIP_ASYNC) { in drm_mode_atomic_ioctl()
1423 if (!dev->mode_config.async_page_flip) { in drm_mode_atomic_ioctl()
1426 return -EINVAL; in drm_mode_atomic_ioctl()
1433 if ((arg->flags & DRM_MODE_ATOMIC_TEST_ONLY) && in drm_mode_atomic_ioctl()
1434 (arg->flags & DRM_MODE_PAGE_FLIP_EVENT)) { in drm_mode_atomic_ioctl()
1436 "commit failed: page-flip event requested with test-only commit\n"); in drm_mode_atomic_ioctl()
1437 return -EINVAL; in drm_mode_atomic_ioctl()
1442 return -ENOMEM; in drm_mode_atomic_ioctl()
1445 state->acquire_ctx = &ctx; in drm_mode_atomic_ioctl()
1446 state->allow_modeset = !!(arg->flags & DRM_MODE_ATOMIC_ALLOW_MODESET); in drm_mode_atomic_ioctl()
1454 for (i = 0; i < arg->count_objs; i++) { in drm_mode_atomic_ioctl()
1459 ret = -EFAULT; in drm_mode_atomic_ioctl()
1466 ret = -ENOENT; in drm_mode_atomic_ioctl()
1470 if (!obj->properties) { in drm_mode_atomic_ioctl()
1473 ret = -ENOENT; in drm_mode_atomic_ioctl()
1479 ret = -EFAULT; in drm_mode_atomic_ioctl()
1492 ret = -EFAULT; in drm_mode_atomic_ioctl()
1499 "[OBJECT:%d] cannot find property ID %d", in drm_mode_atomic_ioctl()
1502 ret = -ENOENT; in drm_mode_atomic_ioctl()
1510 ret = -EFAULT; in drm_mode_atomic_ioctl()
1532 if (arg->flags & DRM_MODE_PAGE_FLIP_ASYNC) in drm_mode_atomic_ioctl()
1535 if (arg->flags & DRM_MODE_ATOMIC_TEST_ONLY) { in drm_mode_atomic_ioctl()
1537 } else if (arg->flags & DRM_MODE_ATOMIC_NONBLOCK) { in drm_mode_atomic_ioctl()
1546 if (ret == -EDEADLK) { in drm_mode_atomic_ioctl()