Quoting Imre Deak (2025-11-12 10:20:31-03:00)
>On Wed, Nov 12, 2025 at 10:00:27AM -0300, Gustavo Sousa wrote:
>> Quoting Imre Deak (2025-11-11 13:15:41-03:00)
>> >On Tue, Nov 11, 2025 at 06:02:31PM +0200, Imre Deak wrote:
>> >> On Fri, Nov 07, 2025 at 09:05:35PM -0300, Gustavo Sousa wrote:
>> >> > VBT version 264 adds new fields associated to Xe3p_LPD's new ways of
>> >> > configuring SoC for TC ports and PHYs.  Update the code to match the
>> >> > updates in VBT.
>> >> > 
>> >> > The new field dedicated_external is used to represent TC ports that are
>> >> > connected to PHYs outside of the Type-C subsystem, meaning that they
>> >> > behave like dedicated ports and don't require the extra Type-C
>> >> > programming.  In an upcoming change, we will update the driver to take
>> >> > this field into consideration when detecting the type of port.
>> >> > 
>> >> > The new field dyn_port_over_tc is used to inform that the TC port can be
>> >> > dynamically allocated for a legacy connector in the Type-C subsystem,
>> >> > which is a new feature in Xe3p_LPD.  In upcoming changes, we will use
>> >> > that field in order to handle the IOM resource management programming
>> >> > required for that.
>> >> > 
>> >> > Note that, when dedicated_external is set, the fields dp_usb_type_c and
>> >> > tbt are tagged as "don't care" in the spec, so they should be ignored in
>> >> > that case, so also add a sanitization function to take care of forcing
>> >> > them to zero when dedicated_external is true.
>> >> > 
>> >> > v2:
>> >> >   - Use sanitization function to force dp_usb_type_c and tbt fields to
>> >> >     be zero instead of adding a
>> >> >     intel_bios_encoder_is_dedicated_external() check in each of their
>> >> >     respective accessor functions. (Jani)
>> >> >   - Print info about dedicated external ports in print_ddi_port().
>> >> >     (Jani)
>> >> > 
>> >> > Bspec: 20124, 68954, 74304
>> >> > Cc: Jani Nikula <[email protected]>
>> >> > Cc: Shekhar Chauhan <[email protected]>
>> >> > Signed-off-by: Gustavo Sousa <[email protected]>
>> >> > ---
>> >> >  drivers/gpu/drm/i915/display/intel_bios.c     | 54 
>> >> > ++++++++++++++++++++++++++-
>> >> >  drivers/gpu/drm/i915/display/intel_bios.h     |  2 +
>> >> >  drivers/gpu/drm/i915/display/intel_vbt_defs.h |  3 +-
>> >> >  3 files changed, 56 insertions(+), 3 deletions(-)
>> >> > 
>> >> > diff --git a/drivers/gpu/drm/i915/display/intel_bios.c 
>> >> > b/drivers/gpu/drm/i915/display/intel_bios.c
>> >> > index 852e4d6db8a3..1487d5e5a69d 100644
>> >> > --- a/drivers/gpu/drm/i915/display/intel_bios.c
>> >> > +++ b/drivers/gpu/drm/i915/display/intel_bios.c
>> >> > @@ -2530,6 +2530,36 @@ intel_bios_encoder_reject_edp_rate(const struct 
>> >> > intel_bios_encoder_data *devdata
>> >> >          return devdata->child.edp_data_rate_override & 
>> >> > edp_rate_override_mask(rate);
>> >> >  }
>> >> >  
>> >> > +static void sanitize_dedicated_external(struct intel_bios_encoder_data 
>> >> > *devdata,
>> >> > +                                        enum port port)
>> >> > +{
>> >> > +        struct intel_display *display = devdata->display;
>> >> > +
>> >> > +        if (!intel_bios_encoder_is_dedicated_external(devdata))
>> >> > +                return;
>> >> > +
>> >> > +        /*
>> >> > +         * Fields dp_usb_type_c and tbt must be ignored when
>> >> > +         * dedicated_external is set.  Since dedicated_external is for
>> >> > +         * ports connected to PHYs outside of the Type-C subsystem, it
>> >> > +         * is safe to force those fields to zero.
>> >> > +         */
>> >
>> >Forgot this: IIUC dyn_port_over_tc doesn't make either sense for a
>> >dedicated external port. IOW, a dedicated port/PHY is not enabled by the
>> >TypeC sequences defined at bspec/68954 and so for such a port/PHY the
>> >DDI->PHY mapping is always 1:1 and so the corresponding DDI can't either
>> >be dynamically allocated to different PHYs. If that's a correct
>> >understanding, dyn_port_over_tc should be also verified/zeroed out here
>> >imo.
>> 
>> Yep, there shouldn't be any need for DDI allocation for dedicated
>> external ports.  However, we would only be checking for dyn_port_over_tc
>> when doing the Type-C flows, which would not happen for a dedicated
>> external port.  Give that, do you think we need to add the extra check
>> here?
>>
>> The main reason we are adding those checks below is because the VBT spec
>> marks those bits as "don't care" when dedicated_external is set.
>
>Right. To me, the interdependencies of these flags in VBT are a bit
>complex. We are reflecting now about the above dependency, which is
>good, since we'll at least agree then how these flags are supposed to
>work. Imo it should've been also documented more explicitly in Bspec,
>similarly to the DP-alt and TBT "don't care" documentation.
>
>With all that, at least a code comment would be good about this for a
>future reader, but even the verify/zeroing would be useful imo, in case
>there is a VBT setting the flags contrary to our assumptions (that would
>remind us then to figure out if our or the VBT authors' assumptions were
>wrong).
>
>It's a detail only, I'm not insisting on either of the above, so up to
>you (maybe you'd only update it in case you have to resend the patch
>anyway or stg).

I'll have a new version of this series and I added the logic to zero out
dyn_port_over_tc as well.  Thanks!

>
>> --
>> Gustavo Sousa
>> 
>> >
>> >> > +
>> >> > +        if (devdata->child.dp_usb_type_c) {
>> >> > +                drm_dbg_kms(display->drm,
>> >> > +                            "VBT claims Port %c supports USB Type-C, 
>> >> > but the port is dedicated external, ignoring\n",
>> >> > +                            port_name(port));
>> >> > +                devdata->child.dp_usb_type_c = 0;
>> >> > +        }
>> >> > +
>> >> > +        if (devdata->child.tbt) {
>> >> > +                drm_dbg_kms(display->drm,
>> >> > +                            "VBT claims Port %c supports TBT, but the 
>> >> > port is dedicated external, ignoring\n",
>> >> > +                            port_name(port));
>> >> > +                devdata->child.tbt = 0;
>> >> > +        }
>> >> > +}
>> >> > +
>> >> >  static void sanitize_device_type(struct intel_bios_encoder_data 
>> >> > *devdata,
>> >> >                                   enum port port)
>> >> >  {
>> >> > @@ -2668,7 +2698,8 @@ static void print_ddi_port(const struct 
>> >> > intel_bios_encoder_data *devdata)
>> >> >  {
>> >> >          struct intel_display *display = devdata->display;
>> >> >          const struct child_device_config *child = &devdata->child;
>> >> > -        bool is_dvi, is_hdmi, is_dp, is_edp, is_dsi, is_crt, 
>> >> > supports_typec_usb, supports_tbt;
>> >> > +        bool is_dvi, is_hdmi, is_dp, is_edp, is_dsi, is_crt, 
>> >> > supports_typec_usb,
>> >> > +                supports_tbt, dedicated_external;
>> >> >          int dp_boost_level, dp_max_link_rate, hdmi_boost_level, 
>> >> > hdmi_level_shift, max_tmds_clock;
>> >> >          enum port port;
>> >> >  
>> >> > @@ -2694,6 +2725,12 @@ static void print_ddi_port(const struct 
>> >> > intel_bios_encoder_data *devdata)
>> >> >                      supports_typec_usb, supports_tbt,
>> >> >                      devdata->dsc != NULL);
>> >> >  
>> >> > +        dedicated_external = 
>> >> > intel_bios_encoder_is_dedicated_external(devdata);
>> >> > +        if (dedicated_external)
>> >> 
>> >> Nit: the variable could be dropped imo, and would be good to print the
>> >> dyn_port_over_tc info as well. Either way:

Incorporated this into local v5.  Thanks!

--
Gustavo Sousa

>> >> 
>> >> Reviewed-by: Imre Deak <[email protected]>
>> >> 
>> >> > +                drm_dbg_kms(display->drm,
>> >> > +                            "Port %c is dedicated external\n",
>> >> > +                            port_name(port));
>> >> > +
>> >> >          hdmi_level_shift = intel_bios_hdmi_level_shift(devdata);
>> >> >          if (hdmi_level_shift >= 0) {
>> >> >                  drm_dbg_kms(display->drm,
>> >> > @@ -2751,6 +2788,7 @@ static void parse_ddi_port(struct 
>> >> > intel_bios_encoder_data *devdata)
>> >> >                  return;
>> >> >          }
>> >> >  
>> >> > +        sanitize_dedicated_external(devdata, port);
>> >> >          sanitize_device_type(devdata, port);
>> >> >          sanitize_hdmi_level_shift(devdata, port);
>> >> >  }
>> >> > @@ -2778,7 +2816,7 @@ static int child_device_expected_size(u16 version)
>> >> >  {
>> >> >          BUILD_BUG_ON(sizeof(struct child_device_config) < 40);
>> >> >  
>> >> > -        if (version > 263)
>> >> > +        if (version > 264)
>> >> >                  return -ENOENT;
>> >> >          else if (version >= 263)
>> >> >                  return 44;
>> >> > @@ -3723,6 +3761,18 @@ bool intel_bios_encoder_supports_tbt(const 
>> >> > struct intel_bios_encoder_data *devda
>> >> >          return devdata->display->vbt.version >= 209 && 
>> >> > devdata->child.tbt;
>> >> >  }
>> >> >  
>> >> > +bool intel_bios_encoder_is_dedicated_external(const struct 
>> >> > intel_bios_encoder_data *devdata)
>> >> > +{
>> >> > +        return devdata->display->vbt.version >= 264 &&
>> >> > +                devdata->child.dedicated_external;
>> >> > +}
>> >> > +
>> >> > +bool intel_bios_encoder_supports_dyn_port_over_tc(const struct 
>> >> > intel_bios_encoder_data *devdata)
>> >> > +{
>> >> > +        return devdata->display->vbt.version >= 264 &&
>> >> > +                devdata->child.dyn_port_over_tc;
>> >> > +}
>> >> > +
>> >> >  bool intel_bios_encoder_lane_reversal(const struct 
>> >> > intel_bios_encoder_data *devdata)
>> >> >  {
>> >> >          return devdata && devdata->child.lane_reversal;
>> >> > diff --git a/drivers/gpu/drm/i915/display/intel_bios.h 
>> >> > b/drivers/gpu/drm/i915/display/intel_bios.h
>> >> > index f9e438b2787b..75dff27b4228 100644
>> >> > --- a/drivers/gpu/drm/i915/display/intel_bios.h
>> >> > +++ b/drivers/gpu/drm/i915/display/intel_bios.h
>> >> > @@ -79,6 +79,8 @@ bool intel_bios_encoder_supports_dp(const struct 
>> >> > intel_bios_encoder_data *devdat
>> >> >  bool intel_bios_encoder_supports_edp(const struct 
>> >> > intel_bios_encoder_data *devdata);
>> >> >  bool intel_bios_encoder_supports_typec_usb(const struct 
>> >> > intel_bios_encoder_data *devdata);
>> >> >  bool intel_bios_encoder_supports_tbt(const struct 
>> >> > intel_bios_encoder_data *devdata);
>> >> > +bool intel_bios_encoder_is_dedicated_external(const struct 
>> >> > intel_bios_encoder_data *devdata);
>> >> > +bool intel_bios_encoder_supports_dyn_port_over_tc(const struct 
>> >> > intel_bios_encoder_data *devdata);
>> >> >  bool intel_bios_encoder_supports_dsi(const struct 
>> >> > intel_bios_encoder_data *devdata);
>> >> >  bool intel_bios_encoder_supports_dp_dual_mode(const struct 
>> >> > intel_bios_encoder_data *devdata);
>> >> >  bool intel_bios_encoder_is_lspcon(const struct intel_bios_encoder_data 
>> >> > *devdata);
>> >> > diff --git a/drivers/gpu/drm/i915/display/intel_vbt_defs.h 
>> >> > b/drivers/gpu/drm/i915/display/intel_vbt_defs.h
>> >> > index 70e31520c560..57fda5824c9c 100644
>> >> > --- a/drivers/gpu/drm/i915/display/intel_vbt_defs.h
>> >> > +++ b/drivers/gpu/drm/i915/display/intel_vbt_defs.h
>> >> > @@ -554,7 +554,8 @@ struct child_device_config {
>> >> >          u8 dvo_function;
>> >> >          u8 dp_usb_type_c:1;                                        /* 
>> >> > 195+ */
>> >> >          u8 tbt:1;                                                /* 
>> >> > 209+ */
>> >> > -        u8 flags2_reserved:2;                                        
>> >> > /* 195+ */
>> >> > +        u8 dedicated_external:1;                                /* 
>> >> > 264+ */
>> >> > +        u8 dyn_port_over_tc:1;                                        
>> >> > /* 264+ */
>> >> >          u8 dp_port_trace_length:4;                                /* 
>> >> > 209+ */
>> >> >          u8 dp_gpio_index;                                        /* 
>> >> > 195+ */
>> >> >          u16 dp_gpio_pin_num;                                        /* 
>> >> > 195+ */
>> >> > 
>> >> > -- 
>> >> > 2.51.0
>> >> >

Reply via email to