[Intel-gfx] [PATCH 4/4] drm/i915/dsi: initialize DSI on each port

Jani Nikula jani.nikula at intel.com
Tue Oct 29 15:39:30 UTC 2019


Make DSI initialization similar to other encoders by calling init on
each possible port. This takes a step towards being able to have two
separate DSI displays, though currently this would likely break if there
were two DSI child devices present in the VBT.

Cc: Ville Syrjälä <ville.syrjala at linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula at intel.com>
---
 drivers/gpu/drm/i915/display/icl_dsi.c       |  7 ++++---
 drivers/gpu/drm/i915/display/intel_display.c | 15 ++++++++++-----
 drivers/gpu/drm/i915/display/intel_dsi.h     |  4 ++--
 drivers/gpu/drm/i915/display/vlv_dsi.c       | 10 ++++------
 4 files changed, 20 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/icl_dsi.c b/drivers/gpu/drm/i915/display/icl_dsi.c
index 6e398c33a524..81a3c36679a2 100644
--- a/drivers/gpu/drm/i915/display/icl_dsi.c
+++ b/drivers/gpu/drm/i915/display/icl_dsi.c
@@ -1543,7 +1543,7 @@ static void icl_dsi_add_properties(struct intel_connector *connector)
 				connector->panel.fixed_mode->vdisplay);
 }
 
-void icl_dsi_init(struct drm_i915_private *dev_priv)
+void icl_dsi_init(struct drm_i915_private *dev_priv, enum port port)
 {
 	struct drm_device *dev = &dev_priv->drm;
 	struct intel_dsi *intel_dsi;
@@ -1551,11 +1551,12 @@ void icl_dsi_init(struct drm_i915_private *dev_priv)
 	struct intel_connector *intel_connector;
 	struct drm_connector *connector;
 	struct drm_display_mode *fixed_mode;
-	enum port port;
 
-	if (!intel_bios_is_dsi_present(dev_priv, &port))
+	if (!dev_priv->vbt.ddi_port_info[port].supports_dsi)
 		return;
 
+	DRM_DEBUG_KMS("Initializing DSI on port %c\n", port_name(port));
+
 	intel_dsi = kzalloc(sizeof(*intel_dsi), GFP_KERNEL);
 	if (!intel_dsi)
 		return;
diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index e56a75c07043..8dd8827a1974 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -15946,13 +15946,15 @@ static void intel_setup_outputs(struct drm_i915_private *dev_priv)
 		intel_ddi_init(dev_priv, PORT_G);
 		intel_ddi_init(dev_priv, PORT_H);
 		intel_ddi_init(dev_priv, PORT_I);
-		icl_dsi_init(dev_priv);
+		icl_dsi_init(dev_priv, PORT_A);
+		icl_dsi_init(dev_priv, PORT_B);
 	} else if (IS_ELKHARTLAKE(dev_priv)) {
 		intel_ddi_init(dev_priv, PORT_A);
 		intel_ddi_init(dev_priv, PORT_B);
 		intel_ddi_init(dev_priv, PORT_C);
 		intel_ddi_init(dev_priv, PORT_D);
-		icl_dsi_init(dev_priv);
+		icl_dsi_init(dev_priv, PORT_A);
+		icl_dsi_init(dev_priv, PORT_B);
 	} else if (IS_GEN(dev_priv, 11)) {
 		intel_ddi_init(dev_priv, PORT_A);
 		intel_ddi_init(dev_priv, PORT_B);
@@ -15968,7 +15970,8 @@ static void intel_setup_outputs(struct drm_i915_private *dev_priv)
 		    intel_bios_is_port_present(dev_priv, PORT_F))
 			intel_ddi_init(dev_priv, PORT_F);
 
-		icl_dsi_init(dev_priv);
+		icl_dsi_init(dev_priv, PORT_A);
+		icl_dsi_init(dev_priv, PORT_B);
 	} else if (IS_GEN9_LP(dev_priv)) {
 		/*
 		 * FIXME: Broxton doesn't support port detection via the
@@ -15979,7 +15982,8 @@ static void intel_setup_outputs(struct drm_i915_private *dev_priv)
 		intel_ddi_init(dev_priv, PORT_B);
 		intel_ddi_init(dev_priv, PORT_C);
 
-		vlv_dsi_init(dev_priv);
+		vlv_dsi_init(dev_priv, PORT_A);
+		vlv_dsi_init(dev_priv, PORT_C);
 	} else if (HAS_DDI(dev_priv)) {
 		int found;
 
@@ -16098,7 +16102,8 @@ static void intel_setup_outputs(struct drm_i915_private *dev_priv)
 				intel_hdmi_init(dev_priv, CHV_HDMID, PORT_D);
 		}
 
-		vlv_dsi_init(dev_priv);
+		vlv_dsi_init(dev_priv, PORT_A);
+		vlv_dsi_init(dev_priv, PORT_C);
 	} else if (IS_PINEVIEW(dev_priv)) {
 		intel_lvds_init(dev_priv);
 		intel_crt_init(dev_priv);
diff --git a/drivers/gpu/drm/i915/display/intel_dsi.h b/drivers/gpu/drm/i915/display/intel_dsi.h
index b15be5814599..c2f4476e03a5 100644
--- a/drivers/gpu/drm/i915/display/intel_dsi.h
+++ b/drivers/gpu/drm/i915/display/intel_dsi.h
@@ -162,7 +162,7 @@ static inline u16 intel_dsi_encoder_ports(struct intel_encoder *encoder)
 }
 
 /* icl_dsi.c */
-void icl_dsi_init(struct drm_i915_private *dev_priv);
+void icl_dsi_init(struct drm_i915_private *dev_priv, enum port port);
 
 /* intel_dsi.c */
 int intel_dsi_bitrate(const struct intel_dsi *intel_dsi);
@@ -179,7 +179,7 @@ enum drm_mode_status intel_dsi_mode_valid(struct drm_connector *connector,
 struct intel_dsi_host *intel_dsi_host_init(struct intel_dsi *intel_dsi,
 					   const struct mipi_dsi_host_ops *funcs,
 					   enum port port);
-void vlv_dsi_init(struct drm_i915_private *dev_priv);
+void vlv_dsi_init(struct drm_i915_private *dev_priv, enum port port);
 
 /* vlv_dsi_pll.c */
 int vlv_dsi_pll_compute(struct intel_encoder *encoder,
diff --git a/drivers/gpu/drm/i915/display/vlv_dsi.c b/drivers/gpu/drm/i915/display/vlv_dsi.c
index 50064cde0724..293c70e36194 100644
--- a/drivers/gpu/drm/i915/display/vlv_dsi.c
+++ b/drivers/gpu/drm/i915/display/vlv_dsi.c
@@ -1809,7 +1809,7 @@ static void vlv_dphy_param_init(struct intel_dsi *intel_dsi)
 	intel_dsi_log_params(intel_dsi);
 }
 
-void vlv_dsi_init(struct drm_i915_private *dev_priv)
+void vlv_dsi_init(struct drm_i915_private *dev_priv, enum port port)
 {
 	struct drm_device *dev = &dev_priv->drm;
 	struct intel_dsi *intel_dsi;
@@ -1818,14 +1818,12 @@ void vlv_dsi_init(struct drm_i915_private *dev_priv)
 	struct intel_connector *intel_connector;
 	struct drm_connector *connector;
 	struct drm_display_mode *current_mode, *fixed_mode;
-	enum port port;
-
-	DRM_DEBUG_KMS("\n");
 
-	/* There is no detection method for MIPI so rely on VBT */
-	if (!intel_bios_is_dsi_present(dev_priv, &port))
+	if (!dev_priv->vbt.ddi_port_info[port].supports_dsi)
 		return;
 
+	DRM_DEBUG_KMS("Initializing DSI on port %c\n", port_name(port));
+
 	if (IS_GEN9_LP(dev_priv))
 		dev_priv->mipi_mmio_base = BXT_MIPI_BASE;
 	else
-- 
2.20.1



More information about the Intel-gfx mailing list