public inbox for intel-gfx@lists.freedesktop.org
 help / color / mirror / Atom feed
From: Imre Deak <imre.deak@intel.com>
To: intel-gfx@lists.freedesktop.org
Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
Subject: [PATCH 14/23] drm/i915: Keep the TypeC port mode fixed for detect/AUX transfers
Date: Tue,  4 Jun 2019 17:58:17 +0300	[thread overview]
Message-ID: <20190604145826.16424-15-imre.deak@intel.com> (raw)
In-Reply-To: <20190604145826.16424-1-imre.deak@intel.com>

We must keep the TypeC port mode fixed for the duration of the connector
detection and each AUX transfers. Add a new TypeC lock holding it around
these two sequences. For consistency also hold the lock during the port
mode sanitization.

Whenever resetting the port mode (only during the detection for now) the
port's AUX power domain must be disabled already. Flush the async power
domain disabling work to ensure this.

A follow-up patch will make the port mode changing more robust by
postponing the change for active ports.

Cc: José Roberto de Souza <jose.souza@intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 drivers/gpu/drm/i915/intel_ddi.c |  9 ++++++---
 drivers/gpu/drm/i915/intel_dp.c  |  7 +++++++
 drivers/gpu/drm/i915/intel_drv.h |  1 +
 drivers/gpu/drm/i915/intel_tc.c  | 34 +++++++++++++++++++++++++++++++-
 drivers/gpu/drm/i915/intel_tc.h  |  4 ++++
 5 files changed, 51 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index 2bc3b4f2c9a5..ad2f7bb2f50b 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -4235,9 +4235,12 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
 	intel_dig_port->max_lanes = intel_ddi_max_lanes(intel_dig_port);
 	intel_dig_port->aux_ch = intel_bios_port_aux_ch(dev_priv, port);
 
-	intel_dig_port->tc_legacy_port = intel_port_is_tc(dev_priv, port) &&
-					 !port_info->supports_typec_usb &&
-					 !port_info->supports_tbt;
+	if (intel_port_is_tc(dev_priv, port)) {
+		bool is_legacy = !port_info->supports_typec_usb &&
+				 !port_info->supports_tbt;
+
+		intel_tc_port_init(intel_dig_port, is_legacy);
+	}
 
 	switch (port) {
 	case PORT_A:
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index e1e27662aa6d..b984410f41a4 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -1190,6 +1190,7 @@ intel_dp_aux_xfer(struct intel_dp *intel_dp,
 	struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
 	struct drm_i915_private *dev_priv =
 			to_i915(intel_dig_port->base.base.dev);
+	bool is_tc_port = intel_port_is_tc(dev_priv, intel_dig_port->base.port);
 	i915_reg_t ch_ctl, ch_data[5];
 	u32 aux_clock_divider;
 	enum intel_display_power_domain aux_domain =
@@ -1205,6 +1206,9 @@ intel_dp_aux_xfer(struct intel_dp *intel_dp,
 	for (i = 0; i < ARRAY_SIZE(ch_data); i++)
 		ch_data[i] = intel_dp->aux_ch_data_reg(intel_dp, i);
 
+	if (is_tc_port)
+		intel_tc_port_lock(intel_dig_port);
+
 	aux_wakeref = intel_display_power_get(dev_priv, aux_domain);
 	pps_wakeref = pps_lock(intel_dp);
 
@@ -1355,6 +1359,9 @@ intel_dp_aux_xfer(struct intel_dp *intel_dp,
 	pps_unlock(intel_dp, pps_wakeref);
 	intel_display_power_put_async(dev_priv, aux_domain, aux_wakeref);
 
+	if (is_tc_port)
+		intel_tc_port_unlock(intel_dig_port);
+
 	return ret;
 }
 
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 30cd49dbd0d8..18d292dd0d9c 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -1224,6 +1224,7 @@ struct intel_digital_port {
 	/* Used for DP and ICL+ TypeC/DP and TypeC/HDMI ports. */
 	enum aux_ch aux_ch;
 	enum intel_display_power_domain ddi_io_power_domain;
+	struct mutex tc_lock;
 	bool tc_legacy_port:1;
 	enum tc_port_mode tc_mode;
 
diff --git a/drivers/gpu/drm/i915/intel_tc.c b/drivers/gpu/drm/i915/intel_tc.c
index 9ebf25d7931c..fc0341dc50c5 100644
--- a/drivers/gpu/drm/i915/intel_tc.c
+++ b/drivers/gpu/drm/i915/intel_tc.c
@@ -322,6 +322,8 @@ static void intel_tc_port_reset_mode(struct intel_digital_port *dig_port)
 	enum tc_port tc_port = intel_port_to_tc(dev_priv, dig_port->base.port);
 	enum tc_port_mode old_tc_mode = dig_port->tc_mode;
 
+	intel_display_power_flush_work(dev_priv);
+
 	icl_tc_phy_disconnect(dig_port);
 	icl_tc_phy_connect(dig_port);
 
@@ -338,6 +340,8 @@ void intel_tc_port_sanitize(struct intel_digital_port *dig_port)
 	enum tc_port tc_port = intel_port_to_tc(dev_priv, encoder->port);
 	int active_links = 0;
 
+	mutex_lock(&dig_port->tc_lock);
+
 	dig_port->tc_mode = intel_tc_port_get_current_mode(dig_port);
 	if (dig_port->dp.is_mst)
 		active_links = intel_dp_mst_encoder_active_links(dig_port);
@@ -359,6 +363,8 @@ void intel_tc_port_sanitize(struct intel_digital_port *dig_port)
 	DRM_DEBUG_DRIVER("Port %s: sanitize mode (%s)\n",
 			 tc_port_name(dev_priv, tc_port),
 			 tc_port_mode_name(dig_port->tc_mode));
+
+	mutex_unlock(&dig_port->tc_lock);
 }
 
 static bool
@@ -379,9 +385,35 @@ intel_tc_port_needs_reset(struct intel_digital_port *dig_port)
  */
 bool intel_tc_port_connected(struct intel_digital_port *dig_port)
 {
+	bool is_connected;
+
+	mutex_lock(&dig_port->tc_lock);
+
 	if (intel_tc_port_needs_reset(dig_port))
 		intel_tc_port_reset_mode(dig_port);
 
-	return tc_port_live_status_mask(dig_port) & BIT(dig_port->tc_mode);
+	is_connected = tc_port_live_status_mask(dig_port) &
+		       BIT(dig_port->tc_mode);
+
+	mutex_unlock(&dig_port->tc_lock);
+
+	return is_connected;
 }
 
+void intel_tc_port_lock(struct intel_digital_port *dig_port)
+{
+	mutex_lock(&dig_port->tc_lock);
+	/* TODO: reset the TypeC port mode if needed */
+}
+
+void intel_tc_port_unlock(struct intel_digital_port *dig_port)
+{
+	mutex_unlock(&dig_port->tc_lock);
+}
+
+void
+intel_tc_port_init(struct intel_digital_port *dig_port, bool is_legacy)
+{
+	mutex_init(&dig_port->tc_lock);
+	dig_port->tc_legacy_port = is_legacy;
+}
diff --git a/drivers/gpu/drm/i915/intel_tc.h b/drivers/gpu/drm/i915/intel_tc.h
index 10f0f0d81ee4..91c6e7459cc9 100644
--- a/drivers/gpu/drm/i915/intel_tc.h
+++ b/drivers/gpu/drm/i915/intel_tc.h
@@ -12,5 +12,9 @@ u32 intel_tc_port_get_lane_info(struct intel_digital_port *dig_port);
 int intel_tc_port_fia_max_lane_count(struct intel_digital_port *dig_port);
 
 void intel_tc_port_sanitize(struct intel_digital_port *dig_port);
+void intel_tc_port_lock(struct intel_digital_port *dig_port);
+void intel_tc_port_unlock(struct intel_digital_port *dig_port);
+
+void intel_tc_port_init(struct intel_digital_port *dig_port, bool is_legacy);
 
 #endif /* __INTEL_TC_H__ */
-- 
2.17.1

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

  parent reply	other threads:[~2019-06-04 14:59 UTC|newest]

Thread overview: 77+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-04 14:58 [PATCH 00/23] drm/i915: Fix TypeC port mode switching Imre Deak
2019-06-04 14:58 ` [PATCH 01/23] drm/i915/icl: Add support to read out the TBT PLL HW state Imre Deak
2019-06-07 17:36   ` Souza, Jose
2019-06-04 14:58 ` [PATCH 02/23] drm/i915: Tune down WARNs about TBT AUX power well enabling Imre Deak
2019-06-07 17:50   ` Souza, Jose
2019-06-08 13:33     ` Imre Deak
2019-06-04 14:58 ` [PATCH 03/23] drm/i915: Move the TypeC port handling code to a separate file Imre Deak
2019-06-06  8:42   ` Jani Nikula
2019-06-06  8:43     ` Jani Nikula
2019-06-06  9:09     ` Imre Deak
2019-06-10 22:57     ` Lucas De Marchi
2019-06-11 10:01       ` Jani Nikula
2019-06-07 17:56   ` Souza, Jose
2019-06-04 14:58 ` [PATCH 04/23] drm/i915: Sanitize the terminology used for TypeC port modes Imre Deak
2019-06-07 19:15   ` Souza, Jose
2019-06-08 13:43     ` Imre Deak
2019-06-10 23:21   ` Lucas De Marchi
2019-06-11 11:19     ` Imre Deak
2019-06-04 14:58 ` [PATCH 05/23] drm/i915: Don't enable the DDI-IO power in the TypeC TBT-alt mode Imre Deak
2019-06-07 19:23   ` Souza, Jose
2019-06-04 14:58 ` [PATCH 06/23] drm/i915: Fix the TBT AUX power well enabling Imre Deak
2019-06-07 19:58   ` Souza, Jose
2019-06-08 13:55     ` Imre Deak
2019-06-04 14:58 ` [PATCH 07/23] drm/i915: Use the correct AUX power domain in TypeC TBT-alt mode Imre Deak
2019-06-07 20:02   ` Souza, Jose
2019-06-04 14:58 ` [PATCH 08/23] drm/i915: Unify the TypeC port notation in debug/error messages Imre Deak
2019-06-07 20:21   ` Souza, Jose
2019-06-07 20:42     ` Imre Deak
2019-06-07 20:45       ` Souza, Jose
2019-06-07 20:46       ` Imre Deak
2019-06-04 14:58 ` [PATCH 09/23] drm/i915: Factor out common parts from TypeC port handling functions Imre Deak
2019-06-06  8:47   ` Jani Nikula
2019-06-06  9:19     ` Imre Deak
2019-06-07 21:22   ` Souza, Jose
2019-06-08 17:23     ` Imre Deak
2019-06-18 16:33   ` Ville Syrjälä
2019-06-18 16:44     ` Imre Deak
2019-06-04 14:58 ` [PATCH 10/23] drm/i915: Wait for TypeC PHY complete flag to clear in safe mode Imre Deak
2019-06-07 21:32   ` Souza, Jose
2019-06-04 14:58 ` [PATCH 11/23] drm/i915: Handle the TCCOLD power-down event Imre Deak
2019-06-07 21:41   ` Souza, Jose
2019-06-08 17:31     ` Imre Deak
2019-06-04 14:58 ` [PATCH 12/23] drm/i915: Sanitize the TypeC connect/detect sequences Imre Deak
2019-06-07 22:15   ` Souza, Jose
2019-06-08 17:40     ` Imre Deak
2019-06-04 14:58 ` [PATCH 13/23] drm/i915: Fix the TypeC port mode sanitization during loading/resume Imre Deak
2019-06-07 22:39   ` Souza, Jose
2019-06-08 17:50     ` Imre Deak
2019-06-04 14:58 ` Imre Deak [this message]
2019-06-04 14:58 ` [PATCH 15/23] drm/i915: Sanitize the TypeC FIA lane configuration decoding Imre Deak
2019-06-07 22:49   ` Souza, Jose
2019-06-18 16:39   ` Ville Syrjälä
2019-06-18 16:46     ` Imre Deak
2019-06-04 14:58 ` [PATCH 16/23] drm/i915: Sanitize the shared DPLL reserve/release interface Imre Deak
2019-06-04 14:58 ` [PATCH 17/23] drm/i915: Sanitize the shared DPLL find/reference interface Imre Deak
2019-06-04 14:58 ` [PATCH 18/23] drm/i915/icl: Split getting the DPLLs to port type specific functions Imre Deak
2019-06-04 14:58 ` [PATCH 19/23] drm/i915/icl: Reserve all required PLLs for TypeC ports Imre Deak
2019-06-07 17:41   ` [PATCH v2 " Imre Deak
2019-06-18 17:25     ` Ville Syrjälä
2019-06-18 18:02       ` Imre Deak
2019-06-04 14:58 ` [PATCH 20/23] drm/i915: Keep the TypeC port mode fixed when the port is active Imre Deak
2019-06-19 12:58   ` Ville Syrjälä
2019-06-19 16:08     ` Imre Deak
2019-06-04 14:58 ` [PATCH 21/23] drm/i915: Add state verification for the TypeC port mode Imre Deak
2019-06-04 14:58 ` [PATCH 22/23] drm/i915: Remove unneeded disconnect in TypeC legacy " Imre Deak
2019-06-08  0:18   ` Souza, Jose
2019-06-04 14:58 ` [PATCH 23/23] drm/i915: WARN about invalid lane reversal in TBT-alt/DP-alt modes Imre Deak
2019-06-08  0:13   ` Souza, Jose
2019-06-08  0:25     ` Souza, Jose
2019-06-04 17:30 ` ✗ Fi.CI.CHECKPATCH: warning for drm/i915: Fix TypeC port mode switching Patchwork
2019-06-04 17:39 ` ✗ Fi.CI.SPARSE: " Patchwork
2019-06-05  5:24 ` ✓ Fi.CI.BAT: success " Patchwork
2019-06-05 16:36 ` ✓ Fi.CI.IGT: " Patchwork
2019-06-07 17:59 ` ✗ Fi.CI.CHECKPATCH: warning for drm/i915: Fix TypeC port mode switching (rev2) Patchwork
2019-06-07 18:07 ` ✗ Fi.CI.SPARSE: " Patchwork
2019-06-07 18:34 ` ✓ Fi.CI.BAT: success " Patchwork
2019-06-10 12:34 ` ✓ Fi.CI.IGT: " Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190604145826.16424-15-imre.deak@intel.com \
    --to=imre.deak@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=paulo.r.zanoni@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox