Lines Matching full:crtc

38 static void assert_vblank_disabled(struct drm_crtc *crtc)  in assert_vblank_disabled()  argument
40 struct intel_display *display = to_intel_display(crtc->dev); in assert_vblank_disabled()
42 if (INTEL_DISPLAY_STATE_WARN(display, drm_crtc_vblank_get(crtc) == 0, in assert_vblank_disabled()
43 "[CRTC:%d:%s] vblank assertion failure (expected off, current on)\n", in assert_vblank_disabled()
44 crtc->base.id, crtc->name)) in assert_vblank_disabled()
45 drm_crtc_vblank_put(crtc); in assert_vblank_disabled()
56 struct intel_crtc *crtc; in intel_crtc_for_pipe() local
58 for_each_intel_crtc(display->drm, crtc) { in intel_crtc_for_pipe()
59 if (crtc->pipe == pipe) in intel_crtc_for_pipe()
60 return crtc; in intel_crtc_for_pipe()
66 void intel_crtc_wait_for_next_vblank(struct intel_crtc *crtc) in intel_crtc_wait_for_next_vblank() argument
68 drm_crtc_wait_one_vblank(&crtc->base); in intel_crtc_wait_for_next_vblank()
75 struct intel_crtc *crtc = intel_crtc_for_pipe(display, pipe); in intel_wait_for_vblank_if_active() local
77 if (crtc->active) in intel_wait_for_vblank_if_active()
78 intel_crtc_wait_for_next_vblank(crtc); in intel_wait_for_vblank_if_active()
81 u32 intel_crtc_get_vblank_counter(struct intel_crtc *crtc) in intel_crtc_get_vblank_counter() argument
83 struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(&crtc->base); in intel_crtc_get_vblank_counter()
85 if (!crtc->active) in intel_crtc_get_vblank_counter()
89 return (u32)drm_crtc_accurate_vblank_count(&crtc->base); in intel_crtc_get_vblank_counter()
91 return crtc->base.funcs->get_vblank_counter(&crtc->base); in intel_crtc_get_vblank_counter()
96 struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev); in intel_crtc_max_vblank_count()
126 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); in intel_crtc_vblank_on() local
128 crtc->block_dc_for_vblank = intel_psr_needs_block_dc_vblank(crtc_state); in intel_crtc_vblank_on()
130 assert_vblank_disabled(&crtc->base); in intel_crtc_vblank_on()
131 drm_crtc_set_max_vblank_count(&crtc->base, in intel_crtc_vblank_on()
133 drm_crtc_vblank_on(&crtc->base); in intel_crtc_vblank_on()
140 trace_intel_pipe_enable(crtc); in intel_crtc_vblank_on()
145 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); in intel_crtc_vblank_off() local
146 struct intel_display *display = to_intel_display(crtc); in intel_crtc_vblank_off()
153 trace_intel_pipe_disable(crtc); in intel_crtc_vblank_off()
155 drm_crtc_vblank_off(&crtc->base); in intel_crtc_vblank_off()
156 assert_vblank_disabled(&crtc->base); in intel_crtc_vblank_off()
158 crtc->block_dc_for_vblank = false; in intel_crtc_vblank_off()
163 struct intel_crtc_state *intel_crtc_state_alloc(struct intel_crtc *crtc) in intel_crtc_state_alloc() argument
170 intel_crtc_state_reset(crtc_state, crtc); in intel_crtc_state_alloc()
176 struct intel_crtc *crtc) in intel_crtc_state_reset() argument
180 __drm_atomic_helper_crtc_state_reset(&crtc_state->uapi, &crtc->base); in intel_crtc_state_reset()
193 struct intel_crtc *crtc; in intel_crtc_alloc() local
195 crtc = kzalloc(sizeof(*crtc), GFP_KERNEL); in intel_crtc_alloc()
196 if (!crtc) in intel_crtc_alloc()
199 crtc_state = intel_crtc_state_alloc(crtc); in intel_crtc_alloc()
201 kfree(crtc); in intel_crtc_alloc()
205 crtc->base.state = &crtc_state->uapi; in intel_crtc_alloc()
206 crtc->config = crtc_state; in intel_crtc_alloc()
208 return crtc; in intel_crtc_alloc()
211 static void intel_crtc_free(struct intel_crtc *crtc) in intel_crtc_free() argument
213 intel_crtc_destroy_state(&crtc->base, crtc->base.state); in intel_crtc_free()
214 kfree(crtc); in intel_crtc_free()
219 struct intel_crtc *crtc = to_intel_crtc(_crtc); in intel_crtc_destroy() local
221 cpu_latency_qos_remove_request(&crtc->vblank_pm_qos); in intel_crtc_destroy()
223 drm_crtc_cleanup(&crtc->base); in intel_crtc_destroy()
224 kfree(crtc); in intel_crtc_destroy()
227 static int intel_crtc_late_register(struct drm_crtc *crtc) in intel_crtc_late_register() argument
229 intel_crtc_debugfs_add(to_intel_crtc(crtc)); in intel_crtc_late_register()
311 struct intel_crtc *crtc; in intel_crtc_init() local
314 crtc = intel_crtc_alloc(); in intel_crtc_init()
315 if (IS_ERR(crtc)) in intel_crtc_init()
316 return PTR_ERR(crtc); in intel_crtc_init()
318 crtc->pipe = pipe; in intel_crtc_init()
319 crtc->num_scalers = DISPLAY_RUNTIME_INFO(dev_priv)->num_scalers[pipe]; in intel_crtc_init()
329 crtc->plane_ids_mask |= BIT(primary->id); in intel_crtc_init()
331 intel_init_fifo_underrun_reporting(dev_priv, crtc, false); in intel_crtc_init()
344 crtc->plane_ids_mask |= BIT(plane->id); in intel_crtc_init()
352 crtc->plane_ids_mask |= BIT(cursor->id); in intel_crtc_init()
373 ret = drm_crtc_init_with_planes(&dev_priv->drm, &crtc->base, in intel_crtc_init()
380 drm_crtc_create_scaling_filter_property(&crtc->base, in intel_crtc_init()
384 intel_color_crtc_init(crtc); in intel_crtc_init()
385 intel_drrs_crtc_init(crtc); in intel_crtc_init()
386 intel_crtc_crc_init(crtc); in intel_crtc_init()
388 cpu_latency_qos_add_request(&crtc->vblank_pm_qos, PM_QOS_DEFAULT_VALUE); in intel_crtc_init()
390 drm_WARN_ON(&dev_priv->drm, drm_crtc_index(&crtc->base) != crtc->pipe); in intel_crtc_init()
395 intel_crtc_free(crtc); in intel_crtc_init()
405 struct intel_crtc *crtc; in intel_crtc_get_pipe_from_crtc_id_ioctl() local
411 crtc = to_intel_crtc(drm_crtc); in intel_crtc_get_pipe_from_crtc_id_ioctl()
412 pipe_from_crtc_id->pipe = crtc->pipe; in intel_crtc_get_pipe_from_crtc_id_ioctl()
432 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); in intel_crtc_vblank_work() local
434 trace_intel_crtc_vblank_work_start(crtc); in intel_crtc_vblank_work()
439 spin_lock_irq(&crtc->base.dev->event_lock); in intel_crtc_vblank_work()
440 drm_crtc_send_vblank_event(&crtc->base, crtc_state->uapi.event); in intel_crtc_vblank_work()
441 spin_unlock_irq(&crtc->base.dev->event_lock); in intel_crtc_vblank_work()
445 trace_intel_crtc_vblank_work_end(crtc); in intel_crtc_vblank_work()
450 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); in intel_crtc_vblank_work_init() local
452 drm_vblank_work_init(&crtc_state->vblank_work, &crtc->base, in intel_crtc_vblank_work_init()
458 cpu_latency_qos_update_request(&crtc->vblank_pm_qos, 0); in intel_crtc_vblank_work_init()
464 struct intel_crtc *crtc; in intel_wait_for_vblank_workers() local
467 for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) { in intel_wait_for_vblank_workers()
472 cpu_latency_qos_update_request(&crtc->vblank_pm_qos, in intel_wait_for_vblank_workers()
502 * @crtc: the crtc
513 struct intel_crtc *crtc) in intel_pipe_update_start() argument
515 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); in intel_pipe_update_start()
517 intel_atomic_get_old_crtc_state(state, crtc); in intel_pipe_update_start()
519 intel_atomic_get_new_crtc_state(state, crtc); in intel_pipe_update_start()
527 &crtc->flip_done_event); in intel_pipe_update_start()
541 if (old_plane_state->uapi.crtc == &crtc->base) in intel_pipe_update_start()
549 if (drm_WARN_ON(&dev_priv->drm, drm_crtc_vblank_get(&crtc->base))) in intel_pipe_update_start()
561 crtc->debug.min_vbl = evade.min; in intel_pipe_update_start()
562 crtc->debug.max_vbl = evade.max; in intel_pipe_update_start()
563 trace_intel_pipe_update_start(crtc); in intel_pipe_update_start()
567 drm_crtc_vblank_put(&crtc->base); in intel_pipe_update_start()
569 crtc->debug.scanline_start = scanline; in intel_pipe_update_start()
570 crtc->debug.start_vbl_time = ktime_get(); in intel_pipe_update_start()
571 crtc->debug.start_vbl_count = intel_crtc_get_vblank_counter(crtc); in intel_pipe_update_start()
573 trace_intel_pipe_update_vblank_evaded(crtc); in intel_pipe_update_start()
581 static void dbg_vblank_evade(struct intel_crtc *crtc, ktime_t end) in dbg_vblank_evade() argument
583 u64 delta = ktime_to_ns(ktime_sub(end, crtc->debug.start_vbl_time)); in dbg_vblank_evade()
587 if (h >= ARRAY_SIZE(crtc->debug.vbl.times)) in dbg_vblank_evade()
588 h = ARRAY_SIZE(crtc->debug.vbl.times) - 1; in dbg_vblank_evade()
589 crtc->debug.vbl.times[h]++; in dbg_vblank_evade()
591 crtc->debug.vbl.sum += delta; in dbg_vblank_evade()
592 if (!crtc->debug.vbl.min || delta < crtc->debug.vbl.min) in dbg_vblank_evade()
593 crtc->debug.vbl.min = delta; in dbg_vblank_evade()
594 if (delta > crtc->debug.vbl.max) in dbg_vblank_evade()
595 crtc->debug.vbl.max = delta; in dbg_vblank_evade()
598 drm_dbg_kms(crtc->base.dev, in dbg_vblank_evade()
600 pipe_name(crtc->pipe), in dbg_vblank_evade()
603 crtc->debug.vbl.over++; in dbg_vblank_evade()
607 static void dbg_vblank_evade(struct intel_crtc *crtc, ktime_t end) {} in dbg_vblank_evade() argument
612 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); in intel_crtc_arm_vblank_event() local
618 drm_WARN_ON(crtc->base.dev, drm_crtc_vblank_get(&crtc->base) != 0); in intel_crtc_arm_vblank_event()
620 spin_lock_irqsave(&crtc->base.dev->event_lock, irqflags); in intel_crtc_arm_vblank_event()
621 drm_crtc_arm_vblank_event(&crtc->base, crtc_state->uapi.event); in intel_crtc_arm_vblank_event()
622 spin_unlock_irqrestore(&crtc->base.dev->event_lock, irqflags); in intel_crtc_arm_vblank_event()
630 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); in intel_crtc_prepare_vblank_event() local
633 spin_lock_irqsave(&crtc->base.dev->event_lock, irqflags); in intel_crtc_prepare_vblank_event()
635 spin_unlock_irqrestore(&crtc->base.dev->event_lock, irqflags); in intel_crtc_prepare_vblank_event()
643 * @crtc: the crtc
650 struct intel_crtc *crtc) in intel_pipe_update_end() argument
653 intel_atomic_get_new_crtc_state(state, crtc); in intel_pipe_update_end()
654 enum pipe pipe = crtc->pipe; in intel_pipe_update_end()
655 int scanline_end = intel_get_crtc_scanline(crtc); in intel_pipe_update_end()
656 u32 end_vbl_count = intel_crtc_get_vblank_counter(crtc); in intel_pipe_update_end()
658 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); in intel_pipe_update_end()
663 trace_intel_pipe_update_end(crtc, end_vbl_count, scanline_end); in intel_pipe_update_end()
679 drm_crtc_accurate_vblank_count(&crtc->base) + 1, in intel_pipe_update_end()
691 if (old_plane_state->uapi.crtc == &crtc->base && in intel_pipe_update_end()
694 drm_crtc_accurate_vblank_count(&crtc->base) + 1, in intel_pipe_update_end()
724 if (crtc->debug.start_vbl_count && in intel_pipe_update_end()
725 crtc->debug.start_vbl_count != end_vbl_count) { in intel_pipe_update_end()
728 pipe_name(pipe), crtc->debug.start_vbl_count, in intel_pipe_update_end()
731 crtc->debug.start_vbl_time), in intel_pipe_update_end()
732 crtc->debug.min_vbl, crtc->debug.max_vbl, in intel_pipe_update_end()
733 crtc->debug.scanline_start, scanline_end); in intel_pipe_update_end()
736 dbg_vblank_evade(crtc, end_vbl_time); in intel_pipe_update_end()