dri-devel.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/2] drm: report dp downstream port type as a subconnector property
@ 2019-07-01  8:00 Oleg Vasilev
  2019-07-01  8:00 ` [PATCH 2/2] drm/i915: utilize subconnector property for DP Oleg Vasilev
                   ` (3 more replies)
  0 siblings, 4 replies; 14+ messages in thread
From: Oleg Vasilev @ 2019-07-01  8:00 UTC (permalink / raw)
  To: dri-devel, intel-gfx

Currently, downstream port type is only reported in debugfs. This
information should be considered important since it reflects the actual
physical connector type. Some userspace (e.g. window compositors)
may want to show this info to a user.

The 'subconnector' property is already utilized for DVI-I and TV-out for
reporting connector subtype.

The initial motivation for this feature came from i2c test [1].
It is supposed to be skipped on VGA connectors, but it cannot
detect VGA over DP and fails instead.

[1]: https://bugs.freedesktop.org/show_bug.cgi?id=104097
Signed-off-by: Oleg Vasilev <oleg.vasilev@intel.com>
---
 drivers/gpu/drm/drm_connector.c | 38 +++++++++++++++++++++++++++++++--
 drivers/gpu/drm/drm_dp_helper.c | 36 +++++++++++++++++++++++++++++++
 include/drm/drm_connector.h     |  2 ++
 include/drm/drm_dp_helper.h     |  3 +++
 include/drm/drm_mode_config.h   |  6 ++++++
 include/uapi/drm/drm_mode.h     | 22 ++++++++++++-------
 6 files changed, 97 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
index 068d4b05f1be..95cd51254be6 100644
--- a/drivers/gpu/drm/drm_connector.c
+++ b/drivers/gpu/drm/drm_connector.c
@@ -793,7 +793,7 @@ static const struct drm_prop_enum_list drm_dvi_i_select_enum_list[] = {
 DRM_ENUM_NAME_FN(drm_get_dvi_i_select_name, drm_dvi_i_select_enum_list)
 
 static const struct drm_prop_enum_list drm_dvi_i_subconnector_enum_list[] = {
-	{ DRM_MODE_SUBCONNECTOR_Unknown,   "Unknown"   }, /* DVI-I and TV-out */
+	{ DRM_MODE_SUBCONNECTOR_Unknown,   "Unknown"   }, /* DVI-I, TV-out and DP */
 	{ DRM_MODE_SUBCONNECTOR_DVID,      "DVI-D"     }, /* DVI-I  */
 	{ DRM_MODE_SUBCONNECTOR_DVIA,      "DVI-A"     }, /* DVI-I  */
 };
@@ -810,7 +810,7 @@ static const struct drm_prop_enum_list drm_tv_select_enum_list[] = {
 DRM_ENUM_NAME_FN(drm_get_tv_select_name, drm_tv_select_enum_list)
 
 static const struct drm_prop_enum_list drm_tv_subconnector_enum_list[] = {
-	{ DRM_MODE_SUBCONNECTOR_Unknown,   "Unknown"   }, /* DVI-I and TV-out */
+	{ DRM_MODE_SUBCONNECTOR_Unknown,   "Unknown"   }, /* DVI-I, TV-out and DP */
 	{ DRM_MODE_SUBCONNECTOR_Composite, "Composite" }, /* TV-out */
 	{ DRM_MODE_SUBCONNECTOR_SVIDEO,    "SVIDEO"    }, /* TV-out */
 	{ DRM_MODE_SUBCONNECTOR_Component, "Component" }, /* TV-out */
@@ -819,6 +819,19 @@ static const struct drm_prop_enum_list drm_tv_subconnector_enum_list[] = {
 DRM_ENUM_NAME_FN(drm_get_tv_subconnector_name,
 		 drm_tv_subconnector_enum_list)
 
+static const struct drm_prop_enum_list drm_dp_subconnector_enum_list[] = {
+	{ DRM_MODE_SUBCONNECTOR_Unknown,   "Unknown"   }, /* DVI-I, TV-out and DP */
+	{ DRM_MODE_SUBCONNECTOR_VGA,	   "VGA"       }, /* DP */
+	{ DRM_MODE_SUBCONNECTOR_DVI,	   "DVI"       }, /* DP */
+	{ DRM_MODE_SUBCONNECTOR_HDMI,	   "HDMI"      }, /* DP */
+	{ DRM_MODE_SUBCONNECTOR_DP,        "DP"        }, /* DP */
+	{ DRM_MODE_SUBCONNECTOR_Wireless,  "Wireless"  }, /* DP */
+	{ DRM_MODE_SUBCONNECTOR_Native,	   "Native"    }, /* DP */
+};
+
+DRM_ENUM_NAME_FN(drm_get_dp_subconnector_name,
+		 drm_dp_subconnector_enum_list)
+
 static const struct drm_prop_enum_list hdmi_colorspaces[] = {
 	/* For Default case, driver will set the colorspace */
 	{ DRM_MODE_COLORIMETRY_DEFAULT, "Default" },
@@ -1128,6 +1141,27 @@ int drm_mode_create_dvi_i_properties(struct drm_device *dev)
 }
 EXPORT_SYMBOL(drm_mode_create_dvi_i_properties);
 
+/**
+ * drm_mode_create_dp_properties - create DP specific connector properties
+ * @dev: DRM device
+ *
+ * Called by a driver the first time a DP connector is made.
+ */
+void drm_mode_create_dp_properties(struct drm_device *dev)
+{
+	struct drm_property *dp_subconnector;
+
+	if (dev->mode_config.dp_subconnector_property)
+		return;
+
+	dp_subconnector = drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE,
+						   "subconnector",
+						   drm_dp_subconnector_enum_list,
+						   ARRAY_SIZE(drm_dp_subconnector_enum_list));
+	dev->mode_config.dp_subconnector_property = dp_subconnector;
+}
+EXPORT_SYMBOL(drm_mode_create_dp_properties);
+
 /**
  * DOC: HDMI connector properties
  *
diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c
index 0b994d083a89..63d8f0b8492c 100644
--- a/drivers/gpu/drm/drm_dp_helper.c
+++ b/drivers/gpu/drm/drm_dp_helper.c
@@ -662,6 +662,42 @@ void drm_dp_downstream_debug(struct seq_file *m,
 }
 EXPORT_SYMBOL(drm_dp_downstream_debug);
 
+/**
+ * drm_dp_downstream_subconnector_type() - get DP branch device type
+ * @dpcd: DisplayPort configuration data
+ * @port_cap: port capabilities
+ *
+ */
+enum drm_mode_subconnector
+drm_dp_downstream_subconnector_type(const u8 dpcd[DP_RECEIVER_CAP_SIZE],
+				    const u8 port_cap[4])
+{
+	int type = port_cap[0] & DP_DS_PORT_TYPE_MASK;
+	bool branch_device_present = dpcd[DP_DOWNSTREAMPORT_PRESENT] &
+				     DP_DWN_STRM_PORT_PRESENT;
+
+	if (!branch_device_present)
+		return DRM_MODE_SUBCONNECTOR_Native;
+
+	switch (type) {
+	case DP_DS_PORT_TYPE_DP:
+	case DP_DS_PORT_TYPE_DP_DUALMODE:
+		return DRM_MODE_SUBCONNECTOR_DP;
+	case DP_DS_PORT_TYPE_VGA:
+		return DRM_MODE_SUBCONNECTOR_VGA;
+	case DP_DS_PORT_TYPE_DVI:
+		return DRM_MODE_SUBCONNECTOR_DVI;
+	case DP_DS_PORT_TYPE_HDMI:
+		return DRM_MODE_SUBCONNECTOR_HDMI;
+	case DP_DS_PORT_TYPE_WIRELESS:
+		return DRM_MODE_SUBCONNECTOR_Wireless;
+	case DP_DS_PORT_TYPE_NON_EDID:
+	default:
+		return DRM_MODE_SUBCONNECTOR_Unknown;
+	}
+}
+EXPORT_SYMBOL(drm_dp_downstream_subconnector_type);
+
 /*
  * I2C-over-AUX implementation
  */
diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
index 4c30d751487a..66f0b2a59c9c 100644
--- a/include/drm/drm_connector.h
+++ b/include/drm/drm_connector.h
@@ -1483,9 +1483,11 @@ const char *drm_get_dvi_i_subconnector_name(int val);
 const char *drm_get_dvi_i_select_name(int val);
 const char *drm_get_tv_subconnector_name(int val);
 const char *drm_get_tv_select_name(int val);
+const char *drm_get_dp_subconnector_name(int val);
 const char *drm_get_content_protection_name(int val);
 
 int drm_mode_create_dvi_i_properties(struct drm_device *dev);
+void drm_mode_create_dp_properties(struct drm_device *dev);
 int drm_mode_create_tv_margin_properties(struct drm_device *dev);
 int drm_mode_create_tv_properties(struct drm_device *dev,
 				  unsigned int num_modes,
diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h
index 397896b5b21a..38792c1afed8 100644
--- a/include/drm/drm_dp_helper.h
+++ b/include/drm/drm_dp_helper.h
@@ -1372,6 +1372,9 @@ int drm_dp_downstream_max_bpc(const u8 dpcd[DP_RECEIVER_CAP_SIZE],
 int drm_dp_downstream_id(struct drm_dp_aux *aux, char id[6]);
 void drm_dp_downstream_debug(struct seq_file *m, const u8 dpcd[DP_RECEIVER_CAP_SIZE],
 			     const u8 port_cap[4], struct drm_dp_aux *aux);
+enum drm_mode_subconnector
+drm_dp_downstream_subconnector_type(const u8 dpcd[DP_RECEIVER_CAP_SIZE],
+				    const u8 port_cap[4]);
 
 void drm_dp_aux_init(struct drm_dp_aux *aux);
 int drm_dp_aux_register(struct drm_dp_aux *aux);
diff --git a/include/drm/drm_mode_config.h b/include/drm/drm_mode_config.h
index 759d462d028b..957d99a34843 100644
--- a/include/drm/drm_mode_config.h
+++ b/include/drm/drm_mode_config.h
@@ -680,6 +680,12 @@ struct drm_mode_config {
 	 */
 	struct drm_property *dvi_i_select_subconnector_property;
 
+	/**
+	 * @dp_subconnector_property: Optional DP property to differentiate
+	 * between different DP downstream port types.
+	 */
+	struct drm_property *dp_subconnector_property;
+
 	/**
 	 * @tv_subconnector_property: Optional TV property to differentiate
 	 * between different TV connector types.
diff --git a/include/uapi/drm/drm_mode.h b/include/uapi/drm/drm_mode.h
index 5ab331e5dc23..9808464bdb63 100644
--- a/include/uapi/drm/drm_mode.h
+++ b/include/uapi/drm/drm_mode.h
@@ -332,14 +332,20 @@ struct drm_mode_get_encoder {
 /* This is for connectors with multiple signal types. */
 /* Try to match DRM_MODE_CONNECTOR_X as closely as possible. */
 enum drm_mode_subconnector {
-	DRM_MODE_SUBCONNECTOR_Automatic = 0,
-	DRM_MODE_SUBCONNECTOR_Unknown = 0,
-	DRM_MODE_SUBCONNECTOR_DVID = 3,
-	DRM_MODE_SUBCONNECTOR_DVIA = 4,
-	DRM_MODE_SUBCONNECTOR_Composite = 5,
-	DRM_MODE_SUBCONNECTOR_SVIDEO = 6,
-	DRM_MODE_SUBCONNECTOR_Component = 8,
-	DRM_MODE_SUBCONNECTOR_SCART = 9,
+	DRM_MODE_SUBCONNECTOR_Automatic  = 0,  /* DVI-I, TV     */
+	DRM_MODE_SUBCONNECTOR_Unknown    = 0,  /* DVI-I, TV, DP */
+	DRM_MODE_SUBCONNECTOR_VGA	 = 1,  /*            DP */
+	DRM_MODE_SUBCONNECTOR_DVI	 = 2,  /*            DP */
+	DRM_MODE_SUBCONNECTOR_DVID	 = 3,  /* DVI-I         */
+	DRM_MODE_SUBCONNECTOR_DVIA	 = 4,  /* DVI-I         */
+	DRM_MODE_SUBCONNECTOR_Composite  = 5,  /*        TV     */
+	DRM_MODE_SUBCONNECTOR_SVIDEO	 = 6,  /*        TV     */
+	DRM_MODE_SUBCONNECTOR_Component  = 8,  /*        TV     */
+	DRM_MODE_SUBCONNECTOR_SCART	 = 9,  /*        TV     */
+	DRM_MODE_SUBCONNECTOR_DP	 = 10, /*            DP */
+	DRM_MODE_SUBCONNECTOR_HDMI       = 11, /*            DP */
+	DRM_MODE_SUBCONNECTOR_Native     = 15, /*            DP */
+	DRM_MODE_SUBCONNECTOR_Wireless   = 19, /*            DP */
 };
 
 #define DRM_MODE_CONNECTOR_Unknown	0
-- 
2.22.0

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 2/2] drm/i915: utilize subconnector property for DP
  2019-07-01  8:00 [PATCH 1/2] drm: report dp downstream port type as a subconnector property Oleg Vasilev
@ 2019-07-01  8:00 ` Oleg Vasilev
  2019-07-02 12:36 ` [Intel-gfx] [PATCH 1/2] drm: report dp downstream port type as a subconnector property Ville Syrjälä
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 14+ messages in thread
From: Oleg Vasilev @ 2019-07-01  8:00 UTC (permalink / raw)
  To: dri-devel, intel-gfx

Since DP-specific information is stored in driver's structures, every
driver needs to implement subconnector property by itself.

Signed-off-by: Oleg Vasilev <oleg.vasilev@intel.com>
---
 drivers/gpu/drm/i915/display/intel_dp.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index 4336df46fe78..6436c14d9b41 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -5532,6 +5532,7 @@ intel_dp_unset_edid(struct intel_dp *intel_dp)
 	intel_dp->has_audio = false;
 }
 
+
 static int
 intel_dp_detect(struct drm_connector *connector,
 		struct drm_modeset_acquire_ctx *ctx,
@@ -5542,6 +5543,7 @@ intel_dp_detect(struct drm_connector *connector,
 	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
 	struct intel_encoder *encoder = &dig_port->base;
 	enum drm_connector_status status;
+	enum drm_mode_subconnector subconnector = DRM_MODE_SUBCONNECTOR_Unknown;
 
 	DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
 		      connector->base.id, connector->name);
@@ -5633,6 +5635,14 @@ intel_dp_detect(struct drm_connector *connector,
 	if (status != connector_status_connected && !intel_dp->is_mst)
 		intel_dp_unset_edid(intel_dp);
 
+	if (status == connector_status_connected)
+		subconnector = drm_dp_downstream_subconnector_type(
+				intel_dp->dpcd, intel_dp->downstream_ports);
+
+	drm_object_property_set_value(&connector->base,
+				      connector->dev->
+				      mode_config.dp_subconnector_property,
+				      subconnector);
 	return status;
 }
 
@@ -6529,6 +6539,11 @@ intel_dp_add_properties(struct intel_dp *intel_dp, struct drm_connector *connect
 	struct drm_i915_private *dev_priv = to_i915(connector->dev);
 	enum port port = dp_to_dig_port(intel_dp)->base.port;
 
+	drm_mode_create_dp_properties(connector->dev);
+	drm_object_attach_property(&connector->base,
+				   connector->dev->mode_config.dp_subconnector_property,
+				   DRM_MODE_SUBCONNECTOR_Unknown);
+
 	if (!IS_G4X(dev_priv) && port != PORT_A)
 		intel_attach_force_audio_property(connector);
 
-- 
2.22.0

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [Intel-gfx] [PATCH 1/2] drm: report dp downstream port type as a subconnector property
  2019-07-01  8:00 [PATCH 1/2] drm: report dp downstream port type as a subconnector property Oleg Vasilev
  2019-07-01  8:00 ` [PATCH 2/2] drm/i915: utilize subconnector property for DP Oleg Vasilev
@ 2019-07-02 12:36 ` Ville Syrjälä
  2019-07-02 13:38 ` Emil Velikov
  2019-07-15 11:23 ` Subconnector property for DP downstream type Oleg Vasilev
  3 siblings, 0 replies; 14+ messages in thread
From: Ville Syrjälä @ 2019-07-02 12:36 UTC (permalink / raw)
  To: Oleg Vasilev; +Cc: intel-gfx, dri-devel

On Mon, Jul 01, 2019 at 11:00:21AM +0300, Oleg Vasilev wrote:
> Currently, downstream port type is only reported in debugfs. This
> information should be considered important since it reflects the actual
> physical connector type. Some userspace (e.g. window compositors)
> may want to show this info to a user.
> 
> The 'subconnector' property is already utilized for DVI-I and TV-out for
> reporting connector subtype.
> 
> The initial motivation for this feature came from i2c test [1].
> It is supposed to be skipped on VGA connectors, but it cannot
> detect VGA over DP and fails instead.
> 
> [1]: https://bugs.freedesktop.org/show_bug.cgi?id=104097
> Signed-off-by: Oleg Vasilev <oleg.vasilev@intel.com>
> ---
>  drivers/gpu/drm/drm_connector.c | 38 +++++++++++++++++++++++++++++++--
>  drivers/gpu/drm/drm_dp_helper.c | 36 +++++++++++++++++++++++++++++++
>  include/drm/drm_connector.h     |  2 ++
>  include/drm/drm_dp_helper.h     |  3 +++
>  include/drm/drm_mode_config.h   |  6 ++++++
>  include/uapi/drm/drm_mode.h     | 22 ++++++++++++-------
>  6 files changed, 97 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
> index 068d4b05f1be..95cd51254be6 100644
> --- a/drivers/gpu/drm/drm_connector.c
> +++ b/drivers/gpu/drm/drm_connector.c
> @@ -793,7 +793,7 @@ static const struct drm_prop_enum_list drm_dvi_i_select_enum_list[] = {
>  DRM_ENUM_NAME_FN(drm_get_dvi_i_select_name, drm_dvi_i_select_enum_list)
>  
>  static const struct drm_prop_enum_list drm_dvi_i_subconnector_enum_list[] = {
> -	{ DRM_MODE_SUBCONNECTOR_Unknown,   "Unknown"   }, /* DVI-I and TV-out */
> +	{ DRM_MODE_SUBCONNECTOR_Unknown,   "Unknown"   }, /* DVI-I, TV-out and DP */
>  	{ DRM_MODE_SUBCONNECTOR_DVID,      "DVI-D"     }, /* DVI-I  */
>  	{ DRM_MODE_SUBCONNECTOR_DVIA,      "DVI-A"     }, /* DVI-I  */
>  };
> @@ -810,7 +810,7 @@ static const struct drm_prop_enum_list drm_tv_select_enum_list[] = {
>  DRM_ENUM_NAME_FN(drm_get_tv_select_name, drm_tv_select_enum_list)
>  
>  static const struct drm_prop_enum_list drm_tv_subconnector_enum_list[] = {
> -	{ DRM_MODE_SUBCONNECTOR_Unknown,   "Unknown"   }, /* DVI-I and TV-out */
> +	{ DRM_MODE_SUBCONNECTOR_Unknown,   "Unknown"   }, /* DVI-I, TV-out and DP */
>  	{ DRM_MODE_SUBCONNECTOR_Composite, "Composite" }, /* TV-out */
>  	{ DRM_MODE_SUBCONNECTOR_SVIDEO,    "SVIDEO"    }, /* TV-out */
>  	{ DRM_MODE_SUBCONNECTOR_Component, "Component" }, /* TV-out */
> @@ -819,6 +819,19 @@ static const struct drm_prop_enum_list drm_tv_subconnector_enum_list[] = {
>  DRM_ENUM_NAME_FN(drm_get_tv_subconnector_name,
>  		 drm_tv_subconnector_enum_list)
>  
> +static const struct drm_prop_enum_list drm_dp_subconnector_enum_list[] = {
> +	{ DRM_MODE_SUBCONNECTOR_Unknown,   "Unknown"   }, /* DVI-I, TV-out and DP */
> +	{ DRM_MODE_SUBCONNECTOR_VGA,	   "VGA"       }, /* DP */
> +	{ DRM_MODE_SUBCONNECTOR_DVI,	   "DVI"       }, /* DP */
> +	{ DRM_MODE_SUBCONNECTOR_HDMI,	   "HDMI"      }, /* DP */
> +	{ DRM_MODE_SUBCONNECTOR_DP,        "DP"        }, /* DP */
> +	{ DRM_MODE_SUBCONNECTOR_Wireless,  "Wireless"  }, /* DP */
> +	{ DRM_MODE_SUBCONNECTOR_Native,	   "Native"    }, /* DP */
> +};
> +
> +DRM_ENUM_NAME_FN(drm_get_dp_subconnector_name,
> +		 drm_dp_subconnector_enum_list)
> +
>  static const struct drm_prop_enum_list hdmi_colorspaces[] = {
>  	/* For Default case, driver will set the colorspace */
>  	{ DRM_MODE_COLORIMETRY_DEFAULT, "Default" },
> @@ -1128,6 +1141,27 @@ int drm_mode_create_dvi_i_properties(struct drm_device *dev)
>  }
>  EXPORT_SYMBOL(drm_mode_create_dvi_i_properties);
>  
> +/**
> + * drm_mode_create_dp_properties - create DP specific connector properties
> + * @dev: DRM device
> + *
> + * Called by a driver the first time a DP connector is made.
> + */
> +void drm_mode_create_dp_properties(struct drm_device *dev)
> +{
> +	struct drm_property *dp_subconnector;
> +
> +	if (dev->mode_config.dp_subconnector_property)
> +		return;
> +
> +	dp_subconnector = drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE,
> +						   "subconnector",
> +						   drm_dp_subconnector_enum_list,
> +						   ARRAY_SIZE(drm_dp_subconnector_enum_list));
> +	dev->mode_config.dp_subconnector_property = dp_subconnector;
> +}
> +EXPORT_SYMBOL(drm_mode_create_dp_properties);
> +
>  /**
>   * DOC: HDMI connector properties
>   *
> diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c
> index 0b994d083a89..63d8f0b8492c 100644
> --- a/drivers/gpu/drm/drm_dp_helper.c
> +++ b/drivers/gpu/drm/drm_dp_helper.c
> @@ -662,6 +662,42 @@ void drm_dp_downstream_debug(struct seq_file *m,
>  }
>  EXPORT_SYMBOL(drm_dp_downstream_debug);
>  
> +/**
> + * drm_dp_downstream_subconnector_type() - get DP branch device type
> + * @dpcd: DisplayPort configuration data
> + * @port_cap: port capabilities
> + *
> + */
> +enum drm_mode_subconnector
> +drm_dp_downstream_subconnector_type(const u8 dpcd[DP_RECEIVER_CAP_SIZE],
> +				    const u8 port_cap[4])
> +{
> +	int type = port_cap[0] & DP_DS_PORT_TYPE_MASK;
> +	bool branch_device_present = dpcd[DP_DOWNSTREAMPORT_PRESENT] &
> +				     DP_DWN_STRM_PORT_PRESENT;

drm_dp_is_branch()

> +
> +	if (!branch_device_present)
> +		return DRM_MODE_SUBCONNECTOR_Native;
> +
> +	switch (type) {
> +	case DP_DS_PORT_TYPE_DP:
> +	case DP_DS_PORT_TYPE_DP_DUALMODE:
> +		return DRM_MODE_SUBCONNECTOR_DP;
> +	case DP_DS_PORT_TYPE_VGA:
> +		return DRM_MODE_SUBCONNECTOR_VGA;
> +	case DP_DS_PORT_TYPE_DVI:
> +		return DRM_MODE_SUBCONNECTOR_DVI;
> +	case DP_DS_PORT_TYPE_HDMI:
> +		return DRM_MODE_SUBCONNECTOR_HDMI;
> +	case DP_DS_PORT_TYPE_WIRELESS:
> +		return DRM_MODE_SUBCONNECTOR_Wireless;
> +	case DP_DS_PORT_TYPE_NON_EDID:
> +	default:
> +		return DRM_MODE_SUBCONNECTOR_Unknown;
> +	}

DPCD 1.0 doesn't have the downstream port information at 0x80.
For those you have to rely on DP_DWN_STRM_PORT_TYPE_MASK & co.

> +}
> +EXPORT_SYMBOL(drm_dp_downstream_subconnector_type);
> +
>  /*
>   * I2C-over-AUX implementation
>   */
> diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
> index 4c30d751487a..66f0b2a59c9c 100644
> --- a/include/drm/drm_connector.h
> +++ b/include/drm/drm_connector.h
> @@ -1483,9 +1483,11 @@ const char *drm_get_dvi_i_subconnector_name(int val);
>  const char *drm_get_dvi_i_select_name(int val);
>  const char *drm_get_tv_subconnector_name(int val);
>  const char *drm_get_tv_select_name(int val);
> +const char *drm_get_dp_subconnector_name(int val);
>  const char *drm_get_content_protection_name(int val);
>  
>  int drm_mode_create_dvi_i_properties(struct drm_device *dev);
> +void drm_mode_create_dp_properties(struct drm_device *dev);
>  int drm_mode_create_tv_margin_properties(struct drm_device *dev);
>  int drm_mode_create_tv_properties(struct drm_device *dev,
>  				  unsigned int num_modes,
> diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h
> index 397896b5b21a..38792c1afed8 100644
> --- a/include/drm/drm_dp_helper.h
> +++ b/include/drm/drm_dp_helper.h
> @@ -1372,6 +1372,9 @@ int drm_dp_downstream_max_bpc(const u8 dpcd[DP_RECEIVER_CAP_SIZE],
>  int drm_dp_downstream_id(struct drm_dp_aux *aux, char id[6]);
>  void drm_dp_downstream_debug(struct seq_file *m, const u8 dpcd[DP_RECEIVER_CAP_SIZE],
>  			     const u8 port_cap[4], struct drm_dp_aux *aux);
> +enum drm_mode_subconnector
> +drm_dp_downstream_subconnector_type(const u8 dpcd[DP_RECEIVER_CAP_SIZE],
> +				    const u8 port_cap[4]);
>  
>  void drm_dp_aux_init(struct drm_dp_aux *aux);
>  int drm_dp_aux_register(struct drm_dp_aux *aux);
> diff --git a/include/drm/drm_mode_config.h b/include/drm/drm_mode_config.h
> index 759d462d028b..957d99a34843 100644
> --- a/include/drm/drm_mode_config.h
> +++ b/include/drm/drm_mode_config.h
> @@ -680,6 +680,12 @@ struct drm_mode_config {
>  	 */
>  	struct drm_property *dvi_i_select_subconnector_property;
>  
> +	/**
> +	 * @dp_subconnector_property: Optional DP property to differentiate
> +	 * between different DP downstream port types.
> +	 */
> +	struct drm_property *dp_subconnector_property;
> +
>  	/**
>  	 * @tv_subconnector_property: Optional TV property to differentiate
>  	 * between different TV connector types.
> diff --git a/include/uapi/drm/drm_mode.h b/include/uapi/drm/drm_mode.h
> index 5ab331e5dc23..9808464bdb63 100644
> --- a/include/uapi/drm/drm_mode.h
> +++ b/include/uapi/drm/drm_mode.h
> @@ -332,14 +332,20 @@ struct drm_mode_get_encoder {
>  /* This is for connectors with multiple signal types. */
>  /* Try to match DRM_MODE_CONNECTOR_X as closely as possible. */
>  enum drm_mode_subconnector {
> -	DRM_MODE_SUBCONNECTOR_Automatic = 0,
> -	DRM_MODE_SUBCONNECTOR_Unknown = 0,
> -	DRM_MODE_SUBCONNECTOR_DVID = 3,
> -	DRM_MODE_SUBCONNECTOR_DVIA = 4,
> -	DRM_MODE_SUBCONNECTOR_Composite = 5,
> -	DRM_MODE_SUBCONNECTOR_SVIDEO = 6,
> -	DRM_MODE_SUBCONNECTOR_Component = 8,
> -	DRM_MODE_SUBCONNECTOR_SCART = 9,
> +	DRM_MODE_SUBCONNECTOR_Automatic  = 0,  /* DVI-I, TV     */
> +	DRM_MODE_SUBCONNECTOR_Unknown    = 0,  /* DVI-I, TV, DP */
> +	DRM_MODE_SUBCONNECTOR_VGA	 = 1,  /*            DP */
> +	DRM_MODE_SUBCONNECTOR_DVI	 = 2,  /*            DP */
> +	DRM_MODE_SUBCONNECTOR_DVID	 = 3,  /* DVI-I         */
> +	DRM_MODE_SUBCONNECTOR_DVIA	 = 4,  /* DVI-I         */
> +	DRM_MODE_SUBCONNECTOR_Composite  = 5,  /*        TV     */
> +	DRM_MODE_SUBCONNECTOR_SVIDEO	 = 6,  /*        TV     */
> +	DRM_MODE_SUBCONNECTOR_Component  = 8,  /*        TV     */
> +	DRM_MODE_SUBCONNECTOR_SCART	 = 9,  /*        TV     */
> +	DRM_MODE_SUBCONNECTOR_DP	 = 10, /*            DP */
> +	DRM_MODE_SUBCONNECTOR_HDMI       = 11, /*            DP */
> +	DRM_MODE_SUBCONNECTOR_Native     = 15, /*            DP */
> +	DRM_MODE_SUBCONNECTOR_Wireless   = 19, /*            DP */
>  };
>  
>  #define DRM_MODE_CONNECTOR_Unknown	0
> -- 
> 2.22.0
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Ville Syrjälä
Intel
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2] drm: report dp downstream port type as a subconnector property
  2019-07-01  8:00 [PATCH 1/2] drm: report dp downstream port type as a subconnector property Oleg Vasilev
  2019-07-01  8:00 ` [PATCH 2/2] drm/i915: utilize subconnector property for DP Oleg Vasilev
  2019-07-02 12:36 ` [Intel-gfx] [PATCH 1/2] drm: report dp downstream port type as a subconnector property Ville Syrjälä
@ 2019-07-02 13:38 ` Emil Velikov
  2019-07-03  8:19   ` Vasilev, Oleg
  2019-07-15 11:23 ` Subconnector property for DP downstream type Oleg Vasilev
  3 siblings, 1 reply; 14+ messages in thread
From: Emil Velikov @ 2019-07-02 13:38 UTC (permalink / raw)
  To: Oleg Vasilev; +Cc: Intel Graphics Development, ML dri-devel

Hi Oleg,

On Mon, 1 Jul 2019 at 09:00, Oleg Vasilev <oleg.vasilev@intel.com> wrote:
>
> Currently, downstream port type is only reported in debugfs. This
> information should be considered important since it reflects the actual
> physical connector type. Some userspace (e.g. window compositors)
> may want to show this info to a user.
>
> The 'subconnector' property is already utilized for DVI-I and TV-out for
> reporting connector subtype.
>
> The initial motivation for this feature came from i2c test [1].
> It is supposed to be skipped on VGA connectors, but it cannot
> detect VGA over DP and fails instead.
>
> [1]: https://bugs.freedesktop.org/show_bug.cgi?id=104097
> Signed-off-by: Oleg Vasilev <oleg.vasilev@intel.com>
> ---
>  drivers/gpu/drm/drm_connector.c | 38 +++++++++++++++++++++++++++++++--
>  drivers/gpu/drm/drm_dp_helper.c | 36 +++++++++++++++++++++++++++++++
>  include/drm/drm_connector.h     |  2 ++
>  include/drm/drm_dp_helper.h     |  3 +++
>  include/drm/drm_mode_config.h   |  6 ++++++
>  include/uapi/drm/drm_mode.h     | 22 ++++++++++++-------
>  6 files changed, 97 insertions(+), 10 deletions(-)
>
Can you please update other drivers to make use of this - quick grep
shows 5-10 in total.
if only i915 does this, then the point of making this uAPI is very meh.

Think user-space having per-vendor quirks for KMS. While KMS should be
vendor agnostic.

-Emil
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2] drm: report dp downstream port type as a subconnector property
  2019-07-02 13:38 ` Emil Velikov
@ 2019-07-03  8:19   ` Vasilev, Oleg
  2019-07-03 13:35     ` [Intel-gfx] " Emil Velikov
  0 siblings, 1 reply; 14+ messages in thread
From: Vasilev, Oleg @ 2019-07-03  8:19 UTC (permalink / raw)
  To: emil.l.velikov; +Cc: intel-gfx, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 1737 bytes --]

On Tue, 2019-07-02 at 14:38 +0100, Emil Velikov wrote:
> Hi Oleg,
> 
> On Mon, 1 Jul 2019 at 09:00, Oleg Vasilev <oleg.vasilev@intel.com>
> wrote:
> > Currently, downstream port type is only reported in debugfs. This
> > information should be considered important since it reflects the
> > actual
> > physical connector type. Some userspace (e.g. window compositors)
> > may want to show this info to a user.
> > 
> > The 'subconnector' property is already utilized for DVI-I and TV-
> > out for
> > reporting connector subtype.
> > 
> > The initial motivation for this feature came from i2c test [1].
> > It is supposed to be skipped on VGA connectors, but it cannot
> > detect VGA over DP and fails instead.
> > 
> > [1]: https://bugs.freedesktop.org/show_bug.cgi?id=104097
> > Signed-off-by: Oleg Vasilev <oleg.vasilev@intel.com>
> > ---
> >  drivers/gpu/drm/drm_connector.c | 38
> > +++++++++++++++++++++++++++++++--
> >  drivers/gpu/drm/drm_dp_helper.c | 36
> > +++++++++++++++++++++++++++++++
> >  include/drm/drm_connector.h     |  2 ++
> >  include/drm/drm_dp_helper.h     |  3 +++
> >  include/drm/drm_mode_config.h   |  6 ++++++
> >  include/uapi/drm/drm_mode.h     | 22 ++++++++++++-------
> >  6 files changed, 97 insertions(+), 10 deletions(-)
> > 
> Can you please update other drivers to make use of this - quick grep
> shows 5-10 in total.

Hi,

Sure, I can do this. Should I do this is a part of this series or
better first get it merged, and then add support for other drivers?

Oleg

> if only i915 does this, then the point of making this uAPI is very
> meh.
> 
> Think user-space having per-vendor quirks for KMS. While KMS should
> be
> vendor agnostic.
> 
> -Emil

[-- Attachment #1.2: smime.p7s --]
[-- Type: application/x-pkcs7-signature, Size: 3261 bytes --]

[-- Attachment #2: Type: text/plain, Size: 159 bytes --]

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Intel-gfx] [PATCH 1/2] drm: report dp downstream port type as a subconnector property
  2019-07-03  8:19   ` Vasilev, Oleg
@ 2019-07-03 13:35     ` Emil Velikov
  0 siblings, 0 replies; 14+ messages in thread
From: Emil Velikov @ 2019-07-03 13:35 UTC (permalink / raw)
  To: Vasilev, Oleg; +Cc: intel-gfx, dri-devel

On Wed, 3 Jul 2019 at 09:19, Vasilev, Oleg <oleg.vasilev@intel.com> wrote:
>
> On Tue, 2019-07-02 at 14:38 +0100, Emil Velikov wrote:
> > Hi Oleg,
> >
> > On Mon, 1 Jul 2019 at 09:00, Oleg Vasilev <oleg.vasilev@intel.com>
> > wrote:
> > > Currently, downstream port type is only reported in debugfs. This
> > > information should be considered important since it reflects the
> > > actual
> > > physical connector type. Some userspace (e.g. window compositors)
> > > may want to show this info to a user.
> > >
> > > The 'subconnector' property is already utilized for DVI-I and TV-
> > > out for
> > > reporting connector subtype.
> > >
> > > The initial motivation for this feature came from i2c test [1].
> > > It is supposed to be skipped on VGA connectors, but it cannot
> > > detect VGA over DP and fails instead.
> > >
> > > [1]: https://bugs.freedesktop.org/show_bug.cgi?id=104097
> > > Signed-off-by: Oleg Vasilev <oleg.vasilev@intel.com>
> > > ---
> > >  drivers/gpu/drm/drm_connector.c | 38
> > > +++++++++++++++++++++++++++++++--
> > >  drivers/gpu/drm/drm_dp_helper.c | 36
> > > +++++++++++++++++++++++++++++++
> > >  include/drm/drm_connector.h     |  2 ++
> > >  include/drm/drm_dp_helper.h     |  3 +++
> > >  include/drm/drm_mode_config.h   |  6 ++++++
> > >  include/uapi/drm/drm_mode.h     | 22 ++++++++++++-------
> > >  6 files changed, 97 insertions(+), 10 deletions(-)
> > >
> > Can you please update other drivers to make use of this - quick grep
> > shows 5-10 in total.
>
> Hi,
>
> Sure, I can do this. Should I do this is a part of this series or
> better first get it merged, and then add support for other drivers?
>
Since it's a very small list, personally I'd go with part of this series.
If others feel differently go with that.

Please don't forget to address Ville feedback.

Thanks
Emil
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Subconnector property for DP downstream type
  2019-07-01  8:00 [PATCH 1/2] drm: report dp downstream port type as a subconnector property Oleg Vasilev
                   ` (2 preceding siblings ...)
  2019-07-02 13:38 ` Emil Velikov
@ 2019-07-15 11:23 ` Oleg Vasilev
  2019-07-15 11:23   ` [PATCH v2 1/6] drm: move DP_MAX_DOWNSTREAM_PORTS from i915 to drm core Oleg Vasilev
                     ` (5 more replies)
  3 siblings, 6 replies; 14+ messages in thread
From: Oleg Vasilev @ 2019-07-15 11:23 UTC (permalink / raw)
  To: dri-devel

Unfortunately, I don't have any nvidia hardware to test a patch. As of amd, it seems that current DP implementation in drm-tip is corrupted with an unrelated DP aux issue.


_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH v2 1/6] drm: move DP_MAX_DOWNSTREAM_PORTS from i915 to drm core
  2019-07-15 11:23 ` Subconnector property for DP downstream type Oleg Vasilev
@ 2019-07-15 11:23   ` Oleg Vasilev
  2019-07-15 11:23   ` [PATCH v2 2/6] drm: always determine branch device with drm_dp_is_branch() Oleg Vasilev
                     ` (4 subsequent siblings)
  5 siblings, 0 replies; 14+ messages in thread
From: Oleg Vasilev @ 2019-07-15 11:23 UTC (permalink / raw)
  To: dri-devel

DP_MAX_DOWNSTREAM_PORTS=0x10 is a vendor-independent constant.

Signed-off-by: Oleg Vasilev <oleg.vasilev@intel.com>
---
 drivers/gpu/drm/i915/intel_drv.h | 2 --
 include/drm/drm_dp_helper.h      | 2 ++
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 770f9f6aad84..f110c5e79610 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -1083,8 +1083,6 @@ struct intel_hdmi {
 };
 
 struct intel_dp_mst_encoder;
-#define DP_MAX_DOWNSTREAM_PORTS		0x10
-
 /*
  * enum link_m_n_set:
  *	When platform provides two set of M_N registers for dp, we can
diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h
index 397896b5b21a..e0c157cde986 100644
--- a/include/drm/drm_dp_helper.h
+++ b/include/drm/drm_dp_helper.h
@@ -349,6 +349,8 @@
 # define DP_DS_12BPC		            2
 # define DP_DS_16BPC		            3
 
+#define DP_MAX_DOWNSTREAM_PORTS		    0x10
+
 /* DP Forward error Correction Registers */
 #define DP_FEC_CAPABILITY		    0x090    /* 1.4 */
 # define DP_FEC_CAPABLE			    (1 << 0)
-- 
2.22.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v2 2/6] drm: always determine branch device with drm_dp_is_branch()
  2019-07-15 11:23 ` Subconnector property for DP downstream type Oleg Vasilev
  2019-07-15 11:23   ` [PATCH v2 1/6] drm: move DP_MAX_DOWNSTREAM_PORTS from i915 to drm core Oleg Vasilev
@ 2019-07-15 11:23   ` Oleg Vasilev
  2019-07-15 11:23   ` [PATCH v2 3/6] drm: report dp downstream port type as a subconnector property Oleg Vasilev
                     ` (3 subsequent siblings)
  5 siblings, 0 replies; 14+ messages in thread
From: Oleg Vasilev @ 2019-07-15 11:23 UTC (permalink / raw)
  To: dri-devel

The helper should always be used.

Signed-off-by: Oleg Vasilev <oleg.vasilev@intel.com>
---
 drivers/gpu/drm/drm_dp_helper.c         | 3 +--
 drivers/gpu/drm/i915/display/intel_dp.c | 2 +-
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c
index 0b994d083a89..67f7f3e1997b 100644
--- a/drivers/gpu/drm/drm_dp_helper.c
+++ b/drivers/gpu/drm/drm_dp_helper.c
@@ -596,8 +596,7 @@ void drm_dp_downstream_debug(struct seq_file *m,
 	int len;
 	uint8_t rev[2];
 	int type = port_cap[0] & DP_DS_PORT_TYPE_MASK;
-	bool branch_device = dpcd[DP_DOWNSTREAMPORT_PRESENT] &
-			     DP_DWN_STRM_PORT_PRESENT;
+	bool branch_device = drm_dp_is_branch(dpcd);
 
 	seq_printf(m, "\tDP branch device present: %s\n",
 		   branch_device ? "yes" : "no");
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index a9db16de2999..b8f8f40b4f3d 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -2916,7 +2916,7 @@ static bool downstream_hpd_needs_d0(struct intel_dp *intel_dp)
 	 * FIXME should really check all downstream ports...
 	 */
 	return intel_dp->dpcd[DP_DPCD_REV] == 0x11 &&
-		intel_dp->dpcd[DP_DOWNSTREAMPORT_PRESENT] & DP_DWN_STRM_PORT_PRESENT &&
+		drm_dp_is_branch(intel_dp->dpcd) &&
 		intel_dp->downstream_ports[0] & DP_DS_PORT_HPD;
 }
 
-- 
2.22.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v2 3/6] drm: report dp downstream port type as a subconnector property
  2019-07-15 11:23 ` Subconnector property for DP downstream type Oleg Vasilev
  2019-07-15 11:23   ` [PATCH v2 1/6] drm: move DP_MAX_DOWNSTREAM_PORTS from i915 to drm core Oleg Vasilev
  2019-07-15 11:23   ` [PATCH v2 2/6] drm: always determine branch device with drm_dp_is_branch() Oleg Vasilev
@ 2019-07-15 11:23   ` Oleg Vasilev
  2019-07-15 11:23   ` [PATCH v2 4/6] drm/i915: utilize subconnector property for DP Oleg Vasilev
                     ` (2 subsequent siblings)
  5 siblings, 0 replies; 14+ messages in thread
From: Oleg Vasilev @ 2019-07-15 11:23 UTC (permalink / raw)
  To: dri-devel

Currently, downstream port type is only reported in debugfs. This
information should be considered important since it reflects the actual
physical connector type. Some userspace (e.g. window compositors)
may want to show this info to a user.

The 'subconnector' property is already utilized for DVI-I and TV-out for
reporting connector subtype.

The initial motivation for this feature came from i2c test [1].
It is supposed to be skipped on VGA connectors, but it cannot
detect VGA over DP and fails instead.

v2:
 - Ville: utilized drm_dp_is_branch()
 - Ville: implement DP 1.0 downstream type info
 - Replaced create_dp_properties with add_dp_subconnector_property
 - Added dp_set_subconnector_property helper

[1]: https://bugs.freedesktop.org/show_bug.cgi?id=104097
Signed-off-by: Oleg Vasilev <oleg.vasilev@intel.com>
---
 drivers/gpu/drm/drm_connector.c | 49 +++++++++++++++++++++++-
 drivers/gpu/drm/drm_dp_helper.c | 68 +++++++++++++++++++++++++++++++++
 include/drm/drm_connector.h     |  3 ++
 include/drm/drm_dp_helper.h     |  8 ++++
 include/drm/drm_mode_config.h   |  6 +++
 include/uapi/drm/drm_mode.h     | 22 +++++++----
 6 files changed, 146 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
index 068d4b05f1be..c0b8174920a8 100644
--- a/drivers/gpu/drm/drm_connector.c
+++ b/drivers/gpu/drm/drm_connector.c
@@ -793,7 +793,7 @@ static const struct drm_prop_enum_list drm_dvi_i_select_enum_list[] = {
 DRM_ENUM_NAME_FN(drm_get_dvi_i_select_name, drm_dvi_i_select_enum_list)
 
 static const struct drm_prop_enum_list drm_dvi_i_subconnector_enum_list[] = {
-	{ DRM_MODE_SUBCONNECTOR_Unknown,   "Unknown"   }, /* DVI-I and TV-out */
+	{ DRM_MODE_SUBCONNECTOR_Unknown,   "Unknown"   }, /* DVI-I, TV-out and DP */
 	{ DRM_MODE_SUBCONNECTOR_DVID,      "DVI-D"     }, /* DVI-I  */
 	{ DRM_MODE_SUBCONNECTOR_DVIA,      "DVI-A"     }, /* DVI-I  */
 };
@@ -810,7 +810,7 @@ static const struct drm_prop_enum_list drm_tv_select_enum_list[] = {
 DRM_ENUM_NAME_FN(drm_get_tv_select_name, drm_tv_select_enum_list)
 
 static const struct drm_prop_enum_list drm_tv_subconnector_enum_list[] = {
-	{ DRM_MODE_SUBCONNECTOR_Unknown,   "Unknown"   }, /* DVI-I and TV-out */
+	{ DRM_MODE_SUBCONNECTOR_Unknown,   "Unknown"   }, /* DVI-I, TV-out and DP */
 	{ DRM_MODE_SUBCONNECTOR_Composite, "Composite" }, /* TV-out */
 	{ DRM_MODE_SUBCONNECTOR_SVIDEO,    "SVIDEO"    }, /* TV-out */
 	{ DRM_MODE_SUBCONNECTOR_Component, "Component" }, /* TV-out */
@@ -819,6 +819,19 @@ static const struct drm_prop_enum_list drm_tv_subconnector_enum_list[] = {
 DRM_ENUM_NAME_FN(drm_get_tv_subconnector_name,
 		 drm_tv_subconnector_enum_list)
 
+static const struct drm_prop_enum_list drm_dp_subconnector_enum_list[] = {
+	{ DRM_MODE_SUBCONNECTOR_Unknown,   "Unknown"   }, /* DVI-I, TV-out and DP */
+	{ DRM_MODE_SUBCONNECTOR_VGA,	   "VGA"       }, /* DP */
+	{ DRM_MODE_SUBCONNECTOR_DVI,	   "DVI"       }, /* DP */
+	{ DRM_MODE_SUBCONNECTOR_HDMI,	   "HDMI"      }, /* DP */
+	{ DRM_MODE_SUBCONNECTOR_DP,        "DP"        }, /* DP */
+	{ DRM_MODE_SUBCONNECTOR_Wireless,  "Wireless"  }, /* DP */
+	{ DRM_MODE_SUBCONNECTOR_Native,	   "Native"    }, /* DP */
+};
+
+DRM_ENUM_NAME_FN(drm_get_dp_subconnector_name,
+		 drm_dp_subconnector_enum_list)
+
 static const struct drm_prop_enum_list hdmi_colorspaces[] = {
 	/* For Default case, driver will set the colorspace */
 	{ DRM_MODE_COLORIMETRY_DEFAULT, "Default" },
@@ -1040,6 +1053,14 @@ static const struct drm_prop_enum_list hdmi_colorspaces[] = {
  *	can also expose this property to external outputs, in which case they
  *	must support "None", which should be the default (since external screens
  *	have a built-in scaler).
+ *
+ * subconnector:
+ *	This property is used by DVI-I, TVout and DisplayPort to indicate different
+ *	connector subtypes. Enum values more or less match with those from main
+ *	connector types.
+ *	For DVI-I and TVout there is also a matching property "select subconnector"
+ *	allowing to switch between signal types.
+ *	DP subconnector corresponds to a downstream port.
  */
 
 int drm_connector_create_standard_properties(struct drm_device *dev)
@@ -1128,6 +1149,30 @@ int drm_mode_create_dvi_i_properties(struct drm_device *dev)
 }
 EXPORT_SYMBOL(drm_mode_create_dvi_i_properties);
 
+/**
+ * drm_mode_add_dp_subconnector_property - create subconnector property for DP
+ * @connector: drm_connector to attach property
+ *
+ * Called by a driver when DP connector is created.
+ */
+void drm_mode_add_dp_subconnector_property(struct drm_connector *connector)
+{
+	struct drm_mode_config *mode_config = &connector->dev->mode_config;
+
+	if (!mode_config->dp_subconnector_property)
+		mode_config->dp_subconnector_property =
+			drm_property_create_enum(connector->dev,
+				DRM_MODE_PROP_IMMUTABLE,
+				"subconnector",
+				drm_dp_subconnector_enum_list,
+				ARRAY_SIZE(drm_dp_subconnector_enum_list));
+
+	drm_object_attach_property(&connector->base,
+				   mode_config->dp_subconnector_property,
+				   DRM_MODE_SUBCONNECTOR_Unknown);
+}
+EXPORT_SYMBOL(drm_mode_add_dp_subconnector_property);
+
 /**
  * DOC: HDMI connector properties
  *
diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c
index 67f7f3e1997b..c2cc479b635d 100644
--- a/drivers/gpu/drm/drm_dp_helper.c
+++ b/drivers/gpu/drm/drm_dp_helper.c
@@ -661,6 +661,74 @@ void drm_dp_downstream_debug(struct seq_file *m,
 }
 EXPORT_SYMBOL(drm_dp_downstream_debug);
 
+/**
+ * drm_dp_subconnector_type() - get DP branch device type
+ * @dpcd: DisplayPort configuration data
+ * @port_cap: port capabilities
+ *
+ */
+enum drm_mode_subconnector
+drm_dp_subconnector_type(const u8 dpcd[DP_RECEIVER_CAP_SIZE],
+			 const u8 port_cap[4])
+{
+	int type;
+	bool branch_device_present = drm_dp_is_branch(dpcd);
+
+	if (!branch_device_present)
+		return DRM_MODE_SUBCONNECTOR_Native;
+	/* DP 1.0 approach */
+	if (dpcd[DP_DPCD_REV] == DP_DPCD_REV_10) {
+		type = dpcd[DP_DOWNSTREAMPORT_PRESENT] &
+		       DP_DWN_STRM_PORT_TYPE_MASK;
+		if (type == DP_DWN_STRM_PORT_TYPE_DP)
+			return DRM_MODE_SUBCONNECTOR_DP;
+		return DRM_MODE_SUBCONNECTOR_Unknown;
+	}
+	type = port_cap[0] & DP_DS_PORT_TYPE_MASK;
+
+	switch (type) {
+	case DP_DS_PORT_TYPE_DP:
+	case DP_DS_PORT_TYPE_DP_DUALMODE:
+		return DRM_MODE_SUBCONNECTOR_DP;
+	case DP_DS_PORT_TYPE_VGA:
+		return DRM_MODE_SUBCONNECTOR_VGA;
+	case DP_DS_PORT_TYPE_DVI:
+		return DRM_MODE_SUBCONNECTOR_DVI;
+	case DP_DS_PORT_TYPE_HDMI:
+		return DRM_MODE_SUBCONNECTOR_HDMI;
+	case DP_DS_PORT_TYPE_WIRELESS:
+		return DRM_MODE_SUBCONNECTOR_Wireless;
+	case DP_DS_PORT_TYPE_NON_EDID:
+	default:
+		return DRM_MODE_SUBCONNECTOR_Unknown;
+	}
+}
+EXPORT_SYMBOL(drm_dp_subconnector_type);
+
+/**
+ * drm_mode_set_dp_subconnector_property - set subconnector for DP connector
+ * @connector: dp connector to attach property
+ * @status: connector status which is about to be set
+ * @dpcd: DisplayPort configuration data
+ * @port_cap: port capabilities
+ *
+ * Called by a driver on every detect event.
+ */
+void drm_dp_set_subconnector_property(struct drm_connector *connector,
+				      enum drm_connector_status status,
+				      const u8 *dpcd,
+				      const u8 port_cap[4])
+{
+	enum drm_mode_subconnector subconnector = DRM_MODE_SUBCONNECTOR_Unknown;
+
+	if (status == connector_status_connected)
+		subconnector = drm_dp_subconnector_type(dpcd, port_cap);
+	drm_object_property_set_value(&connector->base,
+			connector->dev->mode_config.dp_subconnector_property,
+			subconnector);
+}
+EXPORT_SYMBOL(drm_dp_set_subconnector_property);
+
 /*
  * I2C-over-AUX implementation
  */
diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
index 4c30d751487a..f65292112307 100644
--- a/include/drm/drm_connector.h
+++ b/include/drm/drm_connector.h
@@ -1483,9 +1483,12 @@ const char *drm_get_dvi_i_subconnector_name(int val);
 const char *drm_get_dvi_i_select_name(int val);
 const char *drm_get_tv_subconnector_name(int val);
 const char *drm_get_tv_select_name(int val);
+const char *drm_get_dp_subconnector_name(int val);
 const char *drm_get_content_protection_name(int val);
 
 int drm_mode_create_dvi_i_properties(struct drm_device *dev);
+void drm_mode_add_dp_subconnector_property(struct drm_connector *connector);
+
 int drm_mode_create_tv_margin_properties(struct drm_device *dev);
 int drm_mode_create_tv_properties(struct drm_device *dev,
 				  unsigned int num_modes,
diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h
index e0c157cde986..d0b2ae558dba 100644
--- a/include/drm/drm_dp_helper.h
+++ b/include/drm/drm_dp_helper.h
@@ -26,6 +26,7 @@
 #include <linux/types.h>
 #include <linux/i2c.h>
 #include <linux/delay.h>
+#include <drm/drm_connector.h>
 
 /*
  * Unless otherwise noted, all values are from the DP 1.1a spec.  Note that
@@ -1374,6 +1375,13 @@ int drm_dp_downstream_max_bpc(const u8 dpcd[DP_RECEIVER_CAP_SIZE],
 int drm_dp_downstream_id(struct drm_dp_aux *aux, char id[6]);
 void drm_dp_downstream_debug(struct seq_file *m, const u8 dpcd[DP_RECEIVER_CAP_SIZE],
 			     const u8 port_cap[4], struct drm_dp_aux *aux);
+enum drm_mode_subconnector
+drm_dp_subconnector_type(const u8 dpcd[DP_RECEIVER_CAP_SIZE],
+			 const u8 port_cap[4]);
+void drm_dp_set_subconnector_property(struct drm_connector *connector,
+				      enum drm_connector_status status,
+				      const u8 *dpcd,
+				      const u8 port_cap[4]);
 
 void drm_dp_aux_init(struct drm_dp_aux *aux);
 int drm_dp_aux_register(struct drm_dp_aux *aux);
diff --git a/include/drm/drm_mode_config.h b/include/drm/drm_mode_config.h
index f57eea0481e0..607944641837 100644
--- a/include/drm/drm_mode_config.h
+++ b/include/drm/drm_mode_config.h
@@ -680,6 +680,12 @@ struct drm_mode_config {
 	 */
 	struct drm_property *dvi_i_select_subconnector_property;
 
+	/**
+	 * @dp_subconnector_property: Optional DP property to differentiate
+	 * between different DP downstream port types.
+	 */
+	struct drm_property *dp_subconnector_property;
+
 	/**
 	 * @tv_subconnector_property: Optional TV property to differentiate
 	 * between different TV connector types.
diff --git a/include/uapi/drm/drm_mode.h b/include/uapi/drm/drm_mode.h
index 5ab331e5dc23..9808464bdb63 100644
--- a/include/uapi/drm/drm_mode.h
+++ b/include/uapi/drm/drm_mode.h
@@ -332,14 +332,20 @@ struct drm_mode_get_encoder {
 /* This is for connectors with multiple signal types. */
 /* Try to match DRM_MODE_CONNECTOR_X as closely as possible. */
 enum drm_mode_subconnector {
-	DRM_MODE_SUBCONNECTOR_Automatic = 0,
-	DRM_MODE_SUBCONNECTOR_Unknown = 0,
-	DRM_MODE_SUBCONNECTOR_DVID = 3,
-	DRM_MODE_SUBCONNECTOR_DVIA = 4,
-	DRM_MODE_SUBCONNECTOR_Composite = 5,
-	DRM_MODE_SUBCONNECTOR_SVIDEO = 6,
-	DRM_MODE_SUBCONNECTOR_Component = 8,
-	DRM_MODE_SUBCONNECTOR_SCART = 9,
+	DRM_MODE_SUBCONNECTOR_Automatic  = 0,  /* DVI-I, TV     */
+	DRM_MODE_SUBCONNECTOR_Unknown    = 0,  /* DVI-I, TV, DP */
+	DRM_MODE_SUBCONNECTOR_VGA	 = 1,  /*            DP */
+	DRM_MODE_SUBCONNECTOR_DVI	 = 2,  /*            DP */
+	DRM_MODE_SUBCONNECTOR_DVID	 = 3,  /* DVI-I         */
+	DRM_MODE_SUBCONNECTOR_DVIA	 = 4,  /* DVI-I         */
+	DRM_MODE_SUBCONNECTOR_Composite  = 5,  /*        TV     */
+	DRM_MODE_SUBCONNECTOR_SVIDEO	 = 6,  /*        TV     */
+	DRM_MODE_SUBCONNECTOR_Component  = 8,  /*        TV     */
+	DRM_MODE_SUBCONNECTOR_SCART	 = 9,  /*        TV     */
+	DRM_MODE_SUBCONNECTOR_DP	 = 10, /*            DP */
+	DRM_MODE_SUBCONNECTOR_HDMI       = 11, /*            DP */
+	DRM_MODE_SUBCONNECTOR_Native     = 15, /*            DP */
+	DRM_MODE_SUBCONNECTOR_Wireless   = 19, /*            DP */
 };
 
 #define DRM_MODE_CONNECTOR_Unknown	0
-- 
2.22.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v2 4/6] drm/i915: utilize subconnector property for DP
  2019-07-15 11:23 ` Subconnector property for DP downstream type Oleg Vasilev
                     ` (2 preceding siblings ...)
  2019-07-15 11:23   ` [PATCH v2 3/6] drm: report dp downstream port type as a subconnector property Oleg Vasilev
@ 2019-07-15 11:23   ` Oleg Vasilev
  2019-07-15 11:23   ` [PATCH v2 5/6] drm/nouveau: " Oleg Vasilev
       [not found]   ` <20190715112408.20114-1-oleg.vasilev-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
  5 siblings, 0 replies; 14+ messages in thread
From: Oleg Vasilev @ 2019-07-15 11:23 UTC (permalink / raw)
  To: dri-devel; +Cc: intel-gfx

Since DP-specific information is stored in driver's structures, every
driver needs to implement subconnector property by itself.

Signed-off-by: Oleg Vasilev <oleg.vasilev@intel.com>
Cc: intel-gfx@lists.freedesktop.org

v2: updates to match previous commit changes
Signed-off-by: Oleg Vasilev <oleg.vasilev@intel.com>
---
 drivers/gpu/drm/i915/display/intel_dp.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index b8f8f40b4f3d..c5b4e33be355 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -5421,6 +5421,10 @@ intel_dp_detect(struct drm_connector *connector,
 	if (status != connector_status_connected && !intel_dp->is_mst)
 		intel_dp_unset_edid(intel_dp);
 
+	drm_dp_set_subconnector_property(connector,
+					 status,
+					 intel_dp->dpcd,
+					 intel_dp->downstream_ports);
 	return status;
 }
 
@@ -6317,6 +6321,8 @@ intel_dp_add_properties(struct intel_dp *intel_dp, struct drm_connector *connect
 	struct drm_i915_private *dev_priv = to_i915(connector->dev);
 	enum port port = dp_to_dig_port(intel_dp)->base.port;
 
+	drm_mode_add_dp_subconnector_property(connector);
+
 	if (!IS_G4X(dev_priv) && port != PORT_A)
 		intel_attach_force_audio_property(connector);
 
-- 
2.22.0

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v2 5/6] drm/nouveau: utilize subconnector property for DP
  2019-07-15 11:23 ` Subconnector property for DP downstream type Oleg Vasilev
                     ` (3 preceding siblings ...)
  2019-07-15 11:23   ` [PATCH v2 4/6] drm/i915: utilize subconnector property for DP Oleg Vasilev
@ 2019-07-15 11:23   ` Oleg Vasilev
  2019-07-15 12:15     ` Emil Velikov
       [not found]   ` <20190715112408.20114-1-oleg.vasilev-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
  5 siblings, 1 reply; 14+ messages in thread
From: Oleg Vasilev @ 2019-07-15 11:23 UTC (permalink / raw)
  To: dri-devel; +Cc: nouveau

Since DP-specific information is stored in driver's structures, every
driver needs to implement subconnector property by itself.

Signed-off-by: Oleg Vasilev <oleg.vasilev@intel.com>
Cc: nouveau@lists.freedesktop.org
---
 drivers/gpu/drm/nouveau/nouveau_connector.c | 13 +++++++++++++
 drivers/gpu/drm/nouveau/nouveau_dp.c        |  9 +++++++++
 drivers/gpu/drm/nouveau/nouveau_encoder.h   |  1 +
 3 files changed, 23 insertions(+)

diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c
index 4116ee62adaf..728949d803af 100644
--- a/drivers/gpu/drm/nouveau/nouveau_connector.c
+++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
@@ -636,6 +636,17 @@ nouveau_connector_detect(struct drm_connector *connector, bool force)
 	pm_runtime_mark_last_busy(dev->dev);
 	pm_runtime_put_autosuspend(dev->dev);
 
+	if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort ||
+	    connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
+		enum drm_mode_subconnector subconnector = DRM_MODE_SUBCONNECTOR_Unknown;
+
+		if (conn_status == connector_status_connected && nv_encoder)
+			subconnector = nv_encoder->dp.subconnector;
+		drm_object_property_set_value(&connector->base,
+			connector->dev->mode_config.dp_subconnector_property,
+			subconnector);
+	}
+
 	return conn_status;
 }
 
@@ -1357,6 +1368,8 @@ nouveau_connector_create(struct drm_device *dev,
 			kfree(nv_connector);
 			return ERR_PTR(ret);
 		}
+
+		drm_mode_add_dp_subconnector_property(connector);
 		funcs = &nouveau_connector_funcs;
 		break;
 	default:
diff --git a/drivers/gpu/drm/nouveau/nouveau_dp.c b/drivers/gpu/drm/nouveau/nouveau_dp.c
index 0d052e1660f8..7a87b0f808a7 100644
--- a/drivers/gpu/drm/nouveau/nouveau_dp.c
+++ b/drivers/gpu/drm/nouveau/nouveau_dp.c
@@ -63,6 +63,7 @@ nouveau_dp_detect(struct nouveau_encoder *nv_encoder)
 	struct nouveau_drm *drm = nouveau_drm(dev);
 	struct nvkm_i2c_aux *aux;
 	u8 dpcd[8];
+	u8 port_cap[DP_MAX_DOWNSTREAM_PORTS] = {0};
 	int ret;
 
 	aux = nv_encoder->aux;
@@ -73,6 +74,14 @@ nouveau_dp_detect(struct nouveau_encoder *nv_encoder)
 	if (ret)
 		return ret;
 
+	if (dpcd[DP_DPCD_REV] > 0x10) {
+		ret = nvkm_rdaux(aux, DP_DOWNSTREAM_PORT_0,
+				 port_cap, DP_MAX_DOWNSTREAM_PORTS);
+		if (ret)
+			memset(port_cap, 0, DP_MAX_DOWNSTREAM_PORTS);
+	}
+	nv_encoder->dp.subconnector = drm_dp_subconnector_type(dpcd, port_cap);
+
 	nv_encoder->dp.link_bw = 27000 * dpcd[1];
 	nv_encoder->dp.link_nr = dpcd[2] & DP_MAX_LANE_COUNT_MASK;
 
diff --git a/drivers/gpu/drm/nouveau/nouveau_encoder.h b/drivers/gpu/drm/nouveau/nouveau_encoder.h
index 3517f920bf89..e17971a30221 100644
--- a/drivers/gpu/drm/nouveau/nouveau_encoder.h
+++ b/drivers/gpu/drm/nouveau/nouveau_encoder.h
@@ -63,6 +63,7 @@ struct nouveau_encoder {
 			struct nv50_mstm *mstm;
 			int link_nr;
 			int link_bw;
+			enum drm_mode_subconnector subconnector;
 		} dp;
 	};
 
-- 
2.22.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v2 6/6] drm/amdgpu: utilize subconnector property for DP
       [not found]   ` <20190715112408.20114-1-oleg.vasilev-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
@ 2019-07-15 11:23     ` Oleg Vasilev
  0 siblings, 0 replies; 14+ messages in thread
From: Oleg Vasilev @ 2019-07-15 11:23 UTC (permalink / raw)
  To: dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
  Cc: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

Since DP-specific information is stored in driver's structures, every
driver needs to implement subconnector property by itself.

Signed-off-by: Oleg Vasilev <oleg.vasilev@intel.com>
Cc: amd-gfx@lists.freedesktop.org
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c | 12 ++++++++++++
 drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h       |  1 +
 drivers/gpu/drm/amd/amdgpu/atombios_dp.c       | 18 +++++++++++++++++-
 3 files changed, 30 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
index 73b2ede773d3..099286467c82 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
@@ -26,6 +26,7 @@
 
 #include <drm/drm_edid.h>
 #include <drm/drm_fb_helper.h>
+#include <drm/drm_dp_helper.h>
 #include <drm/drm_probe_helper.h>
 #include <drm/amdgpu_drm.h>
 #include "amdgpu.h"
@@ -1407,6 +1408,10 @@ amdgpu_connector_dp_detect(struct drm_connector *connector, bool force)
 		pm_runtime_put_autosuspend(connector->dev->dev);
 	}
 
+	drm_dp_set_subconnector_property(&amdgpu_connector->base,
+					 ret,
+					 amdgpu_dig_connector->dpcd,
+					 amdgpu_dig_connector->downstream_ports);
 	return ret;
 }
 
@@ -1567,6 +1572,13 @@ amdgpu_connector_add(struct amdgpu_device *adev,
 			DRM_ERROR("Failed to assign router i2c bus! Check dmesg for i2c errors.\n");
 	}
 
+	if ((connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) ||
+		   (connector->connector_type == DRM_MODE_CONNECTOR_eDP))
+	{
+		drm_mode_add_dp_subconnector_property(&amdgpu_connector->base);
+	}
+
+
 	if (is_dp_bridge) {
 		amdgpu_dig_connector = kzalloc(sizeof(struct amdgpu_connector_atom_dig), GFP_KERNEL);
 		if (!amdgpu_dig_connector)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
index eb9975f4decb..cb360b44371c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
@@ -469,6 +469,7 @@ struct amdgpu_encoder {
 struct amdgpu_connector_atom_dig {
 	/* displayport */
 	u8 dpcd[DP_RECEIVER_CAP_SIZE];
+	u8 downstream_ports[DP_MAX_DOWNSTREAM_PORTS];
 	u8 dp_sink_type;
 	int dp_clock;
 	int dp_lane_count;
diff --git a/drivers/gpu/drm/amd/amdgpu/atombios_dp.c b/drivers/gpu/drm/amd/amdgpu/atombios_dp.c
index 6858cde9fc5d..b0d414553e71 100644
--- a/drivers/gpu/drm/amd/amdgpu/atombios_dp.c
+++ b/drivers/gpu/drm/amd/amdgpu/atombios_dp.c
@@ -334,6 +334,22 @@ static void amdgpu_atombios_dp_probe_oui(struct amdgpu_connector *amdgpu_connect
 			      buf[0], buf[1], buf[2]);
 }
 
+static void amdgpu_atombios_dp_ds_ports(struct amdgpu_connector *amdgpu_connector)
+{
+	struct amdgpu_connector_atom_dig *dig_connector = amdgpu_connector->con_priv;
+	int ret;
+
+	if (dig_connector->dpcd[DP_DPCD_REV] > 0x10) {
+		ret = drm_dp_dpcd_read(&amdgpu_connector->ddc_bus->aux,
+				       DP_DOWNSTREAM_PORT_0,
+				       dig_connector->downstream_ports,
+				       DP_MAX_DOWNSTREAM_PORTS);
+		if (ret)
+			memset(dig_connector->downstream_ports, 0,
+			       DP_MAX_DOWNSTREAM_PORTS);
+	}
+}
+
 int amdgpu_atombios_dp_get_dpcd(struct amdgpu_connector *amdgpu_connector)
 {
 	struct amdgpu_connector_atom_dig *dig_connector = amdgpu_connector->con_priv;
@@ -349,7 +365,7 @@ int amdgpu_atombios_dp_get_dpcd(struct amdgpu_connector *amdgpu_connector)
 			      dig_connector->dpcd);
 
 		amdgpu_atombios_dp_probe_oui(amdgpu_connector);
-
+		amdgpu_atombios_dp_ds_ports(amdgpu_connector);
 		return 0;
 	}
 
-- 
2.22.0

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 5/6] drm/nouveau: utilize subconnector property for DP
  2019-07-15 11:23   ` [PATCH v2 5/6] drm/nouveau: " Oleg Vasilev
@ 2019-07-15 12:15     ` Emil Velikov
  0 siblings, 0 replies; 14+ messages in thread
From: Emil Velikov @ 2019-07-15 12:15 UTC (permalink / raw)
  To: Oleg Vasilev; +Cc: nouveau, dri-devel

Hi Oleg,

On 2019/07/15, Oleg Vasilev wrote:
> Since DP-specific information is stored in driver's structures, every
> driver needs to implement subconnector property by itself.
> 
> Signed-off-by: Oleg Vasilev <oleg.vasilev@intel.com>
> Cc: nouveau@lists.freedesktop.org
> ---
>  drivers/gpu/drm/nouveau/nouveau_connector.c | 13 +++++++++++++
>  drivers/gpu/drm/nouveau/nouveau_dp.c        |  9 +++++++++
>  drivers/gpu/drm/nouveau/nouveau_encoder.h   |  1 +
>  3 files changed, 23 insertions(+)
> 
> diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c
> index 4116ee62adaf..728949d803af 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_connector.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
> @@ -636,6 +636,17 @@ nouveau_connector_detect(struct drm_connector *connector, bool force)
>  	pm_runtime_mark_last_busy(dev->dev);
>  	pm_runtime_put_autosuspend(dev->dev);
>  
> +	if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort ||
> +	    connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
> +		enum drm_mode_subconnector subconnector = DRM_MODE_SUBCONNECTOR_Unknown;
> +
> +		if (conn_status == connector_status_connected && nv_encoder)
> +			subconnector = nv_encoder->dp.subconnector;
> +		drm_object_property_set_value(&connector->base,
> +			connector->dev->mode_config.dp_subconnector_property,
> +			subconnector);
> +	}
> +
>  	return conn_status;
>  }
>  
> @@ -1357,6 +1368,8 @@ nouveau_connector_create(struct drm_device *dev,
>  			kfree(nv_connector);
>  			return ERR_PTR(ret);
>  		}
> +
> +		drm_mode_add_dp_subconnector_property(connector);
>  		funcs = &nouveau_connector_funcs;
>  		break;
>  	default:
> diff --git a/drivers/gpu/drm/nouveau/nouveau_dp.c b/drivers/gpu/drm/nouveau/nouveau_dp.c
> index 0d052e1660f8..7a87b0f808a7 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_dp.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_dp.c
> @@ -63,6 +63,7 @@ nouveau_dp_detect(struct nouveau_encoder *nv_encoder)
>  	struct nouveau_drm *drm = nouveau_drm(dev);
>  	struct nvkm_i2c_aux *aux;
>  	u8 dpcd[8];
> +	u8 port_cap[DP_MAX_DOWNSTREAM_PORTS] = {0};
IIRC clang will complain about {0}. How about we make this a {}.

Regardless of the above nitpick, the series is:
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>

Thanks for the follow-up :-)
Emil
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2019-07-15 12:15 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-07-01  8:00 [PATCH 1/2] drm: report dp downstream port type as a subconnector property Oleg Vasilev
2019-07-01  8:00 ` [PATCH 2/2] drm/i915: utilize subconnector property for DP Oleg Vasilev
2019-07-02 12:36 ` [Intel-gfx] [PATCH 1/2] drm: report dp downstream port type as a subconnector property Ville Syrjälä
2019-07-02 13:38 ` Emil Velikov
2019-07-03  8:19   ` Vasilev, Oleg
2019-07-03 13:35     ` [Intel-gfx] " Emil Velikov
2019-07-15 11:23 ` Subconnector property for DP downstream type Oleg Vasilev
2019-07-15 11:23   ` [PATCH v2 1/6] drm: move DP_MAX_DOWNSTREAM_PORTS from i915 to drm core Oleg Vasilev
2019-07-15 11:23   ` [PATCH v2 2/6] drm: always determine branch device with drm_dp_is_branch() Oleg Vasilev
2019-07-15 11:23   ` [PATCH v2 3/6] drm: report dp downstream port type as a subconnector property Oleg Vasilev
2019-07-15 11:23   ` [PATCH v2 4/6] drm/i915: utilize subconnector property for DP Oleg Vasilev
2019-07-15 11:23   ` [PATCH v2 5/6] drm/nouveau: " Oleg Vasilev
2019-07-15 12:15     ` Emil Velikov
     [not found]   ` <20190715112408.20114-1-oleg.vasilev-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2019-07-15 11:23     ` [PATCH v2 6/6] drm/amdgpu: " Oleg Vasilev

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).