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