@@ -46,6 +46,8 @@ struct vc4_crtc_state {
46
46
struct drm_crtc_state base ;
47
47
/* Dlist area for this CRTC configuration. */
48
48
struct drm_mm_node mm ;
49
+ bool feed_txp ;
50
+ bool txp_armed ;
49
51
};
50
52
51
53
static inline struct vc4_crtc_state *
@@ -324,10 +326,8 @@ static struct drm_encoder *vc4_get_crtc_encoder(struct drm_crtc *crtc)
324
326
return NULL ;
325
327
}
326
328
327
- static void vc4_crtc_mode_set_nofb (struct drm_crtc * crtc )
329
+ static void vc4_crtc_config_pv (struct drm_crtc * crtc )
328
330
{
329
- struct drm_device * dev = crtc -> dev ;
330
- struct vc4_dev * vc4 = to_vc4_dev (dev );
331
331
struct drm_encoder * encoder = vc4_get_crtc_encoder (crtc );
332
332
struct vc4_encoder * vc4_encoder = to_vc4_encoder (encoder );
333
333
struct vc4_crtc * vc4_crtc = to_vc4_crtc (crtc );
@@ -338,12 +338,6 @@ static void vc4_crtc_mode_set_nofb(struct drm_crtc *crtc)
338
338
bool is_dsi = (vc4_encoder -> type == VC4_ENCODER_TYPE_DSI0 ||
339
339
vc4_encoder -> type == VC4_ENCODER_TYPE_DSI1 );
340
340
u32 format = is_dsi ? PV_CONTROL_FORMAT_DSIV_24 : PV_CONTROL_FORMAT_24 ;
341
- bool debug_dump_regs = false;
342
-
343
- if (debug_dump_regs ) {
344
- DRM_INFO ("CRTC %d regs before:\n" , drm_crtc_index (crtc ));
345
- vc4_crtc_dump_regs (vc4_crtc );
346
- }
347
341
348
342
/* Reset the PV fifo. */
349
343
CRTC_WRITE (PV_CONTROL , 0 );
@@ -419,6 +413,49 @@ static void vc4_crtc_mode_set_nofb(struct drm_crtc *crtc)
419
413
PV_CONTROL_CLK_SELECT ) |
420
414
PV_CONTROL_FIFO_CLR |
421
415
PV_CONTROL_EN );
416
+ }
417
+
418
+ static void vc4_crtc_mode_set_nofb (struct drm_crtc * crtc )
419
+ {
420
+ struct drm_device * dev = crtc -> dev ;
421
+ struct vc4_dev * vc4 = to_vc4_dev (dev );
422
+ struct vc4_crtc * vc4_crtc = to_vc4_crtc (crtc );
423
+ struct vc4_crtc_state * vc4_state = to_vc4_crtc_state (crtc -> state );
424
+ struct drm_display_mode * mode = & crtc -> state -> adjusted_mode ;
425
+ bool interlace = mode -> flags & DRM_MODE_FLAG_INTERLACE ;
426
+ bool debug_dump_regs = false;
427
+
428
+ if (debug_dump_regs ) {
429
+ DRM_INFO ("CRTC %d regs before:\n" , drm_crtc_index (crtc ));
430
+ vc4_crtc_dump_regs (vc4_crtc );
431
+ }
432
+
433
+ if (vc4_crtc -> channel == 2 ) {
434
+ u32 dispctrl ;
435
+ u32 dsp3_mux ;
436
+
437
+ /*
438
+ * SCALER_DISPCTRL_DSP3 = X, where X < 2 means 'connect DSP3 to
439
+ * FIFO X'.
440
+ * SCALER_DISPCTRL_DSP3 = 3 means 'disable DSP 3'.
441
+ *
442
+ * DSP3 is connected to FIFO2 unless the transposer is
443
+ * enabled. In this case, FIFO 2 is directly accessed by the
444
+ * TXP IP, and we need to disable the FIFO2 -> pixelvalve1
445
+ * route.
446
+ */
447
+ if (vc4_state -> feed_txp )
448
+ dsp3_mux = VC4_SET_FIELD (3 , SCALER_DISPCTRL_DSP3_MUX );
449
+ else
450
+ dsp3_mux = VC4_SET_FIELD (2 , SCALER_DISPCTRL_DSP3_MUX );
451
+
452
+ dispctrl = HVS_READ (SCALER_DISPCTRL ) &
453
+ ~SCALER_DISPCTRL_DSP3_MUX_MASK ;
454
+ HVS_WRITE (SCALER_DISPCTRL , dispctrl | dsp3_mux );
455
+ }
456
+
457
+ if (!vc4_state -> feed_txp )
458
+ vc4_crtc_config_pv (crtc );
422
459
423
460
HVS_WRITE (SCALER_DISPBKGNDX (vc4_crtc -> channel ),
424
461
SCALER_DISPBKGND_AUTOHS |
@@ -499,6 +536,13 @@ static void vc4_crtc_atomic_disable(struct drm_crtc *crtc,
499
536
}
500
537
}
501
538
539
+ void vc4_crtc_txp_armed (struct drm_crtc_state * state )
540
+ {
541
+ struct vc4_crtc_state * vc4_state = to_vc4_crtc_state (state );
542
+
543
+ vc4_state -> txp_armed = true;
544
+ }
545
+
502
546
static void vc4_crtc_update_dlist (struct drm_crtc * crtc )
503
547
{
504
548
struct drm_device * dev = crtc -> dev ;
@@ -514,8 +558,11 @@ static void vc4_crtc_update_dlist(struct drm_crtc *crtc)
514
558
WARN_ON (drm_crtc_vblank_get (crtc ) != 0 );
515
559
516
560
spin_lock_irqsave (& dev -> event_lock , flags );
517
- vc4_crtc -> event = crtc -> state -> event ;
518
- crtc -> state -> event = NULL ;
561
+
562
+ if (!vc4_state -> feed_txp || vc4_state -> txp_armed ) {
563
+ vc4_crtc -> event = crtc -> state -> event ;
564
+ crtc -> state -> event = NULL ;
565
+ }
519
566
520
567
HVS_WRITE (SCALER_DISPLISTX (vc4_crtc -> channel ),
521
568
vc4_state -> mm .start );
@@ -533,8 +580,8 @@ static void vc4_crtc_atomic_enable(struct drm_crtc *crtc,
533
580
struct drm_device * dev = crtc -> dev ;
534
581
struct vc4_dev * vc4 = to_vc4_dev (dev );
535
582
struct vc4_crtc * vc4_crtc = to_vc4_crtc (crtc );
536
- struct drm_crtc_state * state = crtc -> state ;
537
- struct drm_display_mode * mode = & state -> adjusted_mode ;
583
+ struct vc4_crtc_state * vc4_state = to_vc4_crtc_state ( crtc -> state ) ;
584
+ struct drm_display_mode * mode = & crtc -> state -> adjusted_mode ;
538
585
539
586
require_hvs_enabled (dev );
540
587
@@ -546,15 +593,21 @@ static void vc4_crtc_atomic_enable(struct drm_crtc *crtc,
546
593
547
594
/* Turn on the scaler, which will wait for vstart to start
548
595
* compositing.
596
+ * When feeding the transposer, we should operate in oneshot
597
+ * mode.
549
598
*/
550
599
HVS_WRITE (SCALER_DISPCTRLX (vc4_crtc -> channel ),
551
600
VC4_SET_FIELD (mode -> hdisplay , SCALER_DISPCTRLX_WIDTH ) |
552
601
VC4_SET_FIELD (mode -> vdisplay , SCALER_DISPCTRLX_HEIGHT ) |
553
- SCALER_DISPCTRLX_ENABLE );
602
+ SCALER_DISPCTRLX_ENABLE |
603
+ (vc4_state -> feed_txp ? SCALER_DISPCTRLX_ONESHOT : 0 ));
554
604
555
- /* Turn on the pixel valve, which will emit the vstart signal. */
556
- CRTC_WRITE (PV_V_CONTROL ,
557
- CRTC_READ (PV_V_CONTROL ) | PV_VCONTROL_VIDEN );
605
+ /* When feeding the transposer block the pixelvalve is unneeded and
606
+ * should not be enabled.
607
+ */
608
+ if (!vc4_state -> feed_txp )
609
+ CRTC_WRITE (PV_V_CONTROL ,
610
+ CRTC_READ (PV_V_CONTROL ) | PV_VCONTROL_VIDEN );
558
611
}
559
612
560
613
static enum drm_mode_status vc4_crtc_mode_valid (struct drm_crtc * crtc ,
@@ -579,8 +632,10 @@ static int vc4_crtc_atomic_check(struct drm_crtc *crtc,
579
632
struct drm_plane * plane ;
580
633
unsigned long flags ;
581
634
const struct drm_plane_state * plane_state ;
635
+ struct drm_connector * conn ;
636
+ struct drm_connector_state * conn_state ;
582
637
u32 dlist_count = 0 ;
583
- int ret ;
638
+ int ret , i ;
584
639
585
640
/* The pixelvalve can only feed one encoder (and encoders are
586
641
* 1:1 with connectors.)
@@ -600,6 +655,24 @@ static int vc4_crtc_atomic_check(struct drm_crtc *crtc,
600
655
if (ret )
601
656
return ret ;
602
657
658
+ for_each_new_connector_in_state (state -> state , conn , conn_state , i ) {
659
+ if (conn_state -> crtc != crtc )
660
+ continue ;
661
+
662
+ /* The writeback connector is implemented using the transposer
663
+ * block which is directly taking its data from the HVS FIFO.
664
+ */
665
+ if (conn -> connector_type == DRM_MODE_CONNECTOR_WRITEBACK ) {
666
+ state -> no_vblank = true;
667
+ vc4_state -> feed_txp = true;
668
+ } else {
669
+ state -> no_vblank = false;
670
+ vc4_state -> feed_txp = false;
671
+ }
672
+
673
+ break ;
674
+ }
675
+
603
676
return 0 ;
604
677
}
605
678
@@ -713,25 +786,31 @@ static void vc4_crtc_handle_page_flip(struct vc4_crtc *vc4_crtc)
713
786
714
787
spin_lock_irqsave (& dev -> event_lock , flags );
715
788
if (vc4_crtc -> event &&
716
- (vc4_state -> mm .start == HVS_READ (SCALER_DISPLACTX (chan )))) {
789
+ (vc4_state -> mm .start == HVS_READ (SCALER_DISPLACTX (chan )) ||
790
+ vc4_state -> feed_txp )) {
717
791
drm_crtc_send_vblank_event (crtc , vc4_crtc -> event );
718
792
vc4_crtc -> event = NULL ;
719
793
drm_crtc_vblank_put (crtc );
720
794
}
721
795
spin_unlock_irqrestore (& dev -> event_lock , flags );
722
796
}
723
797
798
+ void vc4_crtc_handle_vblank (struct vc4_crtc * crtc )
799
+ {
800
+ crtc -> t_vblank = ktime_get ();
801
+ drm_crtc_handle_vblank (& crtc -> base );
802
+ vc4_crtc_handle_page_flip (crtc );
803
+ }
804
+
724
805
static irqreturn_t vc4_crtc_irq_handler (int irq , void * data )
725
806
{
726
807
struct vc4_crtc * vc4_crtc = data ;
727
808
u32 stat = CRTC_READ (PV_INTSTAT );
728
809
irqreturn_t ret = IRQ_NONE ;
729
810
730
811
if (stat & PV_INT_VFP_START ) {
731
- vc4_crtc -> t_vblank = ktime_get ();
732
812
CRTC_WRITE (PV_INTSTAT , PV_INT_VFP_START );
733
- drm_crtc_handle_vblank (& vc4_crtc -> base );
734
- vc4_crtc_handle_page_flip (vc4_crtc );
813
+ vc4_crtc_handle_vblank (vc4_crtc );
735
814
ret = IRQ_HANDLED ;
736
815
}
737
816
@@ -884,12 +963,15 @@ static int vc4_page_flip(struct drm_crtc *crtc,
884
963
885
964
static struct drm_crtc_state * vc4_crtc_duplicate_state (struct drm_crtc * crtc )
886
965
{
887
- struct vc4_crtc_state * vc4_state ;
966
+ struct vc4_crtc_state * vc4_state , * old_vc4_state ;
888
967
889
968
vc4_state = kzalloc (sizeof (* vc4_state ), GFP_KERNEL );
890
969
if (!vc4_state )
891
970
return NULL ;
892
971
972
+ old_vc4_state = to_vc4_crtc_state (crtc -> state );
973
+ vc4_state -> feed_txp = old_vc4_state -> feed_txp ;
974
+
893
975
__drm_atomic_helper_crtc_duplicate_state (crtc , & vc4_state -> base );
894
976
return & vc4_state -> base ;
895
977
}
@@ -987,9 +1069,17 @@ static void vc4_set_crtc_possible_masks(struct drm_device *drm,
987
1069
struct drm_encoder * encoder ;
988
1070
989
1071
drm_for_each_encoder (encoder , drm ) {
990
- struct vc4_encoder * vc4_encoder = to_vc4_encoder ( encoder ) ;
1072
+ struct vc4_encoder * vc4_encoder ;
991
1073
int i ;
992
1074
1075
+ /* HVS FIFO2 can feed the TXP IP. */
1076
+ if (crtc_data -> hvs_channel == 2 &&
1077
+ encoder -> encoder_type == DRM_MODE_ENCODER_VIRTUAL ) {
1078
+ encoder -> possible_crtcs |= drm_crtc_mask (crtc );
1079
+ continue ;
1080
+ }
1081
+
1082
+ vc4_encoder = to_vc4_encoder (encoder );
993
1083
for (i = 0 ; i < ARRAY_SIZE (crtc_data -> encoder_types ); i ++ ) {
994
1084
if (vc4_encoder -> type == encoder_types [i ]) {
995
1085
vc4_encoder -> clock_select = i ;
0 commit comments