Intel-GFX Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Matt Atwood <matthew.s.atwood@intel.com>
To: intel-xe@lists.freedesktop.org, intel-gfx@lists.freedesktop.org
Cc: ankit.k.nautiyal@Intel.com, dnyaneshware.bhdane@intel.com,
	gustavo.sousa@intel.com, jouni.hogander@intel.com,
	juha-peka.heikkila@intel.com, luciano.coelho@intel.com,
	matthew.d.roper@intel.com, ravi.kumar.vodapalli@intel.com,
	shekhar.chauhan@intel.com, vinod.govindapillai@intel.com,
	imre.deak@intel.com, jani.nikula@linux.intel.com,
	suraj.kandapal@intel.com, jani.nikula@intel.com,
	ville.syrjala@linux.intel.com, sai.teja.pottumuttu@Intel.com
Subject: [PATCH v6 3/8] drm/i915/display: Handle dedicated external ports in intel_encoder_is_tc()
Date: Mon,  1 Dec 2025 17:23:01 -0800	[thread overview]
Message-ID: <20251202012306.9315-4-matthew.s.atwood@intel.com> (raw)
In-Reply-To: <20251202012306.9315-1-matthew.s.atwood@intel.com>

From: Gustavo Sousa <gustavo.sousa@intel.com>

Starting with Xe3p_LPD, the VBT has a new field, called in the driver
"dedicated_external", which tells that a Type-C capable port is
physically connected to a PHY outside of the Type-C subsystem.  When
that's the case, the driver must not do the extra Type-C programming for
that port.  Update intel_encoder_is_tc() to check for that case.

While at it, add a note to intel_phy_is_tc() to remind us that it is
about whether the respective port is a Type-C capable port rather than
the PHY itself.

(Maybe it would be a nice idea to rename intel_phy_is_tc()?)

Note that this was handled with a new bool member added to struct
intel_digital_port instead of having querying the VBT directly because
VBT memory is freed (intel_bios_driver_remove) before encoder cleanup
(intel_ddi_encoder_destroy), which would cause an oops to happen when
the latter calls intel_encoder_is_tc().  This could be fixed by keeping
VBT data around longer, but that's left for a follow-up work, if deemed
necessary.

v2:
  - Drop printing info about dedicated external, now that we are doing
    it when parsing the VBT. (Jani)
  - Add a FIXME comment on the code explaining why we need to store
    dedicated_external in struct intel_digital_port. (Jani)
v3:
  - Simplify the code by using NULL check for dig_port to avoid using
    intel_encoder_is_dig_port(). (Imre)

Cc: Imre Deak <imre.deak@intel.com>
Cc: Jani Nikula <jani.nikula@linux.intel.com>
Cc: Shekhar Chauhan <shekhar.chauhan@intel.com>
Signed-off-by: Gustavo Sousa <gustavo.sousa@intel.com>
Reviewed-by: Imre Deak <imre.deak@intel.com>
---
 drivers/gpu/drm/i915/display/intel_ddi.c         | 11 +++++++++++
 drivers/gpu/drm/i915/display/intel_display.c     | 16 +++++++++++++++-
 .../gpu/drm/i915/display/intel_display_types.h   |  1 +
 3 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
index a83a4200e631..cb91d07cdaa6 100644
--- a/drivers/gpu/drm/i915/display/intel_ddi.c
+++ b/drivers/gpu/drm/i915/display/intel_ddi.c
@@ -5423,6 +5423,17 @@ void intel_ddi_init(struct intel_display *display,
 			goto err;
 	}
 
+	/*
+	 * FIXME: We currently need to store dedicated_external because devdata
+	 * does not live long enough for when intel_encoder_is_tc() is called on
+	 * the unbind path.  This needs to be fixed by making sure that the VBT
+	 * data is kept long enough, so that
+	 * intel_bios_encoder_is_dedicated_external() can be called directly
+	 * from intel_encoder_is_tc().
+	 */
+	if (intel_bios_encoder_is_dedicated_external(devdata))
+		dig_port->dedicated_external = true;
+
 	if (intel_encoder_is_tc(encoder)) {
 		bool is_legacy =
 			!intel_bios_encoder_supports_typec_usb(devdata) &&
diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 5563ff7ee10e..de8ae14e06cd 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -1810,7 +1810,17 @@ bool intel_phy_is_combo(struct intel_display *display, enum phy phy)
 		return false;
 }
 
-/* Prefer intel_encoder_is_tc() */
+/*
+ * This function returns true if the DDI port respective to the PHY enumeration
+ * is a Type-C capable port.
+ *
+ * Depending on the VBT, the port might be configured
+ * as a "dedicated external" port, meaning that actual physical PHY is outside
+ * of the Type-C subsystem and, as such, not really a "Type-C PHY".
+ *
+ * Prefer intel_encoder_is_tc(), especially if you really need to know if we
+ * are dealing with Type-C connections.
+ */
 bool intel_phy_is_tc(struct intel_display *display, enum phy phy)
 {
 	/*
@@ -1909,6 +1919,10 @@ bool intel_encoder_is_snps(struct intel_encoder *encoder)
 bool intel_encoder_is_tc(struct intel_encoder *encoder)
 {
 	struct intel_display *display = to_intel_display(encoder);
+	struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
+
+	if (dig_port && dig_port->dedicated_external)
+		return false;
 
 	return intel_phy_is_tc(display, intel_encoder_to_phy(encoder));
 }
diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
index ed0f7448e6cd..f8f7bc956214 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1936,6 +1936,7 @@ struct intel_digital_port {
 	bool lane_reversal;
 	bool ddi_a_4_lanes;
 	bool release_cl2_override;
+	bool dedicated_external;
 	u8 max_lanes;
 	/* Used for DP and ICL+ TypeC/DP and TypeC/HDMI ports. */
 	enum aux_ch aux_ch;
-- 
2.51.0


  parent reply	other threads:[~2025-12-02  1:23 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-12-02  1:22 [PATCH v6 0/8] drm/i915/display: Add initial support Xe3p_LPD Matt Atwood
2025-12-02  1:22 ` [PATCH v6 1/8] drm/i915/vbt: Add fields dedicated_external and dyn_port_over_tc Matt Atwood
2025-12-02  1:23 ` [PATCH v6 2/8] drm/i915/power: Use intel_encoder_is_tc() Matt Atwood
2025-12-02  1:23 ` Matt Atwood [this message]
2025-12-02  1:23 ` [PATCH v6 4/8] drm/i915/xe3p_lpd: Handle underrun debug bits Matt Atwood
2025-12-02 18:11   ` Matt Roper
2025-12-02  1:23 ` [PATCH v6 5/8] drm/i915/nvls: Add NVL-S display support Matt Atwood
2025-12-02  1:23 ` [PATCH v6 6/8] drm/i915/display: Use platform check in HAS_LT_PHY() Matt Atwood
2025-12-02  1:23 ` [PATCH v6 7/8] drm/i915/display: Move HAS_LT_PHY() to intel_display_device.h Matt Atwood
2025-12-02  1:23 ` [PATCH v6 8/8] drm/i915/display: Use HAS_LT_PHY() for LT PHY AUX power Matt Atwood
2025-12-02  2:07 ` ✓ i915.CI.BAT: success for drm/i915/display: Add initial support Xe3p_LPD Patchwork
2025-12-02  3:26 ` ✓ i915.CI.Full: " 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=20251202012306.9315-4-matthew.s.atwood@intel.com \
    --to=matthew.s.atwood@intel.com \
    --cc=ankit.k.nautiyal@Intel.com \
    --cc=dnyaneshware.bhdane@intel.com \
    --cc=gustavo.sousa@intel.com \
    --cc=imre.deak@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=intel-xe@lists.freedesktop.org \
    --cc=jani.nikula@intel.com \
    --cc=jani.nikula@linux.intel.com \
    --cc=jouni.hogander@intel.com \
    --cc=juha-peka.heikkila@intel.com \
    --cc=luciano.coelho@intel.com \
    --cc=matthew.d.roper@intel.com \
    --cc=ravi.kumar.vodapalli@intel.com \
    --cc=sai.teja.pottumuttu@Intel.com \
    --cc=shekhar.chauhan@intel.com \
    --cc=suraj.kandapal@intel.com \
    --cc=ville.syrjala@linux.intel.com \
    --cc=vinod.govindapillai@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