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
>>

Reply via email to