diff mbox

[v3,3/4] drm/i915: Parse VBT data for lspcon

Message ID 1467723950-14093-4-git-send-email-shashank.sharma@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Sharma, Shashank July 5, 2016, 1:05 p.m. UTC
Many GEN9 boards come with on-board lspcon cards.
Fot these boards, VBT configuration should properly point out
if a particular port contains lspcon device, so that driver can
initialize it properly.

This patch adds a utility function, which checks the VBT flag
for lspcon bit, and tells us if a port is configured to have a
lspcon device or not.

V2: Fixed review comments from Ville
- Do not forget PORT_D while checking lspcon for GEN9

V3: Addressed review comments from Rodrigo
- Create a HAS_LSPCON() macro for better use case handling.
- Do not dump warnings for non-gen-9 platforms, it will be noise.

Signed-off-by: Shashank Sharma <shashank.sharma@intel.com>
---
 drivers/gpu/drm/i915/i915_drv.h   |  5 ++++
 drivers/gpu/drm/i915/intel_bios.c | 49 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 54 insertions(+)

Comments

Rodrigo Vivi July 6, 2016, 5:33 p.m. UTC | #1
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>


On Tue, 2016-07-05 at 18:35 +0530, Shashank Sharma wrote:
> Many GEN9 boards come with on-board lspcon cards.

> Fot these boards, VBT configuration should properly point out

> if a particular port contains lspcon device, so that driver can

> initialize it properly.

> 

> This patch adds a utility function, which checks the VBT flag

> for lspcon bit, and tells us if a port is configured to have a

> lspcon device or not.

> 

> V2: Fixed review comments from Ville

> - Do not forget PORT_D while checking lspcon for GEN9

> 

> V3: Addressed review comments from Rodrigo

> - Create a HAS_LSPCON() macro for better use case handling.

> - Do not dump warnings for non-gen-9 platforms, it will be noise.

> 

> Signed-off-by: Shashank Sharma <shashank.sharma@intel.com>

> ---

>  drivers/gpu/drm/i915/i915_drv.h   |  5 ++++

>  drivers/gpu/drm/i915/intel_bios.c | 49

> +++++++++++++++++++++++++++++++++++++++

>  2 files changed, 54 insertions(+)

> 

> diff --git a/drivers/gpu/drm/i915/i915_drv.h

> b/drivers/gpu/drm/i915/i915_drv.h

> index 594ddbb..91e1dd1 100644

> --- a/drivers/gpu/drm/i915/i915_drv.h

> +++ b/drivers/gpu/drm/i915/i915_drv.h

> @@ -2896,6 +2896,8 @@ struct drm_i915_cmd_table {

>  #define HAS_GMCH_DISPLAY(dev) (INTEL_INFO(dev)->gen < 5 || \

>  			       IS_VALLEYVIEW(dev) ||

> IS_CHERRYVIEW(dev))

>  

> +#define HAS_LSPCON(dev) (IS_GEN9(dev))

> +

>  /* DPF == dynamic parity feature */

>  #define HAS_L3_DPF(dev) (IS_IVYBRIDGE(dev) || IS_HASWELL(dev))

>  #define NUM_L3_SLICES(dev) (IS_HSW_GT3(dev) ? 2 : HAS_L3_DPF(dev))

> @@ -3706,6 +3708,9 @@ bool intel_bios_is_port_dp_dual_mode(struct

> drm_i915_private *dev_priv, enum por

>  bool intel_bios_is_dsi_present(struct drm_i915_private *dev_priv,

> enum port *port);

>  bool intel_bios_is_port_hpd_inverted(struct drm_i915_private

> *dev_priv,

>  				     enum port port);

> +bool intel_bios_is_lspcon_present(struct drm_i915_private *dev_priv,

> +				enum port port);

> +

>  

>  /* intel_opregion.c */

>  #ifdef CONFIG_ACPI

> diff --git a/drivers/gpu/drm/i915/intel_bios.c

> b/drivers/gpu/drm/i915/intel_bios.c

> index da5ed4a..121df10 100644

> --- a/drivers/gpu/drm/i915/intel_bios.c

> +++ b/drivers/gpu/drm/i915/intel_bios.c

> @@ -1759,3 +1759,52 @@ intel_bios_is_port_hpd_inverted(struct

> drm_i915_private *dev_priv,

>  

>  	return false;

>  }

> +

> +/**

> + * intel_bios_is_lspcon_present - if LSPCON is attached on %port

> + * @dev_priv:	i915 device instance

> + * @port:	port to check

> + *

> + * Return true if LSPCON is present on this port

> + */

> +bool

> +intel_bios_is_lspcon_present(struct drm_i915_private *dev_priv,

> +				enum port port)

> +{

> +	int i;

> +

> +	if (!HAS_LSPCON(dev_priv))

> +		return false;

> +

> +	for (i = 0; i < dev_priv->vbt.child_dev_num; i++) {

> +		if (!dev_priv->vbt.child_dev[i].common.lspcon)

> +			continue;

> +

> +		switch (dev_priv->vbt.child_dev[i].common.dvo_port)

> {

> +		case DVO_PORT_DPA:

> +		case DVO_PORT_HDMIA:

> +			if (port == PORT_A)

> +				return true;

> +			break;

> +		case DVO_PORT_DPB:

> +		case DVO_PORT_HDMIB:

> +			if (port == PORT_B)

> +				return true;

> +			break;

> +		case DVO_PORT_DPC:

> +		case DVO_PORT_HDMIC:

> +			if (port == PORT_C)

> +				return true;

> +			break;

> +		case DVO_PORT_DPD:

> +		case DVO_PORT_HDMID:

> +			if (port == PORT_D)

> +				return true;

> +			break;

> +		default:

> +			break;

> +		}

> +	}

> +

> +	return false;

> +}
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 594ddbb..91e1dd1 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2896,6 +2896,8 @@  struct drm_i915_cmd_table {
 #define HAS_GMCH_DISPLAY(dev) (INTEL_INFO(dev)->gen < 5 || \
 			       IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev))
 
+#define HAS_LSPCON(dev) (IS_GEN9(dev))
+
 /* DPF == dynamic parity feature */
 #define HAS_L3_DPF(dev) (IS_IVYBRIDGE(dev) || IS_HASWELL(dev))
 #define NUM_L3_SLICES(dev) (IS_HSW_GT3(dev) ? 2 : HAS_L3_DPF(dev))
@@ -3706,6 +3708,9 @@  bool intel_bios_is_port_dp_dual_mode(struct drm_i915_private *dev_priv, enum por
 bool intel_bios_is_dsi_present(struct drm_i915_private *dev_priv, enum port *port);
 bool intel_bios_is_port_hpd_inverted(struct drm_i915_private *dev_priv,
 				     enum port port);
+bool intel_bios_is_lspcon_present(struct drm_i915_private *dev_priv,
+				enum port port);
+
 
 /* intel_opregion.c */
 #ifdef CONFIG_ACPI
diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c
index da5ed4a..121df10 100644
--- a/drivers/gpu/drm/i915/intel_bios.c
+++ b/drivers/gpu/drm/i915/intel_bios.c
@@ -1759,3 +1759,52 @@  intel_bios_is_port_hpd_inverted(struct drm_i915_private *dev_priv,
 
 	return false;
 }
+
+/**
+ * intel_bios_is_lspcon_present - if LSPCON is attached on %port
+ * @dev_priv:	i915 device instance
+ * @port:	port to check
+ *
+ * Return true if LSPCON is present on this port
+ */
+bool
+intel_bios_is_lspcon_present(struct drm_i915_private *dev_priv,
+				enum port port)
+{
+	int i;
+
+	if (!HAS_LSPCON(dev_priv))
+		return false;
+
+	for (i = 0; i < dev_priv->vbt.child_dev_num; i++) {
+		if (!dev_priv->vbt.child_dev[i].common.lspcon)
+			continue;
+
+		switch (dev_priv->vbt.child_dev[i].common.dvo_port) {
+		case DVO_PORT_DPA:
+		case DVO_PORT_HDMIA:
+			if (port == PORT_A)
+				return true;
+			break;
+		case DVO_PORT_DPB:
+		case DVO_PORT_HDMIB:
+			if (port == PORT_B)
+				return true;
+			break;
+		case DVO_PORT_DPC:
+		case DVO_PORT_HDMIC:
+			if (port == PORT_C)
+				return true;
+			break;
+		case DVO_PORT_DPD:
+		case DVO_PORT_HDMID:
+			if (port == PORT_D)
+				return true;
+			break;
+		default:
+			break;
+		}
+	}
+
+	return false;
+}