From: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
To: Imre Deak <imre.deak@intel.com>
Cc: intel-gfx@lists.freedesktop.org, Paulo Zanoni <paulo.r.zanoni@intel.com>
Subject: Re: [PATCH v2 14/23] drm/i915: Keep the TypeC port mode fixed for detect/AUX transfers
Date: Tue, 25 Jun 2019 16:43:16 +0300 [thread overview]
Message-ID: <20190625134316.GD5942@intel.com> (raw)
In-Reply-To: <20190620140600.11357-15-imre.deak@intel.com>
On Thu, Jun 20, 2019 at 05:05:51PM +0300, Imre Deak wrote:
> 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.
>
> v2:
> - Fix checkpatch issue: missing annotation for tc_lock.
>
> 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>
lgtm.
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_dp.c | 7 ++++++
> drivers/gpu/drm/i915/display/intel_tc.c | 30 ++++++++++++++++++++++++-
> drivers/gpu/drm/i915/display/intel_tc.h | 2 ++
> drivers/gpu/drm/i915/intel_drv.h | 1 +
> 4 files changed, 39 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index 0c6afec78f93..8f7188d71d08 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -1192,6 +1192,7 @@ intel_dp_aux_xfer(struct intel_dp *intel_dp,
> struct drm_i915_private *i915 =
> to_i915(intel_dig_port->base.base.dev);
> struct intel_uncore *uncore = &i915->uncore;
> + bool is_tc_port = intel_port_is_tc(i915, intel_dig_port->base.port);
> i915_reg_t ch_ctl, ch_data[5];
> u32 aux_clock_divider;
> enum intel_display_power_domain aux_domain =
> @@ -1207,6 +1208,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(i915, aux_domain);
> pps_wakeref = pps_lock(intel_dp);
>
> @@ -1359,6 +1363,9 @@ intel_dp_aux_xfer(struct intel_dp *intel_dp,
> pps_unlock(intel_dp, pps_wakeref);
> intel_display_power_put_async(i915, aux_domain, aux_wakeref);
>
> + if (is_tc_port)
> + intel_tc_port_unlock(intel_dig_port);
> +
> return ret;
> }
>
> diff --git a/drivers/gpu/drm/i915/display/intel_tc.c b/drivers/gpu/drm/i915/display/intel_tc.c
> index 81b0d5676108..019bc53af28b 100644
> --- a/drivers/gpu/drm/i915/display/intel_tc.c
> +++ b/drivers/gpu/drm/i915/display/intel_tc.c
> @@ -296,8 +296,11 @@ intel_tc_port_get_target_mode(struct intel_digital_port *dig_port)
>
> static void intel_tc_port_reset_mode(struct intel_digital_port *dig_port)
> {
> + struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
> 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);
>
> @@ -312,6 +315,8 @@ void intel_tc_port_sanitize(struct intel_digital_port *dig_port)
> struct intel_encoder *encoder = &dig_port->base;
> 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);
> @@ -332,6 +337,8 @@ void intel_tc_port_sanitize(struct intel_digital_port *dig_port)
> DRM_DEBUG_KMS("Port %s: sanitize mode (%s)\n",
> dig_port->tc_port_name,
> tc_port_mode_name(dig_port->tc_mode));
> +
> + mutex_unlock(&dig_port->tc_lock);
> }
>
> static bool intel_tc_port_needs_reset(struct intel_digital_port *dig_port)
> @@ -351,10 +358,30 @@ static bool 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)
> @@ -369,5 +396,6 @@ void intel_tc_port_init(struct intel_digital_port *dig_port, bool is_legacy)
> snprintf(dig_port->tc_port_name, sizeof(dig_port->tc_port_name),
> "%c/TC#%d", port_name(port), tc_port + 1);
>
> + mutex_init(&dig_port->tc_lock);
> dig_port->tc_legacy_port = is_legacy;
> }
> diff --git a/drivers/gpu/drm/i915/display/intel_tc.h b/drivers/gpu/drm/i915/display/intel_tc.h
> index 5a7876a74522..b5af2fe60b22 100644
> --- a/drivers/gpu/drm/i915/display/intel_tc.h
> +++ b/drivers/gpu/drm/i915/display/intel_tc.h
> @@ -17,6 +17,8 @@ u32 intel_tc_port_get_lane_mask(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);
>
> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> index 19f6a360acde..d9e7d011ed4a 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; /* protects the TypeC port mode */
> bool tc_legacy_port:1;
> char tc_port_name[8];
> enum tc_port_mode tc_mode;
> --
> 2.17.1
--
Ville Syrjälä
Intel
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2019-06-25 13:43 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-06-20 14:05 [PATCH v2 00/23] drm/i915: Fix TypeC port mode switching Imre Deak
2019-06-20 14:05 ` [PATCH v2 01/23] drm/i915/icl: Add support to read out the TBT PLL HW state Imre Deak
2019-06-20 14:05 ` [PATCH v2 02/23] drm/i915: Tune down WARNs about TBT AUX power well enabling Imre Deak
2019-06-20 14:05 ` [PATCH v2 03/23] drm/i915: Move the TypeC port handling code to a separate file Imre Deak
2019-06-20 14:05 ` [PATCH v2 04/23] drm/i915: Sanitize the terminology used for TypeC port modes Imre Deak
2019-06-20 14:05 ` [PATCH v2 05/23] drm/i915: Don't enable the DDI-IO power in the TypeC TBT-alt mode Imre Deak
2019-06-20 14:05 ` [PATCH v2 06/23] drm/i915: Fix the TBT AUX power well enabling Imre Deak
2019-06-20 14:05 ` [PATCH v2 07/23] drm/i915: Use the correct AUX power domain in TypeC TBT-alt mode Imre Deak
2019-06-20 14:05 ` [PATCH v2 08/23] drm/i915: Unify the TypeC port notation in debug/error messages Imre Deak
2019-06-20 14:05 ` [PATCH v2 09/23] drm/i915: Factor out common parts from TypeC port handling functions Imre Deak
2019-06-25 13:05 ` Ville Syrjälä
2019-06-25 13:48 ` Imre Deak
2019-06-26 20:50 ` [CI v3 " Imre Deak
2019-06-26 22:55 ` Souza, Jose
2019-06-27 10:34 ` Imre Deak
2019-06-20 14:05 ` [PATCH v2 10/23] drm/i915: Wait for TypeC PHY complete flag to clear in safe mode Imre Deak
2019-06-20 14:05 ` [PATCH v2 11/23] drm/i915: Handle the TCCOLD power-down event Imre Deak
2019-06-25 13:17 ` Ville Syrjälä
2019-06-25 14:22 ` Imre Deak
2019-06-26 20:50 ` [CI v3 " Imre Deak
2019-06-20 14:05 ` [PATCH v2 12/23] drm/i915: Sanitize the TypeC connect/detect sequences Imre Deak
2019-06-25 13:42 ` Ville Syrjälä
2019-06-25 18:30 ` Imre Deak
2019-06-26 11:51 ` Ville Syrjälä
2019-06-26 23:55 ` Souza, Jose
2019-06-27 9:48 ` Imre Deak
2019-06-27 21:06 ` Souza, Jose
2019-06-20 14:05 ` [PATCH v2 13/23] drm/i915: Fix the TypeC port mode sanitization during loading/resume Imre Deak
2019-06-26 18:04 ` [PATCH v3 " Imre Deak
2019-06-26 20:50 ` [CI " Imre Deak
2019-06-27 20:38 ` Souza, Jose
2019-06-20 14:05 ` [PATCH v2 14/23] drm/i915: Keep the TypeC port mode fixed for detect/AUX transfers Imre Deak
2019-06-25 13:43 ` Ville Syrjälä [this message]
2019-06-20 14:05 ` [PATCH v2 15/23] drm/i915: Sanitize the TypeC FIA lane configuration decoding Imre Deak
2019-06-20 14:05 ` [PATCH v2 16/23] drm/i915: Sanitize the shared DPLL reserve/release interface Imre Deak
2019-06-25 13:53 ` Ville Syrjälä
2019-06-25 18:57 ` Imre Deak
2019-06-25 19:48 ` Imre Deak
2019-06-20 14:05 ` [PATCH v2 17/23] drm/i915: Sanitize the shared DPLL find/reference interface Imre Deak
2019-06-25 13:54 ` Ville Syrjälä
2019-06-20 14:05 ` [PATCH v2 18/23] drm/i915/icl: Split getting the DPLLs to port type specific functions Imre Deak
2019-06-25 13:55 ` Ville Syrjälä
2019-06-20 14:05 ` [PATCH v2 19/23] drm/i915/icl: Reserve all required PLLs for TypeC ports Imre Deak
2019-06-25 13:58 ` Ville Syrjälä
2019-06-20 14:05 ` [PATCH v2 20/23] drm/i915: Keep the TypeC port mode fixed when the port is active Imre Deak
2019-06-25 14:01 ` Ville Syrjälä
2019-06-20 14:05 ` [PATCH v2 21/23] drm/i915: Add state verification for the TypeC port mode Imre Deak
2019-06-25 14:12 ` Ville Syrjälä
2019-06-25 19:23 ` Imre Deak
2019-06-26 11:52 ` Ville Syrjälä
2019-06-26 18:04 ` [v3 " Imre Deak
2019-06-26 20:50 ` [CI v3 " Imre Deak
2019-06-20 14:05 ` [PATCH v2 22/23] drm/i915: Remove unneeded disconnect in TypeC legacy " Imre Deak
2019-06-20 14:06 ` [PATCH v2 23/23] drm/i915: WARN about invalid lane reversal in TBT-alt/DP-alt modes Imre Deak
2019-06-20 17:23 ` ✗ Fi.CI.CHECKPATCH: warning for drm/i915: Fix TypeC port mode switching (rev3) Patchwork
2019-06-20 17:32 ` ✗ Fi.CI.SPARSE: " Patchwork
2019-06-20 18:05 ` ✓ Fi.CI.BAT: success " Patchwork
2019-06-20 22:42 ` ✓ Fi.CI.IGT: " Patchwork
2019-06-26 22:00 ` ✗ Fi.CI.BAT: failure for drm/i915: Fix TypeC port mode switching (rev7) Patchwork
-- strict thread matches above, loose matches on Subject: below --
2019-06-26 18:04 [PATCH v3 09/23] drm/i915: Factor out common parts from TypeC port handling functions Imre Deak
2019-06-26 18:04 ` [PATCH v3 11/23] drm/i915: Handle the TCCOLD power-down event Imre Deak
2019-06-26 22:12 ` Souza, Jose
2019-06-27 10:09 ` Imre Deak
2019-06-27 12:59 ` Ville Syrjälä
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=20190625134316.GD5942@intel.com \
--to=ville.syrjala@linux.intel.com \
--cc=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