@@ -471,30 +471,68 @@ static int _dpu_kms_initialize_dsi(struct drm_device *dev,
471
471
struct dpu_kms * dpu_kms )
472
472
{
473
473
struct drm_encoder * encoder = NULL ;
474
+ struct msm_display_info info ;
474
475
int i , rc = 0 ;
475
476
476
477
if (!(priv -> dsi [0 ] || priv -> dsi [1 ]))
477
478
return rc ;
478
479
479
- /*TODO: Support two independent DSI connectors */
480
- encoder = dpu_encoder_init (dev , DRM_MODE_ENCODER_DSI );
481
- if (IS_ERR (encoder )) {
482
- DPU_ERROR ("encoder init failed for dsi display\n" );
483
- return PTR_ERR (encoder );
484
- }
485
-
486
- priv -> encoders [priv -> num_encoders ++ ] = encoder ;
487
-
480
+ /*
481
+ * We support following confiurations:
482
+ * - Single DSI host (dsi0 or dsi1)
483
+ * - Two independent DSI hosts
484
+ * - Bonded DSI0 and DSI1 hosts
485
+ *
486
+ * TODO: Support swapping DSI0 and DSI1 in the bonded setup.
487
+ */
488
488
for (i = 0 ; i < ARRAY_SIZE (priv -> dsi ); i ++ ) {
489
+ int other = (i + 1 ) % 2 ;
490
+
489
491
if (!priv -> dsi [i ])
490
492
continue ;
491
493
494
+ if (msm_dsi_is_bonded_dsi (priv -> dsi [i ]) &&
495
+ !msm_dsi_is_master_dsi (priv -> dsi [i ]))
496
+ continue ;
497
+
498
+ encoder = dpu_encoder_init (dev , DRM_MODE_ENCODER_DSI );
499
+ if (IS_ERR (encoder )) {
500
+ DPU_ERROR ("encoder init failed for dsi display\n" );
501
+ return PTR_ERR (encoder );
502
+ }
503
+
504
+ priv -> encoders [priv -> num_encoders ++ ] = encoder ;
505
+
506
+ memset (& info , 0 , sizeof (info ));
507
+ info .intf_type = encoder -> encoder_type ;
508
+
492
509
rc = msm_dsi_modeset_init (priv -> dsi [i ], dev , encoder );
493
510
if (rc ) {
494
511
DPU_ERROR ("modeset_init failed for dsi[%d], rc = %d\n" ,
495
512
i , rc );
496
513
break ;
497
514
}
515
+
516
+ info .h_tile_instance [info .num_of_h_tiles ++ ] = i ;
517
+ info .capabilities = msm_dsi_is_cmd_mode (priv -> dsi [i ]) ?
518
+ MSM_DISPLAY_CAP_CMD_MODE :
519
+ MSM_DISPLAY_CAP_VID_MODE ;
520
+
521
+ if (msm_dsi_is_bonded_dsi (priv -> dsi [i ]) && priv -> dsi [other ]) {
522
+ rc = msm_dsi_modeset_init (priv -> dsi [other ], dev , encoder );
523
+ if (rc ) {
524
+ DPU_ERROR ("modeset_init failed for dsi[%d], rc = %d\n" ,
525
+ other , rc );
526
+ break ;
527
+ }
528
+
529
+ info .h_tile_instance [info .num_of_h_tiles ++ ] = other ;
530
+ }
531
+
532
+ rc = dpu_encoder_setup (dev , encoder , & info );
533
+ if (rc )
534
+ DPU_ERROR ("failed to setup DPU encoder %d: rc:%d\n" ,
535
+ encoder -> base .id , rc );
498
536
}
499
537
500
538
return rc ;
@@ -505,6 +543,7 @@ static int _dpu_kms_initialize_displayport(struct drm_device *dev,
505
543
struct dpu_kms * dpu_kms )
506
544
{
507
545
struct drm_encoder * encoder = NULL ;
546
+ struct msm_display_info info ;
508
547
int rc = 0 ;
509
548
510
549
if (!priv -> dp )
@@ -516,6 +555,7 @@ static int _dpu_kms_initialize_displayport(struct drm_device *dev,
516
555
return PTR_ERR (encoder );
517
556
}
518
557
558
+ memset (& info , 0 , sizeof (info ));
519
559
rc = msm_dp_modeset_init (priv -> dp , dev , encoder );
520
560
if (rc ) {
521
561
DPU_ERROR ("modeset_init failed for DP, rc = %d\n" , rc );
@@ -524,6 +564,14 @@ static int _dpu_kms_initialize_displayport(struct drm_device *dev,
524
564
}
525
565
526
566
priv -> encoders [priv -> num_encoders ++ ] = encoder ;
567
+
568
+ info .num_of_h_tiles = 1 ;
569
+ info .capabilities = MSM_DISPLAY_CAP_VID_MODE ;
570
+ info .intf_type = encoder -> encoder_type ;
571
+ rc = dpu_encoder_setup (dev , encoder , & info );
572
+ if (rc )
573
+ DPU_ERROR ("failed to setup DPU encoder %d: rc:%d\n" ,
574
+ encoder -> base .id , rc );
527
575
return rc ;
528
576
}
529
577
@@ -726,41 +774,6 @@ static void dpu_kms_destroy(struct msm_kms *kms)
726
774
msm_kms_destroy (& dpu_kms -> base );
727
775
}
728
776
729
- static void _dpu_kms_set_encoder_mode (struct msm_kms * kms ,
730
- struct drm_encoder * encoder ,
731
- bool cmd_mode )
732
- {
733
- struct msm_display_info info ;
734
- struct msm_drm_private * priv = encoder -> dev -> dev_private ;
735
- int i , rc = 0 ;
736
-
737
- memset (& info , 0 , sizeof (info ));
738
-
739
- info .intf_type = encoder -> encoder_type ;
740
- info .capabilities = cmd_mode ? MSM_DISPLAY_CAP_CMD_MODE :
741
- MSM_DISPLAY_CAP_VID_MODE ;
742
-
743
- switch (info .intf_type ) {
744
- case DRM_MODE_ENCODER_DSI :
745
- /* TODO: No support for DSI swap */
746
- for (i = 0 ; i < ARRAY_SIZE (priv -> dsi ); i ++ ) {
747
- if (priv -> dsi [i ]) {
748
- info .h_tile_instance [info .num_of_h_tiles ] = i ;
749
- info .num_of_h_tiles ++ ;
750
- }
751
- }
752
- break ;
753
- case DRM_MODE_ENCODER_TMDS :
754
- info .num_of_h_tiles = 1 ;
755
- break ;
756
- }
757
-
758
- rc = dpu_encoder_setup (encoder -> dev , encoder , & info );
759
- if (rc )
760
- DPU_ERROR ("failed to setup DPU encoder %d: rc:%d\n" ,
761
- encoder -> base .id , rc );
762
- }
763
-
764
777
static irqreturn_t dpu_irq (struct msm_kms * kms )
765
778
{
766
779
struct dpu_kms * dpu_kms = to_dpu_kms (kms );
@@ -863,7 +876,6 @@ static const struct msm_kms_funcs kms_funcs = {
863
876
.get_format = dpu_get_msm_format ,
864
877
.round_pixclk = dpu_kms_round_pixclk ,
865
878
.destroy = dpu_kms_destroy ,
866
- .set_encoder_mode = _dpu_kms_set_encoder_mode ,
867
879
.snapshot = dpu_kms_mdp_snapshot ,
868
880
#ifdef CONFIG_DEBUG_FS
869
881
.debugfs_init = dpu_kms_debugfs_init ,
0 commit comments