Quoting Imre Deak (2025-11-12 13:19:07-03:00)
>On Fri, Nov 07, 2025 at 09:05:36PM -0300, Gustavo Sousa wrote:
>> Starting with Xe3p_LPD, when intel_phy_is_tc() returns true, it does
>> not necessarily mean that the port is connected to a PHY in the Type-C
>> subsystem. The reason is that there is now a VBT field called
>> dedicated_external that will indicate that a Type-C capable port is
>> connected to a (most likely) combo/dedicated PHY. When that's the case,
>> we must not do the extra programming required for Type-C connections.
>>
>> In an upcoming change, we will modify intel_encoder_is_tc() to take the
>> VBT field dedicated_external into consideration. Update
>> intel_display_power_well.c to use that function instead of
>> intel_phy_is_tc().
>>
>> Note that, even though icl_aux_power_well_{enable,disable} are not part
>> of Xe3p_LPD's display paths, we modify them anyway for uniformity.
>>
>> Cc: Shekhar Chauhan <[email protected]>
>> Reviewed-by: Suraj Kandpal <[email protected]>
>> Signed-off-by: Gustavo Sousa <[email protected]>
>> ---
>> .../drm/i915/display/intel_display_power_well.c | 26
>> +++++++++++++++-------
>> 1 file changed, 18 insertions(+), 8 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/display/intel_display_power_well.c
>> b/drivers/gpu/drm/i915/display/intel_display_power_well.c
>> index eab7019f2252..1485fc65ab87 100644
>> --- a/drivers/gpu/drm/i915/display/intel_display_power_well.c
>> +++ b/drivers/gpu/drm/i915/display/intel_display_power_well.c
>> @@ -258,8 +258,9 @@ aux_ch_to_digital_port(struct intel_display *display,
>> return NULL;
>> }
>>
>> -static enum phy icl_aux_pw_to_phy(struct intel_display *display,
>> - const struct i915_power_well *power_well)
>> +static struct intel_encoder *
>> +icl_aux_pw_to_encoder(struct intel_display *display,
>> + const struct i915_power_well *power_well)
>> {
>> enum aux_ch aux_ch = icl_aux_pw_to_ch(power_well);
>> struct intel_digital_port *dig_port =
>> aux_ch_to_digital_port(display, aux_ch);
>> @@ -271,7 +272,15 @@ static enum phy icl_aux_pw_to_phy(struct intel_display
>> *display,
>> * as HDMI-only and routed to a combo PHY, the encoder either won't
>> be
>> * present at all or it will not have an aux_ch assigned.
>> */
>> - return dig_port ? intel_encoder_to_phy(&dig_port->base) : PHY_NONE;
>> + return dig_port ? &dig_port->base : NULL;
>> +}
>> +
>> +static enum phy icl_aux_pw_to_phy(struct intel_display *display,
>> + const struct i915_power_well *power_well)
>> +{
>> + struct intel_encoder *encoder = icl_aux_pw_to_encoder(display,
>> power_well);
>> +
>> + return encoder ? intel_encoder_to_phy(encoder) : PHY_NONE;
>> }
>>
>> static void hsw_wait_for_power_well_enable(struct intel_display *display,
>> @@ -570,9 +579,9 @@ static void
>> icl_aux_power_well_enable(struct intel_display *display,
>> struct i915_power_well *power_well)
>> {
>> - enum phy phy = icl_aux_pw_to_phy(display, power_well);
>> + struct intel_encoder *encoder = icl_aux_pw_to_encoder(display,
>> power_well);
>>
>> - if (intel_phy_is_tc(display, phy))
>> + if (encoder && intel_encoder_is_tc(encoder))
>
>Adding an icl_aux_pw_is_tc_phy(display, power_well) helper would
>simplify things avoiding the need to retrieve the encoder.
Ack.
--
Gustavo Sousa
>
>> return icl_tc_phy_aux_power_well_enable(display,
>> power_well);
>> else if (display->platform.icelake)
>> return icl_combo_phy_aux_power_well_enable(display,
>> @@ -585,9 +594,9 @@ static void
>> icl_aux_power_well_disable(struct intel_display *display,
>> struct i915_power_well *power_well)
>> {
>> - enum phy phy = icl_aux_pw_to_phy(display, power_well);
>> + struct intel_encoder *encoder = icl_aux_pw_to_encoder(display,
>> power_well);
>>
>> - if (intel_phy_is_tc(display, phy))
>> + if (encoder && intel_encoder_is_tc(encoder))
>> return hsw_power_well_disable(display, power_well);
>> else if (display->platform.icelake)
>> return icl_combo_phy_aux_power_well_disable(display,
>> @@ -1849,10 +1858,11 @@ tgl_tc_cold_off_power_well_is_enabled(struct
>> intel_display *display,
>> static void xelpdp_aux_power_well_enable(struct intel_display *display,
>> struct i915_power_well *power_well)
>> {
>> + struct intel_encoder *encoder = icl_aux_pw_to_encoder(display,
>> power_well);
>> enum aux_ch aux_ch =
>> i915_power_well_instance(power_well)->xelpdp.aux_ch;
>> enum phy phy = icl_aux_pw_to_phy(display, power_well);
>>
>> - if (intel_phy_is_tc(display, phy))
>> + if (encoder && intel_encoder_is_tc(encoder))
>> icl_tc_port_assert_ref_held(display, power_well,
>> aux_ch_to_digital_port(display,
>> aux_ch));
>>
>>
>> --
>> 2.51.0
>>