Lines Matching full:crtc
7 * DOC: VC4 CRTC module
10 * DRM's concept of a CRTC. The PV generates video timings from the
14 * However, the DRM CRTC also collects the configuration of all the
15 * DRM planes attached to it. As a result, the CRTC is also
17 * the CRTC will use.
106 static bool vc4_crtc_get_scanout_position(struct drm_crtc *crtc, in vc4_crtc_get_scanout_position() argument
112 struct drm_device *dev = crtc->dev; in vc4_crtc_get_scanout_position()
115 struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc); in vc4_crtc_get_scanout_position()
116 struct vc4_crtc_state *vc4_crtc_state = to_vc4_crtc_state(crtc->state); in vc4_crtc_get_scanout_position()
310 * Returns the encoder attached to the CRTC.
314 * same CRTC.
316 struct drm_encoder *vc4_get_crtc_encoder(struct drm_crtc *crtc, in vc4_get_crtc_encoder() argument
323 drm_for_each_encoder_mask(encoder, crtc->dev, state->encoder_mask) in vc4_get_crtc_encoder()
329 static void vc4_crtc_pixelvalve_reset(struct drm_crtc *crtc) in vc4_crtc_pixelvalve_reset() argument
331 struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc); in vc4_crtc_pixelvalve_reset()
332 struct drm_device *dev = crtc->dev; in vc4_crtc_pixelvalve_reset()
345 static void vc4_crtc_config_pv(struct drm_crtc *crtc, struct drm_encoder *encoder, in vc4_crtc_config_pv() argument
348 struct drm_device *dev = crtc->dev; in vc4_crtc_config_pv()
351 struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc); in vc4_crtc_config_pv()
353 struct drm_crtc_state *crtc_state = crtc->state; in vc4_crtc_config_pv()
378 dev_info(&vc4_crtc->pdev->dev, "CRTC %d regs before:\n", in vc4_crtc_config_pv()
379 drm_crtc_index(crtc)); in vc4_crtc_config_pv()
383 vc4_crtc_pixelvalve_reset(crtc); in vc4_crtc_config_pv()
479 dev_info(&vc4_crtc->pdev->dev, "CRTC %d regs after:\n", in vc4_crtc_config_pv()
480 drm_crtc_index(crtc)); in vc4_crtc_config_pv()
498 static int vc4_crtc_disable(struct drm_crtc *crtc, in vc4_crtc_disable() argument
504 struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc); in vc4_crtc_disable()
505 struct drm_device *dev = crtc->dev; in vc4_crtc_disable()
538 vc4_crtc_pixelvalve_reset(crtc); in vc4_crtc_disable()
549 int vc4_crtc_disable_at_boot(struct drm_crtc *crtc) in vc4_crtc_disable_at_boot() argument
551 struct drm_device *drm = crtc->dev; in vc4_crtc_disable_at_boot()
553 struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc); in vc4_crtc_disable_at_boot()
597 ret = vc4_crtc_disable(crtc, encoder, NULL, channel); in vc4_crtc_disable_at_boot()
610 void vc4_crtc_send_vblank(struct drm_crtc *crtc) in vc4_crtc_send_vblank() argument
612 struct drm_device *dev = crtc->dev; in vc4_crtc_send_vblank()
615 if (!crtc->state || !crtc->state->event) in vc4_crtc_send_vblank()
619 drm_crtc_send_vblank_event(crtc, crtc->state->event); in vc4_crtc_send_vblank()
620 crtc->state->event = NULL; in vc4_crtc_send_vblank()
624 static void vc4_crtc_atomic_disable(struct drm_crtc *crtc, in vc4_crtc_atomic_disable() argument
628 crtc); in vc4_crtc_atomic_disable()
630 struct drm_encoder *encoder = vc4_get_crtc_encoder(crtc, old_state); in vc4_crtc_atomic_disable()
631 struct drm_device *dev = crtc->dev; in vc4_crtc_atomic_disable()
633 drm_dbg(dev, "Disabling CRTC %s (%u) connected to Encoder %s (%u)", in vc4_crtc_atomic_disable()
634 crtc->name, crtc->base.id, encoder->name, encoder->base.id); in vc4_crtc_atomic_disable()
638 /* Disable vblank irq handling before crtc is disabled. */ in vc4_crtc_atomic_disable()
639 drm_crtc_vblank_off(crtc); in vc4_crtc_atomic_disable()
641 vc4_crtc_disable(crtc, encoder, state, old_vc4_state->assigned_channel); in vc4_crtc_atomic_disable()
644 * Make sure we issue a vblank event after disabling the CRTC if in vc4_crtc_atomic_disable()
647 vc4_crtc_send_vblank(crtc); in vc4_crtc_atomic_disable()
650 static void vc4_crtc_atomic_enable(struct drm_crtc *crtc, in vc4_crtc_atomic_enable() argument
654 crtc); in vc4_crtc_atomic_enable()
655 struct drm_device *dev = crtc->dev; in vc4_crtc_atomic_enable()
656 struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc); in vc4_crtc_atomic_enable()
657 struct drm_encoder *encoder = vc4_get_crtc_encoder(crtc, new_state); in vc4_crtc_atomic_enable()
661 drm_dbg(dev, "Enabling CRTC %s (%u) connected to Encoder %s (%u)", in vc4_crtc_atomic_enable()
662 crtc->name, crtc->base.id, encoder->name, encoder->base.id); in vc4_crtc_atomic_enable()
669 /* Enable vblank irq handling before crtc is started otherwise in vc4_crtc_atomic_enable()
672 drm_crtc_vblank_on(crtc); in vc4_crtc_atomic_enable()
674 vc4_hvs_atomic_enable(crtc, state); in vc4_crtc_atomic_enable()
679 vc4_crtc_config_pv(crtc, encoder, state); in vc4_crtc_atomic_enable()
698 static enum drm_mode_status vc4_crtc_mode_valid(struct drm_crtc *crtc, in vc4_crtc_mode_valid() argument
703 DRM_DEBUG_KMS("[CRTC:%d] Doublescan mode rejected.\n", in vc4_crtc_mode_valid()
704 crtc->base.id); in vc4_crtc_mode_valid()
731 if (conn_state->crtc != state->crtc) in vc4_crtc_get_margins()
742 int vc4_crtc_atomic_check(struct drm_crtc *crtc, in vc4_crtc_atomic_check() argument
746 crtc); in vc4_crtc_atomic_check()
753 ret = vc4_hvs_atomic_check(crtc, state); in vc4_crtc_atomic_check()
757 encoder = vc4_get_crtc_encoder(crtc, crtc_state); in vc4_crtc_atomic_check()
772 if (conn_state->crtc != crtc) in vc4_crtc_atomic_check()
792 static int vc4_enable_vblank(struct drm_crtc *crtc) in vc4_enable_vblank() argument
794 struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc); in vc4_enable_vblank()
795 struct drm_device *dev = crtc->dev; in vc4_enable_vblank()
808 static void vc4_disable_vblank(struct drm_crtc *crtc) in vc4_disable_vblank() argument
810 struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc); in vc4_disable_vblank()
811 struct drm_device *dev = crtc->dev; in vc4_disable_vblank()
824 struct drm_crtc *crtc = &vc4_crtc->base; in vc4_crtc_handle_page_flip() local
825 struct drm_device *dev = crtc->dev; in vc4_crtc_handle_page_flip()
843 drm_crtc_send_vblank_event(crtc, vc4_crtc->event); in vc4_crtc_handle_page_flip()
845 drm_crtc_vblank_put(crtc); in vc4_crtc_handle_page_flip()
850 * the CRTC and encoder already reconfigured, leading to in vc4_crtc_handle_page_flip()
851 * underruns. This can be seen when reconfiguring the CRTC. in vc4_crtc_handle_page_flip()
860 void vc4_crtc_handle_vblank(struct vc4_crtc *crtc) in vc4_crtc_handle_vblank() argument
862 crtc->t_vblank = ktime_get(); in vc4_crtc_handle_vblank()
863 drm_crtc_handle_vblank(&crtc->base); in vc4_crtc_handle_vblank()
864 vc4_crtc_handle_page_flip(crtc); in vc4_crtc_handle_vblank()
883 struct drm_crtc *crtc; member
900 struct drm_crtc *crtc = flip_state->crtc; in vc4_async_page_flip_complete() local
901 struct drm_device *dev = crtc->dev; in vc4_async_page_flip_complete()
902 struct drm_plane *plane = crtc->primary; in vc4_async_page_flip_complete()
909 drm_crtc_send_vblank_event(crtc, flip_state->event); in vc4_async_page_flip_complete()
913 drm_crtc_vblank_put(crtc); in vc4_async_page_flip_complete()
994 vc4_async_page_flip_common(struct drm_crtc *crtc, in vc4_async_page_flip_common() argument
999 struct drm_device *dev = crtc->dev; in vc4_async_page_flip_common()
1000 struct drm_plane *plane = crtc->primary; in vc4_async_page_flip_common()
1009 flip_state->crtc = crtc; in vc4_async_page_flip_common()
1024 WARN_ON(drm_crtc_vblank_get(crtc) != 0); in vc4_async_page_flip_common()
1044 static int vc4_async_page_flip(struct drm_crtc *crtc, in vc4_async_page_flip() argument
1049 struct drm_device *dev = crtc->dev; in vc4_async_page_flip()
1071 ret = vc4_async_page_flip_common(crtc, fb, event, flags); in vc4_async_page_flip()
1080 static int vc5_async_page_flip(struct drm_crtc *crtc, in vc5_async_page_flip() argument
1085 return vc4_async_page_flip_common(crtc, fb, event, flags); in vc5_async_page_flip()
1088 int vc4_page_flip(struct drm_crtc *crtc, in vc4_page_flip() argument
1095 struct drm_device *dev = crtc->dev; in vc4_page_flip()
1099 return vc5_async_page_flip(crtc, fb, event, flags); in vc4_page_flip()
1101 return vc4_async_page_flip(crtc, fb, event, flags); in vc4_page_flip()
1103 return drm_atomic_helper_page_flip(crtc, fb, event, flags, ctx); in vc4_page_flip()
1107 struct drm_crtc_state *vc4_crtc_duplicate_state(struct drm_crtc *crtc) in vc4_crtc_duplicate_state() argument
1115 old_vc4_state = to_vc4_crtc_state(crtc->state); in vc4_crtc_duplicate_state()
1119 __drm_atomic_helper_crtc_duplicate_state(crtc, &vc4_state->base); in vc4_crtc_duplicate_state()
1123 void vc4_crtc_destroy_state(struct drm_crtc *crtc, in vc4_crtc_destroy_state() argument
1126 struct vc4_dev *vc4 = to_vc4_dev(crtc->dev); in vc4_crtc_destroy_state()
1138 drm_atomic_helper_crtc_destroy_state(crtc, state); in vc4_crtc_destroy_state()
1141 void vc4_crtc_reset(struct drm_crtc *crtc) in vc4_crtc_reset() argument
1145 if (crtc->state) in vc4_crtc_reset()
1146 vc4_crtc_destroy_state(crtc, crtc->state); in vc4_crtc_reset()
1150 crtc->state = NULL; in vc4_crtc_reset()
1155 __drm_atomic_helper_crtc_reset(crtc, &vc4_crtc_state->base); in vc4_crtc_reset()
1158 int vc4_crtc_late_register(struct drm_crtc *crtc) in vc4_crtc_late_register() argument
1160 struct drm_device *drm = crtc->dev; in vc4_crtc_late_register()
1161 struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc); in vc4_crtc_late_register()
1353 struct drm_crtc *crtc) in vc4_set_crtc_possible_masks() argument
1355 struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc); in vc4_set_crtc_possible_masks()
1371 encoder->possible_crtcs |= drm_crtc_mask(crtc); in vc4_set_crtc_possible_masks()
1379 * __vc4_crtc_init - Initializes a CRTC
1381 * @pdev: CRTC Platform Device
1382 * @vc4_crtc: CRTC Object to Initialize
1383 * @data: Configuration data associated with this CRTC
1384 * @primary_plane: Primary plane for CRTC
1385 * @crtc_funcs: Callbacks for the new CRTC
1386 * @crtc_helper_funcs: Helper Callbacks for the new CRTC
1387 * @feeds_txp: Is this CRTC connected to the TXP?
1389 * Initializes our private CRTC structure. This function is mostly
1406 struct drm_crtc *crtc = &vc4_crtc->base; in __vc4_crtc_init() local
1414 ret = drmm_crtc_init_with_planes(drm, crtc, primary_plane, NULL, in __vc4_crtc_init()
1419 drm_crtc_helper_add(crtc, crtc_helper_funcs); in __vc4_crtc_init()
1422 drm_mode_crtc_set_gamma_size(crtc, ARRAY_SIZE(vc4_crtc->lut_r)); in __vc4_crtc_init()
1423 drm_crtc_enable_color_mgmt(crtc, 0, false, crtc->gamma_size); in __vc4_crtc_init()
1425 /* We support CTM, but only for one CRTC at a time. It's therefore in __vc4_crtc_init()
1428 drm_crtc_enable_color_mgmt(crtc, 0, true, crtc->gamma_size); in __vc4_crtc_init()
1431 for (i = 0; i < crtc->gamma_size; i++) { in __vc4_crtc_init()
1471 struct drm_crtc *crtc; in vc4_crtc_bind() local
1477 crtc = &vc4_crtc->base; in vc4_crtc_bind()
1496 vc4_set_crtc_possible_masks(drm, crtc); in vc4_crtc_bind()
1503 "vc4 crtc", vc4_crtc); in vc4_crtc_bind()