Lines Matching full:crtc
65 static void mdp5_crtc_restore_cursor(struct drm_crtc *crtc);
67 static struct mdp5_kms *get_kms(struct drm_crtc *crtc) in get_kms() argument
69 struct msm_drm_private *priv = crtc->dev->dev_private; in get_kms()
73 static void request_pending(struct drm_crtc *crtc, uint32_t pending) in request_pending() argument
75 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in request_pending()
78 mdp_irq_register(&get_kms(crtc)->base, &mdp5_crtc->vblank); in request_pending()
81 static void request_pp_done_pending(struct drm_crtc *crtc) in request_pp_done_pending() argument
83 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in request_pp_done_pending()
87 static u32 crtc_flush(struct drm_crtc *crtc, u32 flush_mask) in crtc_flush() argument
89 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in crtc_flush()
96 DBG("%s: flush=%08x", crtc->name, flush_mask); in crtc_flush()
106 static u32 crtc_flush_all(struct drm_crtc *crtc) in crtc_flush_all() argument
108 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in crtc_flush_all()
117 drm_atomic_crtc_for_each_plane(plane, crtc) { in crtc_flush_all()
130 return crtc_flush(crtc, flush_mask); in crtc_flush_all()
134 static void complete_flip(struct drm_crtc *crtc, struct drm_file *file) in complete_flip() argument
136 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in complete_flip()
138 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in complete_flip()
140 struct drm_device *dev = crtc->dev; in complete_flip()
148 DBG("%s: send event: %p", crtc->name, event); in complete_flip()
149 drm_crtc_send_vblank_event(crtc, event); in complete_flip()
153 if (ctl && !crtc->state->enable) { in complete_flip()
172 static void mdp5_crtc_destroy(struct drm_crtc *crtc) in mdp5_crtc_destroy() argument
174 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_destroy()
176 drm_crtc_cleanup(crtc); in mdp5_crtc_destroy()
204 * blend_setup() - blend all the planes of a CRTC
210 static void blend_setup(struct drm_crtc *crtc) in blend_setup() argument
212 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in blend_setup()
213 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in blend_setup()
215 struct mdp5_kms *mdp5_kms = get_kms(crtc); in blend_setup()
242 drm_atomic_crtc_for_each_plane(plane, crtc) { in blend_setup()
359 static void mdp5_crtc_mode_set_nofb(struct drm_crtc *crtc) in mdp5_crtc_mode_set_nofb() argument
361 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_mode_set_nofb()
362 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_mode_set_nofb()
363 struct mdp5_kms *mdp5_kms = get_kms(crtc); in mdp5_crtc_mode_set_nofb()
371 if (WARN_ON(!crtc->state)) in mdp5_crtc_mode_set_nofb()
374 mode = &crtc->state->adjusted_mode; in mdp5_crtc_mode_set_nofb()
376 DBG("%s: set mode: " DRM_MODE_FMT, crtc->name, DRM_MODE_ARG(mode)); in mdp5_crtc_mode_set_nofb()
408 static struct drm_encoder *get_encoder_from_crtc(struct drm_crtc *crtc) in get_encoder_from_crtc() argument
410 struct drm_device *dev = crtc->dev; in get_encoder_from_crtc()
414 if (encoder->crtc == crtc) in get_encoder_from_crtc()
420 static bool mdp5_crtc_get_scanout_position(struct drm_crtc *crtc, in mdp5_crtc_get_scanout_position() argument
426 unsigned int pipe = crtc->index; in mdp5_crtc_get_scanout_position()
431 encoder = get_encoder_from_crtc(crtc); in mdp5_crtc_get_scanout_position()
433 DRM_ERROR("no encoder found for crtc %d\n", pipe); in mdp5_crtc_get_scanout_position()
474 static u32 mdp5_crtc_get_vblank_counter(struct drm_crtc *crtc) in mdp5_crtc_get_vblank_counter() argument
478 encoder = get_encoder_from_crtc(crtc); in mdp5_crtc_get_vblank_counter()
485 static void mdp5_crtc_atomic_disable(struct drm_crtc *crtc, in mdp5_crtc_atomic_disable() argument
488 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_atomic_disable()
489 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_atomic_disable()
490 struct mdp5_kms *mdp5_kms = get_kms(crtc); in mdp5_crtc_atomic_disable()
494 DBG("%s", crtc->name); in mdp5_crtc_atomic_disable()
500 drm_crtc_vblank_off(crtc); in mdp5_crtc_atomic_disable()
508 if (crtc->state->event && !crtc->state->active) { in mdp5_crtc_atomic_disable()
511 drm_crtc_send_vblank_event(crtc, crtc->state->event); in mdp5_crtc_atomic_disable()
512 crtc->state->event = NULL; in mdp5_crtc_atomic_disable()
519 static void mdp5_crtc_vblank_on(struct drm_crtc *crtc) in mdp5_crtc_vblank_on() argument
521 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_vblank_on()
526 drm_crtc_set_max_vblank_count(crtc, count); in mdp5_crtc_vblank_on()
528 drm_crtc_vblank_on(crtc); in mdp5_crtc_vblank_on()
531 static void mdp5_crtc_atomic_enable(struct drm_crtc *crtc, in mdp5_crtc_atomic_enable() argument
534 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_atomic_enable()
535 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_atomic_enable()
536 struct mdp5_kms *mdp5_kms = get_kms(crtc); in mdp5_crtc_atomic_enable()
539 DBG("%s", crtc->name); in mdp5_crtc_atomic_enable()
555 mdp5_crtc_restore_cursor(crtc); in mdp5_crtc_atomic_enable()
567 mdp5_crtc_vblank_on(crtc); in mdp5_crtc_atomic_enable()
569 mdp5_crtc_mode_set_nofb(crtc); in mdp5_crtc_atomic_enable()
579 int mdp5_crtc_setup_pipeline(struct drm_crtc *crtc, in mdp5_crtc_setup_pipeline() argument
605 ret = mdp5_mixer_assign(new_crtc_state->state, crtc, caps, in mdp5_crtc_setup_pipeline()
661 static enum mdp_mixer_stage_id get_start_stage(struct drm_crtc *crtc, in get_start_stage() argument
684 static int mdp5_crtc_atomic_check(struct drm_crtc *crtc, in mdp5_crtc_atomic_check() argument
687 struct mdp5_kms *mdp5_kms = get_kms(crtc); in mdp5_crtc_atomic_check()
689 struct drm_device *dev = crtc->dev; in mdp5_crtc_atomic_check()
700 DBG("%s: check", crtc->name); in mdp5_crtc_atomic_check()
710 * if any plane on this crtc uses 2 hwpipes, then we need in mdp5_crtc_atomic_check()
711 * the crtc to have a right hwmixer. in mdp5_crtc_atomic_check()
734 ret = mdp5_crtc_setup_pipeline(crtc, state, need_right_mixer); in mdp5_crtc_atomic_check()
747 start = get_start_stage(crtc, state, &pstates[0].state->base); in mdp5_crtc_atomic_check()
749 /* verify that there are not too many planes attached to crtc in mdp5_crtc_atomic_check()
763 DBG("%s: assign pipe %s on stage=%d", crtc->name, in mdp5_crtc_atomic_check()
771 static void mdp5_crtc_atomic_begin(struct drm_crtc *crtc, in mdp5_crtc_atomic_begin() argument
774 DBG("%s: begin", crtc->name); in mdp5_crtc_atomic_begin()
777 static void mdp5_crtc_atomic_flush(struct drm_crtc *crtc, in mdp5_crtc_atomic_flush() argument
780 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_atomic_flush()
781 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_atomic_flush()
782 struct drm_device *dev = crtc->dev; in mdp5_crtc_atomic_flush()
785 DBG("%s: event: %p", crtc->name, crtc->state->event); in mdp5_crtc_atomic_flush()
790 mdp5_crtc->event = crtc->state->event; in mdp5_crtc_atomic_flush()
791 crtc->state->event = NULL; in mdp5_crtc_atomic_flush()
796 * it means we are trying to flush a CRTC whose state is disabled: in mdp5_crtc_atomic_flush()
803 blend_setup(crtc); in mdp5_crtc_atomic_flush()
812 request_pp_done_pending(crtc); in mdp5_crtc_atomic_flush()
814 mdp5_crtc->flushed_mask = crtc_flush_all(crtc); in mdp5_crtc_atomic_flush()
821 request_pending(crtc, PENDING_FLIP); in mdp5_crtc_atomic_flush()
824 static void get_roi(struct drm_crtc *crtc, uint32_t *roi_w, uint32_t *roi_h) in get_roi() argument
826 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in get_roi()
827 uint32_t xres = crtc->mode.hdisplay; in get_roi()
828 uint32_t yres = crtc->mode.vdisplay; in get_roi()
861 static void mdp5_crtc_restore_cursor(struct drm_crtc *crtc) in mdp5_crtc_restore_cursor() argument
864 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_restore_cursor()
865 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_restore_cursor()
866 struct mdp5_kms *mdp5_kms = get_kms(crtc); in mdp5_crtc_restore_cursor()
884 get_roi(crtc, &roi_w, &roi_h); in mdp5_crtc_restore_cursor()
904 crtc->name, x, y, roi_w, roi_h, src_x, src_y); in mdp5_crtc_restore_cursor()
929 static int mdp5_crtc_cursor_set(struct drm_crtc *crtc, in mdp5_crtc_cursor_set() argument
933 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_cursor_set()
934 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_cursor_set()
936 struct drm_device *dev = crtc->dev; in mdp5_crtc_cursor_set()
937 struct mdp5_kms *mdp5_kms = get_kms(crtc); in mdp5_crtc_cursor_set()
992 mdp5_crtc_restore_cursor(crtc); in mdp5_crtc_cursor_set()
1004 crtc_flush(crtc, flush_mask); in mdp5_crtc_cursor_set()
1011 request_pending(crtc, PENDING_CURSOR); in mdp5_crtc_cursor_set()
1016 static int mdp5_crtc_cursor_move(struct drm_crtc *crtc, int x, int y) in mdp5_crtc_cursor_move() argument
1018 struct mdp5_kms *mdp5_kms = get_kms(crtc); in mdp5_crtc_cursor_move()
1019 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_cursor_move()
1020 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_cursor_move()
1022 struct drm_device *dev = crtc->dev; in mdp5_crtc_cursor_move()
1037 /* In case the CRTC is disabled, just drop the cursor update */ in mdp5_crtc_cursor_move()
1038 if (unlikely(!crtc->state->enable)) in mdp5_crtc_cursor_move()
1045 get_roi(crtc, &roi_w, &roi_h); in mdp5_crtc_cursor_move()
1050 mdp5_crtc_restore_cursor(crtc); in mdp5_crtc_cursor_move()
1053 crtc_flush(crtc, flush_mask); in mdp5_crtc_cursor_move()
1066 struct mdp5_kms *mdp5_kms = get_kms(state->crtc); in mdp5_crtc_atomic_print_state()
1085 mdp5_crtc_duplicate_state(struct drm_crtc *crtc) in mdp5_crtc_duplicate_state() argument
1089 if (WARN_ON(!crtc->state)) in mdp5_crtc_duplicate_state()
1092 mdp5_cstate = kmemdup(to_mdp5_crtc_state(crtc->state), in mdp5_crtc_duplicate_state()
1097 __drm_atomic_helper_crtc_duplicate_state(crtc, &mdp5_cstate->base); in mdp5_crtc_duplicate_state()
1102 static void mdp5_crtc_destroy_state(struct drm_crtc *crtc, struct drm_crtc_state *state) in mdp5_crtc_destroy_state() argument
1111 static void mdp5_crtc_reset(struct drm_crtc *crtc) in mdp5_crtc_reset() argument
1116 if (crtc->state) in mdp5_crtc_reset()
1117 mdp5_crtc_destroy_state(crtc, crtc->state); in mdp5_crtc_reset()
1119 __drm_atomic_helper_crtc_reset(crtc, &mdp5_cstate->base); in mdp5_crtc_reset()
1151 struct drm_crtc *crtc = &mdp5_crtc->base; in mdp5_crtc_vblank_irq() local
1152 struct msm_drm_private *priv = crtc->dev->dev_private; in mdp5_crtc_vblank_irq()
1155 mdp_irq_unregister(&get_kms(crtc)->base, &mdp5_crtc->vblank); in mdp5_crtc_vblank_irq()
1160 complete_flip(crtc, NULL); in mdp5_crtc_vblank_irq()
1182 static void mdp5_crtc_wait_for_pp_done(struct drm_crtc *crtc) in mdp5_crtc_wait_for_pp_done() argument
1184 struct drm_device *dev = crtc->dev; in mdp5_crtc_wait_for_pp_done()
1185 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_wait_for_pp_done()
1186 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_wait_for_pp_done()
1196 static void mdp5_crtc_wait_for_flush_done(struct drm_crtc *crtc) in mdp5_crtc_wait_for_flush_done() argument
1198 struct drm_device *dev = crtc->dev; in mdp5_crtc_wait_for_flush_done()
1199 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_wait_for_flush_done()
1200 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_wait_for_flush_done()
1204 /* Should not call this function if crtc is disabled. */ in mdp5_crtc_wait_for_flush_done()
1208 ret = drm_crtc_vblank_get(crtc); in mdp5_crtc_wait_for_flush_done()
1212 ret = wait_event_timeout(dev->vblank[drm_crtc_index(crtc)].queue, in mdp5_crtc_wait_for_flush_done()
1217 dev_warn(dev->dev, "vblank time out, crtc=%d\n", mdp5_crtc->id); in mdp5_crtc_wait_for_flush_done()
1221 drm_crtc_vblank_put(crtc); in mdp5_crtc_wait_for_flush_done()
1224 uint32_t mdp5_crtc_vblank(struct drm_crtc *crtc) in mdp5_crtc_vblank() argument
1226 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); in mdp5_crtc_vblank()
1230 void mdp5_crtc_set_pipeline(struct drm_crtc *crtc) in mdp5_crtc_set_pipeline() argument
1232 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_set_pipeline()
1233 struct mdp5_kms *mdp5_kms = get_kms(crtc); in mdp5_crtc_set_pipeline()
1241 struct mdp5_ctl *mdp5_crtc_get_ctl(struct drm_crtc *crtc) in mdp5_crtc_get_ctl() argument
1243 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_get_ctl()
1248 struct mdp5_hw_mixer *mdp5_crtc_get_mixer(struct drm_crtc *crtc) in mdp5_crtc_get_mixer() argument
1252 if (WARN_ON(!crtc)) in mdp5_crtc_get_mixer()
1255 mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_get_mixer()
1261 struct mdp5_pipeline *mdp5_crtc_get_pipeline(struct drm_crtc *crtc) in mdp5_crtc_get_pipeline() argument
1265 if (WARN_ON(!crtc)) in mdp5_crtc_get_pipeline()
1268 mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_get_pipeline()
1273 void mdp5_crtc_wait_for_commit_done(struct drm_crtc *crtc) in mdp5_crtc_wait_for_commit_done() argument
1275 struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); in mdp5_crtc_wait_for_commit_done()
1278 mdp5_crtc_wait_for_pp_done(crtc); in mdp5_crtc_wait_for_commit_done()
1280 mdp5_crtc_wait_for_flush_done(crtc); in mdp5_crtc_wait_for_commit_done()
1283 /* initialize crtc */
1288 struct drm_crtc *crtc = NULL; in mdp5_crtc_init() local
1295 crtc = &mdp5_crtc->base; in mdp5_crtc_init()
1309 drm_crtc_init_with_planes(dev, crtc, plane, cursor_plane, in mdp5_crtc_init()
1315 drm_crtc_helper_add(crtc, &mdp5_crtc_helper_funcs); in mdp5_crtc_init()
1317 return crtc; in mdp5_crtc_init()