diff mbox series

[2/4] drm/i915/bios: add DSI ports to parse_ddi_port()

Message ID 20191029153930.27103-2-jani.nikula@intel.com (mailing list archive)
State New, archived
Headers show
Series [1/4] drm/i915/bios: use a flag for vbt hdmi level shift presence | expand

Commit Message

Jani Nikula Oct. 29, 2019, 3:39 p.m. UTC
Bring DSI closer to other ports, and facilitate easier lookup of more
child device specific data in a unified manner in the future. This may
cause problems if there are any VBTs in the wild with colliding child
device ports. In practice those should have surfaced already by way of
trying to initialize DSI and something else on the same port.

Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/i915/display/intel_bios.c | 14 ++++++++------
 drivers/gpu/drm/i915/i915_drv.h           |  1 +
 2 files changed, 9 insertions(+), 6 deletions(-)

Comments

Ville Syrjälä Oct. 29, 2019, 4:01 p.m. UTC | #1
On Tue, Oct 29, 2019 at 05:39:28PM +0200, Jani Nikula wrote:
> Bring DSI closer to other ports, and facilitate easier lookup of more
> child device specific data in a unified manner in the future. This may
> cause problems if there are any VBTs in the wild with colliding child
> device ports. In practice those should have surfaced already by way of
> trying to initialize DSI and something else on the same port.

I think this can legit happen on VLV/CHV where the DSI ports
do not occupy the same universe as the HDMI/DP ports. Eg.
it would be perfectly legal to have DSI C + HDMI/DP C at the same
time. DSI A of course won't collide with anything since the
other ports start from B.

> 
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_bios.c | 14 ++++++++------
>  drivers/gpu/drm/i915/i915_drv.h           |  1 +
>  2 files changed, 9 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_bios.c b/drivers/gpu/drm/i915/display/intel_bios.c
> index 5c78f52be9b4..7d7e953e4a30 100644
> --- a/drivers/gpu/drm/i915/display/intel_bios.c
> +++ b/drivers/gpu/drm/i915/display/intel_bios.c
> @@ -1393,9 +1393,9 @@ static enum port dvo_port_to_port(u8 dvo_port)
>  	 * so look for all the possible values for each port.
>  	 */
>  	static const int dvo_ports[][3] = {
> -		[PORT_A] = { DVO_PORT_HDMIA, DVO_PORT_DPA, -1},
> -		[PORT_B] = { DVO_PORT_HDMIB, DVO_PORT_DPB, -1},
> -		[PORT_C] = { DVO_PORT_HDMIC, DVO_PORT_DPC, -1},
> +		[PORT_A] = { DVO_PORT_HDMIA, DVO_PORT_DPA, DVO_PORT_MIPIA },
> +		[PORT_B] = { DVO_PORT_HDMIB, DVO_PORT_DPB, DVO_PORT_MIPIB },
> +		[PORT_C] = { DVO_PORT_HDMIC, DVO_PORT_DPC, DVO_PORT_MIPIC },
>  		[PORT_D] = { DVO_PORT_HDMID, DVO_PORT_DPD, -1},
>  		[PORT_E] = { DVO_PORT_CRT, DVO_PORT_HDMIE, DVO_PORT_DPE},
>  		[PORT_F] = { DVO_PORT_HDMIF, DVO_PORT_DPF, -1},
> @@ -1422,7 +1422,7 @@ static void parse_ddi_port(struct drm_i915_private *dev_priv,
>  			   u8 bdb_version)
>  {
>  	struct ddi_vbt_port_info *info;
> -	bool is_dvi, is_hdmi, is_dp, is_edp, is_crt;
> +	bool is_dvi, is_hdmi, is_dp, is_edp, is_crt, is_dsi;
>  	enum port port;
>  
>  	port = dvo_port_to_port(child->dvo_port);
> @@ -1442,6 +1442,7 @@ static void parse_ddi_port(struct drm_i915_private *dev_priv,
>  	is_crt = child->device_type & DEVICE_TYPE_ANALOG_OUTPUT;
>  	is_hdmi = is_dvi && (child->device_type & DEVICE_TYPE_NOT_HDMI_OUTPUT) == 0;
>  	is_edp = is_dp && (child->device_type & DEVICE_TYPE_INTERNAL_CONNECTOR);
> +	is_dsi = child->device_type & DEVICE_TYPE_MIPI_OUTPUT;
>  
>  	if (port == PORT_A && is_dvi) {
>  		DRM_DEBUG_KMS("VBT claims port A supports DVI%s, ignoring\n",
> @@ -1454,6 +1455,7 @@ static void parse_ddi_port(struct drm_i915_private *dev_priv,
>  	info->supports_hdmi = is_hdmi;
>  	info->supports_dp = is_dp;
>  	info->supports_edp = is_edp;
> +	info->supports_dsi = is_dsi;
>  
>  	if (bdb_version >= 195)
>  		info->supports_typec_usb = child->dp_usb_type_c;
> @@ -1461,9 +1463,9 @@ static void parse_ddi_port(struct drm_i915_private *dev_priv,
>  	if (bdb_version >= 209)
>  		info->supports_tbt = child->tbt;
>  
> -	DRM_DEBUG_KMS("Port %c VBT info: CRT:%d DVI:%d HDMI:%d DP:%d eDP:%d LSPCON:%d USB-Type-C:%d TBT:%d\n",
> +	DRM_DEBUG_KMS("Port %c VBT info: CRT:%d DVI:%d HDMI:%d DP:%d eDP:%d DSI:%d LSPCON:%d USB-Type-C:%d TBT:%d\n",
>  		      port_name(port), is_crt, is_dvi, is_hdmi, is_dp, is_edp,
> -		      HAS_LSPCON(dev_priv) && child->lspcon,
> +		      is_dsi, HAS_LSPCON(dev_priv) && child->lspcon,
>  		      info->supports_typec_usb, info->supports_tbt);
>  
>  	if (is_edp && is_dvi)
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 9faf5cb6bfaa..5c6a43d79597 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -635,6 +635,7 @@ struct ddi_vbt_port_info {
>  	u8 supports_hdmi:1;
>  	u8 supports_dp:1;
>  	u8 supports_edp:1;
> +	u8 supports_dsi:1;
>  	u8 supports_typec_usb:1;
>  	u8 supports_tbt:1;
>  
> -- 
> 2.20.1
diff mbox series

Patch

diff --git a/drivers/gpu/drm/i915/display/intel_bios.c b/drivers/gpu/drm/i915/display/intel_bios.c
index 5c78f52be9b4..7d7e953e4a30 100644
--- a/drivers/gpu/drm/i915/display/intel_bios.c
+++ b/drivers/gpu/drm/i915/display/intel_bios.c
@@ -1393,9 +1393,9 @@  static enum port dvo_port_to_port(u8 dvo_port)
 	 * so look for all the possible values for each port.
 	 */
 	static const int dvo_ports[][3] = {
-		[PORT_A] = { DVO_PORT_HDMIA, DVO_PORT_DPA, -1},
-		[PORT_B] = { DVO_PORT_HDMIB, DVO_PORT_DPB, -1},
-		[PORT_C] = { DVO_PORT_HDMIC, DVO_PORT_DPC, -1},
+		[PORT_A] = { DVO_PORT_HDMIA, DVO_PORT_DPA, DVO_PORT_MIPIA },
+		[PORT_B] = { DVO_PORT_HDMIB, DVO_PORT_DPB, DVO_PORT_MIPIB },
+		[PORT_C] = { DVO_PORT_HDMIC, DVO_PORT_DPC, DVO_PORT_MIPIC },
 		[PORT_D] = { DVO_PORT_HDMID, DVO_PORT_DPD, -1},
 		[PORT_E] = { DVO_PORT_CRT, DVO_PORT_HDMIE, DVO_PORT_DPE},
 		[PORT_F] = { DVO_PORT_HDMIF, DVO_PORT_DPF, -1},
@@ -1422,7 +1422,7 @@  static void parse_ddi_port(struct drm_i915_private *dev_priv,
 			   u8 bdb_version)
 {
 	struct ddi_vbt_port_info *info;
-	bool is_dvi, is_hdmi, is_dp, is_edp, is_crt;
+	bool is_dvi, is_hdmi, is_dp, is_edp, is_crt, is_dsi;
 	enum port port;
 
 	port = dvo_port_to_port(child->dvo_port);
@@ -1442,6 +1442,7 @@  static void parse_ddi_port(struct drm_i915_private *dev_priv,
 	is_crt = child->device_type & DEVICE_TYPE_ANALOG_OUTPUT;
 	is_hdmi = is_dvi && (child->device_type & DEVICE_TYPE_NOT_HDMI_OUTPUT) == 0;
 	is_edp = is_dp && (child->device_type & DEVICE_TYPE_INTERNAL_CONNECTOR);
+	is_dsi = child->device_type & DEVICE_TYPE_MIPI_OUTPUT;
 
 	if (port == PORT_A && is_dvi) {
 		DRM_DEBUG_KMS("VBT claims port A supports DVI%s, ignoring\n",
@@ -1454,6 +1455,7 @@  static void parse_ddi_port(struct drm_i915_private *dev_priv,
 	info->supports_hdmi = is_hdmi;
 	info->supports_dp = is_dp;
 	info->supports_edp = is_edp;
+	info->supports_dsi = is_dsi;
 
 	if (bdb_version >= 195)
 		info->supports_typec_usb = child->dp_usb_type_c;
@@ -1461,9 +1463,9 @@  static void parse_ddi_port(struct drm_i915_private *dev_priv,
 	if (bdb_version >= 209)
 		info->supports_tbt = child->tbt;
 
-	DRM_DEBUG_KMS("Port %c VBT info: CRT:%d DVI:%d HDMI:%d DP:%d eDP:%d LSPCON:%d USB-Type-C:%d TBT:%d\n",
+	DRM_DEBUG_KMS("Port %c VBT info: CRT:%d DVI:%d HDMI:%d DP:%d eDP:%d DSI:%d LSPCON:%d USB-Type-C:%d TBT:%d\n",
 		      port_name(port), is_crt, is_dvi, is_hdmi, is_dp, is_edp,
-		      HAS_LSPCON(dev_priv) && child->lspcon,
+		      is_dsi, HAS_LSPCON(dev_priv) && child->lspcon,
 		      info->supports_typec_usb, info->supports_tbt);
 
 	if (is_edp && is_dvi)
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 9faf5cb6bfaa..5c6a43d79597 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -635,6 +635,7 @@  struct ddi_vbt_port_info {
 	u8 supports_hdmi:1;
 	u8 supports_dp:1;
 	u8 supports_edp:1;
+	u8 supports_dsi:1;
 	u8 supports_typec_usb:1;
 	u8 supports_tbt:1;