All of lore.kernel.org
 help / color / mirror / Atom feed
* [Intel-gfx] [PATCH 1/5] drm: report dp downstream port type as a subconnector property
@ 2020-04-01 12:12 Jeevan B
  2020-04-01 12:12 ` [Intel-gfx] [PATCH 2/5] drm/i915: utilize subconnector property for DP Jeevan B
                   ` (4 more replies)
  0 siblings, 5 replies; 13+ messages in thread
From: Jeevan B @ 2020-04-01 12:12 UTC (permalink / raw)
  To: uma.shankar; +Cc: Jeevan B, 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.

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

v4:
 - Ville: add DP1.0 best assumption about subconnector
 - Ville: assume DVI is DVI-D
 - Ville: reuse Writeback enum value for Virtual subconnector
 - Renamed #defines: HDMI -> HDMIA, DP -> DisplayPort

[1]: https://bugs.freedesktop.org/show_bug.cgi?id=104097

Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
Signed-off-by: Oleg Vasilev <oleg.vasilev@intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: intel-gfx@lists.freedesktop.org
Signed-off-by: Jeevan B <jeevan.b@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190829114854.1539-3-oleg.vasilev@intel.com
---
 drivers/gpu/drm/drm_connector.c | 49 ++++++++++++++++++++++++--
 drivers/gpu/drm/drm_dp_helper.c | 77 +++++++++++++++++++++++++++++++++++++++++
 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     | 21 ++++++-----
 6 files changed, 154 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
index b1099e1..b6972d1 100644
--- a/drivers/gpu/drm/drm_connector.c
+++ b/drivers/gpu/drm/drm_connector.c
@@ -844,7 +844,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  */
 };
@@ -861,7 +861,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 */
@@ -870,6 +870,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_DVID,	     "DVI-D"     }, /* DP */
+	{ DRM_MODE_SUBCONNECTOR_HDMIA,	     "HDMI"      }, /* DP */
+	{ DRM_MODE_SUBCONNECTOR_DisplayPort, "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" },
@@ -1186,6 +1199,14 @@ static const struct drm_prop_enum_list dp_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)
@@ -1275,6 +1296,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
  *
  * content type (HDMI specific):
diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c
index 8ba4531..5d5b50f 100644
--- a/drivers/gpu/drm/drm_dp_helper.c
+++ b/drivers/gpu/drm/drm_dp_helper.c
@@ -594,6 +594,83 @@ 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;
+	if (!drm_dp_is_branch(dpcd))
+		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;
+
+		switch (type) {
+		case DP_DWN_STRM_PORT_TYPE_TMDS:
+			/* Can be HDMI or DVI-D, DVI-D is a safer option */
+			return DRM_MODE_SUBCONNECTOR_DVID;
+		case DP_DWN_STRM_PORT_TYPE_ANALOG:
+			/* Can be VGA or DVI-A, VGA is more popular */
+			return DRM_MODE_SUBCONNECTOR_VGA;
+		case DP_DWN_STRM_PORT_TYPE_DP:
+			return DRM_MODE_SUBCONNECTOR_DisplayPort;
+		case DP_DWN_STRM_PORT_TYPE_OTHER:
+		default:
+			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_DisplayPort;
+	case DP_DS_PORT_TYPE_VGA:
+		return DRM_MODE_SUBCONNECTOR_VGA;
+	case DP_DS_PORT_TYPE_DVI:
+		return DRM_MODE_SUBCONNECTOR_DVID;
+	case DP_DS_PORT_TYPE_HDMI:
+		return DRM_MODE_SUBCONNECTOR_HDMIA;
+	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 fd543d1..82797c8 100644
--- a/include/drm/drm_connector.h
+++ b/include/drm/drm_connector.h
@@ -1556,10 +1556,13 @@ 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);
 const char *drm_get_hdcp_content_type_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 305533d..6408b31 100644
--- a/include/drm/drm_dp_helper.h
+++ b/include/drm/drm_dp_helper.h
@@ -26,6 +26,7 @@
 #include <linux/delay.h>
 #include <linux/i2c.h>
 #include <linux/types.h>
+#include <drm/drm_connector.h>
 
 /*
  * Unless otherwise noted, all values are from the DP 1.1a spec.  Note that
@@ -1599,6 +1600,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_remote_aux_init(struct drm_dp_aux *aux);
 void drm_dp_aux_init(struct drm_dp_aux *aux);
diff --git a/include/drm/drm_mode_config.h b/include/drm/drm_mode_config.h
index 6c3ef49..085fb00 100644
--- a/include/drm/drm_mode_config.h
+++ b/include/drm/drm_mode_config.h
@@ -681,6 +681,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 735c8cf..3358c6b 100644
--- a/include/uapi/drm/drm_mode.h
+++ b/include/uapi/drm/drm_mode.h
@@ -332,14 +332,19 @@ 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_DVID	  = 3,  /* DVI-I      DP */
+	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_DisplayPort = 10, /*            DP */
+	DRM_MODE_SUBCONNECTOR_HDMIA       = 11, /*            DP */
+	DRM_MODE_SUBCONNECTOR_Native      = 15, /*            DP */
+	DRM_MODE_SUBCONNECTOR_Wireless    = 18, /*            DP */
 };
 
 #define DRM_MODE_CONNECTOR_Unknown	0
-- 
2.7.4

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

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

* [Intel-gfx] [PATCH 2/5] drm/i915: utilize subconnector property for DP
  2020-04-01 12:12 [Intel-gfx] [PATCH 1/5] drm: report dp downstream port type as a subconnector property Jeevan B
@ 2020-04-01 12:12 ` Jeevan B
       [not found] ` <1585743148-31205-1-git-send-email-jeevan.b-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 13+ messages in thread
From: Jeevan B @ 2020-04-01 12:12 UTC (permalink / raw)
  To: uma.shankar; +Cc: Jeevan B, intel-gfx

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

v2: updates to match previous commit changes

Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
Tested-by: Oleg Vasilev <oleg.vasilev@intel.com>
Signed-off-by: Oleg Vasilev <oleg.vasilev@intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: intel-gfx@lists.freedesktop.org
Signed-off-by: Jeevan B <jeevan.b@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190829114854.1539-4-oleg.vasilev@intel.com
---
 drivers/gpu/drm/i915/display/intel_dp.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index 2e715e6..c2c9ed3 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -6140,6 +6140,11 @@ intel_dp_detect(struct drm_connector *connector,
 	 */
 	intel_display_power_flush_work(dev_priv);
 
+	if (!intel_dp_is_edp(intel_dp))
+		drm_dp_set_subconnector_property(connector,
+						 status,
+						 intel_dp->dpcd,
+						 intel_dp->downstream_ports);
 	return status;
 }
 
@@ -7192,6 +7197,9 @@ 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;
 
+	if (!intel_dp_is_edp(intel_dp))
+		drm_mode_add_dp_subconnector_property(connector);
+
 	if (!IS_G4X(dev_priv) && port != PORT_A)
 		intel_attach_force_audio_property(connector);
 
-- 
2.7.4

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

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

* [PATCH 3/5] drm/nouveau: utilize subconnector property for DP
       [not found] ` <1585743148-31205-1-git-send-email-jeevan.b-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
@ 2020-04-01 12:12   ` Jeevan B
  0 siblings, 0 replies; 13+ messages in thread
From: Jeevan B @ 2020-04-01 12:12 UTC (permalink / raw)
  To: uma.shankar-ral2JQCrhuEAvxtiuMwx3w
  Cc: Jeevan B, nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, Ben Skeggs

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

Reviewed-by: Emil Velikov <emil.velikov-ZGY8ohtN/8qB+jHODAdFcQ@public.gmane.org>
Signed-off-by: Oleg Vasilev <oleg.vasilev-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Cc: Ben Skeggs <bskeggs-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Cc: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org
Signed-off-by: Jeevan B <jeevan.b-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20190829114854.1539-5-oleg.vasilev-ral2JQCrhuEAvxtiuMwx3w@public.gmane.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 9a9a7f5..6464e48 100644
--- a/drivers/gpu/drm/nouveau/nouveau_connector.c
+++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
@@ -648,6 +648,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;
 }
 
@@ -1373,6 +1384,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 2674f15..85eac85 100644
--- a/drivers/gpu/drm/nouveau/nouveau_dp.c
+++ b/drivers/gpu/drm/nouveau/nouveau_dp.c
@@ -62,6 +62,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] = {};
 	int ret;
 
 	aux = nv_encoder->aux;
@@ -72,6 +73,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 3517f92..e17971a 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.7.4

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

* [PATCH 5/5] drm/amdgpu: utilize subconnector property for DP through DisplayManager
  2020-04-01 12:12 [Intel-gfx] [PATCH 1/5] drm: report dp downstream port type as a subconnector property Jeevan B
  2020-04-01 12:12 ` [Intel-gfx] [PATCH 2/5] drm/i915: utilize subconnector property for DP Jeevan B
       [not found] ` <1585743148-31205-1-git-send-email-jeevan.b-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
@ 2020-04-01 12:12 ` Jeevan B
  2020-04-01 15:21   ` Alex Deucher
  2020-04-01 12:26 ` [Intel-gfx] [PATCH 1/5] drm: report dp downstream port type as a subconnector property Shankar, Uma
  2020-04-01 13:03 ` Ville Syrjälä
  4 siblings, 1 reply; 13+ messages in thread
From: Jeevan B @ 2020-04-01 12:12 UTC (permalink / raw)
  To: uma.shankar
  Cc: Jeevan B, Alex Deucher, Christian König, amd-gfx, David Zhou

Since DP-specific information is stored in driver's structures, every
driver needs to implement subconnector property by itself. Display
Core already has the subconnector information, we only need to
expose it through DRM property.

Signed-off-by: Oleg Vasilev <oleg.vasilev@intel.com>
Tested-by: Oleg Vasilev <oleg.vasilev@intel.com>
Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: Christian König <christian.koenig@amd.com>
Cc: David (ChunMing) Zhou <David1.Zhou@amd.com>
Cc: amd-gfx@lists.freedesktop.org
Signed-off-by: Jeevan B <jeevan.b@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190829114854.1539-7-oleg.vasilev@intel.com
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c  | 41 +++++++++++++++++++++-
 .../amd/display/amdgpu_dm/amdgpu_dm_mst_types.c    |  3 ++
 2 files changed, 43 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index d3674d8..91c0ef2 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -121,6 +121,42 @@ MODULE_FIRMWARE(FIRMWARE_NAVI12_DMCU);
 static int amdgpu_dm_init(struct amdgpu_device *adev);
 static void amdgpu_dm_fini(struct amdgpu_device *adev);
 
+static enum drm_mode_subconnector get_subconnector_type(struct dc_link *link)
+{
+	switch (link->dpcd_caps.dongle_type) {
+	case DISPLAY_DONGLE_NONE:
+		return DRM_MODE_SUBCONNECTOR_Native;
+	case DISPLAY_DONGLE_DP_VGA_CONVERTER:
+		return DRM_MODE_SUBCONNECTOR_VGA;
+	case DISPLAY_DONGLE_DP_DVI_CONVERTER:
+	case DISPLAY_DONGLE_DP_DVI_DONGLE:
+		return DRM_MODE_SUBCONNECTOR_DVID;
+	case DISPLAY_DONGLE_DP_HDMI_CONVERTER:
+	case DISPLAY_DONGLE_DP_HDMI_DONGLE:
+		return DRM_MODE_SUBCONNECTOR_HDMIA;
+	case DISPLAY_DONGLE_DP_HDMI_MISMATCHED_DONGLE:
+	default:
+		return DRM_MODE_SUBCONNECTOR_Unknown;
+	}
+}
+
+static void update_subconnector_property(struct amdgpu_dm_connector *aconnector)
+{
+	struct dc_link *link = aconnector->dc_link;
+	struct drm_connector *connector = &aconnector->base;
+	enum drm_mode_subconnector subconnector = DRM_MODE_SUBCONNECTOR_Unknown;
+
+	if (connector->connector_type != DRM_MODE_CONNECTOR_DisplayPort)
+		return;
+
+	if (aconnector->dc_sink)
+		subconnector = get_subconnector_type(link);
+
+	drm_object_property_set_value(&connector->base,
+			connector->dev->mode_config.dp_subconnector_property,
+			subconnector);
+}
+
 /*
  * initializes drm_device display related structures, based on the information
  * provided by DAL. The drm strcutures are: drm_crtc, drm_connector,
@@ -1917,7 +1953,6 @@ void amdgpu_dm_update_connector_after_detect(
 	if (aconnector->mst_mgr.mst_state == true)
 		return;
 
-
 	sink = aconnector->dc_link->local_sink;
 	if (sink)
 		dc_sink_retain(sink);
@@ -2038,6 +2073,8 @@ void amdgpu_dm_update_connector_after_detect(
 
 	mutex_unlock(&dev->mode_config.mutex);
 
+	update_subconnector_property(aconnector);
+
 	if (sink)
 		dc_sink_release(sink);
 }
@@ -4518,6 +4555,8 @@ amdgpu_dm_connector_detect(struct drm_connector *connector, bool force)
 	else
 		connected = (aconnector->base.force == DRM_FORCE_ON);
 
+	update_subconnector_property(aconnector);
+
 	return (connected ? connector_status_connected :
 			connector_status_disconnected);
 }
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
index e8208df..dab81a6 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
@@ -26,6 +26,7 @@
 #include <linux/version.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_dp_mst_helper.h>
+#include <drm/drm_dp_helper.h>
 #include "dm_services.h"
 #include "amdgpu.h"
 #include "amdgpu_dm.h"
@@ -485,6 +486,8 @@ void amdgpu_dm_initialize_dp_connector(struct amdgpu_display_manager *dm,
 		16,
 		4,
 		aconnector->connector_id);
+
+	drm_mode_add_dp_subconnector_property(&aconnector->base);
 }
 
 int dm_mst_get_pbn_divider(struct dc_link *link)
-- 
2.7.4

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

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

* Re: [Intel-gfx] [PATCH 1/5] drm: report dp downstream port type as a subconnector property
  2020-04-01 12:12 [Intel-gfx] [PATCH 1/5] drm: report dp downstream port type as a subconnector property Jeevan B
                   ` (2 preceding siblings ...)
  2020-04-01 12:12 ` [PATCH 5/5] drm/amdgpu: utilize subconnector property for DP through DisplayManager Jeevan B
@ 2020-04-01 12:26 ` Shankar, Uma
  2020-04-01 12:38   ` Shankar, Uma
  2020-04-01 13:03 ` Ville Syrjälä
  4 siblings, 1 reply; 13+ messages in thread
From: Shankar, Uma @ 2020-04-01 12:26 UTC (permalink / raw)
  To: B, Jeevan; +Cc: intel-gfx



> -----Original Message-----
> From: B, Jeevan <jeevan.b@intel.com>
> Sent: Wednesday, April 1, 2020 5:42 PM
> To: Shankar, Uma <uma.shankar@intel.com>
> Cc: B, Jeevan <jeevan.b@intel.com>; Ville Syrjälä <ville.syrjala@linux.intel.com>;
> intel-gfx@lists.freedesktop.org
> Subject: [PATCH 1/5] drm: report dp downstream port type as a subconnector
> property
> 
> 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
> 
> v4:
>  - Ville: add DP1.0 best assumption about subconnector
>  - Ville: assume DVI is DVI-D
>  - Ville: reuse Writeback enum value for Virtual subconnector
>  - Renamed #defines: HDMI -> HDMIA, DP -> DisplayPort
> 
> [1]: https://bugs.freedesktop.org/show_bug.cgi?id=104097
> 
> Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
> Signed-off-by: Oleg Vasilev <oleg.vasilev@intel.com>
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Cc: intel-gfx@lists.freedesktop.org
> Signed-off-by: Jeevan B <jeevan.b@intel.com>

You can update the version number for this series : use subject-prefix=v5 as git-format.
Also move your signed off close to Oleg's. Best is to put Cc: at the top, then all
Signed-off and Reviewed-by

Also in patch mention change in v5, like if it's just rebased
V5: rebase

> Link: https://patchwork.freedesktop.org/patch/msgid/20190829114854.1539-3-
> oleg.vasilev@intel.com
> ---
>  drivers/gpu/drm/drm_connector.c | 49 ++++++++++++++++++++++++--
> drivers/gpu/drm/drm_dp_helper.c | 77
> +++++++++++++++++++++++++++++++++++++++++
>  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     | 21 ++++++-----
>  6 files changed, 154 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
> index b1099e1..b6972d1 100644
> --- a/drivers/gpu/drm/drm_connector.c
> +++ b/drivers/gpu/drm/drm_connector.c
> @@ -844,7 +844,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  */
>  };
> @@ -861,7 +861,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 */
> @@ -870,6 +870,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_DVID,	     "DVI-D"     }, /* DP */
> +	{ DRM_MODE_SUBCONNECTOR_HDMIA,	     "HDMI"      }, /* DP */
> +	{ DRM_MODE_SUBCONNECTOR_DisplayPort, "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" }, @@ -1186,6 +1199,14
> @@ static const struct drm_prop_enum_list dp_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) @@ -
> 1275,6 +1296,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
>   *
>   * content type (HDMI specific):
> diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c
> index 8ba4531..5d5b50f 100644
> --- a/drivers/gpu/drm/drm_dp_helper.c
> +++ b/drivers/gpu/drm/drm_dp_helper.c
> @@ -594,6 +594,83 @@ 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;
> +	if (!drm_dp_is_branch(dpcd))
> +		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;
> +
> +		switch (type) {
> +		case DP_DWN_STRM_PORT_TYPE_TMDS:
> +			/* Can be HDMI or DVI-D, DVI-D is a safer option */
> +			return DRM_MODE_SUBCONNECTOR_DVID;
> +		case DP_DWN_STRM_PORT_TYPE_ANALOG:
> +			/* Can be VGA or DVI-A, VGA is more popular */
> +			return DRM_MODE_SUBCONNECTOR_VGA;
> +		case DP_DWN_STRM_PORT_TYPE_DP:
> +			return DRM_MODE_SUBCONNECTOR_DisplayPort;
> +		case DP_DWN_STRM_PORT_TYPE_OTHER:
> +		default:
> +			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_DisplayPort;
> +	case DP_DS_PORT_TYPE_VGA:
> +		return DRM_MODE_SUBCONNECTOR_VGA;
> +	case DP_DS_PORT_TYPE_DVI:
> +		return DRM_MODE_SUBCONNECTOR_DVID;
> +	case DP_DS_PORT_TYPE_HDMI:
> +		return DRM_MODE_SUBCONNECTOR_HDMIA;
> +	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
> fd543d1..82797c8 100644
> --- a/include/drm/drm_connector.h
> +++ b/include/drm/drm_connector.h
> @@ -1556,10 +1556,13 @@ 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);  const char
> *drm_get_hdcp_content_type_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
> 305533d..6408b31 100644
> --- a/include/drm/drm_dp_helper.h
> +++ b/include/drm/drm_dp_helper.h
> @@ -26,6 +26,7 @@
>  #include <linux/delay.h>
>  #include <linux/i2c.h>
>  #include <linux/types.h>
> +#include <drm/drm_connector.h>
> 
>  /*
>   * Unless otherwise noted, all values are from the DP 1.1a spec.  Note that @@ -
> 1599,6 +1600,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_remote_aux_init(struct drm_dp_aux *aux);  void
> drm_dp_aux_init(struct drm_dp_aux *aux); diff --git
> a/include/drm/drm_mode_config.h b/include/drm/drm_mode_config.h index
> 6c3ef49..085fb00 100644
> --- a/include/drm/drm_mode_config.h
> +++ b/include/drm/drm_mode_config.h
> @@ -681,6 +681,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
> 735c8cf..3358c6b 100644
> --- a/include/uapi/drm/drm_mode.h
> +++ b/include/uapi/drm/drm_mode.h
> @@ -332,14 +332,19 @@ 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_DVID	  = 3,  /* DVI-I      DP */
> +	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_DisplayPort = 10, /*            DP */
> +	DRM_MODE_SUBCONNECTOR_HDMIA       = 11, /*            DP */
> +	DRM_MODE_SUBCONNECTOR_Native      = 15, /*            DP */
> +	DRM_MODE_SUBCONNECTOR_Wireless    = 18, /*            DP */
>  };
> 
>  #define DRM_MODE_CONNECTOR_Unknown	0
> --
> 2.7.4

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

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

* Re: [Intel-gfx] [PATCH 1/5] drm: report dp downstream port type as a subconnector property
  2020-04-01 12:26 ` [Intel-gfx] [PATCH 1/5] drm: report dp downstream port type as a subconnector property Shankar, Uma
@ 2020-04-01 12:38   ` Shankar, Uma
  0 siblings, 0 replies; 13+ messages in thread
From: Shankar, Uma @ 2020-04-01 12:38 UTC (permalink / raw)
  To: B, Jeevan; +Cc: intel-gfx

> 
> > -----Original Message-----
> > From: B, Jeevan <jeevan.b@intel.com>
> > Sent: Wednesday, April 1, 2020 5:42 PM
> > To: Shankar, Uma <uma.shankar@intel.com>
> > Cc: B, Jeevan <jeevan.b@intel.com>; Ville Syrjälä
> > <ville.syrjala@linux.intel.com>; intel-gfx@lists.freedesktop.org
> > Subject: [PATCH 1/5] drm: report dp downstream port type as a
> > subconnector property
> >
> > 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
> >
> > v4:
> >  - Ville: add DP1.0 best assumption about subconnector
> >  - Ville: assume DVI is DVI-D
> >  - Ville: reuse Writeback enum value for Virtual subconnector
> >  - Renamed #defines: HDMI -> HDMIA, DP -> DisplayPort
> >
> > [1]: https://bugs.freedesktop.org/show_bug.cgi?id=104097
> >
> > Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
> > Signed-off-by: Oleg Vasilev <oleg.vasilev@intel.com>
> > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > Cc: intel-gfx@lists.freedesktop.org
> > Signed-off-by: Jeevan B <jeevan.b@intel.com>
> 
> You can update the version number for this series : use subject-prefix=v5 as git-
> format.
> Also move your signed off close to Oleg's. Best is to put Cc: at the top, then all
> Signed-off and Reviewed-by
> 
> Also in patch mention change in v5, like if it's just rebased
> V5: rebase

Also, please send the series to intel-gfx as well as dri-devel for review.

> > Link:
> > https://patchwork.freedesktop.org/patch/msgid/20190829114854.1539-3-
> > oleg.vasilev@intel.com
> > ---
> >  drivers/gpu/drm/drm_connector.c | 49 ++++++++++++++++++++++++--
> > drivers/gpu/drm/drm_dp_helper.c | 77
> > +++++++++++++++++++++++++++++++++++++++++
> >  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     | 21 ++++++-----
> >  6 files changed, 154 insertions(+), 10 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/drm_connector.c
> > b/drivers/gpu/drm/drm_connector.c index b1099e1..b6972d1 100644
> > --- a/drivers/gpu/drm/drm_connector.c
> > +++ b/drivers/gpu/drm/drm_connector.c
> > @@ -844,7 +844,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  */
> >  };
> > @@ -861,7 +861,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 */
> @@
> > -870,6 +870,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_DVID,	     "DVI-D"     }, /* DP */
> > +	{ DRM_MODE_SUBCONNECTOR_HDMIA,	     "HDMI"      }, /* DP */
> > +	{ DRM_MODE_SUBCONNECTOR_DisplayPort, "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" }, @@ -1186,6 +1199,14
> @@
> > static const struct drm_prop_enum_list dp_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)
> > @@ -
> > 1275,6 +1296,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
> >   *
> >   * content type (HDMI specific):
> > diff --git a/drivers/gpu/drm/drm_dp_helper.c
> > b/drivers/gpu/drm/drm_dp_helper.c index 8ba4531..5d5b50f 100644
> > --- a/drivers/gpu/drm/drm_dp_helper.c
> > +++ b/drivers/gpu/drm/drm_dp_helper.c
> > @@ -594,6 +594,83 @@ 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;
> > +	if (!drm_dp_is_branch(dpcd))
> > +		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;
> > +
> > +		switch (type) {
> > +		case DP_DWN_STRM_PORT_TYPE_TMDS:
> > +			/* Can be HDMI or DVI-D, DVI-D is a safer option */
> > +			return DRM_MODE_SUBCONNECTOR_DVID;
> > +		case DP_DWN_STRM_PORT_TYPE_ANALOG:
> > +			/* Can be VGA or DVI-A, VGA is more popular */
> > +			return DRM_MODE_SUBCONNECTOR_VGA;
> > +		case DP_DWN_STRM_PORT_TYPE_DP:
> > +			return DRM_MODE_SUBCONNECTOR_DisplayPort;
> > +		case DP_DWN_STRM_PORT_TYPE_OTHER:
> > +		default:
> > +			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_DisplayPort;
> > +	case DP_DS_PORT_TYPE_VGA:
> > +		return DRM_MODE_SUBCONNECTOR_VGA;
> > +	case DP_DS_PORT_TYPE_DVI:
> > +		return DRM_MODE_SUBCONNECTOR_DVID;
> > +	case DP_DS_PORT_TYPE_HDMI:
> > +		return DRM_MODE_SUBCONNECTOR_HDMIA;
> > +	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
> > fd543d1..82797c8 100644
> > --- a/include/drm/drm_connector.h
> > +++ b/include/drm/drm_connector.h
> > @@ -1556,10 +1556,13 @@ 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);  const char
> > *drm_get_hdcp_content_type_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
> > 305533d..6408b31 100644
> > --- a/include/drm/drm_dp_helper.h
> > +++ b/include/drm/drm_dp_helper.h
> > @@ -26,6 +26,7 @@
> >  #include <linux/delay.h>
> >  #include <linux/i2c.h>
> >  #include <linux/types.h>
> > +#include <drm/drm_connector.h>
> >
> >  /*
> >   * Unless otherwise noted, all values are from the DP 1.1a spec.
> > Note that @@ -
> > 1599,6 +1600,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_remote_aux_init(struct drm_dp_aux *aux);  void
> > drm_dp_aux_init(struct drm_dp_aux *aux); diff --git
> > a/include/drm/drm_mode_config.h b/include/drm/drm_mode_config.h index
> > 6c3ef49..085fb00 100644
> > --- a/include/drm/drm_mode_config.h
> > +++ b/include/drm/drm_mode_config.h
> > @@ -681,6 +681,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 735c8cf..3358c6b 100644
> > --- a/include/uapi/drm/drm_mode.h
> > +++ b/include/uapi/drm/drm_mode.h
> > @@ -332,14 +332,19 @@ 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_DVID	  = 3,  /* DVI-I      DP */
> > +	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_DisplayPort = 10, /*            DP */
> > +	DRM_MODE_SUBCONNECTOR_HDMIA       = 11, /*            DP */
> > +	DRM_MODE_SUBCONNECTOR_Native      = 15, /*            DP */
> > +	DRM_MODE_SUBCONNECTOR_Wireless    = 18, /*            DP */
> >  };
> >
> >  #define DRM_MODE_CONNECTOR_Unknown	0
> > --
> > 2.7.4

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

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

* Re: [Intel-gfx] [PATCH 1/5] drm: report dp downstream port type as a subconnector property
  2020-04-01 12:12 [Intel-gfx] [PATCH 1/5] drm: report dp downstream port type as a subconnector property Jeevan B
                   ` (3 preceding siblings ...)
  2020-04-01 12:26 ` [Intel-gfx] [PATCH 1/5] drm: report dp downstream port type as a subconnector property Shankar, Uma
@ 2020-04-01 13:03 ` Ville Syrjälä
  2020-04-03  7:01   ` Jeevan B
  4 siblings, 1 reply; 13+ messages in thread
From: Ville Syrjälä @ 2020-04-01 13:03 UTC (permalink / raw)
  To: Jeevan B; +Cc: intel-gfx

On Wed, Apr 01, 2020 at 05:42:24PM +0530, Jeevan B 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.
> 
> 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
> 
> v4:
>  - Ville: add DP1.0 best assumption about subconnector
>  - Ville: assume DVI is DVI-D
>  - Ville: reuse Writeback enum value for Virtual subconnector
>  - Renamed #defines: HDMI -> HDMIA, DP -> DisplayPort
> 
> [1]: https://bugs.freedesktop.org/show_bug.cgi?id=104097
> 
> Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
> Signed-off-by: Oleg Vasilev <oleg.vasilev@intel.com>

Is this Oleg's patch? If so why did you change the patch author to be
yourself?

> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Cc: intel-gfx@lists.freedesktop.org
> Signed-off-by: Jeevan B <jeevan.b@intel.com>
> Link: https://patchwork.freedesktop.org/patch/msgid/20190829114854.1539-3-oleg.vasilev@intel.com
> ---
>  drivers/gpu/drm/drm_connector.c | 49 ++++++++++++++++++++++++--
>  drivers/gpu/drm/drm_dp_helper.c | 77 +++++++++++++++++++++++++++++++++++++++++
>  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     | 21 ++++++-----
>  6 files changed, 154 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
> index b1099e1..b6972d1 100644
> --- a/drivers/gpu/drm/drm_connector.c
> +++ b/drivers/gpu/drm/drm_connector.c
> @@ -844,7 +844,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  */
>  };
> @@ -861,7 +861,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 */
> @@ -870,6 +870,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_DVID,	     "DVI-D"     }, /* DP */
> +	{ DRM_MODE_SUBCONNECTOR_HDMIA,	     "HDMI"      }, /* DP */
> +	{ DRM_MODE_SUBCONNECTOR_DisplayPort, "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" },
> @@ -1186,6 +1199,14 @@ static const struct drm_prop_enum_list dp_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)
> @@ -1275,6 +1296,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
>   *
>   * content type (HDMI specific):
> diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c
> index 8ba4531..5d5b50f 100644
> --- a/drivers/gpu/drm/drm_dp_helper.c
> +++ b/drivers/gpu/drm/drm_dp_helper.c
> @@ -594,6 +594,83 @@ 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;
> +	if (!drm_dp_is_branch(dpcd))
> +		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;
> +
> +		switch (type) {
> +		case DP_DWN_STRM_PORT_TYPE_TMDS:
> +			/* Can be HDMI or DVI-D, DVI-D is a safer option */
> +			return DRM_MODE_SUBCONNECTOR_DVID;
> +		case DP_DWN_STRM_PORT_TYPE_ANALOG:
> +			/* Can be VGA or DVI-A, VGA is more popular */
> +			return DRM_MODE_SUBCONNECTOR_VGA;
> +		case DP_DWN_STRM_PORT_TYPE_DP:
> +			return DRM_MODE_SUBCONNECTOR_DisplayPort;
> +		case DP_DWN_STRM_PORT_TYPE_OTHER:
> +		default:
> +			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_DisplayPort;
> +	case DP_DS_PORT_TYPE_VGA:
> +		return DRM_MODE_SUBCONNECTOR_VGA;
> +	case DP_DS_PORT_TYPE_DVI:
> +		return DRM_MODE_SUBCONNECTOR_DVID;
> +	case DP_DS_PORT_TYPE_HDMI:
> +		return DRM_MODE_SUBCONNECTOR_HDMIA;
> +	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 fd543d1..82797c8 100644
> --- a/include/drm/drm_connector.h
> +++ b/include/drm/drm_connector.h
> @@ -1556,10 +1556,13 @@ 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);
>  const char *drm_get_hdcp_content_type_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 305533d..6408b31 100644
> --- a/include/drm/drm_dp_helper.h
> +++ b/include/drm/drm_dp_helper.h
> @@ -26,6 +26,7 @@
>  #include <linux/delay.h>
>  #include <linux/i2c.h>
>  #include <linux/types.h>
> +#include <drm/drm_connector.h>
>  
>  /*
>   * Unless otherwise noted, all values are from the DP 1.1a spec.  Note that
> @@ -1599,6 +1600,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_remote_aux_init(struct drm_dp_aux *aux);
>  void drm_dp_aux_init(struct drm_dp_aux *aux);
> diff --git a/include/drm/drm_mode_config.h b/include/drm/drm_mode_config.h
> index 6c3ef49..085fb00 100644
> --- a/include/drm/drm_mode_config.h
> +++ b/include/drm/drm_mode_config.h
> @@ -681,6 +681,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 735c8cf..3358c6b 100644
> --- a/include/uapi/drm/drm_mode.h
> +++ b/include/uapi/drm/drm_mode.h
> @@ -332,14 +332,19 @@ 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_DVID	  = 3,  /* DVI-I      DP */
> +	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_DisplayPort = 10, /*            DP */
> +	DRM_MODE_SUBCONNECTOR_HDMIA       = 11, /*            DP */
> +	DRM_MODE_SUBCONNECTOR_Native      = 15, /*            DP */
> +	DRM_MODE_SUBCONNECTOR_Wireless    = 18, /*            DP */
>  };
>  
>  #define DRM_MODE_CONNECTOR_Unknown	0
> -- 
> 2.7.4

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

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

* Re: [PATCH 5/5] drm/amdgpu: utilize subconnector property for DP through DisplayManager
  2020-04-01 12:12 ` [PATCH 5/5] drm/amdgpu: utilize subconnector property for DP through DisplayManager Jeevan B
@ 2020-04-01 15:21   ` Alex Deucher
  0 siblings, 0 replies; 13+ messages in thread
From: Alex Deucher @ 2020-04-01 15:21 UTC (permalink / raw)
  To: Jeevan B
  Cc: Alex Deucher, David Zhou, Shankar, Uma, Christian König,
	amd-gfx list

On Wed, Apr 1, 2020 at 8:17 AM Jeevan B <jeevan.b@intel.com> wrote:
>
> Since DP-specific information is stored in driver's structures, every
> driver needs to implement subconnector property by itself. Display
> Core already has the subconnector information, we only need to
> expose it through DRM property.
>
> Signed-off-by: Oleg Vasilev <oleg.vasilev@intel.com>
> Tested-by: Oleg Vasilev <oleg.vasilev@intel.com>
> Cc: Alex Deucher <alexander.deucher@amd.com>
> Cc: Christian König <christian.koenig@amd.com>
> Cc: David (ChunMing) Zhou <David1.Zhou@amd.com>
> Cc: amd-gfx@lists.freedesktop.org
> Signed-off-by: Jeevan B <jeevan.b@intel.com>
> Link: https://patchwork.freedesktop.org/patch/msgid/20190829114854.1539-7-oleg.vasilev@intel.com

Is this just a resend or a new version?  If it's new can you send out
the entire series to the mailing list instead of individual
developers?

Also, what are the subconnectors used for?  Just informational?

Alex

> ---
>  drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c  | 41 +++++++++++++++++++++-
>  .../amd/display/amdgpu_dm/amdgpu_dm_mst_types.c    |  3 ++
>  2 files changed, 43 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> index d3674d8..91c0ef2 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> @@ -121,6 +121,42 @@ MODULE_FIRMWARE(FIRMWARE_NAVI12_DMCU);
>  static int amdgpu_dm_init(struct amdgpu_device *adev);
>  static void amdgpu_dm_fini(struct amdgpu_device *adev);
>
> +static enum drm_mode_subconnector get_subconnector_type(struct dc_link *link)
> +{
> +       switch (link->dpcd_caps.dongle_type) {
> +       case DISPLAY_DONGLE_NONE:
> +               return DRM_MODE_SUBCONNECTOR_Native;
> +       case DISPLAY_DONGLE_DP_VGA_CONVERTER:
> +               return DRM_MODE_SUBCONNECTOR_VGA;
> +       case DISPLAY_DONGLE_DP_DVI_CONVERTER:
> +       case DISPLAY_DONGLE_DP_DVI_DONGLE:
> +               return DRM_MODE_SUBCONNECTOR_DVID;
> +       case DISPLAY_DONGLE_DP_HDMI_CONVERTER:
> +       case DISPLAY_DONGLE_DP_HDMI_DONGLE:
> +               return DRM_MODE_SUBCONNECTOR_HDMIA;
> +       case DISPLAY_DONGLE_DP_HDMI_MISMATCHED_DONGLE:
> +       default:
> +               return DRM_MODE_SUBCONNECTOR_Unknown;
> +       }
> +}
> +
> +static void update_subconnector_property(struct amdgpu_dm_connector *aconnector)
> +{
> +       struct dc_link *link = aconnector->dc_link;
> +       struct drm_connector *connector = &aconnector->base;
> +       enum drm_mode_subconnector subconnector = DRM_MODE_SUBCONNECTOR_Unknown;
> +
> +       if (connector->connector_type != DRM_MODE_CONNECTOR_DisplayPort)
> +               return;
> +
> +       if (aconnector->dc_sink)
> +               subconnector = get_subconnector_type(link);
> +
> +       drm_object_property_set_value(&connector->base,
> +                       connector->dev->mode_config.dp_subconnector_property,
> +                       subconnector);
> +}
> +
>  /*
>   * initializes drm_device display related structures, based on the information
>   * provided by DAL. The drm strcutures are: drm_crtc, drm_connector,
> @@ -1917,7 +1953,6 @@ void amdgpu_dm_update_connector_after_detect(
>         if (aconnector->mst_mgr.mst_state == true)
>                 return;
>
> -
>         sink = aconnector->dc_link->local_sink;
>         if (sink)
>                 dc_sink_retain(sink);
> @@ -2038,6 +2073,8 @@ void amdgpu_dm_update_connector_after_detect(
>
>         mutex_unlock(&dev->mode_config.mutex);
>
> +       update_subconnector_property(aconnector);
> +
>         if (sink)
>                 dc_sink_release(sink);
>  }
> @@ -4518,6 +4555,8 @@ amdgpu_dm_connector_detect(struct drm_connector *connector, bool force)
>         else
>                 connected = (aconnector->base.force == DRM_FORCE_ON);
>
> +       update_subconnector_property(aconnector);
> +
>         return (connected ? connector_status_connected :
>                         connector_status_disconnected);
>  }
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
> index e8208df..dab81a6 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
> @@ -26,6 +26,7 @@
>  #include <linux/version.h>
>  #include <drm/drm_atomic_helper.h>
>  #include <drm/drm_dp_mst_helper.h>
> +#include <drm/drm_dp_helper.h>
>  #include "dm_services.h"
>  #include "amdgpu.h"
>  #include "amdgpu_dm.h"
> @@ -485,6 +486,8 @@ void amdgpu_dm_initialize_dp_connector(struct amdgpu_display_manager *dm,
>                 16,
>                 4,
>                 aconnector->connector_id);
> +
> +       drm_mode_add_dp_subconnector_property(&aconnector->base);
>  }
>
>  int dm_mst_get_pbn_divider(struct dc_link *link)
> --
> 2.7.4
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

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

* Re: [Intel-gfx] [PATCH 1/5] drm: report dp downstream port type as a subconnector property
  2020-04-01 13:03 ` Ville Syrjälä
@ 2020-04-03  7:01   ` Jeevan B
  0 siblings, 0 replies; 13+ messages in thread
From: Jeevan B @ 2020-04-03  7:01 UTC (permalink / raw)
  To: Ville Syrjälä; +Cc: intel-gfx

On 2020-04-01 at 16:03:46 +0300, Ville Syrjälä wrote:
> On Wed, Apr 01, 2020 at 05:42:24PM +0530, Jeevan B 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.
> > 
> > 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
> > 
> > v4:
> >  - Ville: add DP1.0 best assumption about subconnector
> >  - Ville: assume DVI is DVI-D
> >  - Ville: reuse Writeback enum value for Virtual subconnector
> >  - Renamed #defines: HDMI -> HDMIA, DP -> DisplayPort
> > 
> > [1]: https://bugs.freedesktop.org/show_bug.cgi?id=104097
> > 
> > Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
> > Signed-off-by: Oleg Vasilev <oleg.vasilev@intel.com>
> 
> Is this Oleg's patch? If so why did you change the patch author to be
> yourself?
>
it happened unintentionally i will update and resend the series to list  

Thanks
Jeevan B 
> > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > Cc: intel-gfx@lists.freedesktop.org
> > Signed-off-by: Jeevan B <jeevan.b@intel.com>
> > Link: https://patchwork.freedesktop.org/patch/msgid/20190829114854.1539-3-oleg.vasilev@intel.com
> > ---
> >  drivers/gpu/drm/drm_connector.c | 49 ++++++++++++++++++++++++--
> >  drivers/gpu/drm/drm_dp_helper.c | 77 +++++++++++++++++++++++++++++++++++++++++
> >  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     | 21 ++++++-----
> >  6 files changed, 154 insertions(+), 10 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
> > index b1099e1..b6972d1 100644
> > --- a/drivers/gpu/drm/drm_connector.c
> > +++ b/drivers/gpu/drm/drm_connector.c
> > @@ -844,7 +844,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  */
> >  };
> > @@ -861,7 +861,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 */
> > @@ -870,6 +870,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_DVID,	     "DVI-D"     }, /* DP */
> > +	{ DRM_MODE_SUBCONNECTOR_HDMIA,	     "HDMI"      }, /* DP */
> > +	{ DRM_MODE_SUBCONNECTOR_DisplayPort, "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" },
> > @@ -1186,6 +1199,14 @@ static const struct drm_prop_enum_list dp_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)
> > @@ -1275,6 +1296,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
> >   *
> >   * content type (HDMI specific):
> > diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c
> > index 8ba4531..5d5b50f 100644
> > --- a/drivers/gpu/drm/drm_dp_helper.c
> > +++ b/drivers/gpu/drm/drm_dp_helper.c
> > @@ -594,6 +594,83 @@ 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;
> > +	if (!drm_dp_is_branch(dpcd))
> > +		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;
> > +
> > +		switch (type) {
> > +		case DP_DWN_STRM_PORT_TYPE_TMDS:
> > +			/* Can be HDMI or DVI-D, DVI-D is a safer option */
> > +			return DRM_MODE_SUBCONNECTOR_DVID;
> > +		case DP_DWN_STRM_PORT_TYPE_ANALOG:
> > +			/* Can be VGA or DVI-A, VGA is more popular */
> > +			return DRM_MODE_SUBCONNECTOR_VGA;
> > +		case DP_DWN_STRM_PORT_TYPE_DP:
> > +			return DRM_MODE_SUBCONNECTOR_DisplayPort;
> > +		case DP_DWN_STRM_PORT_TYPE_OTHER:
> > +		default:
> > +			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_DisplayPort;
> > +	case DP_DS_PORT_TYPE_VGA:
> > +		return DRM_MODE_SUBCONNECTOR_VGA;
> > +	case DP_DS_PORT_TYPE_DVI:
> > +		return DRM_MODE_SUBCONNECTOR_DVID;
> > +	case DP_DS_PORT_TYPE_HDMI:
> > +		return DRM_MODE_SUBCONNECTOR_HDMIA;
> > +	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 fd543d1..82797c8 100644
> > --- a/include/drm/drm_connector.h
> > +++ b/include/drm/drm_connector.h
> > @@ -1556,10 +1556,13 @@ 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);
> >  const char *drm_get_hdcp_content_type_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 305533d..6408b31 100644
> > --- a/include/drm/drm_dp_helper.h
> > +++ b/include/drm/drm_dp_helper.h
> > @@ -26,6 +26,7 @@
> >  #include <linux/delay.h>
> >  #include <linux/i2c.h>
> >  #include <linux/types.h>
> > +#include <drm/drm_connector.h>
> >  
> >  /*
> >   * Unless otherwise noted, all values are from the DP 1.1a spec.  Note that
> > @@ -1599,6 +1600,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_remote_aux_init(struct drm_dp_aux *aux);
> >  void drm_dp_aux_init(struct drm_dp_aux *aux);
> > diff --git a/include/drm/drm_mode_config.h b/include/drm/drm_mode_config.h
> > index 6c3ef49..085fb00 100644
> > --- a/include/drm/drm_mode_config.h
> > +++ b/include/drm/drm_mode_config.h
> > @@ -681,6 +681,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 735c8cf..3358c6b 100644
> > --- a/include/uapi/drm/drm_mode.h
> > +++ b/include/uapi/drm/drm_mode.h
> > @@ -332,14 +332,19 @@ 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_DVID	  = 3,  /* DVI-I      DP */
> > +	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_DisplayPort = 10, /*            DP */
> > +	DRM_MODE_SUBCONNECTOR_HDMIA       = 11, /*            DP */
> > +	DRM_MODE_SUBCONNECTOR_Native      = 15, /*            DP */
> > +	DRM_MODE_SUBCONNECTOR_Wireless    = 18, /*            DP */
> >  };
> >  
> >  #define DRM_MODE_CONNECTOR_Unknown	0
> > -- 
> > 2.7.4
> 
> -- 
> Ville Syrjälä
> Intel
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

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

* [PATCH 5/5] drm/amdgpu: utilize subconnector property for DP through DisplayManager
  2020-04-24 12:50 [PATCH 1/5] drm: report dp downstream port type as a subconnector property Jeevan B
@ 2020-04-24 12:50   ` Jeevan B
  0 siblings, 0 replies; 13+ messages in thread
From: Jeevan B @ 2020-04-24 12:50 UTC (permalink / raw)
  To: dri-devel, intel-gfx
  Cc: jani.nikula, Oleg Vasilev, amd-gfx, Jeevan B, uma.shankar,
	Alex Deucher, Christian König

From: Oleg Vasilev <oleg.vasilev@intel.com>

Since DP-specific information is stored in driver's structures, every
driver needs to implement subconnector property by itself. Display
Core already has the subconnector information, we only need to
expose it through DRM property.

v2:rebase

v3: renamed a function call

Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: Christian König <christian.koenig@amd.com>
Cc: David (ChunMing) Zhou <David1.Zhou@amd.com>
Cc: amd-gfx@lists.freedesktop.org
Signed-off-by: Jeevan B <jeevan.b@intel.com>
Signed-off-by: Oleg Vasilev <oleg.vasilev@intel.com>
Tested-by: Oleg Vasilev <oleg.vasilev@intel.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c  | 41 +++++++++++++++++++++-
 .../amd/display/amdgpu_dm/amdgpu_dm_mst_types.c    |  3 ++
 2 files changed, 43 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index f7c5cdc..16bdd20 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -121,6 +121,42 @@ MODULE_FIRMWARE(FIRMWARE_NAVI12_DMCU);
 static int amdgpu_dm_init(struct amdgpu_device *adev);
 static void amdgpu_dm_fini(struct amdgpu_device *adev);
 
+static enum drm_mode_subconnector get_subconnector_type(struct dc_link *link)
+{
+	switch (link->dpcd_caps.dongle_type) {
+	case DISPLAY_DONGLE_NONE:
+		return DRM_MODE_SUBCONNECTOR_Native;
+	case DISPLAY_DONGLE_DP_VGA_CONVERTER:
+		return DRM_MODE_SUBCONNECTOR_VGA;
+	case DISPLAY_DONGLE_DP_DVI_CONVERTER:
+	case DISPLAY_DONGLE_DP_DVI_DONGLE:
+		return DRM_MODE_SUBCONNECTOR_DVID;
+	case DISPLAY_DONGLE_DP_HDMI_CONVERTER:
+	case DISPLAY_DONGLE_DP_HDMI_DONGLE:
+		return DRM_MODE_SUBCONNECTOR_HDMIA;
+	case DISPLAY_DONGLE_DP_HDMI_MISMATCHED_DONGLE:
+	default:
+		return DRM_MODE_SUBCONNECTOR_Unknown;
+	}
+}
+
+static void update_subconnector_property(struct amdgpu_dm_connector *aconnector)
+{
+	struct dc_link *link = aconnector->dc_link;
+	struct drm_connector *connector = &aconnector->base;
+	enum drm_mode_subconnector subconnector = DRM_MODE_SUBCONNECTOR_Unknown;
+
+	if (connector->connector_type != DRM_MODE_CONNECTOR_DisplayPort)
+		return;
+
+	if (aconnector->dc_sink)
+		subconnector = get_subconnector_type(link);
+
+	drm_object_property_set_value(&connector->base,
+			connector->dev->mode_config.dp_subconnector_property,
+			subconnector);
+}
+
 /*
  * initializes drm_device display related structures, based on the information
  * provided by DAL. The drm strcutures are: drm_crtc, drm_connector,
@@ -1917,7 +1953,6 @@ void amdgpu_dm_update_connector_after_detect(
 	if (aconnector->mst_mgr.mst_state == true)
 		return;
 
-
 	sink = aconnector->dc_link->local_sink;
 	if (sink)
 		dc_sink_retain(sink);
@@ -2038,6 +2073,8 @@ void amdgpu_dm_update_connector_after_detect(
 
 	mutex_unlock(&dev->mode_config.mutex);
 
+	update_subconnector_property(aconnector);
+
 	if (sink)
 		dc_sink_release(sink);
 }
@@ -4521,6 +4558,8 @@ amdgpu_dm_connector_detect(struct drm_connector *connector, bool force)
 	else
 		connected = (aconnector->base.force == DRM_FORCE_ON);
 
+	update_subconnector_property(aconnector);
+
 	return (connected ? connector_status_connected :
 			connector_status_disconnected);
 }
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
index 3db1ec3..6a2562d 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
@@ -26,6 +26,7 @@
 #include <linux/version.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_dp_mst_helper.h>
+#include <drm/drm_dp_helper.h>
 #include "dm_services.h"
 #include "amdgpu.h"
 #include "amdgpu_dm.h"
@@ -472,6 +473,8 @@ void amdgpu_dm_initialize_dp_connector(struct amdgpu_display_manager *dm,
 		16,
 		4,
 		aconnector->connector_id);
+
+	drm_connector_attach_dp_subconnector_property(&aconnector->base);
 }
 
 int dm_mst_get_pbn_divider(struct dc_link *link)
-- 
2.7.4

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

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

* [PATCH 5/5] drm/amdgpu: utilize subconnector property for DP through DisplayManager
@ 2020-04-24 12:50   ` Jeevan B
  0 siblings, 0 replies; 13+ messages in thread
From: Jeevan B @ 2020-04-24 12:50 UTC (permalink / raw)
  To: dri-devel, intel-gfx
  Cc: David Zhou, jani.nikula, Oleg Vasilev, amd-gfx, Jeevan B,
	uma.shankar, Alex Deucher, Christian König

From: Oleg Vasilev <oleg.vasilev@intel.com>

Since DP-specific information is stored in driver's structures, every
driver needs to implement subconnector property by itself. Display
Core already has the subconnector information, we only need to
expose it through DRM property.

v2:rebase

v3: renamed a function call

Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: Christian König <christian.koenig@amd.com>
Cc: David (ChunMing) Zhou <David1.Zhou@amd.com>
Cc: amd-gfx@lists.freedesktop.org
Signed-off-by: Jeevan B <jeevan.b@intel.com>
Signed-off-by: Oleg Vasilev <oleg.vasilev@intel.com>
Tested-by: Oleg Vasilev <oleg.vasilev@intel.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c  | 41 +++++++++++++++++++++-
 .../amd/display/amdgpu_dm/amdgpu_dm_mst_types.c    |  3 ++
 2 files changed, 43 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index f7c5cdc..16bdd20 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -121,6 +121,42 @@ MODULE_FIRMWARE(FIRMWARE_NAVI12_DMCU);
 static int amdgpu_dm_init(struct amdgpu_device *adev);
 static void amdgpu_dm_fini(struct amdgpu_device *adev);
 
+static enum drm_mode_subconnector get_subconnector_type(struct dc_link *link)
+{
+	switch (link->dpcd_caps.dongle_type) {
+	case DISPLAY_DONGLE_NONE:
+		return DRM_MODE_SUBCONNECTOR_Native;
+	case DISPLAY_DONGLE_DP_VGA_CONVERTER:
+		return DRM_MODE_SUBCONNECTOR_VGA;
+	case DISPLAY_DONGLE_DP_DVI_CONVERTER:
+	case DISPLAY_DONGLE_DP_DVI_DONGLE:
+		return DRM_MODE_SUBCONNECTOR_DVID;
+	case DISPLAY_DONGLE_DP_HDMI_CONVERTER:
+	case DISPLAY_DONGLE_DP_HDMI_DONGLE:
+		return DRM_MODE_SUBCONNECTOR_HDMIA;
+	case DISPLAY_DONGLE_DP_HDMI_MISMATCHED_DONGLE:
+	default:
+		return DRM_MODE_SUBCONNECTOR_Unknown;
+	}
+}
+
+static void update_subconnector_property(struct amdgpu_dm_connector *aconnector)
+{
+	struct dc_link *link = aconnector->dc_link;
+	struct drm_connector *connector = &aconnector->base;
+	enum drm_mode_subconnector subconnector = DRM_MODE_SUBCONNECTOR_Unknown;
+
+	if (connector->connector_type != DRM_MODE_CONNECTOR_DisplayPort)
+		return;
+
+	if (aconnector->dc_sink)
+		subconnector = get_subconnector_type(link);
+
+	drm_object_property_set_value(&connector->base,
+			connector->dev->mode_config.dp_subconnector_property,
+			subconnector);
+}
+
 /*
  * initializes drm_device display related structures, based on the information
  * provided by DAL. The drm strcutures are: drm_crtc, drm_connector,
@@ -1917,7 +1953,6 @@ void amdgpu_dm_update_connector_after_detect(
 	if (aconnector->mst_mgr.mst_state == true)
 		return;
 
-
 	sink = aconnector->dc_link->local_sink;
 	if (sink)
 		dc_sink_retain(sink);
@@ -2038,6 +2073,8 @@ void amdgpu_dm_update_connector_after_detect(
 
 	mutex_unlock(&dev->mode_config.mutex);
 
+	update_subconnector_property(aconnector);
+
 	if (sink)
 		dc_sink_release(sink);
 }
@@ -4521,6 +4558,8 @@ amdgpu_dm_connector_detect(struct drm_connector *connector, bool force)
 	else
 		connected = (aconnector->base.force == DRM_FORCE_ON);
 
+	update_subconnector_property(aconnector);
+
 	return (connected ? connector_status_connected :
 			connector_status_disconnected);
 }
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
index 3db1ec3..6a2562d 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
@@ -26,6 +26,7 @@
 #include <linux/version.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_dp_mst_helper.h>
+#include <drm/drm_dp_helper.h>
 #include "dm_services.h"
 #include "amdgpu.h"
 #include "amdgpu_dm.h"
@@ -472,6 +473,8 @@ void amdgpu_dm_initialize_dp_connector(struct amdgpu_display_manager *dm,
 		16,
 		4,
 		aconnector->connector_id);
+
+	drm_connector_attach_dp_subconnector_property(&aconnector->base);
 }
 
 int dm_mst_get_pbn_divider(struct dc_link *link)
-- 
2.7.4

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

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

* [PATCH 5/5] drm/amdgpu: utilize subconnector property for DP through DisplayManager
  2020-04-07  6:50 Jeevan B
@ 2020-04-07  6:50   ` Jeevan B
  0 siblings, 0 replies; 13+ messages in thread
From: Jeevan B @ 2020-04-07  6:50 UTC (permalink / raw)
  To: dri-devel, intel-gfx
  Cc: jani.nikula, Oleg Vasilev, amd-gfx, Jeevan B, uma.shankar,
	Alex Deucher, Christian König

From: Oleg Vasilev <oleg.vasilev@intel.com>

Since DP-specific information is stored in driver's structures, every
driver needs to implement subconnector property by itself. Display
Core already has the subconnector information, we only need to
expose it through DRM property.

v2:rebase

Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: Christian König <christian.koenig@amd.com>
Cc: David (ChunMing) Zhou <David1.Zhou@amd.com>
Cc: amd-gfx@lists.freedesktop.org
Signed-off-by: Jeevan B <jeevan.b@intel.com>
Signed-off-by: Oleg Vasilev <oleg.vasilev@intel.com>
Tested-by: Oleg Vasilev <oleg.vasilev@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190829114854.1539-7-oleg.vasilev@intel.com
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c  | 41 +++++++++++++++++++++-
 .../amd/display/amdgpu_dm/amdgpu_dm_mst_types.c    |  3 ++
 2 files changed, 43 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index d3674d8..91c0ef2 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -121,6 +121,42 @@ MODULE_FIRMWARE(FIRMWARE_NAVI12_DMCU);
 static int amdgpu_dm_init(struct amdgpu_device *adev);
 static void amdgpu_dm_fini(struct amdgpu_device *adev);
 
+static enum drm_mode_subconnector get_subconnector_type(struct dc_link *link)
+{
+	switch (link->dpcd_caps.dongle_type) {
+	case DISPLAY_DONGLE_NONE:
+		return DRM_MODE_SUBCONNECTOR_Native;
+	case DISPLAY_DONGLE_DP_VGA_CONVERTER:
+		return DRM_MODE_SUBCONNECTOR_VGA;
+	case DISPLAY_DONGLE_DP_DVI_CONVERTER:
+	case DISPLAY_DONGLE_DP_DVI_DONGLE:
+		return DRM_MODE_SUBCONNECTOR_DVID;
+	case DISPLAY_DONGLE_DP_HDMI_CONVERTER:
+	case DISPLAY_DONGLE_DP_HDMI_DONGLE:
+		return DRM_MODE_SUBCONNECTOR_HDMIA;
+	case DISPLAY_DONGLE_DP_HDMI_MISMATCHED_DONGLE:
+	default:
+		return DRM_MODE_SUBCONNECTOR_Unknown;
+	}
+}
+
+static void update_subconnector_property(struct amdgpu_dm_connector *aconnector)
+{
+	struct dc_link *link = aconnector->dc_link;
+	struct drm_connector *connector = &aconnector->base;
+	enum drm_mode_subconnector subconnector = DRM_MODE_SUBCONNECTOR_Unknown;
+
+	if (connector->connector_type != DRM_MODE_CONNECTOR_DisplayPort)
+		return;
+
+	if (aconnector->dc_sink)
+		subconnector = get_subconnector_type(link);
+
+	drm_object_property_set_value(&connector->base,
+			connector->dev->mode_config.dp_subconnector_property,
+			subconnector);
+}
+
 /*
  * initializes drm_device display related structures, based on the information
  * provided by DAL. The drm strcutures are: drm_crtc, drm_connector,
@@ -1917,7 +1953,6 @@ void amdgpu_dm_update_connector_after_detect(
 	if (aconnector->mst_mgr.mst_state == true)
 		return;
 
-
 	sink = aconnector->dc_link->local_sink;
 	if (sink)
 		dc_sink_retain(sink);
@@ -2038,6 +2073,8 @@ void amdgpu_dm_update_connector_after_detect(
 
 	mutex_unlock(&dev->mode_config.mutex);
 
+	update_subconnector_property(aconnector);
+
 	if (sink)
 		dc_sink_release(sink);
 }
@@ -4518,6 +4555,8 @@ amdgpu_dm_connector_detect(struct drm_connector *connector, bool force)
 	else
 		connected = (aconnector->base.force == DRM_FORCE_ON);
 
+	update_subconnector_property(aconnector);
+
 	return (connected ? connector_status_connected :
 			connector_status_disconnected);
 }
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
index d56b758..267c82c 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
@@ -26,6 +26,7 @@
 #include <linux/version.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_dp_mst_helper.h>
+#include <drm/drm_dp_helper.h>
 #include "dm_services.h"
 #include "amdgpu.h"
 #include "amdgpu_dm.h"
@@ -464,6 +465,8 @@ void amdgpu_dm_initialize_dp_connector(struct amdgpu_display_manager *dm,
 		16,
 		4,
 		aconnector->connector_id);
+
+	drm_mode_add_dp_subconnector_property(&aconnector->base);
 }
 
 int dm_mst_get_pbn_divider(struct dc_link *link)
-- 
2.7.4

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

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

* [PATCH 5/5] drm/amdgpu: utilize subconnector property for DP through DisplayManager
@ 2020-04-07  6:50   ` Jeevan B
  0 siblings, 0 replies; 13+ messages in thread
From: Jeevan B @ 2020-04-07  6:50 UTC (permalink / raw)
  To: dri-devel, intel-gfx
  Cc: David Zhou, jani.nikula, Oleg Vasilev, amd-gfx, Jeevan B,
	uma.shankar, Alex Deucher, Christian König, ville.syrjala

From: Oleg Vasilev <oleg.vasilev@intel.com>

Since DP-specific information is stored in driver's structures, every
driver needs to implement subconnector property by itself. Display
Core already has the subconnector information, we only need to
expose it through DRM property.

v2:rebase

Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: Christian König <christian.koenig@amd.com>
Cc: David (ChunMing) Zhou <David1.Zhou@amd.com>
Cc: amd-gfx@lists.freedesktop.org
Signed-off-by: Jeevan B <jeevan.b@intel.com>
Signed-off-by: Oleg Vasilev <oleg.vasilev@intel.com>
Tested-by: Oleg Vasilev <oleg.vasilev@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190829114854.1539-7-oleg.vasilev@intel.com
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c  | 41 +++++++++++++++++++++-
 .../amd/display/amdgpu_dm/amdgpu_dm_mst_types.c    |  3 ++
 2 files changed, 43 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index d3674d8..91c0ef2 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -121,6 +121,42 @@ MODULE_FIRMWARE(FIRMWARE_NAVI12_DMCU);
 static int amdgpu_dm_init(struct amdgpu_device *adev);
 static void amdgpu_dm_fini(struct amdgpu_device *adev);
 
+static enum drm_mode_subconnector get_subconnector_type(struct dc_link *link)
+{
+	switch (link->dpcd_caps.dongle_type) {
+	case DISPLAY_DONGLE_NONE:
+		return DRM_MODE_SUBCONNECTOR_Native;
+	case DISPLAY_DONGLE_DP_VGA_CONVERTER:
+		return DRM_MODE_SUBCONNECTOR_VGA;
+	case DISPLAY_DONGLE_DP_DVI_CONVERTER:
+	case DISPLAY_DONGLE_DP_DVI_DONGLE:
+		return DRM_MODE_SUBCONNECTOR_DVID;
+	case DISPLAY_DONGLE_DP_HDMI_CONVERTER:
+	case DISPLAY_DONGLE_DP_HDMI_DONGLE:
+		return DRM_MODE_SUBCONNECTOR_HDMIA;
+	case DISPLAY_DONGLE_DP_HDMI_MISMATCHED_DONGLE:
+	default:
+		return DRM_MODE_SUBCONNECTOR_Unknown;
+	}
+}
+
+static void update_subconnector_property(struct amdgpu_dm_connector *aconnector)
+{
+	struct dc_link *link = aconnector->dc_link;
+	struct drm_connector *connector = &aconnector->base;
+	enum drm_mode_subconnector subconnector = DRM_MODE_SUBCONNECTOR_Unknown;
+
+	if (connector->connector_type != DRM_MODE_CONNECTOR_DisplayPort)
+		return;
+
+	if (aconnector->dc_sink)
+		subconnector = get_subconnector_type(link);
+
+	drm_object_property_set_value(&connector->base,
+			connector->dev->mode_config.dp_subconnector_property,
+			subconnector);
+}
+
 /*
  * initializes drm_device display related structures, based on the information
  * provided by DAL. The drm strcutures are: drm_crtc, drm_connector,
@@ -1917,7 +1953,6 @@ void amdgpu_dm_update_connector_after_detect(
 	if (aconnector->mst_mgr.mst_state == true)
 		return;
 
-
 	sink = aconnector->dc_link->local_sink;
 	if (sink)
 		dc_sink_retain(sink);
@@ -2038,6 +2073,8 @@ void amdgpu_dm_update_connector_after_detect(
 
 	mutex_unlock(&dev->mode_config.mutex);
 
+	update_subconnector_property(aconnector);
+
 	if (sink)
 		dc_sink_release(sink);
 }
@@ -4518,6 +4555,8 @@ amdgpu_dm_connector_detect(struct drm_connector *connector, bool force)
 	else
 		connected = (aconnector->base.force == DRM_FORCE_ON);
 
+	update_subconnector_property(aconnector);
+
 	return (connected ? connector_status_connected :
 			connector_status_disconnected);
 }
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
index d56b758..267c82c 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
@@ -26,6 +26,7 @@
 #include <linux/version.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_dp_mst_helper.h>
+#include <drm/drm_dp_helper.h>
 #include "dm_services.h"
 #include "amdgpu.h"
 #include "amdgpu_dm.h"
@@ -464,6 +465,8 @@ void amdgpu_dm_initialize_dp_connector(struct amdgpu_display_manager *dm,
 		16,
 		4,
 		aconnector->connector_id);
+
+	drm_mode_add_dp_subconnector_property(&aconnector->base);
 }
 
 int dm_mst_get_pbn_divider(struct dc_link *link)
-- 
2.7.4

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

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

end of thread, other threads:[~2020-04-24 12:54 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-01 12:12 [Intel-gfx] [PATCH 1/5] drm: report dp downstream port type as a subconnector property Jeevan B
2020-04-01 12:12 ` [Intel-gfx] [PATCH 2/5] drm/i915: utilize subconnector property for DP Jeevan B
     [not found] ` <1585743148-31205-1-git-send-email-jeevan.b-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2020-04-01 12:12   ` [PATCH 3/5] drm/nouveau: " Jeevan B
2020-04-01 12:12 ` [PATCH 5/5] drm/amdgpu: utilize subconnector property for DP through DisplayManager Jeevan B
2020-04-01 15:21   ` Alex Deucher
2020-04-01 12:26 ` [Intel-gfx] [PATCH 1/5] drm: report dp downstream port type as a subconnector property Shankar, Uma
2020-04-01 12:38   ` Shankar, Uma
2020-04-01 13:03 ` Ville Syrjälä
2020-04-03  7:01   ` Jeevan B
2020-04-07  6:50 Jeevan B
2020-04-07  6:50 ` [PATCH 5/5] drm/amdgpu: utilize subconnector property for DP through DisplayManager Jeevan B
2020-04-07  6:50   ` Jeevan B
2020-04-24 12:50 [PATCH 1/5] drm: report dp downstream port type as a subconnector property Jeevan B
2020-04-24 12:50 ` [PATCH 5/5] drm/amdgpu: utilize subconnector property for DP through DisplayManager Jeevan B
2020-04-24 12:50   ` Jeevan B

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.