Lines Matching refs:crtc

31 static void assert_vblank_disabled(struct drm_crtc *crtc)  in assert_vblank_disabled()  argument
33 if (I915_STATE_WARN_ON(drm_crtc_vblank_get(crtc) == 0)) in assert_vblank_disabled()
34 drm_crtc_vblank_put(crtc); in assert_vblank_disabled()
37 u32 intel_crtc_get_vblank_counter(struct intel_crtc *crtc) in intel_crtc_get_vblank_counter() argument
39 struct drm_device *dev = crtc->base.dev; in intel_crtc_get_vblank_counter()
40 struct drm_vblank_crtc *vblank = &dev->vblank[drm_crtc_index(&crtc->base)]; in intel_crtc_get_vblank_counter()
42 if (!crtc->active) in intel_crtc_get_vblank_counter()
46 return (u32)drm_crtc_accurate_vblank_count(&crtc->base); in intel_crtc_get_vblank_counter()
48 return crtc->base.funcs->get_vblank_counter(&crtc->base); in intel_crtc_get_vblank_counter()
53 struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev); in intel_crtc_max_vblank_count()
83 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); in intel_crtc_vblank_on() local
85 assert_vblank_disabled(&crtc->base); in intel_crtc_vblank_on()
86 drm_crtc_set_max_vblank_count(&crtc->base, in intel_crtc_vblank_on()
88 drm_crtc_vblank_on(&crtc->base); in intel_crtc_vblank_on()
95 trace_intel_pipe_enable(crtc); in intel_crtc_vblank_on()
100 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); in intel_crtc_vblank_off() local
107 trace_intel_pipe_disable(crtc); in intel_crtc_vblank_off()
109 drm_crtc_vblank_off(&crtc->base); in intel_crtc_vblank_off()
110 assert_vblank_disabled(&crtc->base); in intel_crtc_vblank_off()
113 struct intel_crtc_state *intel_crtc_state_alloc(struct intel_crtc *crtc) in intel_crtc_state_alloc() argument
120 intel_crtc_state_reset(crtc_state, crtc); in intel_crtc_state_alloc()
126 struct intel_crtc *crtc) in intel_crtc_state_reset() argument
130 __drm_atomic_helper_crtc_state_reset(&crtc_state->uapi, &crtc->base); in intel_crtc_state_reset()
142 struct intel_crtc *crtc; in intel_crtc_alloc() local
144 crtc = kzalloc(sizeof(*crtc), GFP_KERNEL); in intel_crtc_alloc()
145 if (!crtc) in intel_crtc_alloc()
148 crtc_state = intel_crtc_state_alloc(crtc); in intel_crtc_alloc()
150 kfree(crtc); in intel_crtc_alloc()
154 crtc->base.state = &crtc_state->uapi; in intel_crtc_alloc()
155 crtc->config = crtc_state; in intel_crtc_alloc()
157 return crtc; in intel_crtc_alloc()
160 static void intel_crtc_free(struct intel_crtc *crtc) in intel_crtc_free() argument
162 intel_crtc_destroy_state(&crtc->base, crtc->base.state); in intel_crtc_free()
163 kfree(crtc); in intel_crtc_free()
168 struct intel_crtc *crtc = to_intel_crtc(_crtc); in intel_crtc_destroy() local
170 drm_crtc_cleanup(&crtc->base); in intel_crtc_destroy()
171 kfree(crtc); in intel_crtc_destroy()
174 static int intel_crtc_late_register(struct drm_crtc *crtc) in intel_crtc_late_register() argument
176 intel_crtc_debugfs_add(crtc); in intel_crtc_late_register()
258 struct intel_crtc *crtc; in intel_crtc_init() local
261 crtc = intel_crtc_alloc(); in intel_crtc_init()
262 if (IS_ERR(crtc)) in intel_crtc_init()
263 return PTR_ERR(crtc); in intel_crtc_init()
265 crtc->pipe = pipe; in intel_crtc_init()
266 crtc->num_scalers = RUNTIME_INFO(dev_priv)->num_scalers[pipe]; in intel_crtc_init()
277 crtc->plane_ids_mask |= BIT(primary->id); in intel_crtc_init()
291 crtc->plane_ids_mask |= BIT(plane->id); in intel_crtc_init()
299 crtc->plane_ids_mask |= BIT(cursor->id); in intel_crtc_init()
320 ret = drm_crtc_init_with_planes(&dev_priv->drm, &crtc->base, in intel_crtc_init()
328 dev_priv->pipe_to_crtc_mapping[pipe] = crtc; in intel_crtc_init()
335 dev_priv->plane_to_crtc_mapping[i9xx_plane] = crtc; in intel_crtc_init()
339 drm_crtc_create_scaling_filter_property(&crtc->base, in intel_crtc_init()
343 intel_color_init(crtc); in intel_crtc_init()
345 intel_crtc_crc_init(crtc); in intel_crtc_init()
347 drm_WARN_ON(&dev_priv->drm, drm_crtc_index(&crtc->base) != crtc->pipe); in intel_crtc_init()
352 intel_crtc_free(crtc); in intel_crtc_init()
392 struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->uapi.crtc); in intel_pipe_update_start() local
393 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); in intel_pipe_update_start()
397 wait_queue_head_t *wq = drm_crtc_vblank_waitqueue(&crtc->base); in intel_pipe_update_start()
418 if (drm_WARN_ON(&dev_priv->drm, drm_crtc_vblank_get(&crtc->base))) in intel_pipe_update_start()
430 crtc->debug.min_vbl = min; in intel_pipe_update_start()
431 crtc->debug.max_vbl = max; in intel_pipe_update_start()
432 trace_intel_pipe_update_start(crtc); in intel_pipe_update_start()
442 scanline = intel_get_crtc_scanline(crtc); in intel_pipe_update_start()
449 pipe_name(crtc->pipe)); in intel_pipe_update_start()
462 drm_crtc_vblank_put(&crtc->base); in intel_pipe_update_start()
480 scanline = intel_get_crtc_scanline(crtc); in intel_pipe_update_start()
482 crtc->debug.scanline_start = scanline; in intel_pipe_update_start()
483 crtc->debug.start_vbl_time = ktime_get(); in intel_pipe_update_start()
484 crtc->debug.start_vbl_count = intel_crtc_get_vblank_counter(crtc); in intel_pipe_update_start()
486 trace_intel_pipe_update_vblank_evaded(crtc); in intel_pipe_update_start()
494 static void dbg_vblank_evade(struct intel_crtc *crtc, ktime_t end) in dbg_vblank_evade() argument
496 u64 delta = ktime_to_ns(ktime_sub(end, crtc->debug.start_vbl_time)); in dbg_vblank_evade()
500 if (h >= ARRAY_SIZE(crtc->debug.vbl.times)) in dbg_vblank_evade()
501 h = ARRAY_SIZE(crtc->debug.vbl.times) - 1; in dbg_vblank_evade()
502 crtc->debug.vbl.times[h]++; in dbg_vblank_evade()
504 crtc->debug.vbl.sum += delta; in dbg_vblank_evade()
505 if (!crtc->debug.vbl.min || delta < crtc->debug.vbl.min) in dbg_vblank_evade()
506 crtc->debug.vbl.min = delta; in dbg_vblank_evade()
507 if (delta > crtc->debug.vbl.max) in dbg_vblank_evade()
508 crtc->debug.vbl.max = delta; in dbg_vblank_evade()
511 drm_dbg_kms(crtc->base.dev, in dbg_vblank_evade()
513 pipe_name(crtc->pipe), in dbg_vblank_evade()
516 crtc->debug.vbl.over++; in dbg_vblank_evade()
520 static void dbg_vblank_evade(struct intel_crtc *crtc, ktime_t end) {} in dbg_vblank_evade() argument
533 struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->uapi.crtc); in intel_pipe_update_end() local
534 enum pipe pipe = crtc->pipe; in intel_pipe_update_end()
535 int scanline_end = intel_get_crtc_scanline(crtc); in intel_pipe_update_end()
536 u32 end_vbl_count = intel_crtc_get_vblank_counter(crtc); in intel_pipe_update_end()
538 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); in intel_pipe_update_end()
543 trace_intel_pipe_update_end(crtc, end_vbl_count, scanline_end); in intel_pipe_update_end()
559 drm_crtc_vblank_get(&crtc->base) != 0); in intel_pipe_update_end()
561 spin_lock(&crtc->base.dev->event_lock); in intel_pipe_update_end()
562 drm_crtc_arm_vblank_event(&crtc->base, in intel_pipe_update_end()
564 spin_unlock(&crtc->base.dev->event_lock); in intel_pipe_update_end()
577 if (crtc->debug.start_vbl_count && in intel_pipe_update_end()
578 crtc->debug.start_vbl_count != end_vbl_count) { in intel_pipe_update_end()
581 pipe_name(pipe), crtc->debug.start_vbl_count, in intel_pipe_update_end()
584 crtc->debug.start_vbl_time), in intel_pipe_update_end()
585 crtc->debug.min_vbl, crtc->debug.max_vbl, in intel_pipe_update_end()
586 crtc->debug.scanline_start, scanline_end); in intel_pipe_update_end()
589 dbg_vblank_evade(crtc, end_vbl_time); in intel_pipe_update_end()