Skip to content

Commit a2f3d32

Browse files
lumagrobclark
authored andcommitted
drm/msm/dpu: support setting up two independent DSI connectors
Move setting up encoders from set_encoder_mode to _dpu_kms_initialize_dsi() / _dpu_kms_initialize_displayport(). This allows us to support not only "single DSI" and "bonded DSI" but also "two independent DSI" configurations. In future this would also help adding support for multiple DP connectors. Signed-off-by: Dmitry Baryshkov <[email protected]> Reviewed-by: Abhinav Kumar <[email protected]> Link: https://lore.kernel.org/r/[email protected] Reviewed-by: Bjorn Andersson <[email protected]> Signed-off-by: Dmitry Baryshkov <[email protected]> Signed-off-by: Rob Clark <[email protected]>
1 parent f518f6c commit a2f3d32

File tree

1 file changed

+57
-45
lines changed

1 file changed

+57
-45
lines changed

drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c

Lines changed: 57 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -471,30 +471,68 @@ static int _dpu_kms_initialize_dsi(struct drm_device *dev,
471471
struct dpu_kms *dpu_kms)
472472
{
473473
struct drm_encoder *encoder = NULL;
474+
struct msm_display_info info;
474475
int i, rc = 0;
475476

476477
if (!(priv->dsi[0] || priv->dsi[1]))
477478
return rc;
478479

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+
*/
488488
for (i = 0; i < ARRAY_SIZE(priv->dsi); i++) {
489+
int other = (i + 1) % 2;
490+
489491
if (!priv->dsi[i])
490492
continue;
491493

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+
492509
rc = msm_dsi_modeset_init(priv->dsi[i], dev, encoder);
493510
if (rc) {
494511
DPU_ERROR("modeset_init failed for dsi[%d], rc = %d\n",
495512
i, rc);
496513
break;
497514
}
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);
498536
}
499537

500538
return rc;
@@ -505,6 +543,7 @@ static int _dpu_kms_initialize_displayport(struct drm_device *dev,
505543
struct dpu_kms *dpu_kms)
506544
{
507545
struct drm_encoder *encoder = NULL;
546+
struct msm_display_info info;
508547
int rc = 0;
509548

510549
if (!priv->dp)
@@ -516,6 +555,7 @@ static int _dpu_kms_initialize_displayport(struct drm_device *dev,
516555
return PTR_ERR(encoder);
517556
}
518557

558+
memset(&info, 0, sizeof(info));
519559
rc = msm_dp_modeset_init(priv->dp, dev, encoder);
520560
if (rc) {
521561
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,
524564
}
525565

526566
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);
527575
return rc;
528576
}
529577

@@ -726,41 +774,6 @@ static void dpu_kms_destroy(struct msm_kms *kms)
726774
msm_kms_destroy(&dpu_kms->base);
727775
}
728776

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-
764777
static irqreturn_t dpu_irq(struct msm_kms *kms)
765778
{
766779
struct dpu_kms *dpu_kms = to_dpu_kms(kms);
@@ -863,7 +876,6 @@ static const struct msm_kms_funcs kms_funcs = {
863876
.get_format = dpu_get_msm_format,
864877
.round_pixclk = dpu_kms_round_pixclk,
865878
.destroy = dpu_kms_destroy,
866-
.set_encoder_mode = _dpu_kms_set_encoder_mode,
867879
.snapshot = dpu_kms_mdp_snapshot,
868880
#ifdef CONFIG_DEBUG_FS
869881
.debugfs_init = dpu_kms_debugfs_init,

0 commit comments

Comments
 (0)