* [PATCH v1 0/3] Restrict alternate modes based on cable capabilities
@ 2026-06-11 12:21 Andrei Kuchynski
2026-06-11 12:21 ` [PATCH v1 1/3] usb: typec: Add helper to check cable altmode support Andrei Kuchynski
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Andrei Kuchynski @ 2026-06-11 12:21 UTC (permalink / raw)
To: Heikki Krogerus
Cc: Greg Kroah-Hartman, linux-usb, linux-kernel, Andrei Kuchynski
Currently, alternate mode drivers (like DisplayPort and Thunderbolt)
automatically assign operational callbacks (`typec_altmode_set_ops`)
during probing, even if the underlying cable capabilities cannot support
them. This can lead to incorrectly advertised state configurations or
initialization failures later on.
The first patch introduces the core helper function, and the subsequent
patches update the DisplayPort and Thunderbolt altmode drivers to
utilize this check during their respective probe phases.
Andrei Kuchynski (3):
usb: typec: Add helper to check cable altmode support
usb: typec: thunderbolt: Check cable altmode support
usb: typec: displayport: Check cable altmode support
drivers/usb/typec/altmodes/displayport.c | 5 +++-
drivers/usb/typec/altmodes/thunderbolt.c | 4 +++
drivers/usb/typec/class.c | 35 ++++++++++++++++++++++++
include/linux/usb/typec.h | 1 +
4 files changed, 44 insertions(+), 1 deletion(-)
--
2.54.0.1099.g489fc7bff1-goog
^ permalink raw reply [flat|nested] 5+ messages in thread* [PATCH v1 1/3] usb: typec: Add helper to check cable altmode support 2026-06-11 12:21 [PATCH v1 0/3] Restrict alternate modes based on cable capabilities Andrei Kuchynski @ 2026-06-11 12:21 ` Andrei Kuchynski 2026-06-11 18:47 ` Benson Leung 2026-06-11 12:21 ` [PATCH v1 2/3] usb: typec: thunderbolt: Check " Andrei Kuchynski 2026-06-11 12:21 ` [PATCH v1 3/3] usb: typec: displayport: " Andrei Kuchynski 2 siblings, 1 reply; 5+ messages in thread From: Andrei Kuchynski @ 2026-06-11 12:21 UTC (permalink / raw) To: Heikki Krogerus Cc: Greg Kroah-Hartman, linux-usb, linux-kernel, Andrei Kuchynski Introduce typec_cable_altmode_unsupported function to evaluate whether an alternate mode is restricted based on the connected cable's properties. Implement validation logic that parses the cable's identity to catch incompatible setups early. Alternate modes are restricted over: - cables lacking an identity header - passive cables with USB 2.0 speed - active cables unless they have corresponding plugs The function returns false if the cable is not registered or the identifier is not set. Signed-off-by: Andrei Kuchynski <akuchynski@chromium.org> --- drivers/usb/typec/class.c | 35 +++++++++++++++++++++++++++++++++++ include/linux/usb/typec.h | 1 + 2 files changed, 36 insertions(+) diff --git a/drivers/usb/typec/class.c b/drivers/usb/typec/class.c index 0977581ad1b6e..f7f1adbaab7e6 100644 --- a/drivers/usb/typec/class.c +++ b/drivers/usb/typec/class.c @@ -1429,6 +1429,41 @@ int typec_cable_is_active(struct typec_cable *cable) } EXPORT_SYMBOL_GPL(typec_cable_is_active); +/** + * typec_cable_altmode_unsupported - Check if a cable restricts altmode + * @alt: The Alternate Mode to evaluate + * + * Returns true if the connected cable is incapable of handling the altmode. + */ +bool typec_cable_altmode_unsupported(struct typec_altmode *alt) +{ + struct typec_altmode *plug; + struct typec_cable *cable; + bool unsupported = false; + + plug = typec_altmode_get_plug(alt, TYPEC_PLUG_SOP_P); + if (plug) { + typec_altmode_put_plug(plug); + return false; + } + + cable = typec_cable_get(typec_altmode2port(alt)); + if (cable && cable->identity) { + const u32 id_header = cable->identity->id_header; + const u32 speed = VDO_TYPEC_CABLE_SPEED(cable->identity->vdo[0]); + + if (!id_header || PD_IDH_PTYPE(id_header) == IDH_PTYPE_ACABLE) + unsupported = true; + else if (PD_IDH_PTYPE(id_header) == IDH_PTYPE_PCABLE) + unsupported = (speed == CABLE_USB2_ONLY); + } + if (cable) + typec_cable_put(cable); + + return unsupported; +} +EXPORT_SYMBOL_GPL(typec_cable_altmode_unsupported); + /** * typec_cable_set_identity - Report result from Discover Identity command * @cable: The cable updated identity values diff --git a/include/linux/usb/typec.h b/include/linux/usb/typec.h index d61ec38216fa9..10a783b738efd 100644 --- a/include/linux/usb/typec.h +++ b/include/linux/usb/typec.h @@ -337,6 +337,7 @@ void typec_unregister_cable(struct typec_cable *cable); struct typec_cable *typec_cable_get(struct typec_port *port); void typec_cable_put(struct typec_cable *cable); int typec_cable_is_active(struct typec_cable *cable); +bool typec_cable_altmode_unsupported(struct typec_altmode *alt); struct typec_plug *typec_register_plug(struct typec_cable *cable, struct typec_plug_desc *desc); -- 2.54.0.1099.g489fc7bff1-goog ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v1 1/3] usb: typec: Add helper to check cable altmode support 2026-06-11 12:21 ` [PATCH v1 1/3] usb: typec: Add helper to check cable altmode support Andrei Kuchynski @ 2026-06-11 18:47 ` Benson Leung 0 siblings, 0 replies; 5+ messages in thread From: Benson Leung @ 2026-06-11 18:47 UTC (permalink / raw) To: Andrei Kuchynski Cc: Heikki Krogerus, Greg Kroah-Hartman, linux-usb, linux-kernel [-- Attachment #1: Type: text/plain, Size: 4612 bytes --] On Thu, Jun 11, 2026 at 12:21:44PM +0000, Andrei Kuchynski wrote: > Introduce typec_cable_altmode_unsupported function to evaluate whether an > alternate mode is restricted based on the connected cable's properties. > > Implement validation logic that parses the cable's identity to catch > incompatible setups early. Alternate modes are restricted over: I think I follow this logic, and it is correct, but it may be harder to understand for a passing code observer who aren't deeply versed in how USB-C cables work. I think maybe additional comments on each of these resolution cases may be helpful. > - cables lacking an identity header Cable lacking an ID Header indicates a non-emarked cable, which in the case of a detachable C-to-C cable, can only be guaranteed to have USB 2.0 data path (D+ and D-). > - passive cables with USB 2.0 speed In this case, it's an affirmative confirmation from an e-marked cable (ID Header present, rest of e-mark present), we are sure it's a USB 2.0-only cable. > - active cables unless they have corresponding plugs This case is a little bit nuanced. The "corresponding plugs" means that this cable has an e-marker, supports modal operation, and the SOP' alt mode nodes are created. You're looking for a 1:1 match based on SVIDs that this cable has support for the alt mode being queried here. If yes, then alt mode is supported. If there's no match, then the alt mode is unsupported. > > The function returns false if the cable is not registered or the identifier > is not set. > > Signed-off-by: Andrei Kuchynski <akuchynski@chromium.org> > --- > drivers/usb/typec/class.c | 35 +++++++++++++++++++++++++++++++++++ > include/linux/usb/typec.h | 1 + > 2 files changed, 36 insertions(+) > > diff --git a/drivers/usb/typec/class.c b/drivers/usb/typec/class.c > index 0977581ad1b6e..f7f1adbaab7e6 100644 > --- a/drivers/usb/typec/class.c > +++ b/drivers/usb/typec/class.c > @@ -1429,6 +1429,41 @@ int typec_cable_is_active(struct typec_cable *cable) > } > EXPORT_SYMBOL_GPL(typec_cable_is_active); > > +/** > + * typec_cable_altmode_unsupported - Check if a cable restricts altmode > + * @alt: The Alternate Mode to evaluate > + * > + * Returns true if the connected cable is incapable of handling the altmode. > + */ > +bool typec_cable_altmode_unsupported(struct typec_altmode *alt) > +{ > + struct typec_altmode *plug; > + struct typec_cable *cable; > + bool unsupported = false; > + > + plug = typec_altmode_get_plug(alt, TYPEC_PLUG_SOP_P); > + if (plug) { In this case, we have an affirmative match on alt mode being queried, so the cable supports this alt mode, which is why you return false, meaning alt mode is supported. > + typec_altmode_put_plug(plug); > + return false; > + } > + Past this point, there is no SOP' alt mode object matching the alt mode. The only way to return supported is if we find the cable is a passive cable of at least USB3 Gen 1 or better speed. > + cable = typec_cable_get(typec_altmode2port(alt)); > + if (cable && cable->identity) { > + const u32 id_header = cable->identity->id_header; > + const u32 speed = VDO_TYPEC_CABLE_SPEED(cable->identity->vdo[0]); > + > + if (!id_header || PD_IDH_PTYPE(id_header) == IDH_PTYPE_ACABLE) > + unsupported = true; > + else if (PD_IDH_PTYPE(id_header) == IDH_PTYPE_PCABLE) > + unsupported = (speed == CABLE_USB2_ONLY); This might be a little easier to follow if this was a switch statement on PD_IDH_PTYPE(id_header) so the reader can see what different behavior is between PCABLE and ACABLE. > + } > + if (cable) > + typec_cable_put(cable); > + > + return unsupported; > +} > +EXPORT_SYMBOL_GPL(typec_cable_altmode_unsupported); > + > /** > * typec_cable_set_identity - Report result from Discover Identity command > * @cable: The cable updated identity values > diff --git a/include/linux/usb/typec.h b/include/linux/usb/typec.h > index d61ec38216fa9..10a783b738efd 100644 > --- a/include/linux/usb/typec.h > +++ b/include/linux/usb/typec.h > @@ -337,6 +337,7 @@ void typec_unregister_cable(struct typec_cable *cable); > struct typec_cable *typec_cable_get(struct typec_port *port); > void typec_cable_put(struct typec_cable *cable); > int typec_cable_is_active(struct typec_cable *cable); > +bool typec_cable_altmode_unsupported(struct typec_altmode *alt); > > struct typec_plug *typec_register_plug(struct typec_cable *cable, > struct typec_plug_desc *desc); > -- > 2.54.0.1099.g489fc7bff1-goog > > [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 228 bytes --] ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v1 2/3] usb: typec: thunderbolt: Check cable altmode support 2026-06-11 12:21 [PATCH v1 0/3] Restrict alternate modes based on cable capabilities Andrei Kuchynski 2026-06-11 12:21 ` [PATCH v1 1/3] usb: typec: Add helper to check cable altmode support Andrei Kuchynski @ 2026-06-11 12:21 ` Andrei Kuchynski 2026-06-11 12:21 ` [PATCH v1 3/3] usb: typec: displayport: " Andrei Kuchynski 2 siblings, 0 replies; 5+ messages in thread From: Andrei Kuchynski @ 2026-06-11 12:21 UTC (permalink / raw) To: Heikki Krogerus Cc: Greg Kroah-Hartman, linux-usb, linux-kernel, Andrei Kuchynski Update the probe function to utilize the new typec_cable_altmode_unsupported() helper. If the cable doesn't support Thunderbolt altmode, don't initialize altmode_ops and prevent altmode from being activated. Signed-off-by: Andrei Kuchynski <akuchynski@chromium.org> --- drivers/usb/typec/altmodes/thunderbolt.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/usb/typec/altmodes/thunderbolt.c b/drivers/usb/typec/altmodes/thunderbolt.c index 32250b94262a9..2eccdddf1b1f4 100644 --- a/drivers/usb/typec/altmodes/thunderbolt.c +++ b/drivers/usb/typec/altmodes/thunderbolt.c @@ -284,6 +284,10 @@ static int tbt_altmode_probe(struct typec_altmode *alt) alt->desc = "Thunderbolt3"; typec_altmode_set_drvdata(alt, tbt); + + if (typec_cable_altmode_unsupported(alt)) + return 0; + typec_altmode_set_ops(alt, &tbt_altmode_ops); if (!alt->mode_selection && tbt_ready(alt)) { -- 2.54.0.1099.g489fc7bff1-goog ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v1 3/3] usb: typec: displayport: Check cable altmode support 2026-06-11 12:21 [PATCH v1 0/3] Restrict alternate modes based on cable capabilities Andrei Kuchynski 2026-06-11 12:21 ` [PATCH v1 1/3] usb: typec: Add helper to check cable altmode support Andrei Kuchynski 2026-06-11 12:21 ` [PATCH v1 2/3] usb: typec: thunderbolt: Check " Andrei Kuchynski @ 2026-06-11 12:21 ` Andrei Kuchynski 2 siblings, 0 replies; 5+ messages in thread From: Andrei Kuchynski @ 2026-06-11 12:21 UTC (permalink / raw) To: Heikki Krogerus Cc: Greg Kroah-Hartman, linux-usb, linux-kernel, Andrei Kuchynski Update the probe function to utilize the new typec_cable_altmode_unsupported() helper. If the cable doesn't support DisplayPort altmode, don't initialize altmode_ops and prevent altmode from being activated. A captive cable shouldn't be checked; it may not provide discoverable capability information, but it is inherently designed to support the device's requirements. Signed-off-by: Andrei Kuchynski <akuchynski@chromium.org> --- drivers/usb/typec/altmodes/displayport.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/usb/typec/altmodes/displayport.c b/drivers/usb/typec/altmodes/displayport.c index 263a89c5f3243..5ee33a69b9cf7 100644 --- a/drivers/usb/typec/altmodes/displayport.c +++ b/drivers/usb/typec/altmodes/displayport.c @@ -790,7 +790,6 @@ int dp_altmode_probe(struct typec_altmode *alt) dp->alt = alt; alt->desc = "DisplayPort"; - typec_altmode_set_ops(alt, &dp_altmode_ops); if (plug) { plug->desc = "Displayport"; @@ -811,6 +810,10 @@ int dp_altmode_probe(struct typec_altmode *alt) if (plug) typec_altmode_set_drvdata(plug, dp); + if ((alt->vdo & DP_CAP_RECEPTACLE) && typec_cable_altmode_unsupported(alt)) + return 0; + + typec_altmode_set_ops(alt, &dp_altmode_ops); if (!alt->mode_selection) { dp->state = plug ? DP_STATE_ENTER_PRIME : DP_STATE_ENTER; schedule_work(&dp->work); -- 2.54.0.1099.g489fc7bff1-goog ^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-06-11 18:47 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-06-11 12:21 [PATCH v1 0/3] Restrict alternate modes based on cable capabilities Andrei Kuchynski 2026-06-11 12:21 ` [PATCH v1 1/3] usb: typec: Add helper to check cable altmode support Andrei Kuchynski 2026-06-11 18:47 ` Benson Leung 2026-06-11 12:21 ` [PATCH v1 2/3] usb: typec: thunderbolt: Check " Andrei Kuchynski 2026-06-11 12:21 ` [PATCH v1 3/3] usb: typec: displayport: " Andrei Kuchynski
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.