Lines Matching full:crtc

68 static void mdp5_crtc_restore_cursor(struct drm_crtc *crtc);
70 static struct mdp5_kms *get_kms(struct drm_crtc *crtc) in get_kms() argument
72 struct msm_drm_private *priv = crtc->dev->dev_private; in get_kms()
76 static void request_pending(struct drm_crtc *crtc, uint32_t pending) in request_pending() argument
78 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in request_pending()
81 mdp_irq_register(&get_kms(crtc)->base, &mdp5_crtc->vblank); in request_pending()
84 static void request_pp_done_pending(struct drm_crtc *crtc) in request_pp_done_pending() argument
86 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in request_pp_done_pending()
90 static u32 crtc_flush(struct drm_crtc *crtc, u32 flush_mask) in crtc_flush() argument
92 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in crtc_flush()
99 DBG("%s: flush=%08x", crtc->name, flush_mask); in crtc_flush()
109 static u32 crtc_flush_all(struct drm_crtc *crtc) in crtc_flush_all() argument
111 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in crtc_flush_all()
120 drm_atomic_crtc_for_each_plane(plane, crtc) { in crtc_flush_all()
133 return crtc_flush(crtc, flush_mask); in crtc_flush_all()
137 static void complete_flip(struct drm_crtc *crtc, struct drm_file *file) in complete_flip() argument
139 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in complete_flip()
141 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in complete_flip()
143 struct drm_device *dev = crtc->dev; in complete_flip()
151 DBG("%s: send event: %p", crtc->name, event); in complete_flip()
152 drm_crtc_send_vblank_event(crtc, event); in complete_flip()
156 if (ctl && !crtc->state->enable) { in complete_flip()
175 static void mdp5_crtc_destroy(struct drm_crtc *crtc) in mdp5_crtc_destroy() argument
177 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_destroy()
179 drm_crtc_cleanup(crtc); in mdp5_crtc_destroy()
207 * blend_setup() - blend all the planes of a CRTC
213 static void blend_setup(struct drm_crtc *crtc) in blend_setup() argument
215 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in blend_setup()
216 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in blend_setup()
218 struct mdp5_kms *mdp5_kms = get_kms(crtc); in blend_setup()
245 drm_atomic_crtc_for_each_plane(plane, crtc) { in blend_setup()
364 static void mdp5_crtc_mode_set_nofb(struct drm_crtc *crtc) in mdp5_crtc_mode_set_nofb() argument
366 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_mode_set_nofb()
367 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_mode_set_nofb()
368 struct mdp5_kms *mdp5_kms = get_kms(crtc); in mdp5_crtc_mode_set_nofb()
376 if (WARN_ON(!crtc->state)) in mdp5_crtc_mode_set_nofb()
379 mode = &crtc->state->adjusted_mode; in mdp5_crtc_mode_set_nofb()
381 DBG("%s: set mode: " DRM_MODE_FMT, crtc->name, DRM_MODE_ARG(mode)); in mdp5_crtc_mode_set_nofb()
413 static struct drm_encoder *get_encoder_from_crtc(struct drm_crtc *crtc) in get_encoder_from_crtc() argument
415 struct drm_device *dev = crtc->dev; in get_encoder_from_crtc()
419 if (encoder->crtc == crtc) in get_encoder_from_crtc()
425 static bool mdp5_crtc_get_scanout_position(struct drm_crtc *crtc, in mdp5_crtc_get_scanout_position() argument
431 unsigned int pipe = crtc->index; in mdp5_crtc_get_scanout_position()
436 encoder = get_encoder_from_crtc(crtc); in mdp5_crtc_get_scanout_position()
438 DRM_ERROR("no encoder found for crtc %d\n", pipe); in mdp5_crtc_get_scanout_position()
479 static u32 mdp5_crtc_get_vblank_counter(struct drm_crtc *crtc) in mdp5_crtc_get_vblank_counter() argument
483 encoder = get_encoder_from_crtc(crtc); in mdp5_crtc_get_vblank_counter()
490 static void mdp5_crtc_atomic_disable(struct drm_crtc *crtc, in mdp5_crtc_atomic_disable() argument
493 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_atomic_disable()
494 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_atomic_disable()
495 struct mdp5_kms *mdp5_kms = get_kms(crtc); in mdp5_crtc_atomic_disable()
499 DBG("%s", crtc->name); in mdp5_crtc_atomic_disable()
505 drm_crtc_vblank_off(crtc); in mdp5_crtc_atomic_disable()
513 if (crtc->state->event && !crtc->state->active) { in mdp5_crtc_atomic_disable()
516 drm_crtc_send_vblank_event(crtc, crtc->state->event); in mdp5_crtc_atomic_disable()
517 crtc->state->event = NULL; in mdp5_crtc_atomic_disable()
524 static void mdp5_crtc_vblank_on(struct drm_crtc *crtc) in mdp5_crtc_vblank_on() argument
526 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_vblank_on()
531 drm_crtc_set_max_vblank_count(crtc, count); in mdp5_crtc_vblank_on()
533 drm_crtc_vblank_on(crtc); in mdp5_crtc_vblank_on()
536 static void mdp5_crtc_atomic_enable(struct drm_crtc *crtc, in mdp5_crtc_atomic_enable() argument
539 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_atomic_enable()
540 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_atomic_enable()
541 struct mdp5_kms *mdp5_kms = get_kms(crtc); in mdp5_crtc_atomic_enable()
544 DBG("%s", crtc->name); in mdp5_crtc_atomic_enable()
560 mdp5_crtc_restore_cursor(crtc); in mdp5_crtc_atomic_enable()
572 mdp5_crtc_vblank_on(crtc); in mdp5_crtc_atomic_enable()
574 mdp5_crtc_mode_set_nofb(crtc); in mdp5_crtc_atomic_enable()
584 static int mdp5_crtc_setup_pipeline(struct drm_crtc *crtc, in mdp5_crtc_setup_pipeline() argument
610 ret = mdp5_mixer_assign(new_crtc_state->state, crtc, caps, in mdp5_crtc_setup_pipeline()
672 static enum mdp_mixer_stage_id get_start_stage(struct drm_crtc *crtc, in get_start_stage() argument
695 static int mdp5_crtc_atomic_check(struct drm_crtc *crtc, in mdp5_crtc_atomic_check() argument
699 crtc); in mdp5_crtc_atomic_check()
702 struct mdp5_kms *mdp5_kms = get_kms(crtc); in mdp5_crtc_atomic_check()
704 struct drm_device *dev = crtc->dev; in mdp5_crtc_atomic_check()
715 DBG("%s: check", crtc->name); in mdp5_crtc_atomic_check()
731 * if any plane on this crtc uses 2 hwpipes, then we need in mdp5_crtc_atomic_check()
732 * the crtc to have a right hwmixer. in mdp5_crtc_atomic_check()
755 ret = mdp5_crtc_setup_pipeline(crtc, crtc_state, need_right_mixer); in mdp5_crtc_atomic_check()
768 start = get_start_stage(crtc, crtc_state, &pstates[0].state->base); in mdp5_crtc_atomic_check()
770 /* verify that there are not too many planes attached to crtc in mdp5_crtc_atomic_check()
784 DBG("%s: assign pipe %s on stage=%d", crtc->name, in mdp5_crtc_atomic_check()
792 static void mdp5_crtc_atomic_begin(struct drm_crtc *crtc, in mdp5_crtc_atomic_begin() argument
795 DBG("%s: begin", crtc->name); in mdp5_crtc_atomic_begin()
798 static void mdp5_crtc_atomic_flush(struct drm_crtc *crtc, in mdp5_crtc_atomic_flush() argument
801 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_atomic_flush()
802 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_atomic_flush()
803 struct drm_device *dev = crtc->dev; in mdp5_crtc_atomic_flush()
806 DBG("%s: event: %p", crtc->name, crtc->state->event); in mdp5_crtc_atomic_flush()
811 mdp5_crtc->event = crtc->state->event; in mdp5_crtc_atomic_flush()
812 crtc->state->event = NULL; in mdp5_crtc_atomic_flush()
817 * it means we are trying to flush a CRTC whose state is disabled: in mdp5_crtc_atomic_flush()
824 blend_setup(crtc); in mdp5_crtc_atomic_flush()
833 request_pp_done_pending(crtc); in mdp5_crtc_atomic_flush()
835 mdp5_crtc->flushed_mask = crtc_flush_all(crtc); in mdp5_crtc_atomic_flush()
842 request_pending(crtc, PENDING_FLIP); in mdp5_crtc_atomic_flush()
845 static void get_roi(struct drm_crtc *crtc, uint32_t *roi_w, uint32_t *roi_h) in get_roi() argument
847 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in get_roi()
848 uint32_t xres = crtc->mode.hdisplay; in get_roi()
849 uint32_t yres = crtc->mode.vdisplay; in get_roi()
882 static void mdp5_crtc_restore_cursor(struct drm_crtc *crtc) in mdp5_crtc_restore_cursor() argument
885 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_restore_cursor()
886 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_restore_cursor()
887 struct mdp5_kms *mdp5_kms = get_kms(crtc); in mdp5_crtc_restore_cursor()
905 get_roi(crtc, &roi_w, &roi_h); in mdp5_crtc_restore_cursor()
925 crtc->name, x, y, roi_w, roi_h, src_x, src_y); in mdp5_crtc_restore_cursor()
950 static int mdp5_crtc_cursor_set(struct drm_crtc *crtc, in mdp5_crtc_cursor_set() argument
954 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_cursor_set()
955 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_cursor_set()
957 struct drm_device *dev = crtc->dev; in mdp5_crtc_cursor_set()
958 struct mdp5_kms *mdp5_kms = get_kms(crtc); in mdp5_crtc_cursor_set()
1015 mdp5_crtc_restore_cursor(crtc); in mdp5_crtc_cursor_set()
1027 crtc_flush(crtc, flush_mask); in mdp5_crtc_cursor_set()
1034 request_pending(crtc, PENDING_CURSOR); in mdp5_crtc_cursor_set()
1039 static int mdp5_crtc_cursor_move(struct drm_crtc *crtc, int x, int y) in mdp5_crtc_cursor_move() argument
1041 struct mdp5_kms *mdp5_kms = get_kms(crtc); in mdp5_crtc_cursor_move()
1042 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_cursor_move()
1043 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_cursor_move()
1045 struct drm_device *dev = crtc->dev; in mdp5_crtc_cursor_move()
1060 /* In case the CRTC is disabled, just drop the cursor update */ in mdp5_crtc_cursor_move()
1061 if (unlikely(!crtc->state->enable)) in mdp5_crtc_cursor_move()
1068 get_roi(crtc, &roi_w, &roi_h); in mdp5_crtc_cursor_move()
1073 mdp5_crtc_restore_cursor(crtc); in mdp5_crtc_cursor_move()
1076 crtc_flush(crtc, flush_mask); in mdp5_crtc_cursor_move()
1089 struct mdp5_kms *mdp5_kms = get_kms(state->crtc); in mdp5_crtc_atomic_print_state()
1108 mdp5_crtc_duplicate_state(struct drm_crtc *crtc) in mdp5_crtc_duplicate_state() argument
1112 if (WARN_ON(!crtc->state)) in mdp5_crtc_duplicate_state()
1115 mdp5_cstate = kmemdup(to_mdp5_crtc_state(crtc->state), in mdp5_crtc_duplicate_state()
1120 __drm_atomic_helper_crtc_duplicate_state(crtc, &mdp5_cstate->base); in mdp5_crtc_duplicate_state()
1125 static void mdp5_crtc_destroy_state(struct drm_crtc *crtc, struct drm_crtc_state *state) in mdp5_crtc_destroy_state() argument
1134 static void mdp5_crtc_reset(struct drm_crtc *crtc) in mdp5_crtc_reset() argument
1139 if (crtc->state) in mdp5_crtc_reset()
1140 mdp5_crtc_destroy_state(crtc, crtc->state); in mdp5_crtc_reset()
1143 __drm_atomic_helper_crtc_reset(crtc, &mdp5_cstate->base); in mdp5_crtc_reset()
1145 __drm_atomic_helper_crtc_reset(crtc, NULL); in mdp5_crtc_reset()
1191 struct drm_crtc *crtc = &mdp5_crtc->base; in mdp5_crtc_vblank_irq() local
1192 struct msm_drm_private *priv = crtc->dev->dev_private; in mdp5_crtc_vblank_irq()
1195 mdp_irq_unregister(&get_kms(crtc)->base, &mdp5_crtc->vblank); in mdp5_crtc_vblank_irq()
1200 complete_flip(crtc, NULL); in mdp5_crtc_vblank_irq()
1222 static void mdp5_crtc_wait_for_pp_done(struct drm_crtc *crtc) in mdp5_crtc_wait_for_pp_done() argument
1224 struct drm_device *dev = crtc->dev; in mdp5_crtc_wait_for_pp_done()
1225 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_wait_for_pp_done()
1226 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_wait_for_pp_done()
1236 static void mdp5_crtc_wait_for_flush_done(struct drm_crtc *crtc) in mdp5_crtc_wait_for_flush_done() argument
1238 struct drm_device *dev = crtc->dev; in mdp5_crtc_wait_for_flush_done()
1239 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_wait_for_flush_done()
1240 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_wait_for_flush_done()
1244 /* Should not call this function if crtc is disabled. */ in mdp5_crtc_wait_for_flush_done()
1248 ret = drm_crtc_vblank_get(crtc); in mdp5_crtc_wait_for_flush_done()
1252 ret = wait_event_timeout(dev->vblank[drm_crtc_index(crtc)].queue, in mdp5_crtc_wait_for_flush_done()
1257 dev_warn(dev->dev, "vblank time out, crtc=%d\n", mdp5_crtc->id); in mdp5_crtc_wait_for_flush_done()
1261 drm_crtc_vblank_put(crtc); in mdp5_crtc_wait_for_flush_done()
1264 uint32_t mdp5_crtc_vblank(struct drm_crtc *crtc) in mdp5_crtc_vblank() argument
1266 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_vblank()
1270 void mdp5_crtc_set_pipeline(struct drm_crtc *crtc) in mdp5_crtc_set_pipeline() argument
1272 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_set_pipeline()
1273 struct mdp5_kms *mdp5_kms = get_kms(crtc); in mdp5_crtc_set_pipeline()
1281 struct mdp5_ctl *mdp5_crtc_get_ctl(struct drm_crtc *crtc) in mdp5_crtc_get_ctl() argument
1283 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_get_ctl()
1288 struct mdp5_hw_mixer *mdp5_crtc_get_mixer(struct drm_crtc *crtc) in mdp5_crtc_get_mixer() argument
1292 if (WARN_ON(!crtc)) in mdp5_crtc_get_mixer()
1295 mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_get_mixer()
1301 struct mdp5_pipeline *mdp5_crtc_get_pipeline(struct drm_crtc *crtc) in mdp5_crtc_get_pipeline() argument
1305 if (WARN_ON(!crtc)) in mdp5_crtc_get_pipeline()
1308 mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_get_pipeline()
1313 void mdp5_crtc_wait_for_commit_done(struct drm_crtc *crtc) in mdp5_crtc_wait_for_commit_done() argument
1315 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_wait_for_commit_done()
1318 mdp5_crtc_wait_for_pp_done(crtc); in mdp5_crtc_wait_for_commit_done()
1320 mdp5_crtc_wait_for_flush_done(crtc); in mdp5_crtc_wait_for_commit_done()
1323 /* initialize crtc */
1328 struct drm_crtc *crtc = NULL; in mdp5_crtc_init() local
1335 crtc = &mdp5_crtc->base; in mdp5_crtc_init()
1349 drm_crtc_init_with_planes(dev, crtc, plane, cursor_plane, in mdp5_crtc_init()
1357 drm_crtc_helper_add(crtc, &mdp5_crtc_helper_funcs); in mdp5_crtc_init()
1359 return crtc; in mdp5_crtc_init()