Lines Matching refs:crtc
67 static void mdp5_crtc_restore_cursor(struct drm_crtc *crtc);
69 static struct mdp5_kms *get_kms(struct drm_crtc *crtc) in get_kms() argument
71 struct msm_drm_private *priv = crtc->dev->dev_private; in get_kms()
75 static void request_pending(struct drm_crtc *crtc, uint32_t pending) in request_pending() argument
77 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in request_pending()
80 mdp_irq_register(&get_kms(crtc)->base, &mdp5_crtc->vblank); in request_pending()
83 static void request_pp_done_pending(struct drm_crtc *crtc) in request_pp_done_pending() argument
85 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in request_pp_done_pending()
89 static u32 crtc_flush(struct drm_crtc *crtc, u32 flush_mask) in crtc_flush() argument
91 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in crtc_flush()
98 DBG("%s: flush=%08x", crtc->name, flush_mask); in crtc_flush()
108 static u32 crtc_flush_all(struct drm_crtc *crtc) in crtc_flush_all() argument
110 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in crtc_flush_all()
119 drm_atomic_crtc_for_each_plane(plane, crtc) { in crtc_flush_all()
132 return crtc_flush(crtc, flush_mask); in crtc_flush_all()
136 static void complete_flip(struct drm_crtc *crtc, struct drm_file *file) in complete_flip() argument
138 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in complete_flip()
140 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in complete_flip()
142 struct drm_device *dev = crtc->dev; in complete_flip()
150 DBG("%s: send event: %p", crtc->name, event); in complete_flip()
151 drm_crtc_send_vblank_event(crtc, event); in complete_flip()
155 if (ctl && !crtc->state->enable) { in complete_flip()
174 static void mdp5_crtc_destroy(struct drm_crtc *crtc) in mdp5_crtc_destroy() argument
176 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_destroy()
178 drm_crtc_cleanup(crtc); in mdp5_crtc_destroy()
212 static void blend_setup(struct drm_crtc *crtc) in blend_setup() argument
214 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in blend_setup()
215 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in blend_setup()
217 struct mdp5_kms *mdp5_kms = get_kms(crtc); in blend_setup()
244 drm_atomic_crtc_for_each_plane(plane, crtc) { in blend_setup()
363 static void mdp5_crtc_mode_set_nofb(struct drm_crtc *crtc) in mdp5_crtc_mode_set_nofb() argument
365 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_mode_set_nofb()
366 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_mode_set_nofb()
367 struct mdp5_kms *mdp5_kms = get_kms(crtc); in mdp5_crtc_mode_set_nofb()
375 if (WARN_ON(!crtc->state)) in mdp5_crtc_mode_set_nofb()
378 mode = &crtc->state->adjusted_mode; in mdp5_crtc_mode_set_nofb()
380 DBG("%s: set mode: " DRM_MODE_FMT, crtc->name, DRM_MODE_ARG(mode)); in mdp5_crtc_mode_set_nofb()
412 static struct drm_encoder *get_encoder_from_crtc(struct drm_crtc *crtc) in get_encoder_from_crtc() argument
414 struct drm_device *dev = crtc->dev; in get_encoder_from_crtc()
418 if (encoder->crtc == crtc) in get_encoder_from_crtc()
424 static bool mdp5_crtc_get_scanout_position(struct drm_crtc *crtc, in mdp5_crtc_get_scanout_position() argument
430 unsigned int pipe = crtc->index; in mdp5_crtc_get_scanout_position()
435 encoder = get_encoder_from_crtc(crtc); in mdp5_crtc_get_scanout_position()
478 static u32 mdp5_crtc_get_vblank_counter(struct drm_crtc *crtc) in mdp5_crtc_get_vblank_counter() argument
482 encoder = get_encoder_from_crtc(crtc); in mdp5_crtc_get_vblank_counter()
489 static void mdp5_crtc_atomic_disable(struct drm_crtc *crtc, in mdp5_crtc_atomic_disable() argument
492 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_atomic_disable()
493 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_atomic_disable()
494 struct mdp5_kms *mdp5_kms = get_kms(crtc); in mdp5_crtc_atomic_disable()
498 DBG("%s", crtc->name); in mdp5_crtc_atomic_disable()
504 drm_crtc_vblank_off(crtc); in mdp5_crtc_atomic_disable()
512 if (crtc->state->event && !crtc->state->active) { in mdp5_crtc_atomic_disable()
515 drm_crtc_send_vblank_event(crtc, crtc->state->event); in mdp5_crtc_atomic_disable()
516 crtc->state->event = NULL; in mdp5_crtc_atomic_disable()
523 static void mdp5_crtc_vblank_on(struct drm_crtc *crtc) in mdp5_crtc_vblank_on() argument
525 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_vblank_on()
530 drm_crtc_set_max_vblank_count(crtc, count); in mdp5_crtc_vblank_on()
532 drm_crtc_vblank_on(crtc); in mdp5_crtc_vblank_on()
535 static void mdp5_crtc_atomic_enable(struct drm_crtc *crtc, in mdp5_crtc_atomic_enable() argument
538 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_atomic_enable()
539 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_atomic_enable()
540 struct mdp5_kms *mdp5_kms = get_kms(crtc); in mdp5_crtc_atomic_enable()
543 DBG("%s", crtc->name); in mdp5_crtc_atomic_enable()
559 mdp5_crtc_restore_cursor(crtc); in mdp5_crtc_atomic_enable()
571 mdp5_crtc_vblank_on(crtc); in mdp5_crtc_atomic_enable()
573 mdp5_crtc_mode_set_nofb(crtc); in mdp5_crtc_atomic_enable()
583 static int mdp5_crtc_setup_pipeline(struct drm_crtc *crtc, in mdp5_crtc_setup_pipeline() argument
609 ret = mdp5_mixer_assign(new_crtc_state->state, crtc, caps, in mdp5_crtc_setup_pipeline()
665 static enum mdp_mixer_stage_id get_start_stage(struct drm_crtc *crtc, in get_start_stage() argument
688 static int mdp5_crtc_atomic_check(struct drm_crtc *crtc, in mdp5_crtc_atomic_check() argument
692 crtc); in mdp5_crtc_atomic_check()
693 struct mdp5_kms *mdp5_kms = get_kms(crtc); in mdp5_crtc_atomic_check()
695 struct drm_device *dev = crtc->dev; in mdp5_crtc_atomic_check()
706 DBG("%s: check", crtc->name); in mdp5_crtc_atomic_check()
740 ret = mdp5_crtc_setup_pipeline(crtc, crtc_state, need_right_mixer); in mdp5_crtc_atomic_check()
753 start = get_start_stage(crtc, crtc_state, &pstates[0].state->base); in mdp5_crtc_atomic_check()
769 DBG("%s: assign pipe %s on stage=%d", crtc->name, in mdp5_crtc_atomic_check()
777 static void mdp5_crtc_atomic_begin(struct drm_crtc *crtc, in mdp5_crtc_atomic_begin() argument
780 DBG("%s: begin", crtc->name); in mdp5_crtc_atomic_begin()
783 static void mdp5_crtc_atomic_flush(struct drm_crtc *crtc, in mdp5_crtc_atomic_flush() argument
786 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_atomic_flush()
787 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_atomic_flush()
788 struct drm_device *dev = crtc->dev; in mdp5_crtc_atomic_flush()
791 DBG("%s: event: %p", crtc->name, crtc->state->event); in mdp5_crtc_atomic_flush()
796 mdp5_crtc->event = crtc->state->event; in mdp5_crtc_atomic_flush()
797 crtc->state->event = NULL; in mdp5_crtc_atomic_flush()
809 blend_setup(crtc); in mdp5_crtc_atomic_flush()
818 request_pp_done_pending(crtc); in mdp5_crtc_atomic_flush()
820 mdp5_crtc->flushed_mask = crtc_flush_all(crtc); in mdp5_crtc_atomic_flush()
827 request_pending(crtc, PENDING_FLIP); in mdp5_crtc_atomic_flush()
830 static void get_roi(struct drm_crtc *crtc, uint32_t *roi_w, uint32_t *roi_h) in get_roi() argument
832 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in get_roi()
833 uint32_t xres = crtc->mode.hdisplay; in get_roi()
834 uint32_t yres = crtc->mode.vdisplay; in get_roi()
867 static void mdp5_crtc_restore_cursor(struct drm_crtc *crtc) in mdp5_crtc_restore_cursor() argument
870 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_restore_cursor()
871 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_restore_cursor()
872 struct mdp5_kms *mdp5_kms = get_kms(crtc); in mdp5_crtc_restore_cursor()
890 get_roi(crtc, &roi_w, &roi_h); in mdp5_crtc_restore_cursor()
910 crtc->name, x, y, roi_w, roi_h, src_x, src_y); in mdp5_crtc_restore_cursor()
935 static int mdp5_crtc_cursor_set(struct drm_crtc *crtc, in mdp5_crtc_cursor_set() argument
939 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_cursor_set()
940 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_cursor_set()
942 struct drm_device *dev = crtc->dev; in mdp5_crtc_cursor_set()
943 struct mdp5_kms *mdp5_kms = get_kms(crtc); in mdp5_crtc_cursor_set()
998 mdp5_crtc_restore_cursor(crtc); in mdp5_crtc_cursor_set()
1010 crtc_flush(crtc, flush_mask); in mdp5_crtc_cursor_set()
1017 request_pending(crtc, PENDING_CURSOR); in mdp5_crtc_cursor_set()
1022 static int mdp5_crtc_cursor_move(struct drm_crtc *crtc, int x, int y) in mdp5_crtc_cursor_move() argument
1024 struct mdp5_kms *mdp5_kms = get_kms(crtc); in mdp5_crtc_cursor_move()
1025 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_cursor_move()
1026 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_cursor_move()
1028 struct drm_device *dev = crtc->dev; in mdp5_crtc_cursor_move()
1044 if (unlikely(!crtc->state->enable)) in mdp5_crtc_cursor_move()
1051 get_roi(crtc, &roi_w, &roi_h); in mdp5_crtc_cursor_move()
1056 mdp5_crtc_restore_cursor(crtc); in mdp5_crtc_cursor_move()
1059 crtc_flush(crtc, flush_mask); in mdp5_crtc_cursor_move()
1072 struct mdp5_kms *mdp5_kms = get_kms(state->crtc); in mdp5_crtc_atomic_print_state()
1091 mdp5_crtc_duplicate_state(struct drm_crtc *crtc) in mdp5_crtc_duplicate_state() argument
1095 if (WARN_ON(!crtc->state)) in mdp5_crtc_duplicate_state()
1098 mdp5_cstate = kmemdup(to_mdp5_crtc_state(crtc->state), in mdp5_crtc_duplicate_state()
1103 __drm_atomic_helper_crtc_duplicate_state(crtc, &mdp5_cstate->base); in mdp5_crtc_duplicate_state()
1108 static void mdp5_crtc_destroy_state(struct drm_crtc *crtc, struct drm_crtc_state *state) in mdp5_crtc_destroy_state() argument
1117 static void mdp5_crtc_reset(struct drm_crtc *crtc) in mdp5_crtc_reset() argument
1122 if (crtc->state) in mdp5_crtc_reset()
1123 mdp5_crtc_destroy_state(crtc, crtc->state); in mdp5_crtc_reset()
1125 __drm_atomic_helper_crtc_reset(crtc, &mdp5_cstate->base); in mdp5_crtc_reset()
1171 struct drm_crtc *crtc = &mdp5_crtc->base; in mdp5_crtc_vblank_irq() local
1172 struct msm_drm_private *priv = crtc->dev->dev_private; in mdp5_crtc_vblank_irq()
1175 mdp_irq_unregister(&get_kms(crtc)->base, &mdp5_crtc->vblank); in mdp5_crtc_vblank_irq()
1180 complete_flip(crtc, NULL); in mdp5_crtc_vblank_irq()
1202 static void mdp5_crtc_wait_for_pp_done(struct drm_crtc *crtc) in mdp5_crtc_wait_for_pp_done() argument
1204 struct drm_device *dev = crtc->dev; in mdp5_crtc_wait_for_pp_done()
1205 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_wait_for_pp_done()
1206 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_wait_for_pp_done()
1216 static void mdp5_crtc_wait_for_flush_done(struct drm_crtc *crtc) in mdp5_crtc_wait_for_flush_done() argument
1218 struct drm_device *dev = crtc->dev; in mdp5_crtc_wait_for_flush_done()
1219 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_wait_for_flush_done()
1220 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_wait_for_flush_done()
1228 ret = drm_crtc_vblank_get(crtc); in mdp5_crtc_wait_for_flush_done()
1232 ret = wait_event_timeout(dev->vblank[drm_crtc_index(crtc)].queue, in mdp5_crtc_wait_for_flush_done()
1241 drm_crtc_vblank_put(crtc); in mdp5_crtc_wait_for_flush_done()
1244 uint32_t mdp5_crtc_vblank(struct drm_crtc *crtc) in mdp5_crtc_vblank() argument
1246 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_vblank()
1250 void mdp5_crtc_set_pipeline(struct drm_crtc *crtc) in mdp5_crtc_set_pipeline() argument
1252 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_set_pipeline()
1253 struct mdp5_kms *mdp5_kms = get_kms(crtc); in mdp5_crtc_set_pipeline()
1261 struct mdp5_ctl *mdp5_crtc_get_ctl(struct drm_crtc *crtc) in mdp5_crtc_get_ctl() argument
1263 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_get_ctl()
1268 struct mdp5_hw_mixer *mdp5_crtc_get_mixer(struct drm_crtc *crtc) in mdp5_crtc_get_mixer() argument
1272 if (WARN_ON(!crtc)) in mdp5_crtc_get_mixer()
1275 mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_get_mixer()
1281 struct mdp5_pipeline *mdp5_crtc_get_pipeline(struct drm_crtc *crtc) in mdp5_crtc_get_pipeline() argument
1285 if (WARN_ON(!crtc)) in mdp5_crtc_get_pipeline()
1288 mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_get_pipeline()
1293 void mdp5_crtc_wait_for_commit_done(struct drm_crtc *crtc) in mdp5_crtc_wait_for_commit_done() argument
1295 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_wait_for_commit_done()
1298 mdp5_crtc_wait_for_pp_done(crtc); in mdp5_crtc_wait_for_commit_done()
1300 mdp5_crtc_wait_for_flush_done(crtc); in mdp5_crtc_wait_for_commit_done()
1308 struct drm_crtc *crtc = NULL; in mdp5_crtc_init() local
1315 crtc = &mdp5_crtc->base; in mdp5_crtc_init()
1329 drm_crtc_init_with_planes(dev, crtc, plane, cursor_plane, in mdp5_crtc_init()
1337 drm_crtc_helper_add(crtc, &mdp5_crtc_helper_funcs); in mdp5_crtc_init()
1339 return crtc; in mdp5_crtc_init()