Lines Matching refs:crtc
43 static struct dpu_kms *_dpu_crtc_get_kms(struct drm_crtc *crtc) in _dpu_crtc_get_kms() argument
45 struct msm_drm_private *priv = crtc->dev->dev_private; in _dpu_crtc_get_kms()
50 static void dpu_crtc_destroy(struct drm_crtc *crtc) in dpu_crtc_destroy() argument
52 struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc); in dpu_crtc_destroy()
54 if (!crtc) in dpu_crtc_destroy()
57 drm_crtc_cleanup(crtc); in dpu_crtc_destroy()
61 static struct drm_encoder *get_encoder_from_crtc(struct drm_crtc *crtc) in get_encoder_from_crtc() argument
63 struct drm_device *dev = crtc->dev; in get_encoder_from_crtc()
67 if (encoder->crtc == crtc) in get_encoder_from_crtc()
85 static int dpu_crtc_verify_crc_source(struct drm_crtc *crtc, in dpu_crtc_verify_crc_source() argument
89 struct dpu_crtc_state *crtc_state = to_dpu_crtc_state(crtc->state); in dpu_crtc_verify_crc_source()
92 DRM_DEBUG_DRIVER("Invalid source %s for CRTC%d\n", src_name, crtc->index); in dpu_crtc_verify_crc_source()
102 static int dpu_crtc_set_crc_source(struct drm_crtc *crtc, const char *src_name) in dpu_crtc_set_crc_source() argument
107 struct drm_device *drm_dev = crtc->dev; in dpu_crtc_set_crc_source()
115 DRM_DEBUG_DRIVER("Invalid CRC source %s for CRTC%d\n", src_name, crtc->index); in dpu_crtc_set_crc_source()
119 ret = drm_modeset_lock(&crtc->mutex, NULL); in dpu_crtc_set_crc_source()
125 crtc_state = to_dpu_crtc_state(crtc->state); in dpu_crtc_set_crc_source()
134 ret = drm_crtc_vblank_get(crtc); in dpu_crtc_set_crc_source()
140 drm_crtc_vblank_put(crtc); in dpu_crtc_set_crc_source()
161 drm_modeset_unlock(&crtc->mutex); in dpu_crtc_set_crc_source()
166 static u32 dpu_crtc_get_vblank_counter(struct drm_crtc *crtc) in dpu_crtc_get_vblank_counter() argument
168 struct drm_encoder *encoder = get_encoder_from_crtc(crtc); in dpu_crtc_get_vblank_counter()
170 DRM_ERROR("no encoder found for crtc %d\n", crtc->index); in dpu_crtc_get_vblank_counter()
178 static int dpu_crtc_get_crc(struct drm_crtc *crtc) in dpu_crtc_get_crc() argument
187 crtc_state = to_dpu_crtc_state(crtc->state); in dpu_crtc_get_crc()
212 return drm_crtc_add_crc_entry(crtc, true, in dpu_crtc_get_crc()
213 drm_crtc_accurate_vblank_count(crtc), crcs); in dpu_crtc_get_crc()
216 static bool dpu_crtc_get_scanout_position(struct drm_crtc *crtc, in dpu_crtc_get_scanout_position() argument
222 unsigned int pipe = crtc->index; in dpu_crtc_get_scanout_position()
226 encoder = get_encoder_from_crtc(crtc); in dpu_crtc_get_scanout_position()
315 static void _dpu_crtc_program_lm_output_roi(struct drm_crtc *crtc) in _dpu_crtc_program_lm_output_roi() argument
320 crtc_state = to_dpu_crtc_state(crtc->state); in _dpu_crtc_program_lm_output_roi()
339 static void _dpu_crtc_blend_setup_mixer(struct drm_crtc *crtc, in _dpu_crtc_blend_setup_mixer() argument
345 struct dpu_crtc_state *cstate = to_dpu_crtc_state(crtc->state); in _dpu_crtc_blend_setup_mixer()
358 drm_atomic_crtc_for_each_plane(plane, crtc) { in _dpu_crtc_blend_setup_mixer()
370 crtc->base.id, in _dpu_crtc_blend_setup_mixer()
387 trace_dpu_crtc_setup_mixer(DRMID(crtc), DRMID(plane), in _dpu_crtc_blend_setup_mixer()
411 _dpu_crtc_program_lm_output_roi(crtc); in _dpu_crtc_blend_setup_mixer()
418 static void _dpu_crtc_blend_setup(struct drm_crtc *crtc) in _dpu_crtc_blend_setup() argument
420 struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc); in _dpu_crtc_blend_setup()
421 struct dpu_crtc_state *cstate = to_dpu_crtc_state(crtc->state); in _dpu_crtc_blend_setup()
440 _dpu_crtc_blend_setup_mixer(crtc, dpu_crtc, mixer); in _dpu_crtc_blend_setup()
474 static void _dpu_crtc_complete_flip(struct drm_crtc *crtc) in _dpu_crtc_complete_flip() argument
476 struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc); in _dpu_crtc_complete_flip()
477 struct drm_device *dev = crtc->dev; in _dpu_crtc_complete_flip()
484 trace_dpu_crtc_complete_flip(DRMID(crtc)); in _dpu_crtc_complete_flip()
485 drm_crtc_send_vblank_event(crtc, dpu_crtc->event); in _dpu_crtc_complete_flip()
491 enum dpu_intf_mode dpu_crtc_get_intf_mode(struct drm_crtc *crtc) in dpu_crtc_get_intf_mode() argument
504 WARN_ON(!drm_modeset_is_locked(&crtc->mutex)); in dpu_crtc_get_intf_mode()
507 drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask) in dpu_crtc_get_intf_mode()
513 void dpu_crtc_vblank_callback(struct drm_crtc *crtc) in dpu_crtc_vblank_callback() argument
515 struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc); in dpu_crtc_vblank_callback()
523 dpu_crtc_get_crc(crtc); in dpu_crtc_vblank_callback()
525 drm_crtc_handle_vblank(crtc); in dpu_crtc_vblank_callback()
526 trace_dpu_crtc_vblank_cb(DRMID(crtc)); in dpu_crtc_vblank_callback()
533 struct drm_crtc *crtc = fevent->crtc; in dpu_crtc_frame_event_work() local
534 struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc); in dpu_crtc_frame_event_work()
540 DRM_DEBUG_ATOMIC("crtc%d event:%u ts:%lld\n", crtc->base.id, fevent->event, in dpu_crtc_frame_event_work()
551 trace_dpu_crtc_frame_event_done(DRMID(crtc), in dpu_crtc_frame_event_work()
553 dpu_core_perf_crtc_release_bw(crtc); in dpu_crtc_frame_event_work()
555 trace_dpu_crtc_frame_event_more_pending(DRMID(crtc), in dpu_crtc_frame_event_work()
566 crtc->base.id, ktime_to_ns(fevent->ts)); in dpu_crtc_frame_event_work()
588 struct drm_crtc *crtc = (struct drm_crtc *)data; in dpu_crtc_frame_event_cb() local
599 dpu_crtc = to_dpu_crtc(crtc); in dpu_crtc_frame_event_cb()
600 priv = crtc->dev->dev_private; in dpu_crtc_frame_event_cb()
601 crtc_id = drm_crtc_index(crtc); in dpu_crtc_frame_event_cb()
603 trace_dpu_crtc_frame_event_cb(DRMID(crtc), event); in dpu_crtc_frame_event_cb()
613 DRM_ERROR_RATELIMITED("crtc%d event %d overflow\n", crtc->base.id, event); in dpu_crtc_frame_event_cb()
618 fevent->crtc = crtc; in dpu_crtc_frame_event_cb()
623 void dpu_crtc_complete_commit(struct drm_crtc *crtc) in dpu_crtc_complete_commit() argument
625 trace_dpu_crtc_complete_commit(DRMID(crtc)); in dpu_crtc_complete_commit()
626 dpu_core_perf_crtc_update(crtc, 0, false); in dpu_crtc_complete_commit()
627 _dpu_crtc_complete_flip(crtc); in dpu_crtc_complete_commit()
630 static void _dpu_crtc_setup_lm_bounds(struct drm_crtc *crtc, in _dpu_crtc_setup_lm_bounds() argument
645 trace_dpu_crtc_setup_lm_bounds(DRMID(crtc), i, r); in _dpu_crtc_setup_lm_bounds()
674 static void _dpu_crtc_setup_cp_blocks(struct drm_crtc *crtc) in _dpu_crtc_setup_cp_blocks() argument
676 struct drm_crtc_state *state = crtc->state; in _dpu_crtc_setup_cp_blocks()
677 struct dpu_crtc_state *cstate = to_dpu_crtc_state(crtc->state); in _dpu_crtc_setup_cp_blocks()
715 static void dpu_crtc_atomic_begin(struct drm_crtc *crtc, in dpu_crtc_atomic_begin() argument
718 struct dpu_crtc_state *cstate = to_dpu_crtc_state(crtc->state); in dpu_crtc_atomic_begin()
721 if (!crtc->state->enable) { in dpu_crtc_atomic_begin()
723 crtc->base.id, crtc->state->enable); in dpu_crtc_atomic_begin()
727 DRM_DEBUG_ATOMIC("crtc%d\n", crtc->base.id); in dpu_crtc_atomic_begin()
729 _dpu_crtc_setup_lm_bounds(crtc, crtc->state); in dpu_crtc_atomic_begin()
732 drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask) in dpu_crtc_atomic_begin()
743 _dpu_crtc_blend_setup(crtc); in dpu_crtc_atomic_begin()
745 _dpu_crtc_setup_cp_blocks(crtc); in dpu_crtc_atomic_begin()
756 static void dpu_crtc_atomic_flush(struct drm_crtc *crtc, in dpu_crtc_atomic_flush() argument
766 if (!crtc->state->enable) { in dpu_crtc_atomic_flush()
768 crtc->base.id, crtc->state->enable); in dpu_crtc_atomic_flush()
772 DRM_DEBUG_ATOMIC("crtc%d\n", crtc->base.id); in dpu_crtc_atomic_flush()
774 dpu_crtc = to_dpu_crtc(crtc); in dpu_crtc_atomic_flush()
775 cstate = to_dpu_crtc_state(crtc->state); in dpu_crtc_atomic_flush()
776 dev = crtc->dev; in dpu_crtc_atomic_flush()
779 if (crtc->index >= ARRAY_SIZE(priv->event_thread)) { in dpu_crtc_atomic_flush()
780 DPU_ERROR("invalid crtc index[%d]\n", crtc->index); in dpu_crtc_atomic_flush()
786 dpu_crtc->event = crtc->state->event; in dpu_crtc_atomic_flush()
787 crtc->state->event = NULL; in dpu_crtc_atomic_flush()
799 dpu_core_perf_crtc_update(crtc, 1, false); in dpu_crtc_atomic_flush()
806 drm_atomic_crtc_for_each_plane(plane, crtc) { in dpu_crtc_atomic_flush()
820 static void dpu_crtc_destroy_state(struct drm_crtc *crtc, in dpu_crtc_destroy_state() argument
825 DRM_DEBUG_ATOMIC("crtc%d\n", crtc->base.id); in dpu_crtc_destroy_state()
832 static int _dpu_crtc_wait_for_frame_done(struct drm_crtc *crtc) in _dpu_crtc_wait_for_frame_done() argument
834 struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc); in _dpu_crtc_wait_for_frame_done()
854 void dpu_crtc_commit_kickoff(struct drm_crtc *crtc) in dpu_crtc_commit_kickoff() argument
857 struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc); in dpu_crtc_commit_kickoff()
858 struct dpu_kms *dpu_kms = _dpu_crtc_get_kms(crtc); in dpu_crtc_commit_kickoff()
859 struct dpu_crtc_state *cstate = to_dpu_crtc_state(crtc->state); in dpu_crtc_commit_kickoff()
875 drm_for_each_encoder_mask(encoder, crtc->dev, in dpu_crtc_commit_kickoff()
876 crtc->state->encoder_mask) in dpu_crtc_commit_kickoff()
881 DRM_DEBUG_ATOMIC("crtc%d first commit\n", crtc->base.id); in dpu_crtc_commit_kickoff()
883 DRM_DEBUG_ATOMIC("crtc%d commit\n", crtc->base.id); in dpu_crtc_commit_kickoff()
889 drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask) in dpu_crtc_commit_kickoff()
896 static void dpu_crtc_reset(struct drm_crtc *crtc) in dpu_crtc_reset() argument
900 if (crtc->state) in dpu_crtc_reset()
901 dpu_crtc_destroy_state(crtc, crtc->state); in dpu_crtc_reset()
903 __drm_atomic_helper_crtc_reset(crtc, &cstate->base); in dpu_crtc_reset()
910 static struct drm_crtc_state *dpu_crtc_duplicate_state(struct drm_crtc *crtc) in dpu_crtc_duplicate_state() argument
912 struct dpu_crtc_state *cstate, *old_cstate = to_dpu_crtc_state(crtc->state); in dpu_crtc_duplicate_state()
921 __drm_atomic_helper_crtc_duplicate_state(crtc, &cstate->base); in dpu_crtc_duplicate_state()
926 static void dpu_crtc_disable(struct drm_crtc *crtc, in dpu_crtc_disable() argument
930 crtc); in dpu_crtc_disable()
931 struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc); in dpu_crtc_disable()
932 struct dpu_crtc_state *cstate = to_dpu_crtc_state(crtc->state); in dpu_crtc_disable()
937 DRM_DEBUG_KMS("crtc%d\n", crtc->base.id); in dpu_crtc_disable()
940 drm_crtc_vblank_off(crtc); in dpu_crtc_disable()
942 drm_for_each_encoder_mask(encoder, crtc->dev, in dpu_crtc_disable()
954 if (_dpu_crtc_wait_for_frame_done(crtc)) in dpu_crtc_disable()
956 crtc->base.id, in dpu_crtc_disable()
959 trace_dpu_crtc_disable(DRMID(crtc), false, dpu_crtc); in dpu_crtc_disable()
963 trace_dpu_crtc_disable_frame_pending(DRMID(crtc), in dpu_crtc_disable()
966 dpu_core_perf_crtc_release_bw(crtc); in dpu_crtc_disable()
970 dpu_core_perf_crtc_update(crtc, 0, true); in dpu_crtc_disable()
972 drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask) in dpu_crtc_disable()
982 if (crtc->state->event && !crtc->state->active) { in dpu_crtc_disable()
983 spin_lock_irqsave(&crtc->dev->event_lock, flags); in dpu_crtc_disable()
984 drm_crtc_send_vblank_event(crtc, crtc->state->event); in dpu_crtc_disable()
985 crtc->state->event = NULL; in dpu_crtc_disable()
986 spin_unlock_irqrestore(&crtc->dev->event_lock, flags); in dpu_crtc_disable()
989 pm_runtime_put_sync(crtc->dev->dev); in dpu_crtc_disable()
992 static void dpu_crtc_enable(struct drm_crtc *crtc, in dpu_crtc_enable() argument
995 struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc); in dpu_crtc_enable()
999 pm_runtime_get_sync(crtc->dev->dev); in dpu_crtc_enable()
1001 DRM_DEBUG_KMS("crtc%d\n", crtc->base.id); in dpu_crtc_enable()
1003 drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask) { in dpu_crtc_enable()
1011 dpu_crtc_frame_event_cb, (void *)crtc); in dpu_crtc_enable()
1015 atomic_inc(&_dpu_crtc_get_kms(crtc)->bandwidth_ref); in dpu_crtc_enable()
1017 trace_dpu_crtc_enable(DRMID(crtc), true, dpu_crtc); in dpu_crtc_enable()
1020 drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask) in dpu_crtc_enable()
1021 dpu_encoder_assign_crtc(encoder, crtc); in dpu_crtc_enable()
1024 drm_crtc_vblank_on(crtc); in dpu_crtc_enable()
1034 static int dpu_crtc_atomic_check(struct drm_crtc *crtc, in dpu_crtc_atomic_check() argument
1038 crtc); in dpu_crtc_atomic_check()
1039 struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc); in dpu_crtc_atomic_check()
1059 crtc->base.id, crtc_state->enable, in dpu_crtc_atomic_check()
1077 _dpu_crtc_setup_lm_bounds(crtc, crtc_state); in dpu_crtc_atomic_check()
1188 atomic_inc(&_dpu_crtc_get_kms(crtc)->bandwidth_ref); in dpu_crtc_atomic_check()
1190 rc = dpu_core_perf_crtc_check(crtc, crtc_state); in dpu_crtc_atomic_check()
1193 crtc->base.id, rc); in dpu_crtc_atomic_check()
1264 int dpu_crtc_vblank(struct drm_crtc *crtc, bool en) in dpu_crtc_vblank() argument
1266 struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc); in dpu_crtc_vblank()
1286 list_for_each_entry(enc, &crtc->dev->mode_config.encoder_list, head) { in dpu_crtc_vblank()
1287 trace_dpu_crtc_vblank_enable(DRMID(crtc), DRMID(enc), en, in dpu_crtc_vblank()
1290 dpu_encoder_toggle_vblank_for_crtc(enc, crtc, en); in dpu_crtc_vblank()
1303 struct drm_crtc *crtc; in _dpu_debugfs_status_show() local
1313 crtc = &dpu_crtc->base; in _dpu_debugfs_status_show()
1315 drm_modeset_lock_all(crtc->dev); in _dpu_debugfs_status_show()
1316 cstate = to_dpu_crtc_state(crtc->state); in _dpu_debugfs_status_show()
1318 mode = &crtc->state->adjusted_mode; in _dpu_debugfs_status_show()
1321 seq_printf(s, "crtc:%d width:%d height:%d\n", crtc->base.id, in _dpu_debugfs_status_show()
1335 drm_atomic_crtc_for_each_plane(plane, crtc) { in _dpu_debugfs_status_show()
1399 drm_modeset_unlock_all(crtc->dev); in _dpu_debugfs_status_show()
1408 struct drm_crtc *crtc = (struct drm_crtc *) s->private; in dpu_crtc_debugfs_state_show() local
1409 struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc); in dpu_crtc_debugfs_state_show()
1411 seq_printf(s, "client type: %d\n", dpu_crtc_get_client_type(crtc)); in dpu_crtc_debugfs_state_show()
1412 seq_printf(s, "intf_mode: %d\n", dpu_crtc_get_intf_mode(crtc)); in dpu_crtc_debugfs_state_show()
1423 static int _dpu_crtc_init_debugfs(struct drm_crtc *crtc) in _dpu_crtc_init_debugfs() argument
1425 struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc); in _dpu_crtc_init_debugfs()
1428 crtc->dev->primary->debugfs_root); in _dpu_crtc_init_debugfs()
1441 static int _dpu_crtc_init_debugfs(struct drm_crtc *crtc) in _dpu_crtc_init_debugfs() argument
1447 static int dpu_crtc_late_register(struct drm_crtc *crtc) in dpu_crtc_late_register() argument
1449 return _dpu_crtc_init_debugfs(crtc); in dpu_crtc_late_register()
1452 static void dpu_crtc_early_unregister(struct drm_crtc *crtc) in dpu_crtc_early_unregister() argument
1454 struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc); in dpu_crtc_early_unregister()
1489 struct drm_crtc *crtc = NULL; in dpu_crtc_init() local
1497 crtc = &dpu_crtc->base; in dpu_crtc_init()
1498 crtc->dev = dev; in dpu_crtc_init()
1515 drm_crtc_init_with_planes(dev, crtc, plane, cursor, &dpu_crtc_funcs, in dpu_crtc_init()
1518 drm_crtc_helper_add(crtc, &dpu_crtc_helper_funcs); in dpu_crtc_init()
1520 drm_crtc_enable_color_mgmt(crtc, 0, true, 0); in dpu_crtc_init()
1523 snprintf(dpu_crtc->name, DPU_CRTC_NAME_SIZE, "crtc%u", crtc->base.id); in dpu_crtc_init()
1529 return crtc; in dpu_crtc_init()