* [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.