Lines Matching full:crtc
48 static struct dpu_kms *_dpu_crtc_get_kms(struct drm_crtc *crtc) in _dpu_crtc_get_kms() argument
50 struct msm_drm_private *priv = crtc->dev->dev_private; in _dpu_crtc_get_kms()
55 static void dpu_crtc_destroy(struct drm_crtc *crtc) in dpu_crtc_destroy() argument
57 struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc); in dpu_crtc_destroy()
61 if (!crtc) in dpu_crtc_destroy()
64 drm_crtc_cleanup(crtc); in dpu_crtc_destroy()
94 static void _dpu_crtc_program_lm_output_roi(struct drm_crtc *crtc) in _dpu_crtc_program_lm_output_roi() argument
99 crtc_state = to_dpu_crtc_state(crtc->state); in _dpu_crtc_program_lm_output_roi()
118 static void _dpu_crtc_blend_setup_mixer(struct drm_crtc *crtc, in _dpu_crtc_blend_setup_mixer() argument
124 struct dpu_crtc_state *cstate = to_dpu_crtc_state(crtc->state); in _dpu_crtc_blend_setup_mixer()
135 drm_atomic_crtc_for_each_plane(plane, crtc) { in _dpu_crtc_blend_setup_mixer()
145 DPU_DEBUG("crtc %d stage:%d - plane %d sspp %d fb %d\n", in _dpu_crtc_blend_setup_mixer()
146 crtc->base.id, in _dpu_crtc_blend_setup_mixer()
163 trace_dpu_crtc_setup_mixer(DRMID(crtc), DRMID(plane), in _dpu_crtc_blend_setup_mixer()
184 _dpu_crtc_program_lm_output_roi(crtc); in _dpu_crtc_blend_setup_mixer()
188 * _dpu_crtc_blend_setup - configure crtc mixers
189 * @crtc: Pointer to drm crtc structure
191 static void _dpu_crtc_blend_setup(struct drm_crtc *crtc) in _dpu_crtc_blend_setup() argument
193 struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc); in _dpu_crtc_blend_setup()
194 struct dpu_crtc_state *cstate = to_dpu_crtc_state(crtc->state); in _dpu_crtc_blend_setup()
213 _dpu_crtc_blend_setup_mixer(crtc, dpu_crtc, mixer); in _dpu_crtc_blend_setup()
245 * @crtc: Pointer to drm crtc structure
247 static void _dpu_crtc_complete_flip(struct drm_crtc *crtc) in _dpu_crtc_complete_flip() argument
249 struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc); in _dpu_crtc_complete_flip()
250 struct drm_device *dev = crtc->dev; in _dpu_crtc_complete_flip()
257 trace_dpu_crtc_complete_flip(DRMID(crtc)); in _dpu_crtc_complete_flip()
258 drm_crtc_send_vblank_event(crtc, dpu_crtc->event); in _dpu_crtc_complete_flip()
264 enum dpu_intf_mode dpu_crtc_get_intf_mode(struct drm_crtc *crtc) in dpu_crtc_get_intf_mode() argument
270 * check. When called from debugfs, the crtc->mutex must be held to in dpu_crtc_get_intf_mode()
271 * read crtc->state. However reading crtc->state from atomic check isn't in dpu_crtc_get_intf_mode()
277 WARN_ON(!drm_modeset_is_locked(&crtc->mutex)); in dpu_crtc_get_intf_mode()
280 drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask) in dpu_crtc_get_intf_mode()
286 void dpu_crtc_vblank_callback(struct drm_crtc *crtc) in dpu_crtc_vblank_callback() argument
288 struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc); in dpu_crtc_vblank_callback()
295 drm_crtc_handle_vblank(crtc); in dpu_crtc_vblank_callback()
296 trace_dpu_crtc_vblank_cb(DRMID(crtc)); in dpu_crtc_vblank_callback()
303 struct drm_crtc *crtc = fevent->crtc; in dpu_crtc_frame_event_work() local
304 struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc); in dpu_crtc_frame_event_work()
310 DRM_DEBUG_KMS("crtc%d event:%u ts:%lld\n", crtc->base.id, fevent->event, in dpu_crtc_frame_event_work()
321 trace_dpu_crtc_frame_event_done(DRMID(crtc), in dpu_crtc_frame_event_work()
323 dpu_core_perf_crtc_release_bw(crtc); in dpu_crtc_frame_event_work()
325 trace_dpu_crtc_frame_event_more_pending(DRMID(crtc), in dpu_crtc_frame_event_work()
330 dpu_core_perf_crtc_update(crtc, 0, false); in dpu_crtc_frame_event_work()
338 DPU_ERROR("crtc%d ts:%lld received panel dead event\n", in dpu_crtc_frame_event_work()
339 crtc->base.id, ktime_to_ns(fevent->ts)); in dpu_crtc_frame_event_work()
351 * dpu_crtc_frame_event_cb - crtc frame event callback API. CRTC module
361 struct drm_crtc *crtc = (struct drm_crtc *)data; in dpu_crtc_frame_event_cb() local
372 dpu_crtc = to_dpu_crtc(crtc); in dpu_crtc_frame_event_cb()
373 priv = crtc->dev->dev_private; in dpu_crtc_frame_event_cb()
374 crtc_id = drm_crtc_index(crtc); in dpu_crtc_frame_event_cb()
376 trace_dpu_crtc_frame_event_cb(DRMID(crtc), event); in dpu_crtc_frame_event_cb()
386 DRM_ERROR_RATELIMITED("crtc%d event %d overflow\n", crtc->base.id, event); in dpu_crtc_frame_event_cb()
391 fevent->crtc = crtc; in dpu_crtc_frame_event_cb()
396 void dpu_crtc_complete_commit(struct drm_crtc *crtc) in dpu_crtc_complete_commit() argument
398 trace_dpu_crtc_complete_commit(DRMID(crtc)); in dpu_crtc_complete_commit()
399 _dpu_crtc_complete_flip(crtc); in dpu_crtc_complete_commit()
402 static void _dpu_crtc_setup_lm_bounds(struct drm_crtc *crtc, in _dpu_crtc_setup_lm_bounds() argument
417 trace_dpu_crtc_setup_lm_bounds(DRMID(crtc), i, r); in _dpu_crtc_setup_lm_bounds()
446 static void _dpu_crtc_setup_cp_blocks(struct drm_crtc *crtc) in _dpu_crtc_setup_cp_blocks() argument
448 struct drm_crtc_state *state = crtc->state; in _dpu_crtc_setup_cp_blocks()
449 struct dpu_crtc_state *cstate = to_dpu_crtc_state(crtc->state); in _dpu_crtc_setup_cp_blocks()
487 static void dpu_crtc_atomic_begin(struct drm_crtc *crtc, in dpu_crtc_atomic_begin() argument
490 struct dpu_crtc_state *cstate = to_dpu_crtc_state(crtc->state); in dpu_crtc_atomic_begin()
493 if (!crtc->state->enable) { in dpu_crtc_atomic_begin()
494 DPU_DEBUG("crtc%d -> enable %d, skip atomic_begin\n", in dpu_crtc_atomic_begin()
495 crtc->base.id, crtc->state->enable); in dpu_crtc_atomic_begin()
499 DPU_DEBUG("crtc%d\n", crtc->base.id); in dpu_crtc_atomic_begin()
501 _dpu_crtc_setup_lm_bounds(crtc, crtc->state); in dpu_crtc_atomic_begin()
504 drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask) in dpu_crtc_atomic_begin()
509 * it means we are trying to flush a CRTC whose state is disabled: in dpu_crtc_atomic_begin()
515 _dpu_crtc_blend_setup(crtc); in dpu_crtc_atomic_begin()
517 _dpu_crtc_setup_cp_blocks(crtc); in dpu_crtc_atomic_begin()
528 static void dpu_crtc_atomic_flush(struct drm_crtc *crtc, in dpu_crtc_atomic_flush() argument
538 if (!crtc->state->enable) { in dpu_crtc_atomic_flush()
539 DPU_DEBUG("crtc%d -> enable %d, skip atomic_flush\n", in dpu_crtc_atomic_flush()
540 crtc->base.id, crtc->state->enable); in dpu_crtc_atomic_flush()
544 DPU_DEBUG("crtc%d\n", crtc->base.id); in dpu_crtc_atomic_flush()
546 dpu_crtc = to_dpu_crtc(crtc); in dpu_crtc_atomic_flush()
547 cstate = to_dpu_crtc_state(crtc->state); in dpu_crtc_atomic_flush()
548 dev = crtc->dev; in dpu_crtc_atomic_flush()
551 if (crtc->index >= ARRAY_SIZE(priv->event_thread)) { in dpu_crtc_atomic_flush()
552 DPU_ERROR("invalid crtc index[%d]\n", crtc->index); in dpu_crtc_atomic_flush()
558 dpu_crtc->event = crtc->state->event; in dpu_crtc_atomic_flush()
559 crtc->state->event = NULL; in dpu_crtc_atomic_flush()
564 * it means we are trying to flush a CRTC whose state is disabled: in dpu_crtc_atomic_flush()
577 drm_atomic_crtc_for_each_plane(plane, crtc) in dpu_crtc_atomic_flush()
580 /* update performance setting before crtc kickoff */ in dpu_crtc_atomic_flush()
581 dpu_core_perf_crtc_update(crtc, 1, false); in dpu_crtc_atomic_flush()
585 * required writes/flushing before crtc's "flush in dpu_crtc_atomic_flush()
588 drm_atomic_crtc_for_each_plane(plane, crtc) { in dpu_crtc_atomic_flush()
599 * @crtc: drm CRTC
600 * @state: CRTC state object to release
602 static void dpu_crtc_destroy_state(struct drm_crtc *crtc, in dpu_crtc_destroy_state() argument
607 DPU_DEBUG("crtc%d\n", crtc->base.id); in dpu_crtc_destroy_state()
614 static int _dpu_crtc_wait_for_frame_done(struct drm_crtc *crtc) in _dpu_crtc_wait_for_frame_done() argument
616 struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc); in _dpu_crtc_wait_for_frame_done()
636 void dpu_crtc_commit_kickoff(struct drm_crtc *crtc) in dpu_crtc_commit_kickoff() argument
639 struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc); in dpu_crtc_commit_kickoff()
640 struct dpu_kms *dpu_kms = _dpu_crtc_get_kms(crtc); in dpu_crtc_commit_kickoff()
641 struct dpu_crtc_state *cstate = to_dpu_crtc_state(crtc->state); in dpu_crtc_commit_kickoff()
645 * it means we are trying to start a CRTC whose state is disabled: in dpu_crtc_commit_kickoff()
657 drm_for_each_encoder_mask(encoder, crtc->dev, in dpu_crtc_commit_kickoff()
658 crtc->state->encoder_mask) in dpu_crtc_commit_kickoff()
663 DPU_DEBUG("crtc%d first commit\n", crtc->base.id); in dpu_crtc_commit_kickoff()
665 DPU_DEBUG("crtc%d commit\n", crtc->base.id); in dpu_crtc_commit_kickoff()
671 drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask) in dpu_crtc_commit_kickoff()
678 static void dpu_crtc_reset(struct drm_crtc *crtc) in dpu_crtc_reset() argument
682 if (crtc->state) in dpu_crtc_reset()
683 dpu_crtc_destroy_state(crtc, crtc->state); in dpu_crtc_reset()
685 __drm_atomic_helper_crtc_reset(crtc, &cstate->base); in dpu_crtc_reset()
690 * @crtc: Pointer to drm crtc structure
692 static struct drm_crtc_state *dpu_crtc_duplicate_state(struct drm_crtc *crtc) in dpu_crtc_duplicate_state() argument
694 struct dpu_crtc_state *cstate, *old_cstate = to_dpu_crtc_state(crtc->state); in dpu_crtc_duplicate_state()
703 __drm_atomic_helper_crtc_duplicate_state(crtc, &cstate->base); in dpu_crtc_duplicate_state()
708 static void dpu_crtc_disable(struct drm_crtc *crtc, in dpu_crtc_disable() argument
711 struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc); in dpu_crtc_disable()
712 struct dpu_crtc_state *cstate = to_dpu_crtc_state(crtc->state); in dpu_crtc_disable()
717 DRM_DEBUG_KMS("crtc%d\n", crtc->base.id); in dpu_crtc_disable()
720 drm_crtc_vblank_off(crtc); in dpu_crtc_disable()
722 drm_for_each_encoder_mask(encoder, crtc->dev, in dpu_crtc_disable()
726 * crtc is being used in video mode. in dpu_crtc_disable()
734 if (_dpu_crtc_wait_for_frame_done(crtc)) in dpu_crtc_disable()
735 DPU_ERROR("crtc%d wait for frame done failed;frame_pending%d\n", in dpu_crtc_disable()
736 crtc->base.id, in dpu_crtc_disable()
739 trace_dpu_crtc_disable(DRMID(crtc), false, dpu_crtc); in dpu_crtc_disable()
743 trace_dpu_crtc_disable_frame_pending(DRMID(crtc), in dpu_crtc_disable()
746 dpu_core_perf_crtc_release_bw(crtc); in dpu_crtc_disable()
750 dpu_core_perf_crtc_update(crtc, 0, true); in dpu_crtc_disable()
752 drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask) in dpu_crtc_disable()
762 if (crtc->state->event && !crtc->state->active) { in dpu_crtc_disable()
763 spin_lock_irqsave(&crtc->dev->event_lock, flags); in dpu_crtc_disable()
764 drm_crtc_send_vblank_event(crtc, crtc->state->event); in dpu_crtc_disable()
765 crtc->state->event = NULL; in dpu_crtc_disable()
766 spin_unlock_irqrestore(&crtc->dev->event_lock, flags); in dpu_crtc_disable()
769 pm_runtime_put_sync(crtc->dev->dev); in dpu_crtc_disable()
772 static void dpu_crtc_enable(struct drm_crtc *crtc, in dpu_crtc_enable() argument
775 struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc); in dpu_crtc_enable()
779 pm_runtime_get_sync(crtc->dev->dev); in dpu_crtc_enable()
781 DRM_DEBUG_KMS("crtc%d\n", crtc->base.id); in dpu_crtc_enable()
783 drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask) { in dpu_crtc_enable()
786 * crtc is being used in video mode. in dpu_crtc_enable()
791 dpu_crtc_frame_event_cb, (void *)crtc); in dpu_crtc_enable()
795 atomic_inc(&_dpu_crtc_get_kms(crtc)->bandwidth_ref); in dpu_crtc_enable()
797 trace_dpu_crtc_enable(DRMID(crtc), true, dpu_crtc); in dpu_crtc_enable()
800 drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask) in dpu_crtc_enable()
801 dpu_encoder_assign_crtc(encoder, crtc); in dpu_crtc_enable()
804 drm_crtc_vblank_on(crtc); in dpu_crtc_enable()
814 static int dpu_crtc_atomic_check(struct drm_crtc *crtc, in dpu_crtc_atomic_check() argument
817 struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc); in dpu_crtc_atomic_check()
836 DPU_DEBUG("crtc%d -> enable %d, active %d, skip atomic_check\n", in dpu_crtc_atomic_check()
837 crtc->base.id, state->enable, state->active); in dpu_crtc_atomic_check()
853 _dpu_crtc_setup_lm_bounds(crtc, state); in dpu_crtc_atomic_check()
859 /* get plane state for all drm planes associated with crtc state */ in dpu_crtc_atomic_check()
964 atomic_inc(&_dpu_crtc_get_kms(crtc)->bandwidth_ref); in dpu_crtc_atomic_check()
966 rc = dpu_core_perf_crtc_check(crtc, state); in dpu_crtc_atomic_check()
968 DPU_ERROR("crtc%d failed performance check %d\n", in dpu_crtc_atomic_check()
969 crtc->base.id, rc); in dpu_crtc_atomic_check()
1040 int dpu_crtc_vblank(struct drm_crtc *crtc, bool en) in dpu_crtc_vblank() argument
1042 struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc); in dpu_crtc_vblank()
1048 * Normally we would iterate through encoder_mask in crtc state to find in dpu_crtc_vblank()
1052 * Instead, we "assign" a crtc to the encoder in enable and clear it in in dpu_crtc_vblank()
1055 * currently assigned to our crtc. in dpu_crtc_vblank()
1057 * Note also that this function cannot be called while crtc is disabled in dpu_crtc_vblank()
1062 list_for_each_entry(enc, &crtc->dev->mode_config.encoder_list, head) { in dpu_crtc_vblank()
1063 trace_dpu_crtc_vblank_enable(DRMID(crtc), DRMID(enc), en, in dpu_crtc_vblank()
1066 dpu_encoder_toggle_vblank_for_crtc(enc, crtc, en); in dpu_crtc_vblank()
1079 struct drm_crtc *crtc; in _dpu_debugfs_status_show() local
1089 crtc = &dpu_crtc->base; in _dpu_debugfs_status_show()
1091 drm_modeset_lock_all(crtc->dev); in _dpu_debugfs_status_show()
1092 cstate = to_dpu_crtc_state(crtc->state); in _dpu_debugfs_status_show()
1094 mode = &crtc->state->adjusted_mode; in _dpu_debugfs_status_show()
1097 seq_printf(s, "crtc:%d width:%d height:%d\n", crtc->base.id, in _dpu_debugfs_status_show()
1111 drm_atomic_crtc_for_each_plane(plane, crtc) { in _dpu_debugfs_status_show()
1175 drm_modeset_unlock_all(crtc->dev); in _dpu_debugfs_status_show()
1184 struct drm_crtc *crtc = (struct drm_crtc *) s->private; in dpu_crtc_debugfs_state_show() local
1185 struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc); in dpu_crtc_debugfs_state_show()
1187 seq_printf(s, "client type: %d\n", dpu_crtc_get_client_type(crtc)); in dpu_crtc_debugfs_state_show()
1188 seq_printf(s, "intf_mode: %d\n", dpu_crtc_get_intf_mode(crtc)); in dpu_crtc_debugfs_state_show()
1199 static int _dpu_crtc_init_debugfs(struct drm_crtc *crtc) in _dpu_crtc_init_debugfs() argument
1201 struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc); in _dpu_crtc_init_debugfs()
1204 crtc->dev->primary->debugfs_root); in _dpu_crtc_init_debugfs()
1217 static int _dpu_crtc_init_debugfs(struct drm_crtc *crtc) in _dpu_crtc_init_debugfs() argument
1223 static int dpu_crtc_late_register(struct drm_crtc *crtc) in dpu_crtc_late_register() argument
1225 return _dpu_crtc_init_debugfs(crtc); in dpu_crtc_late_register()
1228 static void dpu_crtc_early_unregister(struct drm_crtc *crtc) in dpu_crtc_early_unregister() argument
1230 struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc); in dpu_crtc_early_unregister()
1256 /* initialize crtc */
1260 struct drm_crtc *crtc = NULL; in dpu_crtc_init() local
1268 crtc = &dpu_crtc->base; in dpu_crtc_init()
1269 crtc->dev = dev; in dpu_crtc_init()
1286 drm_crtc_init_with_planes(dev, crtc, plane, cursor, &dpu_crtc_funcs, in dpu_crtc_init()
1289 drm_crtc_helper_add(crtc, &dpu_crtc_helper_funcs); in dpu_crtc_init()
1291 drm_crtc_enable_color_mgmt(crtc, 0, true, 0); in dpu_crtc_init()
1293 /* save user friendly CRTC name for later */ in dpu_crtc_init()
1294 snprintf(dpu_crtc->name, DPU_CRTC_NAME_SIZE, "crtc%u", crtc->base.id); in dpu_crtc_init()
1299 DPU_DEBUG("%s: successfully initialized crtc\n", dpu_crtc->name); in dpu_crtc_init()
1300 return crtc; in dpu_crtc_init()