All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/6] drm/i915/debugfs: Do not print cached information of a disconnected sink
@ 2018-10-10 21:35 José Roberto de Souza
  2018-10-10 21:35 ` [PATCH 2/6] drm/i915/icl: Set TC type to unknown in the disconnection flow José Roberto de Souza
                   ` (7 more replies)
  0 siblings, 8 replies; 15+ messages in thread
From: José Roberto de Souza @ 2018-10-10 21:35 UTC (permalink / raw)
  To: intel-gfx

Besides of give the expected output of i915_display_info it will also
avoid some aux ch transactions that would timeout by obvious reasons.

Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
---
 drivers/gpu/drm/i915/i915_debugfs.c | 21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index 00c551d3e409..89dd60dc7b00 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -3065,16 +3065,17 @@ static void intel_connector_info(struct seq_file *m,
 	seq_printf(m, "connector %d: type %s, status: %s\n",
 		   connector->base.id, connector->name,
 		   drm_get_connector_status_name(connector->status));
-	if (connector->status == connector_status_connected) {
-		seq_printf(m, "\tname: %s\n", connector->display_info.name);
-		seq_printf(m, "\tphysical dimensions: %dx%dmm\n",
-			   connector->display_info.width_mm,
-			   connector->display_info.height_mm);
-		seq_printf(m, "\tsubpixel order: %s\n",
-			   drm_get_subpixel_order_name(connector->display_info.subpixel_order));
-		seq_printf(m, "\tCEA rev: %d\n",
-			   connector->display_info.cea_rev);
-	}
+
+	if (connector->status == connector_status_disconnected)
+		return;
+
+	seq_printf(m, "\tname: %s\n", connector->display_info.name);
+	seq_printf(m, "\tphysical dimensions: %dx%dmm\n",
+		   connector->display_info.width_mm,
+		   connector->display_info.height_mm);
+	seq_printf(m, "\tsubpixel order: %s\n",
+		   drm_get_subpixel_order_name(connector->display_info.subpixel_order));
+	seq_printf(m, "\tCEA rev: %d\n", connector->display_info.cea_rev);
 
 	if (!intel_encoder)
 		return;
-- 
2.19.1

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

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

* [PATCH 2/6] drm/i915/icl: Set TC type to unknown in the disconnection flow
  2018-10-10 21:35 [PATCH 1/6] drm/i915/debugfs: Do not print cached information of a disconnected sink José Roberto de Souza
@ 2018-10-10 21:35 ` José Roberto de Souza
  2018-10-10 21:35 ` [PATCH 3/6] drm/i915/icl: Set TC type to unknown when a sudden disconnection happen José Roberto de Souza
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 15+ messages in thread
From: José Roberto de Souza @ 2018-10-10 21:35 UTC (permalink / raw)
  To: intel-gfx; +Cc: Paulo Zanoni

Otherwise it would be in a inconsistent state as port is disconnected
but with a valid tc type.

Also setting it to unknown will earlier return
icl_tc_phy_disconnect() for any future calls to
intel_digital_port_connected(), this way we don't need to check if
port is marked as safe everytime.

Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
---
 drivers/gpu/drm/i915/intel_dp.c | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 13ff89be6ad6..d3f31103b8ec 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -4934,21 +4934,24 @@ static void icl_tc_phy_disconnect(struct drm_i915_private *dev_priv,
 				  struct intel_digital_port *dig_port)
 {
 	enum tc_port tc_port = intel_port_to_tc(dev_priv, dig_port->base.port);
-	u32 val;
 
-	if (dig_port->tc_type != TC_PORT_LEGACY &&
-	    dig_port->tc_type != TC_PORT_TYPEC)
+	if (dig_port->tc_type == TC_PORT_UNKNOWN)
 		return;
 
 	/*
-	 * This function may be called many times in a row without an HPD event
-	 * in between, so try to avoid the write when we can.
+	 * TBT disconnection flow is read the live status, what was done in
+	 * caller.
 	 */
-	val = I915_READ(PORT_TX_DFLEXDPCSSS);
-	if (val & DP_PHY_MODE_STATUS_NOT_SAFE(tc_port)) {
+	if (dig_port->tc_type == TC_PORT_TYPEC ||
+	    dig_port->tc_type == TC_PORT_LEGACY) {
+		u32 val;
+
+		val = I915_READ(PORT_TX_DFLEXDPCSSS);
 		val &= ~DP_PHY_MODE_STATUS_NOT_SAFE(tc_port);
 		I915_WRITE(PORT_TX_DFLEXDPCSSS, val);
 	}
+
+	dig_port->tc_type = TC_PORT_UNKNOWN;
 }
 
 /*
-- 
2.19.1

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

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

* [PATCH 3/6] drm/i915/icl: Set TC type to unknown when a sudden disconnection happen
  2018-10-10 21:35 [PATCH 1/6] drm/i915/debugfs: Do not print cached information of a disconnected sink José Roberto de Souza
  2018-10-10 21:35 ` [PATCH 2/6] drm/i915/icl: Set TC type to unknown in the disconnection flow José Roberto de Souza
@ 2018-10-10 21:35 ` José Roberto de Souza
  2018-10-30 17:51   ` Ville Syrjälä
  2018-10-10 21:35 ` [PATCH 4/6] drm/i915: Initialize panel_vdd_work only for eDP ports José Roberto de Souza
                   ` (5 subsequent siblings)
  7 siblings, 1 reply; 15+ messages in thread
From: José Roberto de Souza @ 2018-10-10 21:35 UTC (permalink / raw)
  To: intel-gfx; +Cc: Paulo Zanoni

Otherwise it would be in a inconsistent state as port is disconnected
but with a valid tc type.

Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
---
 drivers/gpu/drm/i915/intel_dp.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index d3f31103b8ec..d3af6aa1959a 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -4863,6 +4863,9 @@ static void icl_update_tc_port_type(struct drm_i915_private *dev_priv,
 			      type_str);
 }
 
+static void icl_tc_phy_disconnect(struct drm_i915_private *dev_priv,
+				  struct intel_digital_port *dig_port);
+
 /*
  * This function implements the first part of the Connect Flow described by our
  * specification, Gen11 TypeC Programming chapter. The rest of the flow (reading
@@ -4917,9 +4920,7 @@ static bool icl_tc_phy_connect(struct drm_i915_private *dev_priv,
 	if (dig_port->tc_type == TC_PORT_TYPEC &&
 	    !(I915_READ(PORT_TX_DFLEXDPSP) & TC_LIVE_STATE_TC(tc_port))) {
 		DRM_DEBUG_KMS("TC PHY %d sudden disconnect.\n", tc_port);
-		val = I915_READ(PORT_TX_DFLEXDPCSSS);
-		val &= ~DP_PHY_MODE_STATUS_NOT_SAFE(tc_port);
-		I915_WRITE(PORT_TX_DFLEXDPCSSS, val);
+		icl_tc_phy_disconnect(dev_priv, dig_port);
 		return false;
 	}
 
-- 
2.19.1

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

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

* [PATCH 4/6] drm/i915: Initialize panel_vdd_work only for eDP ports
  2018-10-10 21:35 [PATCH 1/6] drm/i915/debugfs: Do not print cached information of a disconnected sink José Roberto de Souza
  2018-10-10 21:35 ` [PATCH 2/6] drm/i915/icl: Set TC type to unknown in the disconnection flow José Roberto de Souza
  2018-10-10 21:35 ` [PATCH 3/6] drm/i915/icl: Set TC type to unknown when a sudden disconnection happen José Roberto de Souza
@ 2018-10-10 21:35 ` José Roberto de Souza
  2018-10-30 17:51   ` Ville Syrjälä
  2018-10-10 21:35 ` [PATCH 5/6] drm/i915/icl: Delay hotplug processing for tc ports José Roberto de Souza
                   ` (4 subsequent siblings)
  7 siblings, 1 reply; 15+ messages in thread
From: José Roberto de Souza @ 2018-10-10 21:35 UTC (permalink / raw)
  To: intel-gfx

It is only used by eDP ports so no need to initialize it for each DP
port.

Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
---
 drivers/gpu/drm/i915/intel_dp.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index d3af6aa1959a..60e62a3c1e22 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -6418,6 +6418,8 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
 	if (!intel_dp_is_edp(intel_dp))
 		return true;
 
+	INIT_DELAYED_WORK(&intel_dp->panel_vdd_work, edp_panel_vdd_work);
+
 	/*
 	 * On IBX/CPT we may get here with LVDS already registered. Since the
 	 * driver uses the only internal power sequencer available for both
@@ -6624,9 +6626,6 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
 
 	intel_dp_aux_init(intel_dp);
 
-	INIT_DELAYED_WORK(&intel_dp->panel_vdd_work,
-			  edp_panel_vdd_work);
-
 	intel_connector_attach_encoder(intel_connector, intel_encoder);
 
 	if (HAS_DDI(dev_priv))
-- 
2.19.1

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

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

* [PATCH 5/6] drm/i915/icl: Delay hotplug processing for tc ports
  2018-10-10 21:35 [PATCH 1/6] drm/i915/debugfs: Do not print cached information of a disconnected sink José Roberto de Souza
                   ` (2 preceding siblings ...)
  2018-10-10 21:35 ` [PATCH 4/6] drm/i915: Initialize panel_vdd_work only for eDP ports José Roberto de Souza
@ 2018-10-10 21:35 ` José Roberto de Souza
  2018-10-30 17:52   ` Ville Syrjälä
  2018-10-10 21:35 ` [PATCH 6/6] drm/i915/icl: Fix crash when getting DPLL of a MST encoder in TC ports José Roberto de Souza
                   ` (3 subsequent siblings)
  7 siblings, 1 reply; 15+ messages in thread
From: José Roberto de Souza @ 2018-10-10 21:35 UTC (permalink / raw)
  To: intel-gfx; +Cc: Paulo Zanoni

Some USB type-C dongles requires some time to power on before being
able to process aux channel transactions.
It was not a problem for older gens because there was a bridge
between DP port and USB-C controller adding some delay but ICL
handles type-C native.

So here trying to do a aux channel transaction at each 150ms for up 5
times, before giving up.

Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
---
 drivers/gpu/drm/i915/i915_drv.h      |  1 +
 drivers/gpu/drm/i915/intel_dp.c      |  7 ++++
 drivers/gpu/drm/i915/intel_drv.h     |  6 ++-
 drivers/gpu/drm/i915/intel_hotplug.c | 58 ++++++++++++++++++++++++++++
 4 files changed, 71 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 3017ef037fed..b3f1fc865366 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2810,6 +2810,7 @@ enum hpd_pin intel_hpd_pin_default(struct drm_i915_private *dev_priv,
 				   enum port port);
 bool intel_hpd_disable(struct drm_i915_private *dev_priv, enum hpd_pin pin);
 void intel_hpd_enable(struct drm_i915_private *dev_priv, enum hpd_pin pin);
+void intel_hotplug_tc_wa_work(struct work_struct *__work);
 
 /* i915_irq.c */
 static inline void i915_queue_hangcheck(struct drm_i915_private *dev_priv)
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 60e62a3c1e22..b945385cd5bc 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -5289,6 +5289,7 @@ void intel_dp_encoder_destroy(struct drm_encoder *encoder)
 {
 	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
 	struct intel_dp *intel_dp = &intel_dig_port->dp;
+	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
 
 	intel_dp_mst_encoder_cleanup(intel_dig_port);
 	if (intel_dp_is_edp(intel_dp)) {
@@ -5305,6 +5306,8 @@ void intel_dp_encoder_destroy(struct drm_encoder *encoder)
 			unregister_reboot_notifier(&intel_dp->edp_notifier);
 			intel_dp->edp_notifier.notifier_call = NULL;
 		}
+	} else if (IS_ICELAKE(dev_priv)) {
+		cancel_delayed_work_sync(&intel_dp->tc_wa_work);
 	}
 
 	intel_dp_aux_fini(intel_dp);
@@ -6663,6 +6666,10 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
 		I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd);
 	}
 
+	if (IS_ICELAKE(dev_priv) && !intel_dp_is_edp(intel_dp))
+		INIT_DELAYED_WORK(&intel_dp->tc_wa_work,
+				  intel_hotplug_tc_wa_work);
+
 	return true;
 
 fail:
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 3dea7a1bda7f..174a54aa966a 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -1100,7 +1100,11 @@ struct intel_dp {
 	int panel_power_cycle_delay;
 	int backlight_on_delay;
 	int backlight_off_delay;
-	struct delayed_work panel_vdd_work;
+	union {
+		struct delayed_work panel_vdd_work;
+		struct delayed_work tc_wa_work;
+	};
+	u8 tc_wa_count;
 	bool want_panel_vdd;
 	unsigned long last_power_on;
 	unsigned long last_backlight_off;
diff --git a/drivers/gpu/drm/i915/intel_hotplug.c b/drivers/gpu/drm/i915/intel_hotplug.c
index 648a13c6043c..96546067f832 100644
--- a/drivers/gpu/drm/i915/intel_hotplug.c
+++ b/drivers/gpu/drm/i915/intel_hotplug.c
@@ -323,6 +323,45 @@ static void i915_digport_work_func(struct work_struct *work)
 	}
 }
 
+#define TC_WA_DELAY_MSEC 150
+#define TC_WA_TRIES 5
+
+void intel_hotplug_tc_wa_work(struct work_struct *__work)
+{
+	struct intel_dp *intel_dp = container_of(to_delayed_work(__work),
+						 struct intel_dp, tc_wa_work);
+	struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
+	struct intel_encoder *intel_encoder = &intel_dig_port->base;
+	struct intel_connector *intel_connector = intel_dp->attached_connector;
+	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
+	struct drm_device *dev = &dev_priv->drm;
+	u8 val;
+
+	if (!intel_port_is_tc(dev_priv, intel_encoder->port) ||
+	    !intel_digital_port_connected(intel_encoder))
+		return;
+
+	if (drm_dp_dpcd_read(&intel_dp->aux, DP_DPCD_REV, &val, 1) < 1) {
+		intel_dp->tc_wa_count++;
+
+		if (intel_dp->tc_wa_count < TC_WA_TRIES) {
+			unsigned long delay;
+
+			delay = msecs_to_jiffies(TC_WA_DELAY_MSEC);
+			schedule_delayed_work(&intel_dp->tc_wa_work, delay);
+		} else {
+			DRM_DEBUG_KMS("TC not responsive, giving up\n");
+		}
+	} else {
+		mutex_lock(&dev->mode_config.mutex);
+		val = intel_encoder->hotplug(intel_encoder, intel_connector);
+		mutex_unlock(&dev->mode_config.mutex);
+
+		if (val)
+			drm_kms_helper_hotplug_event(dev);
+	}
+}
+
 /*
  * Handle hotplug events outside the interrupt handler proper.
  */
@@ -361,6 +400,25 @@ static void i915_hotplug_work_func(struct work_struct *work)
 			DRM_DEBUG_KMS("Connector %s (pin %i) received hotplug event.\n",
 				      connector->name, intel_encoder->hpd_pin);
 
+			/*
+			 * TC WA: TC dongles takes some type to be
+			 * responsible
+			 */
+			if (IS_ICELAKE(dev_priv) &&
+			    intel_port_is_tc(dev_priv, intel_encoder->port) &&
+			    intel_digital_port_connected(intel_encoder)) {
+				struct intel_dp *intel_dp;
+				unsigned long delay;
+
+				intel_dp = enc_to_intel_dp(&intel_encoder->base);
+
+				intel_dp->tc_wa_count = 0;
+				delay = msecs_to_jiffies(TC_WA_DELAY_MSEC);
+				schedule_delayed_work(&intel_dp->tc_wa_work,
+						      delay);
+				continue;
+			}
+
 			changed |= intel_encoder->hotplug(intel_encoder,
 							  intel_connector);
 		}
-- 
2.19.1

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

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

* [PATCH 6/6] drm/i915/icl: Fix crash when getting DPLL of a MST encoder in TC ports
  2018-10-10 21:35 [PATCH 1/6] drm/i915/debugfs: Do not print cached information of a disconnected sink José Roberto de Souza
                   ` (3 preceding siblings ...)
  2018-10-10 21:35 ` [PATCH 5/6] drm/i915/icl: Delay hotplug processing for tc ports José Roberto de Souza
@ 2018-10-10 21:35 ` José Roberto de Souza
  2018-10-30 17:56   ` Ville Syrjälä
  2018-10-10 21:52 ` ✗ Fi.CI.SPARSE: warning for series starting with [1/6] drm/i915/debugfs: Do not print cached information of a disconnected sink Patchwork
                   ` (2 subsequent siblings)
  7 siblings, 1 reply; 15+ messages in thread
From: José Roberto de Souza @ 2018-10-10 21:35 UTC (permalink / raw)
  To: intel-gfx; +Cc: Paulo Zanoni

enc_to_dig_port() returns NULL for encoders of type
INTEL_OUTPUT_DP_MST causing the crash bellow:

[ 2832.836101] BUG: unable to handle kernel paging request at 00000000000012b8
[ 2832.843062] PGD 0 P4D 0
[ 2832.845610] Oops: 0000 [#1] SMP
[ 2832.848764] CPU: 2 PID: 3577 Comm: kworker/2:0 Tainted: G        W         4.19.0-rc7+ #491
[ 2832.857106] Hardware name: Intel Corporation Ice Lake Client Platform/IceLake U DDR4 SODIMM PD RVP TLC, BIOS ICLSFWR1.R00.2352.A01.1808281852 08/28/2018
[ 2832.870734] Workqueue: events output_poll_execute
[ 2832.875480] RIP: 0010:icl_get_dpll+0xa4/0x5d0 [i915]
[ 2832.880449] Code: e9 03 f3 48 ab 8b 6e 74 41 8b 8c 24 5c 03 00 00 85 ed 0f 88 3f 02 00 00 83 fd 01 0f 8e ad 01 00 00 83 fd 05 0f 8f 2d 02 00 00 <83> ba b8 12 00 00 02 48 8b 36 0f 84 39 02 00 00 44 8b be ec 89 00
[ 2832.899176] RSP: 0018:ffffc90001b57a78 EFLAGS: 00010293
[ 2832.904404] RAX: 0000000000000000 RBX: ffffc90001b57a94 RCX: 0000000000083d60
[ 2832.911536] RDX: 0000000000000000 RSI: ffff8804a8c0dc00 RDI: ffffc90001b57b18
[ 2832.918668] RBP: 0000000000000003 R08: ffff8804a8c1f990 R09: ffff8804a8c1f990
[ 2832.925797] R10: 0000000000000000 R11: ffff8804a8e99600 R12: ffff8804a7760000
[ 2832.932930] R13: ffff88049e94d000 R14: ffff88049e94d000 R15: 000000000000000e
[ 2832.940063] FS:  0000000000000000(0000) GS:ffff8804b0300000(0000) knlGS:0000000000000000
[ 2832.948147] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 2832.953893] CR2: 00000000000012b8 CR3: 0000000004a1d004 CR4: 0000000000760ee0
[ 2832.961027] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[ 2832.968155] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
[ 2832.975286] PKRU: 55555554
[ 2832.978003] Call Trace:
[ 2832.980496]  haswell_crtc_compute_clock+0x3d/0x68 [i915]
[ 2832.985841]  intel_crtc_atomic_check+0x61/0x340 [i915]
[ 2832.990987]  drm_atomic_helper_check_planes+0x130/0x1c0
[ 2832.996245]  intel_atomic_check+0x4d5/0x10f0 [i915]
[ 2833.001147]  drm_atomic_check_only+0x484/0x690
[ 2833.005629]  drm_atomic_commit+0x13/0x50
[ 2833.009564]  restore_fbdev_mode_atomic+0x1c9/0x1e0
[ 2833.014363]  drm_fb_helper_restore_fbdev_mode_unlocked+0x47/0x90
[ 2833.020368]  drm_fb_helper_set_par+0x29/0x50
[ 2833.024641]  drm_fb_helper_hotplug_event.part.33+0x92/0xb0
[ 2833.030130]  drm_kms_helper_hotplug_event+0x26/0x30
[ 2833.035013]  output_poll_execute+0x192/0x1b0
[ 2833.039293]  process_one_work+0x2a5/0x5f0
[ 2833.043315]  worker_thread+0x2d/0x3d0
[ 2833.046988]  ? rescuer_thread+0x340/0x340
[ 2833.051009]  kthread+0x112/0x130
[ 2833.054247]  ? kthread_create_worker_on_cpu+0x70/0x70
[ 2833.059307]  ret_from_fork+0x3a/0x50
[ 2833.062893] Modules linked in: i915 prime_numbers snd_hda_codec_realtek snd_hda_codec_generic asix snd_usb_audio snd_usbmidi_lib snd_seq_midi snd_seq_midi_event snd_rawmidi cdc_ether usbnet x86_pkg_temp_thermal xhci_pci xhci_hcd ucsi_acpi typec_ucsi typec efivarfs [last unloaded: prime_numbers]
[ 2833.088917] CR2: 00000000000012b8
[ 2833.092241] ---[ end trace 25f9fe3d47af2e75 ]---
[ 2833.096895] RIP: 0010:icl_get_dpll+0xa4/0x5d0 [i915]
[ 2833.101866] Code: e9 03 f3 48 ab 8b 6e 74 41 8b 8c 24 5c 03 00 00 85 ed 0f 88 3f 02 00 00 83 fd 01 0f 8e ad 01 00 00 83 fd 05 0f 8f 2d 02 00 00 <83> ba b8 12 00 00 02 48 8b 36 0f 84 39 02 00 00 44 8b be ec 89 00
[ 2833.120589] RSP: 0018:ffffc90001b57a78 EFLAGS: 00010293
[ 2833.125815] RAX: 0000000000000000 RBX: ffffc90001b57a94 RCX: 0000000000083d60
[ 2833.132946] RDX: 0000000000000000 RSI: ffff8804a8c0dc00 RDI: ffffc90001b57b18
[ 2833.140080] RBP: 0000000000000003 R08: ffff8804a8c1f990 R09: ffff8804a8c1f990
[ 2833.147213] R10: 0000000000000000 R11: ffff8804a8e99600 R12: ffff8804a7760000
[ 2833.154350] R13: ffff88049e94d000 R14: ffff88049e94d000 R15: 000000000000000e
[ 2833.161483] FS:  0000000000000000(0000) GS:ffff8804b0300000(0000) knlGS:0000000000000000
[ 2833.169565] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 2833.175313] CR2: 00000000000012b8 CR3: 0000000004a1d004 CR4: 0000000000760ee0
[ 2833.182449] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[ 2833.189578] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
[ 2833.196712] PKRU: 55555554

MST ports are allocated from struct intel_dp_mst_encoder not from
struct intel_digital_port as regular ports, so to get the TC type it
is necessary check the primary digital port of the mst encoder.

Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
---
 drivers/gpu/drm/i915/intel_dpll_mgr.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_dpll_mgr.c b/drivers/gpu/drm/i915/intel_dpll_mgr.c
index 874646357ad1..23a1bc17a3f9 100644
--- a/drivers/gpu/drm/i915/intel_dpll_mgr.c
+++ b/drivers/gpu/drm/i915/intel_dpll_mgr.c
@@ -2867,8 +2867,7 @@ static struct intel_shared_dpll *
 icl_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
 	     struct intel_encoder *encoder)
 {
-	struct intel_digital_port *intel_dig_port =
-			enc_to_dig_port(&encoder->base);
+	struct intel_digital_port *intel_dig_port;
 	struct intel_shared_dpll *pll;
 	struct intel_dpll_hw_state pll_state = {};
 	enum port port = encoder->port;
@@ -2888,6 +2887,15 @@ icl_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
 	case PORT_D:
 	case PORT_E:
 	case PORT_F:
+		if (encoder->type == INTEL_OUTPUT_DP_MST) {
+			struct intel_dp_mst_encoder *mst_encoder;
+
+			mst_encoder = enc_to_mst(&encoder->base);
+			intel_dig_port = mst_encoder->primary;
+		} else {
+			intel_dig_port = enc_to_dig_port(&encoder->base);
+		}
+
 		if (intel_dig_port->tc_type == TC_PORT_TBT) {
 			min = DPLL_ID_ICL_TBTPLL;
 			max = min;
-- 
2.19.1

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

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

* ✗ Fi.CI.SPARSE: warning for series starting with [1/6] drm/i915/debugfs: Do not print cached information of a disconnected sink
  2018-10-10 21:35 [PATCH 1/6] drm/i915/debugfs: Do not print cached information of a disconnected sink José Roberto de Souza
                   ` (4 preceding siblings ...)
  2018-10-10 21:35 ` [PATCH 6/6] drm/i915/icl: Fix crash when getting DPLL of a MST encoder in TC ports José Roberto de Souza
@ 2018-10-10 21:52 ` Patchwork
  2018-10-10 22:12 ` ✓ Fi.CI.BAT: success " Patchwork
  2018-10-11  7:54 ` ✓ Fi.CI.IGT: " Patchwork
  7 siblings, 0 replies; 15+ messages in thread
From: Patchwork @ 2018-10-10 21:52 UTC (permalink / raw)
  To: José Roberto de Souza; +Cc: intel-gfx

== Series Details ==

Series: series starting with [1/6] drm/i915/debugfs: Do not print cached information of a disconnected sink
URL   : https://patchwork.freedesktop.org/series/50827/
State : warning

== Summary ==

$ dim sparse origin/drm-tip
Sparse version: v0.5.2
Commit: drm/i915/debugfs: Do not print cached information of a disconnected sink
Okay!

Commit: drm/i915/icl: Set TC type to unknown in the disconnection flow
Okay!

Commit: drm/i915/icl: Set TC type to unknown when a sudden disconnection happen
Okay!

Commit: drm/i915: Initialize panel_vdd_work only for eDP ports
Okay!

Commit: drm/i915/icl: Delay hotplug processing for tc ports
-drivers/gpu/drm/i915/selftests/../i915_drv.h:3725:16: warning: expression using sizeof(void)
+drivers/gpu/drm/i915/selftests/../i915_drv.h:3726:16: warning: expression using sizeof(void)

Commit: drm/i915/icl: Fix crash when getting DPLL of a MST encoder in TC ports
Okay!

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

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

* ✓ Fi.CI.BAT: success for series starting with [1/6] drm/i915/debugfs: Do not print cached information of a disconnected sink
  2018-10-10 21:35 [PATCH 1/6] drm/i915/debugfs: Do not print cached information of a disconnected sink José Roberto de Souza
                   ` (5 preceding siblings ...)
  2018-10-10 21:52 ` ✗ Fi.CI.SPARSE: warning for series starting with [1/6] drm/i915/debugfs: Do not print cached information of a disconnected sink Patchwork
@ 2018-10-10 22:12 ` Patchwork
  2018-10-11  7:54 ` ✓ Fi.CI.IGT: " Patchwork
  7 siblings, 0 replies; 15+ messages in thread
From: Patchwork @ 2018-10-10 22:12 UTC (permalink / raw)
  To: José Roberto de Souza; +Cc: intel-gfx

== Series Details ==

Series: series starting with [1/6] drm/i915/debugfs: Do not print cached information of a disconnected sink
URL   : https://patchwork.freedesktop.org/series/50827/
State : success

== Summary ==

= CI Bug Log - changes from CI_DRM_4965 -> Patchwork_10417 =

== Summary - SUCCESS ==

  No regressions found.

  External URL: https://patchwork.freedesktop.org/api/1.0/series/50827/revisions/1/mbox/

== Known issues ==

  Here are the changes found in Patchwork_10417 that come from known issues:

  === IGT changes ===

    ==== Issues hit ====

    igt@gem_exec_suspend@basic-s3:
      fi-blb-e6850:       PASS -> INCOMPLETE (fdo#107718)

    igt@kms_pipe_crc_basic@read-crc-pipe-b:
      fi-byt-clapper:     PASS -> FAIL (fdo#107362)

    igt@kms_pipe_crc_basic@suspend-read-crc-pipe-b:
      fi-byt-clapper:     PASS -> FAIL (fdo#103191, fdo#107362)

    
    ==== Possible fixes ====

    igt@kms_frontbuffer_tracking@basic:
      fi-byt-clapper:     FAIL (fdo#103167) -> PASS

    
  fdo#103167 https://bugs.freedesktop.org/show_bug.cgi?id=103167
  fdo#103191 https://bugs.freedesktop.org/show_bug.cgi?id=103191
  fdo#107362 https://bugs.freedesktop.org/show_bug.cgi?id=107362
  fdo#107718 https://bugs.freedesktop.org/show_bug.cgi?id=107718


== Participating hosts (47 -> 40) ==

  Missing    (7): fi-ilk-m540 fi-hsw-4200u fi-byt-squawks fi-icl-u2 fi-bsw-cyan fi-ctg-p8600 fi-pnv-d510 


== Build changes ==

    * Linux: CI_DRM_4965 -> Patchwork_10417

  CI_DRM_4965: f71ab7ae77be14182f92d78b5a6a790fce761fc9 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGT_4673: 54cb1aeb4e50dea9f3abae632e317875d147c4ab @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
  Patchwork_10417: 89bbe839d82fe3df2f08ea022c3ca729e7fb451a @ git://anongit.freedesktop.org/gfx-ci/linux


== Linux commits ==

89bbe839d82f drm/i915/icl: Fix crash when getting DPLL of a MST encoder in TC ports
6839410e443f drm/i915/icl: Delay hotplug processing for tc ports
ec1e029c48bf drm/i915: Initialize panel_vdd_work only for eDP ports
fb0e11b9660a drm/i915/icl: Set TC type to unknown when a sudden disconnection happen
39ba94708d75 drm/i915/icl: Set TC type to unknown in the disconnection flow
c1271e6d3ea6 drm/i915/debugfs: Do not print cached information of a disconnected sink

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_10417/issues.html
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

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

* ✓ Fi.CI.IGT: success for series starting with [1/6] drm/i915/debugfs: Do not print cached information of a disconnected sink
  2018-10-10 21:35 [PATCH 1/6] drm/i915/debugfs: Do not print cached information of a disconnected sink José Roberto de Souza
                   ` (6 preceding siblings ...)
  2018-10-10 22:12 ` ✓ Fi.CI.BAT: success " Patchwork
@ 2018-10-11  7:54 ` Patchwork
  7 siblings, 0 replies; 15+ messages in thread
From: Patchwork @ 2018-10-11  7:54 UTC (permalink / raw)
  To: José Roberto de Souza; +Cc: intel-gfx

== Series Details ==

Series: series starting with [1/6] drm/i915/debugfs: Do not print cached information of a disconnected sink
URL   : https://patchwork.freedesktop.org/series/50827/
State : success

== Summary ==

= CI Bug Log - changes from CI_DRM_4965_full -> Patchwork_10417_full =

== Summary - WARNING ==

  Minor unknown changes coming with Patchwork_10417_full need to be verified
  manually.
  
  If you think the reported changes have nothing to do with the changes
  introduced in Patchwork_10417_full, please notify your bug team to allow them
  to document this new failure mode, which will reduce false positives in CI.

  

== Possible new issues ==

  Here are the unknown changes that may have been introduced in Patchwork_10417_full:

  === IGT changes ===

    ==== Warnings ====

    igt@perf_pmu@rc6:
      shard-kbl:          PASS -> SKIP

    
== Known issues ==

  Here are the changes found in Patchwork_10417_full that come from known issues:

  === IGT changes ===

    ==== Issues hit ====

    igt@kms_busy@extended-pageflip-modeset-hang-oldfb-render-c:
      shard-glk:          PASS -> DMESG-WARN (fdo#107956)
      shard-skl:          NOTRUN -> DMESG-WARN (fdo#107956)

    igt@kms_cursor_crc@cursor-128x128-dpms:
      shard-apl:          PASS -> FAIL (fdo#103232)

    igt@kms_cursor_crc@cursor-256x256-onscreen:
      shard-glk:          PASS -> FAIL (fdo#103232) +1

    igt@kms_fbcon_fbt@psr:
      shard-skl:          NOTRUN -> FAIL (fdo#107882)

    igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-mmap-cpu:
      shard-skl:          NOTRUN -> FAIL (fdo#103167) +1

    igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-pwrite:
      shard-apl:          PASS -> FAIL (fdo#103167) +1

    igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-draw-mmap-wc:
      shard-glk:          PASS -> FAIL (fdo#103167) +3

    igt@kms_frontbuffer_tracking@fbc-stridechange:
      shard-skl:          NOTRUN -> FAIL (fdo#105683)

    {igt@kms_plane_alpha_blend@pipe-c-alpha-opaque-fb}:
      shard-skl:          NOTRUN -> FAIL (fdo#108145) +1

    igt@kms_plane_multiple@atomic-pipe-c-tiling-y:
      shard-apl:          PASS -> FAIL (fdo#103166)

    igt@kms_vblank@pipe-b-wait-busy-hang:
      shard-kbl:          PASS -> DMESG-WARN (fdo#106107)

    igt@perf@blocking:
      shard-hsw:          PASS -> FAIL (fdo#102252)

    igt@perf_pmu@rc6-runtime-pm:
      shard-glk:          PASS -> FAIL (fdo#105010)
      shard-apl:          PASS -> FAIL (fdo#105010)

    igt@pm_rpm@cursor:
      shard-skl:          PASS -> INCOMPLETE (fdo#107807)

    
    ==== Possible fixes ====

    igt@gem_ctx_isolation@vecs0-s3:
      shard-skl:          INCOMPLETE (fdo#107773, fdo#104108) -> PASS

    igt@kms_busy@extended-modeset-hang-newfb-render-b:
      shard-kbl:          DMESG-WARN (fdo#107956) -> PASS

    igt@kms_cursor_crc@cursor-256x256-random:
      shard-apl:          FAIL (fdo#103232) -> PASS +1

    igt@kms_cursor_crc@cursor-64x64-dpms:
      shard-glk:          FAIL (fdo#103232) -> PASS +1

    igt@kms_cursor_legacy@cursora-vs-flipa-toggle:
      shard-glk:          DMESG-WARN (fdo#105763, fdo#106538) -> PASS

    igt@kms_draw_crc@draw-method-xrgb2101010-pwrite-xtiled:
      shard-skl:          FAIL (fdo#103184) -> PASS

    igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-mmap-gtt:
      shard-glk:          FAIL (fdo#103167) -> PASS +3

    igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-fullscreen:
      shard-apl:          FAIL (fdo#103167) -> PASS +1

    igt@kms_plane_multiple@atomic-pipe-b-tiling-y:
      shard-glk:          FAIL (fdo#103166) -> PASS +1

    igt@kms_plane_multiple@atomic-pipe-c-tiling-yf:
      shard-apl:          FAIL (fdo#103166) -> PASS +2

    igt@kms_setmode@basic:
      shard-kbl:          FAIL (fdo#99912) -> PASS

    igt@pm_rpm@pc8-residency:
      shard-skl:          INCOMPLETE (fdo#107807) -> SKIP

    
  {name}: This element is suppressed. This means it is ignored when computing
          the status of the difference (SUCCESS, WARNING, or FAILURE).

  fdo#102252 https://bugs.freedesktop.org/show_bug.cgi?id=102252
  fdo#103166 https://bugs.freedesktop.org/show_bug.cgi?id=103166
  fdo#103167 https://bugs.freedesktop.org/show_bug.cgi?id=103167
  fdo#103184 https://bugs.freedesktop.org/show_bug.cgi?id=103184
  fdo#103232 https://bugs.freedesktop.org/show_bug.cgi?id=103232
  fdo#104108 https://bugs.freedesktop.org/show_bug.cgi?id=104108
  fdo#105010 https://bugs.freedesktop.org/show_bug.cgi?id=105010
  fdo#105683 https://bugs.freedesktop.org/show_bug.cgi?id=105683
  fdo#105763 https://bugs.freedesktop.org/show_bug.cgi?id=105763
  fdo#106107 https://bugs.freedesktop.org/show_bug.cgi?id=106107
  fdo#106538 https://bugs.freedesktop.org/show_bug.cgi?id=106538
  fdo#107773 https://bugs.freedesktop.org/show_bug.cgi?id=107773
  fdo#107807 https://bugs.freedesktop.org/show_bug.cgi?id=107807
  fdo#107882 https://bugs.freedesktop.org/show_bug.cgi?id=107882
  fdo#107956 https://bugs.freedesktop.org/show_bug.cgi?id=107956
  fdo#108145 https://bugs.freedesktop.org/show_bug.cgi?id=108145
  fdo#99912 https://bugs.freedesktop.org/show_bug.cgi?id=99912


== Participating hosts (6 -> 6) ==

  No changes in participating hosts


== Build changes ==

    * Linux: CI_DRM_4965 -> Patchwork_10417

  CI_DRM_4965: f71ab7ae77be14182f92d78b5a6a790fce761fc9 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGT_4673: 54cb1aeb4e50dea9f3abae632e317875d147c4ab @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
  Patchwork_10417: 89bbe839d82fe3df2f08ea022c3ca729e7fb451a @ git://anongit.freedesktop.org/gfx-ci/linux
  piglit_4509: fdc5a4ca11124ab8413c7988896eec4c97336694 @ git://anongit.freedesktop.org/piglit

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_10417/shards.html
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

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

* Re: [PATCH 3/6] drm/i915/icl: Set TC type to unknown when a sudden disconnection happen
  2018-10-10 21:35 ` [PATCH 3/6] drm/i915/icl: Set TC type to unknown when a sudden disconnection happen José Roberto de Souza
@ 2018-10-30 17:51   ` Ville Syrjälä
  2018-10-30 20:42     ` Souza, Jose
  0 siblings, 1 reply; 15+ messages in thread
From: Ville Syrjälä @ 2018-10-30 17:51 UTC (permalink / raw)
  To: José Roberto de Souza; +Cc: intel-gfx, Paulo Zanoni

On Wed, Oct 10, 2018 at 02:35:05PM -0700, José Roberto de Souza wrote:
> Otherwise it would be in a inconsistent state as port is disconnected
> but with a valid tc type.
> 
> Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
> Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
> ---
>  drivers/gpu/drm/i915/intel_dp.c | 7 ++++---
>  1 file changed, 4 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
> index d3f31103b8ec..d3af6aa1959a 100644
> --- a/drivers/gpu/drm/i915/intel_dp.c
> +++ b/drivers/gpu/drm/i915/intel_dp.c
> @@ -4863,6 +4863,9 @@ static void icl_update_tc_port_type(struct drm_i915_private *dev_priv,
>  			      type_str);
>  }
>  
> +static void icl_tc_phy_disconnect(struct drm_i915_private *dev_priv,
> +				  struct intel_digital_port *dig_port);
> +
>  /*
>   * This function implements the first part of the Connect Flow described by our
>   * specification, Gen11 TypeC Programming chapter. The rest of the flow (reading
> @@ -4917,9 +4920,7 @@ static bool icl_tc_phy_connect(struct drm_i915_private *dev_priv,
>  	if (dig_port->tc_type == TC_PORT_TYPEC &&
>  	    !(I915_READ(PORT_TX_DFLEXDPSP) & TC_LIVE_STATE_TC(tc_port))) {
>  		DRM_DEBUG_KMS("TC PHY %d sudden disconnect.\n", tc_port);
> -		val = I915_READ(PORT_TX_DFLEXDPCSSS);
> -		val &= ~DP_PHY_MODE_STATUS_NOT_SAFE(tc_port);
> -		I915_WRITE(PORT_TX_DFLEXDPCSSS, val);
> +		icl_tc_phy_disconnect(dev_priv, dig_port);
>  		return false;
>  	}

Patches 1-3
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

But icl_tc_port_connected() still looks somewhat busted. If the
port changes from legacy|typec to tbt we won't configure the
safe mode knob correctly.

I think we want something like this:

+ if (!is_legacy && !is_typec)
+ 	icl_tc_phy_disconnect(dev_priv, intel_dig_port);
+ 
  if (!is_legacy && !is_typec && !is_tbt) {
- 	icl_tc_phy_disconnect(dev_priv, intel_dig_port);
  	return false;
  }

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

-- 
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] 15+ messages in thread

* Re: [PATCH 4/6] drm/i915: Initialize panel_vdd_work only for eDP ports
  2018-10-10 21:35 ` [PATCH 4/6] drm/i915: Initialize panel_vdd_work only for eDP ports José Roberto de Souza
@ 2018-10-30 17:51   ` Ville Syrjälä
  0 siblings, 0 replies; 15+ messages in thread
From: Ville Syrjälä @ 2018-10-30 17:51 UTC (permalink / raw)
  To: José Roberto de Souza; +Cc: intel-gfx

On Wed, Oct 10, 2018 at 02:35:06PM -0700, José Roberto de Souza wrote:
> It is only used by eDP ports so no need to initialize it for each DP
> port.
> 
> Signed-off-by: José Roberto de Souza <jose.souza@intel.com>

Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

> ---
>  drivers/gpu/drm/i915/intel_dp.c | 5 ++---
>  1 file changed, 2 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
> index d3af6aa1959a..60e62a3c1e22 100644
> --- a/drivers/gpu/drm/i915/intel_dp.c
> +++ b/drivers/gpu/drm/i915/intel_dp.c
> @@ -6418,6 +6418,8 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
>  	if (!intel_dp_is_edp(intel_dp))
>  		return true;
>  
> +	INIT_DELAYED_WORK(&intel_dp->panel_vdd_work, edp_panel_vdd_work);
> +
>  	/*
>  	 * On IBX/CPT we may get here with LVDS already registered. Since the
>  	 * driver uses the only internal power sequencer available for both
> @@ -6624,9 +6626,6 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
>  
>  	intel_dp_aux_init(intel_dp);
>  
> -	INIT_DELAYED_WORK(&intel_dp->panel_vdd_work,
> -			  edp_panel_vdd_work);
> -
>  	intel_connector_attach_encoder(intel_connector, intel_encoder);
>  
>  	if (HAS_DDI(dev_priv))
> -- 
> 2.19.1
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
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] 15+ messages in thread

* Re: [PATCH 5/6] drm/i915/icl: Delay hotplug processing for tc ports
  2018-10-10 21:35 ` [PATCH 5/6] drm/i915/icl: Delay hotplug processing for tc ports José Roberto de Souza
@ 2018-10-30 17:52   ` Ville Syrjälä
  2018-10-31  1:02     ` Souza, Jose
  0 siblings, 1 reply; 15+ messages in thread
From: Ville Syrjälä @ 2018-10-30 17:52 UTC (permalink / raw)
  To: José Roberto de Souza; +Cc: intel-gfx, Paulo Zanoni

On Wed, Oct 10, 2018 at 02:35:07PM -0700, José Roberto de Souza wrote:
> Some USB type-C dongles requires some time to power on before being
> able to process aux channel transactions.
> It was not a problem for older gens because there was a bridge
> between DP port and USB-C controller adding some delay but ICL
> handles type-C native.
> 
> So here trying to do a aux channel transaction at each 150ms for up 5
> times, before giving up.
> 
> Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
> Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
> ---
>  drivers/gpu/drm/i915/i915_drv.h      |  1 +
>  drivers/gpu/drm/i915/intel_dp.c      |  7 ++++
>  drivers/gpu/drm/i915/intel_drv.h     |  6 ++-
>  drivers/gpu/drm/i915/intel_hotplug.c | 58 ++++++++++++++++++++++++++++
>  4 files changed, 71 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 3017ef037fed..b3f1fc865366 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -2810,6 +2810,7 @@ enum hpd_pin intel_hpd_pin_default(struct drm_i915_private *dev_priv,
>  				   enum port port);
>  bool intel_hpd_disable(struct drm_i915_private *dev_priv, enum hpd_pin pin);
>  void intel_hpd_enable(struct drm_i915_private *dev_priv, enum hpd_pin pin);
> +void intel_hotplug_tc_wa_work(struct work_struct *__work);
>  
>  /* i915_irq.c */
>  static inline void i915_queue_hangcheck(struct drm_i915_private *dev_priv)
> diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
> index 60e62a3c1e22..b945385cd5bc 100644
> --- a/drivers/gpu/drm/i915/intel_dp.c
> +++ b/drivers/gpu/drm/i915/intel_dp.c
> @@ -5289,6 +5289,7 @@ void intel_dp_encoder_destroy(struct drm_encoder *encoder)
>  {
>  	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
>  	struct intel_dp *intel_dp = &intel_dig_port->dp;
> +	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
>  
>  	intel_dp_mst_encoder_cleanup(intel_dig_port);
>  	if (intel_dp_is_edp(intel_dp)) {
> @@ -5305,6 +5306,8 @@ void intel_dp_encoder_destroy(struct drm_encoder *encoder)
>  			unregister_reboot_notifier(&intel_dp->edp_notifier);
>  			intel_dp->edp_notifier.notifier_call = NULL;
>  		}
> +	} else if (IS_ICELAKE(dev_priv)) {
> +		cancel_delayed_work_sync(&intel_dp->tc_wa_work);
>  	}
>  
>  	intel_dp_aux_fini(intel_dp);
> @@ -6663,6 +6666,10 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
>  		I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd);
>  	}
>  
> +	if (IS_ICELAKE(dev_priv) && !intel_dp_is_edp(intel_dp))
> +		INIT_DELAYED_WORK(&intel_dp->tc_wa_work,
> +				  intel_hotplug_tc_wa_work);
> +
>  	return true;
>  
>  fail:
> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> index 3dea7a1bda7f..174a54aa966a 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -1100,7 +1100,11 @@ struct intel_dp {
>  	int panel_power_cycle_delay;
>  	int backlight_on_delay;
>  	int backlight_off_delay;
> -	struct delayed_work panel_vdd_work;
> +	union {
> +		struct delayed_work panel_vdd_work;
> +		struct delayed_work tc_wa_work;
> +	};
> +	u8 tc_wa_count;
>  	bool want_panel_vdd;
>  	unsigned long last_power_on;
>  	unsigned long last_backlight_off;
> diff --git a/drivers/gpu/drm/i915/intel_hotplug.c b/drivers/gpu/drm/i915/intel_hotplug.c
> index 648a13c6043c..96546067f832 100644
> --- a/drivers/gpu/drm/i915/intel_hotplug.c
> +++ b/drivers/gpu/drm/i915/intel_hotplug.c
> @@ -323,6 +323,45 @@ static void i915_digport_work_func(struct work_struct *work)
>  	}
>  }
>  
> +#define TC_WA_DELAY_MSEC 150
> +#define TC_WA_TRIES 5
> +
> +void intel_hotplug_tc_wa_work(struct work_struct *__work)
> +{
> +	struct intel_dp *intel_dp = container_of(to_delayed_work(__work),
> +						 struct intel_dp, tc_wa_work);
> +	struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
> +	struct intel_encoder *intel_encoder = &intel_dig_port->base;
> +	struct intel_connector *intel_connector = intel_dp->attached_connector;
> +	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
> +	struct drm_device *dev = &dev_priv->drm;
> +	u8 val;
> +
> +	if (!intel_port_is_tc(dev_priv, intel_encoder->port) ||
> +	    !intel_digital_port_connected(intel_encoder))
> +		return;
> +
> +	if (drm_dp_dpcd_read(&intel_dp->aux, DP_DPCD_REV, &val, 1) < 1) {
> +		intel_dp->tc_wa_count++;
> +
> +		if (intel_dp->tc_wa_count < TC_WA_TRIES) {
> +			unsigned long delay;
> +
> +			delay = msecs_to_jiffies(TC_WA_DELAY_MSEC);
> +			schedule_delayed_work(&intel_dp->tc_wa_work, delay);
> +		} else {
> +			DRM_DEBUG_KMS("TC not responsive, giving up\n");
> +		}
> +	} else {
> +		mutex_lock(&dev->mode_config.mutex);
> +		val = intel_encoder->hotplug(intel_encoder, intel_connector);
> +		mutex_unlock(&dev->mode_config.mutex);
> +
> +		if (val)
> +			drm_kms_helper_hotplug_event(dev);
> +	}
> +}
> +
>  /*
>   * Handle hotplug events outside the interrupt handler proper.
>   */
> @@ -361,6 +400,25 @@ static void i915_hotplug_work_func(struct work_struct *work)
>  			DRM_DEBUG_KMS("Connector %s (pin %i) received hotplug event.\n",
>  				      connector->name, intel_encoder->hpd_pin);
>  
> +			/*
> +			 * TC WA: TC dongles takes some type to be
> +			 * responsible
> +			 */
> +			if (IS_ICELAKE(dev_priv) &&
> +			    intel_port_is_tc(dev_priv, intel_encoder->port) &&
> +			    intel_digital_port_connected(intel_encoder)) {
> +				struct intel_dp *intel_dp;
> +				unsigned long delay;
> +
> +				intel_dp = enc_to_intel_dp(&intel_encoder->base);
> +
> +				intel_dp->tc_wa_count = 0;
> +				delay = msecs_to_jiffies(TC_WA_DELAY_MSEC);
> +				schedule_delayed_work(&intel_dp->tc_wa_work,
> +						      delay);
> +				continue;
> +			}
> +
>  			changed |= intel_encoder->hotplug(intel_encoder,
>  							  intel_connector);

I think if we need such duct-tape we should just stuff it into the
.hotplug() hook.

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

-- 
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] 15+ messages in thread

* Re: [PATCH 6/6] drm/i915/icl: Fix crash when getting DPLL of a MST encoder in TC ports
  2018-10-10 21:35 ` [PATCH 6/6] drm/i915/icl: Fix crash when getting DPLL of a MST encoder in TC ports José Roberto de Souza
@ 2018-10-30 17:56   ` Ville Syrjälä
  0 siblings, 0 replies; 15+ messages in thread
From: Ville Syrjälä @ 2018-10-30 17:56 UTC (permalink / raw)
  To: José Roberto de Souza; +Cc: intel-gfx, Paulo Zanoni

On Wed, Oct 10, 2018 at 02:35:08PM -0700, José Roberto de Souza wrote:
> enc_to_dig_port() returns NULL for encoders of type
> INTEL_OUTPUT_DP_MST causing the crash bellow:
> 
> [ 2832.836101] BUG: unable to handle kernel paging request at 00000000000012b8
> [ 2832.843062] PGD 0 P4D 0
> [ 2832.845610] Oops: 0000 [#1] SMP
> [ 2832.848764] CPU: 2 PID: 3577 Comm: kworker/2:0 Tainted: G        W         4.19.0-rc7+ #491
> [ 2832.857106] Hardware name: Intel Corporation Ice Lake Client Platform/IceLake U DDR4 SODIMM PD RVP TLC, BIOS ICLSFWR1.R00.2352.A01.1808281852 08/28/2018
> [ 2832.870734] Workqueue: events output_poll_execute
> [ 2832.875480] RIP: 0010:icl_get_dpll+0xa4/0x5d0 [i915]
> [ 2832.880449] Code: e9 03 f3 48 ab 8b 6e 74 41 8b 8c 24 5c 03 00 00 85 ed 0f 88 3f 02 00 00 83 fd 01 0f 8e ad 01 00 00 83 fd 05 0f 8f 2d 02 00 00 <83> ba b8 12 00 00 02 48 8b 36 0f 84 39 02 00 00 44 8b be ec 89 00
> [ 2832.899176] RSP: 0018:ffffc90001b57a78 EFLAGS: 00010293
> [ 2832.904404] RAX: 0000000000000000 RBX: ffffc90001b57a94 RCX: 0000000000083d60
> [ 2832.911536] RDX: 0000000000000000 RSI: ffff8804a8c0dc00 RDI: ffffc90001b57b18
> [ 2832.918668] RBP: 0000000000000003 R08: ffff8804a8c1f990 R09: ffff8804a8c1f990
> [ 2832.925797] R10: 0000000000000000 R11: ffff8804a8e99600 R12: ffff8804a7760000
> [ 2832.932930] R13: ffff88049e94d000 R14: ffff88049e94d000 R15: 000000000000000e
> [ 2832.940063] FS:  0000000000000000(0000) GS:ffff8804b0300000(0000) knlGS:0000000000000000
> [ 2832.948147] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> [ 2832.953893] CR2: 00000000000012b8 CR3: 0000000004a1d004 CR4: 0000000000760ee0
> [ 2832.961027] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
> [ 2832.968155] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
> [ 2832.975286] PKRU: 55555554
> [ 2832.978003] Call Trace:
> [ 2832.980496]  haswell_crtc_compute_clock+0x3d/0x68 [i915]
> [ 2832.985841]  intel_crtc_atomic_check+0x61/0x340 [i915]
> [ 2832.990987]  drm_atomic_helper_check_planes+0x130/0x1c0
> [ 2832.996245]  intel_atomic_check+0x4d5/0x10f0 [i915]
> [ 2833.001147]  drm_atomic_check_only+0x484/0x690
> [ 2833.005629]  drm_atomic_commit+0x13/0x50
> [ 2833.009564]  restore_fbdev_mode_atomic+0x1c9/0x1e0
> [ 2833.014363]  drm_fb_helper_restore_fbdev_mode_unlocked+0x47/0x90
> [ 2833.020368]  drm_fb_helper_set_par+0x29/0x50
> [ 2833.024641]  drm_fb_helper_hotplug_event.part.33+0x92/0xb0
> [ 2833.030130]  drm_kms_helper_hotplug_event+0x26/0x30
> [ 2833.035013]  output_poll_execute+0x192/0x1b0
> [ 2833.039293]  process_one_work+0x2a5/0x5f0
> [ 2833.043315]  worker_thread+0x2d/0x3d0
> [ 2833.046988]  ? rescuer_thread+0x340/0x340
> [ 2833.051009]  kthread+0x112/0x130
> [ 2833.054247]  ? kthread_create_worker_on_cpu+0x70/0x70
> [ 2833.059307]  ret_from_fork+0x3a/0x50
> [ 2833.062893] Modules linked in: i915 prime_numbers snd_hda_codec_realtek snd_hda_codec_generic asix snd_usb_audio snd_usbmidi_lib snd_seq_midi snd_seq_midi_event snd_rawmidi cdc_ether usbnet x86_pkg_temp_thermal xhci_pci xhci_hcd ucsi_acpi typec_ucsi typec efivarfs [last unloaded: prime_numbers]
> [ 2833.088917] CR2: 00000000000012b8
> [ 2833.092241] ---[ end trace 25f9fe3d47af2e75 ]---
> [ 2833.096895] RIP: 0010:icl_get_dpll+0xa4/0x5d0 [i915]
> [ 2833.101866] Code: e9 03 f3 48 ab 8b 6e 74 41 8b 8c 24 5c 03 00 00 85 ed 0f 88 3f 02 00 00 83 fd 01 0f 8e ad 01 00 00 83 fd 05 0f 8f 2d 02 00 00 <83> ba b8 12 00 00 02 48 8b 36 0f 84 39 02 00 00 44 8b be ec 89 00
> [ 2833.120589] RSP: 0018:ffffc90001b57a78 EFLAGS: 00010293
> [ 2833.125815] RAX: 0000000000000000 RBX: ffffc90001b57a94 RCX: 0000000000083d60
> [ 2833.132946] RDX: 0000000000000000 RSI: ffff8804a8c0dc00 RDI: ffffc90001b57b18
> [ 2833.140080] RBP: 0000000000000003 R08: ffff8804a8c1f990 R09: ffff8804a8c1f990
> [ 2833.147213] R10: 0000000000000000 R11: ffff8804a8e99600 R12: ffff8804a7760000
> [ 2833.154350] R13: ffff88049e94d000 R14: ffff88049e94d000 R15: 000000000000000e
> [ 2833.161483] FS:  0000000000000000(0000) GS:ffff8804b0300000(0000) knlGS:0000000000000000
> [ 2833.169565] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> [ 2833.175313] CR2: 00000000000012b8 CR3: 0000000004a1d004 CR4: 0000000000760ee0
> [ 2833.182449] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
> [ 2833.189578] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
> [ 2833.196712] PKRU: 55555554
> 
> MST ports are allocated from struct intel_dp_mst_encoder not from
> struct intel_digital_port as regular ports, so to get the TC type it
> is necessary check the primary digital port of the mst encoder.
> 
> Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
> Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
> ---
>  drivers/gpu/drm/i915/intel_dpll_mgr.c | 12 ++++++++++--
>  1 file changed, 10 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_dpll_mgr.c b/drivers/gpu/drm/i915/intel_dpll_mgr.c
> index 874646357ad1..23a1bc17a3f9 100644
> --- a/drivers/gpu/drm/i915/intel_dpll_mgr.c
> +++ b/drivers/gpu/drm/i915/intel_dpll_mgr.c
> @@ -2867,8 +2867,7 @@ static struct intel_shared_dpll *
>  icl_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
>  	     struct intel_encoder *encoder)
>  {
> -	struct intel_digital_port *intel_dig_port =
> -			enc_to_dig_port(&encoder->base);
> +	struct intel_digital_port *intel_dig_port;
>  	struct intel_shared_dpll *pll;
>  	struct intel_dpll_hw_state pll_state = {};
>  	enum port port = encoder->port;
> @@ -2888,6 +2887,15 @@ icl_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
>  	case PORT_D:
>  	case PORT_E:
>  	case PORT_F:
> +		if (encoder->type == INTEL_OUTPUT_DP_MST) {
> +			struct intel_dp_mst_encoder *mst_encoder;
> +
> +			mst_encoder = enc_to_mst(&encoder->base);
> +			intel_dig_port = mst_encoder->primary;
> +		} else {
> +			intel_dig_port = enc_to_dig_port(&encoder->base);
> +		}

Argh. I thought we had finally got rid of all this. I guess this should
get fixed in a nicer way if we start to track the tc_type (or something
like it) in the crtc_state.

In the meantime
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

> +
>  		if (intel_dig_port->tc_type == TC_PORT_TBT) {
>  			min = DPLL_ID_ICL_TBTPLL;
>  			max = min;
> -- 
> 2.19.1
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
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] 15+ messages in thread

* Re: [PATCH 3/6] drm/i915/icl: Set TC type to unknown when a sudden disconnection happen
  2018-10-30 17:51   ` Ville Syrjälä
@ 2018-10-30 20:42     ` Souza, Jose
  0 siblings, 0 replies; 15+ messages in thread
From: Souza, Jose @ 2018-10-30 20:42 UTC (permalink / raw)
  To: ville.syrjala; +Cc: intel-gfx, Zanoni, Paulo R

On Tue, 2018-10-30 at 19:51 +0200, Ville Syrjälä wrote:
> On Wed, Oct 10, 2018 at 02:35:05PM -0700, José Roberto de Souza
> wrote:
> > Otherwise it would be in a inconsistent state as port is
> > disconnected
> > but with a valid tc type.
> > 
> > Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
> > Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
> > ---
> >  drivers/gpu/drm/i915/intel_dp.c | 7 ++++---
> >  1 file changed, 4 insertions(+), 3 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/intel_dp.c
> > b/drivers/gpu/drm/i915/intel_dp.c
> > index d3f31103b8ec..d3af6aa1959a 100644
> > --- a/drivers/gpu/drm/i915/intel_dp.c
> > +++ b/drivers/gpu/drm/i915/intel_dp.c
> > @@ -4863,6 +4863,9 @@ static void icl_update_tc_port_type(struct
> > drm_i915_private *dev_priv,
> >  			      type_str);
> >  }
> >  
> > +static void icl_tc_phy_disconnect(struct drm_i915_private
> > *dev_priv,
> > +				  struct intel_digital_port *dig_port);
> > +
> >  /*
> >   * This function implements the first part of the Connect Flow
> > described by our
> >   * specification, Gen11 TypeC Programming chapter. The rest of the
> > flow (reading
> > @@ -4917,9 +4920,7 @@ static bool icl_tc_phy_connect(struct
> > drm_i915_private *dev_priv,
> >  	if (dig_port->tc_type == TC_PORT_TYPEC &&
> >  	    !(I915_READ(PORT_TX_DFLEXDPSP) &
> > TC_LIVE_STATE_TC(tc_port))) {
> >  		DRM_DEBUG_KMS("TC PHY %d sudden disconnect.\n",
> > tc_port);
> > -		val = I915_READ(PORT_TX_DFLEXDPCSSS);
> > -		val &= ~DP_PHY_MODE_STATUS_NOT_SAFE(tc_port);
> > -		I915_WRITE(PORT_TX_DFLEXDPCSSS, val);
> > +		icl_tc_phy_disconnect(dev_priv, dig_port);
> >  		return false;
> >  	}
> 
> Patches 1-3
> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> 

Thanks, I will rebase and reoder the patches so the one without
reviewed-by goes last and someone can merge the first 5.

> But icl_tc_port_connected() still looks somewhat busted. If the
> port changes from legacy|typec to tbt we won't configure the
> safe mode knob correctly.

For what I understood, firmware will hang in the disconnected state
until driver change to safe mode when comming form legacy|typec.
But I will give a try into spliting into a connector for each type like
you suggested.

> 
> I think we want something like this:
> 
> + if (!is_legacy && !is_typec)
> + 	icl_tc_phy_disconnect(dev_priv, intel_dig_port);
> + 
>   if (!is_legacy && !is_typec && !is_tbt) {
> - 	icl_tc_phy_disconnect(dev_priv, intel_dig_port);
>   	return false;
>   }
> 
> >  
> > -- 
> > 2.19.1
> > 
> > _______________________________________________
> > Intel-gfx mailing list
> > Intel-gfx@lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/intel-gfx
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

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

* Re: [PATCH 5/6] drm/i915/icl: Delay hotplug processing for tc ports
  2018-10-30 17:52   ` Ville Syrjälä
@ 2018-10-31  1:02     ` Souza, Jose
  0 siblings, 0 replies; 15+ messages in thread
From: Souza, Jose @ 2018-10-31  1:02 UTC (permalink / raw)
  To: ville.syrjala; +Cc: intel-gfx, Zanoni, Paulo R

On Tue, 2018-10-30 at 19:52 +0200, Ville Syrjälä wrote:
> On Wed, Oct 10, 2018 at 02:35:07PM -0700, José Roberto de Souza
> wrote:
> > Some USB type-C dongles requires some time to power on before being
> > able to process aux channel transactions.
> > It was not a problem for older gens because there was a bridge
> > between DP port and USB-C controller adding some delay but ICL
> > handles type-C native.
> > 
> > So here trying to do a aux channel transaction at each 150ms for up
> > 5
> > times, before giving up.
> > 
> > Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
> > Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
> > ---
> >  drivers/gpu/drm/i915/i915_drv.h      |  1 +
> >  drivers/gpu/drm/i915/intel_dp.c      |  7 ++++
> >  drivers/gpu/drm/i915/intel_drv.h     |  6 ++-
> >  drivers/gpu/drm/i915/intel_hotplug.c | 58
> > ++++++++++++++++++++++++++++
> >  4 files changed, 71 insertions(+), 1 deletion(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/i915_drv.h
> > b/drivers/gpu/drm/i915/i915_drv.h
> > index 3017ef037fed..b3f1fc865366 100644
> > --- a/drivers/gpu/drm/i915/i915_drv.h
> > +++ b/drivers/gpu/drm/i915/i915_drv.h
> > @@ -2810,6 +2810,7 @@ enum hpd_pin intel_hpd_pin_default(struct
> > drm_i915_private *dev_priv,
> >  				   enum port port);
> >  bool intel_hpd_disable(struct drm_i915_private *dev_priv, enum
> > hpd_pin pin);
> >  void intel_hpd_enable(struct drm_i915_private *dev_priv, enum
> > hpd_pin pin);
> > +void intel_hotplug_tc_wa_work(struct work_struct *__work);
> >  
> >  /* i915_irq.c */
> >  static inline void i915_queue_hangcheck(struct drm_i915_private
> > *dev_priv)
> > diff --git a/drivers/gpu/drm/i915/intel_dp.c
> > b/drivers/gpu/drm/i915/intel_dp.c
> > index 60e62a3c1e22..b945385cd5bc 100644
> > --- a/drivers/gpu/drm/i915/intel_dp.c
> > +++ b/drivers/gpu/drm/i915/intel_dp.c
> > @@ -5289,6 +5289,7 @@ void intel_dp_encoder_destroy(struct
> > drm_encoder *encoder)
> >  {
> >  	struct intel_digital_port *intel_dig_port =
> > enc_to_dig_port(encoder);
> >  	struct intel_dp *intel_dp = &intel_dig_port->dp;
> > +	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
> >  
> >  	intel_dp_mst_encoder_cleanup(intel_dig_port);
> >  	if (intel_dp_is_edp(intel_dp)) {
> > @@ -5305,6 +5306,8 @@ void intel_dp_encoder_destroy(struct
> > drm_encoder *encoder)
> >  			unregister_reboot_notifier(&intel_dp-
> > >edp_notifier);
> >  			intel_dp->edp_notifier.notifier_call = NULL;
> >  		}
> > +	} else if (IS_ICELAKE(dev_priv)) {
> > +		cancel_delayed_work_sync(&intel_dp->tc_wa_work);
> >  	}
> >  
> >  	intel_dp_aux_fini(intel_dp);
> > @@ -6663,6 +6666,10 @@ intel_dp_init_connector(struct
> > intel_digital_port *intel_dig_port,
> >  		I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd);
> >  	}
> >  
> > +	if (IS_ICELAKE(dev_priv) && !intel_dp_is_edp(intel_dp))
> > +		INIT_DELAYED_WORK(&intel_dp->tc_wa_work,
> > +				  intel_hotplug_tc_wa_work);
> > +
> >  	return true;
> >  
> >  fail:
> > diff --git a/drivers/gpu/drm/i915/intel_drv.h
> > b/drivers/gpu/drm/i915/intel_drv.h
> > index 3dea7a1bda7f..174a54aa966a 100644
> > --- a/drivers/gpu/drm/i915/intel_drv.h
> > +++ b/drivers/gpu/drm/i915/intel_drv.h
> > @@ -1100,7 +1100,11 @@ struct intel_dp {
> >  	int panel_power_cycle_delay;
> >  	int backlight_on_delay;
> >  	int backlight_off_delay;
> > -	struct delayed_work panel_vdd_work;
> > +	union {
> > +		struct delayed_work panel_vdd_work;
> > +		struct delayed_work tc_wa_work;
> > +	};
> > +	u8 tc_wa_count;
> >  	bool want_panel_vdd;
> >  	unsigned long last_power_on;
> >  	unsigned long last_backlight_off;
> > diff --git a/drivers/gpu/drm/i915/intel_hotplug.c
> > b/drivers/gpu/drm/i915/intel_hotplug.c
> > index 648a13c6043c..96546067f832 100644
> > --- a/drivers/gpu/drm/i915/intel_hotplug.c
> > +++ b/drivers/gpu/drm/i915/intel_hotplug.c
> > @@ -323,6 +323,45 @@ static void i915_digport_work_func(struct
> > work_struct *work)
> >  	}
> >  }
> >  
> > +#define TC_WA_DELAY_MSEC 150
> > +#define TC_WA_TRIES 5
> > +
> > +void intel_hotplug_tc_wa_work(struct work_struct *__work)
> > +{
> > +	struct intel_dp *intel_dp =
> > container_of(to_delayed_work(__work),
> > +						 struct intel_dp,
> > tc_wa_work);
> > +	struct intel_digital_port *intel_dig_port =
> > dp_to_dig_port(intel_dp);
> > +	struct intel_encoder *intel_encoder = &intel_dig_port->base;
> > +	struct intel_connector *intel_connector = intel_dp-
> > >attached_connector;
> > +	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
> > +	struct drm_device *dev = &dev_priv->drm;
> > +	u8 val;
> > +
> > +	if (!intel_port_is_tc(dev_priv, intel_encoder->port) ||
> > +	    !intel_digital_port_connected(intel_encoder))
> > +		return;
> > +
> > +	if (drm_dp_dpcd_read(&intel_dp->aux, DP_DPCD_REV, &val, 1) < 1)
> > {
> > +		intel_dp->tc_wa_count++;
> > +
> > +		if (intel_dp->tc_wa_count < TC_WA_TRIES) {
> > +			unsigned long delay;
> > +
> > +			delay = msecs_to_jiffies(TC_WA_DELAY_MSEC);
> > +			schedule_delayed_work(&intel_dp->tc_wa_work,
> > delay);
> > +		} else {
> > +			DRM_DEBUG_KMS("TC not responsive, giving
> > up\n");
> > +		}
> > +	} else {
> > +		mutex_lock(&dev->mode_config.mutex);
> > +		val = intel_encoder->hotplug(intel_encoder,
> > intel_connector);
> > +		mutex_unlock(&dev->mode_config.mutex);
> > +
> > +		if (val)
> > +			drm_kms_helper_hotplug_event(dev);
> > +	}
> > +}
> > +
> >  /*
> >   * Handle hotplug events outside the interrupt handler proper.
> >   */
> > @@ -361,6 +400,25 @@ static void i915_hotplug_work_func(struct
> > work_struct *work)
> >  			DRM_DEBUG_KMS("Connector %s (pin %i) received
> > hotplug event.\n",
> >  				      connector->name, intel_encoder-
> > >hpd_pin);
> >  
> > +			/*
> > +			 * TC WA: TC dongles takes some type to be
> > +			 * responsible
> > +			 */
> > +			if (IS_ICELAKE(dev_priv) &&
> > +			    intel_port_is_tc(dev_priv, intel_encoder-
> > >port) &&
> > +			    intel_digital_port_connected(intel_encoder)
> > ) {
> > +				struct intel_dp *intel_dp;
> > +				unsigned long delay;
> > +
> > +				intel_dp =
> > enc_to_intel_dp(&intel_encoder->base);
> > +
> > +				intel_dp->tc_wa_count = 0;
> > +				delay =
> > msecs_to_jiffies(TC_WA_DELAY_MSEC);
> > +				schedule_delayed_work(&intel_dp-
> > >tc_wa_work,
> > +						      delay);
> > +				continue;
> > +			}
> > +
> >  			changed |= intel_encoder-
> > >hotplug(intel_encoder,
> >  							  intel_connect
> > or);
> 
> I think if we need such duct-tape we should just stuff it into the
> .hotplug() hook.

The problem of moving it to intel_encoder_hotplug() is avoid infinite
tries in case the transaction inside of intel_encoder_hotplug() fails
after the one in intel_hotplug_tc_wa_work() works:

intel_hotplug_tc_wa_work()
{
	...
	intel_dp->tc_wa_count++

	if (drm_dp_dpcd_read() == 1)
		intel_encoder_hotplug()
	...
}
	

intel_encoder_hotplug()
{
	...
	if (drm_dp_dpcd_read() < 1)
		if (IS_ICELAKE() && intel_port_is_tc() &&
intel_digital_port_connected())
			intel_dp->tc_wa_count = 0;
			schedule_delayed_work()
	...
}

I'm still thinking about other solutions but I guess the safest place
is i915_hotplug_work_func(), any other tip?

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

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

end of thread, other threads:[~2018-10-31  1:02 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-10-10 21:35 [PATCH 1/6] drm/i915/debugfs: Do not print cached information of a disconnected sink José Roberto de Souza
2018-10-10 21:35 ` [PATCH 2/6] drm/i915/icl: Set TC type to unknown in the disconnection flow José Roberto de Souza
2018-10-10 21:35 ` [PATCH 3/6] drm/i915/icl: Set TC type to unknown when a sudden disconnection happen José Roberto de Souza
2018-10-30 17:51   ` Ville Syrjälä
2018-10-30 20:42     ` Souza, Jose
2018-10-10 21:35 ` [PATCH 4/6] drm/i915: Initialize panel_vdd_work only for eDP ports José Roberto de Souza
2018-10-30 17:51   ` Ville Syrjälä
2018-10-10 21:35 ` [PATCH 5/6] drm/i915/icl: Delay hotplug processing for tc ports José Roberto de Souza
2018-10-30 17:52   ` Ville Syrjälä
2018-10-31  1:02     ` Souza, Jose
2018-10-10 21:35 ` [PATCH 6/6] drm/i915/icl: Fix crash when getting DPLL of a MST encoder in TC ports José Roberto de Souza
2018-10-30 17:56   ` Ville Syrjälä
2018-10-10 21:52 ` ✗ Fi.CI.SPARSE: warning for series starting with [1/6] drm/i915/debugfs: Do not print cached information of a disconnected sink Patchwork
2018-10-10 22:12 ` ✓ Fi.CI.BAT: success " Patchwork
2018-10-11  7:54 ` ✓ Fi.CI.IGT: " Patchwork

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.