Lines Matching full:crtc

69 static void mdp5_crtc_restore_cursor(struct drm_crtc *crtc);
71 static struct mdp5_kms *get_kms(struct drm_crtc *crtc) in get_kms() argument
73 struct msm_drm_private *priv = crtc->dev->dev_private; in get_kms()
77 static void request_pending(struct drm_crtc *crtc, uint32_t pending) in request_pending() argument
79 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in request_pending()
82 mdp_irq_register(&get_kms(crtc)->base, &mdp5_crtc->vblank); in request_pending()
85 static void request_pp_done_pending(struct drm_crtc *crtc) in request_pp_done_pending() argument
87 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in request_pp_done_pending()
91 static u32 crtc_flush(struct drm_crtc *crtc, u32 flush_mask) in crtc_flush() argument
93 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in crtc_flush()
100 DBG("%s: flush=%08x", crtc->name, flush_mask); in crtc_flush()
110 static u32 crtc_flush_all(struct drm_crtc *crtc) in crtc_flush_all() argument
112 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in crtc_flush_all()
121 drm_atomic_crtc_for_each_plane(plane, crtc) { in crtc_flush_all()
134 return crtc_flush(crtc, flush_mask); in crtc_flush_all()
138 static void complete_flip(struct drm_crtc *crtc, struct drm_file *file) in complete_flip() argument
140 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in complete_flip()
142 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in complete_flip()
144 struct drm_device *dev = crtc->dev; in complete_flip()
152 DBG("%s: send event: %p", crtc->name, event); in complete_flip()
153 drm_crtc_send_vblank_event(crtc, event); in complete_flip()
157 if (ctl && !crtc->state->enable) { in complete_flip()
205 * blend_setup() - blend all the planes of a CRTC
211 static void blend_setup(struct drm_crtc *crtc) in blend_setup() argument
213 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in blend_setup()
214 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in blend_setup()
216 struct mdp5_kms *mdp5_kms = get_kms(crtc); in blend_setup()
243 drm_atomic_crtc_for_each_plane(plane, crtc) { in blend_setup()
361 static void mdp5_crtc_mode_set_nofb(struct drm_crtc *crtc) in mdp5_crtc_mode_set_nofb() argument
363 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_mode_set_nofb()
364 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_mode_set_nofb()
365 struct mdp5_kms *mdp5_kms = get_kms(crtc); in mdp5_crtc_mode_set_nofb()
373 if (WARN_ON(!crtc->state)) in mdp5_crtc_mode_set_nofb()
376 mode = &crtc->state->adjusted_mode; in mdp5_crtc_mode_set_nofb()
378 DBG("%s: set mode: " DRM_MODE_FMT, crtc->name, DRM_MODE_ARG(mode)); in mdp5_crtc_mode_set_nofb()
410 static struct drm_encoder *get_encoder_from_crtc(struct drm_crtc *crtc) in get_encoder_from_crtc() argument
412 struct drm_device *dev = crtc->dev; in get_encoder_from_crtc()
416 if (encoder->crtc == crtc) in get_encoder_from_crtc()
422 static bool mdp5_crtc_get_scanout_position(struct drm_crtc *crtc, in mdp5_crtc_get_scanout_position() argument
428 unsigned int pipe = crtc->index; in mdp5_crtc_get_scanout_position()
433 encoder = get_encoder_from_crtc(crtc); in mdp5_crtc_get_scanout_position()
435 DRM_ERROR("no encoder found for crtc %d\n", pipe); in mdp5_crtc_get_scanout_position()
476 static u32 mdp5_crtc_get_vblank_counter(struct drm_crtc *crtc) in mdp5_crtc_get_vblank_counter() argument
480 encoder = get_encoder_from_crtc(crtc); in mdp5_crtc_get_vblank_counter()
487 static void mdp5_crtc_atomic_disable(struct drm_crtc *crtc, in mdp5_crtc_atomic_disable() argument
490 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_atomic_disable()
491 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_atomic_disable()
492 struct mdp5_kms *mdp5_kms = get_kms(crtc); in mdp5_crtc_atomic_disable()
496 DBG("%s", crtc->name); in mdp5_crtc_atomic_disable()
502 drm_crtc_vblank_off(crtc); in mdp5_crtc_atomic_disable()
510 if (crtc->state->event && !crtc->state->active) { in mdp5_crtc_atomic_disable()
513 drm_crtc_send_vblank_event(crtc, crtc->state->event); in mdp5_crtc_atomic_disable()
514 crtc->state->event = NULL; in mdp5_crtc_atomic_disable()
521 static void mdp5_crtc_vblank_on(struct drm_crtc *crtc) in mdp5_crtc_vblank_on() argument
523 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_vblank_on()
528 drm_crtc_set_max_vblank_count(crtc, count); in mdp5_crtc_vblank_on()
530 drm_crtc_vblank_on(crtc); in mdp5_crtc_vblank_on()
533 static void mdp5_crtc_atomic_enable(struct drm_crtc *crtc, in mdp5_crtc_atomic_enable() argument
536 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_atomic_enable()
537 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_atomic_enable()
538 struct mdp5_kms *mdp5_kms = get_kms(crtc); in mdp5_crtc_atomic_enable()
541 DBG("%s", crtc->name); in mdp5_crtc_atomic_enable()
557 mdp5_crtc_restore_cursor(crtc); in mdp5_crtc_atomic_enable()
569 mdp5_crtc_vblank_on(crtc); in mdp5_crtc_atomic_enable()
571 mdp5_crtc_mode_set_nofb(crtc); in mdp5_crtc_atomic_enable()
581 static int mdp5_crtc_setup_pipeline(struct drm_crtc *crtc, in mdp5_crtc_setup_pipeline() argument
607 ret = mdp5_mixer_assign(new_crtc_state->state, crtc, caps, in mdp5_crtc_setup_pipeline()
669 static enum mdp_mixer_stage_id get_start_stage(struct drm_crtc *crtc, in get_start_stage() argument
692 static int mdp5_crtc_atomic_check(struct drm_crtc *crtc, in mdp5_crtc_atomic_check() argument
696 crtc); in mdp5_crtc_atomic_check()
699 struct mdp5_kms *mdp5_kms = get_kms(crtc); in mdp5_crtc_atomic_check()
701 struct drm_device *dev = crtc->dev; in mdp5_crtc_atomic_check()
712 DBG("%s: check", crtc->name); in mdp5_crtc_atomic_check()
728 * if any plane on this crtc uses 2 hwpipes, then we need in mdp5_crtc_atomic_check()
729 * the crtc to have a right hwmixer. in mdp5_crtc_atomic_check()
752 ret = mdp5_crtc_setup_pipeline(crtc, crtc_state, need_right_mixer); in mdp5_crtc_atomic_check()
765 start = get_start_stage(crtc, crtc_state, &pstates[0].state->base); in mdp5_crtc_atomic_check()
767 /* verify that there are not too many planes attached to crtc in mdp5_crtc_atomic_check()
781 DBG("%s: assign pipe %s on stage=%d", crtc->name, in mdp5_crtc_atomic_check()
789 static void mdp5_crtc_atomic_begin(struct drm_crtc *crtc, in mdp5_crtc_atomic_begin() argument
792 DBG("%s: begin", crtc->name); in mdp5_crtc_atomic_begin()
795 static void mdp5_crtc_atomic_flush(struct drm_crtc *crtc, in mdp5_crtc_atomic_flush() argument
798 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_atomic_flush()
799 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_atomic_flush()
800 struct drm_device *dev = crtc->dev; in mdp5_crtc_atomic_flush()
803 DBG("%s: event: %p", crtc->name, crtc->state->event); in mdp5_crtc_atomic_flush()
808 mdp5_crtc->event = crtc->state->event; in mdp5_crtc_atomic_flush()
809 crtc->state->event = NULL; in mdp5_crtc_atomic_flush()
814 * it means we are trying to flush a CRTC whose state is disabled: in mdp5_crtc_atomic_flush()
821 blend_setup(crtc); in mdp5_crtc_atomic_flush()
830 request_pp_done_pending(crtc); in mdp5_crtc_atomic_flush()
832 mdp5_crtc->flushed_mask = crtc_flush_all(crtc); in mdp5_crtc_atomic_flush()
839 request_pending(crtc, PENDING_FLIP); in mdp5_crtc_atomic_flush()
842 static void get_roi(struct drm_crtc *crtc, uint32_t *roi_w, uint32_t *roi_h) in get_roi() argument
844 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in get_roi()
845 uint32_t xres = crtc->mode.hdisplay; in get_roi()
846 uint32_t yres = crtc->mode.vdisplay; in get_roi()
879 static void mdp5_crtc_restore_cursor(struct drm_crtc *crtc) in mdp5_crtc_restore_cursor() argument
882 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_restore_cursor()
883 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_restore_cursor()
884 struct mdp5_kms *mdp5_kms = get_kms(crtc); in mdp5_crtc_restore_cursor()
902 get_roi(crtc, &roi_w, &roi_h); in mdp5_crtc_restore_cursor()
922 crtc->name, x, y, roi_w, roi_h, src_x, src_y); in mdp5_crtc_restore_cursor()
947 static int mdp5_crtc_cursor_set(struct drm_crtc *crtc, in mdp5_crtc_cursor_set() argument
951 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_cursor_set()
952 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_cursor_set()
954 struct drm_device *dev = crtc->dev; in mdp5_crtc_cursor_set()
955 struct mdp5_kms *mdp5_kms = get_kms(crtc); in mdp5_crtc_cursor_set()
1012 mdp5_crtc_restore_cursor(crtc); in mdp5_crtc_cursor_set()
1024 crtc_flush(crtc, flush_mask); in mdp5_crtc_cursor_set()
1031 request_pending(crtc, PENDING_CURSOR); in mdp5_crtc_cursor_set()
1036 static int mdp5_crtc_cursor_move(struct drm_crtc *crtc, int x, int y) in mdp5_crtc_cursor_move() argument
1038 struct mdp5_kms *mdp5_kms = get_kms(crtc); in mdp5_crtc_cursor_move()
1039 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_cursor_move()
1040 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_cursor_move()
1042 struct drm_device *dev = crtc->dev; in mdp5_crtc_cursor_move()
1057 /* In case the CRTC is disabled, just drop the cursor update */ in mdp5_crtc_cursor_move()
1058 if (unlikely(!crtc->state->enable)) in mdp5_crtc_cursor_move()
1065 get_roi(crtc, &roi_w, &roi_h); in mdp5_crtc_cursor_move()
1070 mdp5_crtc_restore_cursor(crtc); in mdp5_crtc_cursor_move()
1073 crtc_flush(crtc, flush_mask); in mdp5_crtc_cursor_move()
1086 struct mdp5_kms *mdp5_kms = get_kms(state->crtc); in mdp5_crtc_atomic_print_state()
1105 mdp5_crtc_duplicate_state(struct drm_crtc *crtc) in mdp5_crtc_duplicate_state() argument
1109 if (WARN_ON(!crtc->state)) in mdp5_crtc_duplicate_state()
1112 mdp5_cstate = kmemdup(to_mdp5_crtc_state(crtc->state), in mdp5_crtc_duplicate_state()
1117 __drm_atomic_helper_crtc_duplicate_state(crtc, &mdp5_cstate->base); in mdp5_crtc_duplicate_state()
1122 static void mdp5_crtc_destroy_state(struct drm_crtc *crtc, struct drm_crtc_state *state) in mdp5_crtc_destroy_state() argument
1131 static void mdp5_crtc_reset(struct drm_crtc *crtc) in mdp5_crtc_reset() argument
1136 if (crtc->state) in mdp5_crtc_reset()
1137 mdp5_crtc_destroy_state(crtc, crtc->state); in mdp5_crtc_reset()
1140 __drm_atomic_helper_crtc_reset(crtc, &mdp5_cstate->base); in mdp5_crtc_reset()
1142 __drm_atomic_helper_crtc_reset(crtc, NULL); in mdp5_crtc_reset()
1186 struct drm_crtc *crtc = &mdp5_crtc->base; in mdp5_crtc_vblank_irq() local
1187 struct msm_drm_private *priv = crtc->dev->dev_private; in mdp5_crtc_vblank_irq()
1190 mdp_irq_unregister(&get_kms(crtc)->base, &mdp5_crtc->vblank); in mdp5_crtc_vblank_irq()
1195 complete_flip(crtc, NULL); in mdp5_crtc_vblank_irq()
1217 static void mdp5_crtc_wait_for_pp_done(struct drm_crtc *crtc) in mdp5_crtc_wait_for_pp_done() argument
1219 struct drm_device *dev = crtc->dev; in mdp5_crtc_wait_for_pp_done()
1220 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_wait_for_pp_done()
1221 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_wait_for_pp_done()
1231 static void mdp5_crtc_wait_for_flush_done(struct drm_crtc *crtc) in mdp5_crtc_wait_for_flush_done() argument
1233 struct drm_device *dev = crtc->dev; in mdp5_crtc_wait_for_flush_done()
1234 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_wait_for_flush_done()
1235 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_wait_for_flush_done()
1239 /* Should not call this function if crtc is disabled. */ in mdp5_crtc_wait_for_flush_done()
1243 ret = drm_crtc_vblank_get(crtc); in mdp5_crtc_wait_for_flush_done()
1247 ret = wait_event_timeout(dev->vblank[drm_crtc_index(crtc)].queue, in mdp5_crtc_wait_for_flush_done()
1252 dev_warn(dev->dev, "vblank time out, crtc=%d\n", mdp5_crtc->id); in mdp5_crtc_wait_for_flush_done()
1256 drm_crtc_vblank_put(crtc); in mdp5_crtc_wait_for_flush_done()
1259 uint32_t mdp5_crtc_vblank(struct drm_crtc *crtc) in mdp5_crtc_vblank() argument
1261 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_vblank()
1265 void mdp5_crtc_set_pipeline(struct drm_crtc *crtc) in mdp5_crtc_set_pipeline() argument
1267 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_set_pipeline()
1268 struct mdp5_kms *mdp5_kms = get_kms(crtc); in mdp5_crtc_set_pipeline()
1276 struct mdp5_ctl *mdp5_crtc_get_ctl(struct drm_crtc *crtc) in mdp5_crtc_get_ctl() argument
1278 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_get_ctl()
1283 struct mdp5_hw_mixer *mdp5_crtc_get_mixer(struct drm_crtc *crtc) in mdp5_crtc_get_mixer() argument
1287 if (WARN_ON(!crtc)) in mdp5_crtc_get_mixer()
1290 mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_get_mixer()
1296 struct mdp5_pipeline *mdp5_crtc_get_pipeline(struct drm_crtc *crtc) in mdp5_crtc_get_pipeline() argument
1300 if (WARN_ON(!crtc)) in mdp5_crtc_get_pipeline()
1303 mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_get_pipeline()
1308 void mdp5_crtc_wait_for_commit_done(struct drm_crtc *crtc) in mdp5_crtc_wait_for_commit_done() argument
1310 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_wait_for_commit_done()
1313 mdp5_crtc_wait_for_pp_done(crtc); in mdp5_crtc_wait_for_commit_done()
1315 mdp5_crtc_wait_for_flush_done(crtc); in mdp5_crtc_wait_for_commit_done()
1318 /* initialize crtc */
1323 struct drm_crtc *crtc = NULL; in mdp5_crtc_init() local
1336 crtc = &mdp5_crtc->base; in mdp5_crtc_init()
1356 drm_crtc_helper_add(crtc, &mdp5_crtc_helper_funcs); in mdp5_crtc_init()
1358 return crtc; in mdp5_crtc_init()