diff mbox

[v2] drm/i915: Detect if MIPI panel based on VBT and initialize only if present

Message ID 1401195382-21718-1-git-send-email-shobhit.kumar@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Kumar, Shobhit May 27, 2014, 12:56 p.m. UTC
It seems by default the VBT has MIPI configuration block as well. The
Generic driver will assume always MIPI if MIPI configuration block is found.
This is causing probelm when actually there is eDP. Fix this by looking
into general definition block which will have device configurations. From here
we can figure out what is the LFP type and initialize MIPI only if MIPI
is found.

v2: Addressed review comments by Damien
    - Moved PORT definitions to intel_bios.h and renamed as DVO_PORT_MIPIA
    - renamed is_mipi to has_mipi and moved definition as suggested
    - Check hs_mipi inside parse_mipi and intel_dsi_init insted of outside

Signed-off-by: Shobhit Kumar <shobhit.kumar@intel.com>
---
 drivers/gpu/drm/i915/i915_drv.h   |  2 ++
 drivers/gpu/drm/i915/intel_bios.c | 14 ++++++++++++++
 drivers/gpu/drm/i915/intel_bios.h |  4 ++++
 drivers/gpu/drm/i915/intel_dsi.c  |  4 ++++
 4 files changed, 24 insertions(+)

Comments

Lespiau, Damien May 27, 2014, 1:18 p.m. UTC | #1
On Tue, May 27, 2014 at 06:26:22PM +0530, Shobhit Kumar wrote:
> It seems by default the VBT has MIPI configuration block as well. The
> Generic driver will assume always MIPI if MIPI configuration block is found.
> This is causing probelm when actually there is eDP. Fix this by looking
> into general definition block which will have device configurations. From here
> we can figure out what is the LFP type and initialize MIPI only if MIPI
> is found.
> 
> v2: Addressed review comments by Damien
>     - Moved PORT definitions to intel_bios.h and renamed as DVO_PORT_MIPIA
>     - renamed is_mipi to has_mipi and moved definition as suggested
>     - Check hs_mipi inside parse_mipi and intel_dsi_init insted of outside
> 
> Signed-off-by: Shobhit Kumar <shobhit.kumar@intel.com>
> ---
>  drivers/gpu/drm/i915/i915_drv.h   |  2 ++
>  drivers/gpu/drm/i915/intel_bios.c | 14 ++++++++++++++
>  drivers/gpu/drm/i915/intel_bios.h |  4 ++++
>  drivers/gpu/drm/i915/intel_dsi.c  |  4 ++++
>  4 files changed, 24 insertions(+)
> 
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 8e78703..dac9ceb 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -1209,6 +1209,7 @@ struct intel_vbt_data {
>  	unsigned int fdi_rx_polarity_inverted:1;
>  	int lvds_ssc_freq;
>  	unsigned int bios_lvds_val; /* initial [PCH_]LVDS reg val in VBIOS */
> +	int has_mipi;

I meant this can be added in the bitfield (after
fdi_rx_polarity_inverted) so it only takes 1 bit

Otherwise:

Reviewed-by: Damien Lespiau <damien.lespiau@intel.com>

--
Damien
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 8e78703..dac9ceb 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1209,6 +1209,7 @@  struct intel_vbt_data {
 	unsigned int fdi_rx_polarity_inverted:1;
 	int lvds_ssc_freq;
 	unsigned int bios_lvds_val; /* initial [PCH_]LVDS reg val in VBIOS */
+	int has_mipi;
 
 	enum drrs_support_type drrs_type;
 
@@ -1230,6 +1231,7 @@  struct intel_vbt_data {
 
 	/* MIPI DSI */
 	struct {
+		u16 port;
 		u16 panel_id;
 		struct mipi_config *config;
 		struct mipi_pps_data *pps;
diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c
index 6b65096..6f6b6c6 100644
--- a/drivers/gpu/drm/i915/intel_bios.c
+++ b/drivers/gpu/drm/i915/intel_bios.c
@@ -744,6 +744,10 @@  parse_mipi(struct drm_i915_private *dev_priv, struct bdb_header *bdb)
 	int i, panel_id, seq_size;
 	u16 block_size;
 
+	/* parse MIPI blocks only if LFP type is MIPI */
+	if (!dev_priv->vbt.has_mipi)
+		return;
+
 	/* Initialize this to undefined indicating no generic MIPI support */
 	dev_priv->vbt.dsi.panel_id = MIPI_DSI_UNDEFINED_PANEL_ID;
 
@@ -1059,6 +1063,16 @@  parse_device_mapping(struct drm_i915_private *dev_priv,
 			/* skip the device block if device type is invalid */
 			continue;
 		}
+
+		if (p_child->common.dvo_port >= DVO_PORT_MIPIA && p_child->common.dvo_port <= DVO_PORT_MIPID) {
+			/* check the device type and confirm its MIPI */
+			if (p_child->common.device_type & DEVICE_TYPE_MIPI_OUTPUT) {
+				DRM_DEBUG_KMS("Found MIPI as LFP\n");
+				dev_priv->vbt.has_mipi = 1;
+				dev_priv->vbt.dsi.port = p_child->common.dvo_port;
+			}
+		}
+
 		child_dev_ptr = dev_priv->vbt.child_dev + count;
 		count++;
 		memcpy((void *)child_dev_ptr, (void *)p_child,
diff --git a/drivers/gpu/drm/i915/intel_bios.h b/drivers/gpu/drm/i915/intel_bios.h
index 6009deb..b986677 100644
--- a/drivers/gpu/drm/i915/intel_bios.h
+++ b/drivers/gpu/drm/i915/intel_bios.h
@@ -743,6 +743,10 @@  int intel_parse_bios(struct drm_device *dev);
 #define DVO_PORT_DPC	8
 #define DVO_PORT_DPD	9
 #define DVO_PORT_DPA	10
+#define DVO_PORT_MIPIA	21
+#define DVO_PORT_MIPIB	22
+#define DVO_PORT_MIPIC	23
+#define DVO_PORT_MIPID	24
 
 /* Block 52 contains MIPI Panel info
  * 6 such enteries will there. Index into correct
diff --git a/drivers/gpu/drm/i915/intel_dsi.c b/drivers/gpu/drm/i915/intel_dsi.c
index e73bec6..944a421 100644
--- a/drivers/gpu/drm/i915/intel_dsi.c
+++ b/drivers/gpu/drm/i915/intel_dsi.c
@@ -660,6 +660,10 @@  bool intel_dsi_init(struct drm_device *dev)
 
 	DRM_DEBUG_KMS("\n");
 
+	/* There is no detection method for MIPI so rely on VBT */
+	if (!dev_priv->vbt.has_mipi)
+		return false;
+
 	intel_dsi = kzalloc(sizeof(*intel_dsi), GFP_KERNEL);
 	if (!intel_dsi)
 		return false;