All of lore.kernel.org
 help / color / mirror / Atom feed
From: Benson Leung <bleung@google.com>
To: Andrei Kuchynski <akuchynski@chromium.org>
Cc: Heikki Krogerus <heikki.krogerus@linux.intel.com>,
	Benson Leung <bleung@chromium.org>,
	Jameson Thies <jthies@google.com>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3 1/3] usb: typec: Add helper to check cable altmode support
Date: Fri, 26 Jun 2026 18:34:45 +0000	[thread overview]
Message-ID: <aj7GRSeN1UrvtGdc@google.com> (raw)
In-Reply-To: <20260626142702.1941182-2-akuchynski@chromium.org>

[-- Attachment #1: Type: text/plain, Size: 4378 bytes --]

On Fri, Jun 26, 2026 at 02:27:00PM +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:
>  - 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.
> 
> Suggested-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
> Signed-off-by: Andrei Kuchynski <akuchynski@chromium.org>

Reviewed-by: Benson Leung <bleung@chromium.org>


> ---
> Changes in V3:
> - Extracted core verification logic into a static helper function
> - Added an enum to handle supported, unsupported, and unknown cable states
> 
>  drivers/usb/typec/class.c | 71 +++++++++++++++++++++++++++++++++++++++
>  include/linux/usb/typec.h |  1 +
>  2 files changed, 72 insertions(+)
> 
> diff --git a/drivers/usb/typec/class.c b/drivers/usb/typec/class.c
> index 0977581ad1b6e..e9f34eb14ceff 100644
> --- a/drivers/usb/typec/class.c
> +++ b/drivers/usb/typec/class.c
> @@ -1429,6 +1429,77 @@ int typec_cable_is_active(struct typec_cable *cable)
>  }
>  EXPORT_SYMBOL_GPL(typec_cable_is_active);
>  
> +enum typec_cable_altmode_support {
> +	CABLE_SUPPORT_UNKNOWN,
> +	CABLE_SUPPORTED,
> +	CABLE_NOT_SUPPORTED,
> +};
> +
> +static enum typec_cable_altmode_support
> +typec_cable_check_altmode_support(struct typec_cable *cable,
> +				  struct typec_altmode *alt)
> +{
> +	struct typec_altmode *plug;
> +	u32 speed;
> +
> +	/*
> +	 * Check if the cable has an e-marker, supports modal operation, and the
> +	 * SOP' altmode nodes are created.
> +	 */
> +	plug = typec_altmode_get_plug(alt, TYPEC_PLUG_SOP_P);
> +	if (plug) {
> +		typec_altmode_put_plug(plug);
> +		return CABLE_SUPPORTED;
> +	}
> +
> +	/* The identity is not specified */
> +	if (!cable->identity)
> +		return CABLE_SUPPORT_UNKNOWN;
> +
> +	/* Non-e-marked cable */
> +	if (!cable->identity->id_header)
> +		return CABLE_NOT_SUPPORTED;
> +
> +	switch (PD_IDH_PTYPE(cable->identity->id_header)) {
> +	case IDH_PTYPE_PCABLE:
> +		speed = VDO_TYPEC_CABLE_SPEED(cable->identity->vdo[0]);
> +		if (speed == CABLE_USB2_ONLY)
> +			return CABLE_NOT_SUPPORTED;
> +		return CABLE_SUPPORTED;
> +	case IDH_PTYPE_ACABLE:
> +		/*
> +		 * Active cables must establish an SOP' communication
> +		 * node. Since that check failed at the beginning of
> +		 * this function, this active cable does not support
> +		 * this specific altmode.
> +		 */
> +		return CABLE_NOT_SUPPORTED;
> +	}
> +
> +	return CABLE_SUPPORT_UNKNOWN;
> +}
> +
> +/**
> + * 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)
> +{
> +	enum typec_cable_altmode_support support = CABLE_SUPPORT_UNKNOWN;
> +	struct typec_cable *cable;
> +
> +	cable = typec_cable_get(typec_altmode2port(alt));
> +	if (cable) {
> +		support = typec_cable_check_altmode_support(cable, alt);
> +		typec_cable_put(cable);
> +	}
> +
> +	return support == CABLE_NOT_SUPPORTED;
> +}
> +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.55.0.rc0.799.gd6f94ed593-goog
> 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

  reply	other threads:[~2026-06-26 18:34 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-06-26 14:26 [PATCH v3 0/3] Restrict alternate modes based on cable capabilities Andrei Kuchynski
2026-06-26 14:27 ` [PATCH v3 1/3] usb: typec: Add helper to check cable altmode support Andrei Kuchynski
2026-06-26 18:34   ` Benson Leung [this message]
2026-06-26 14:27 ` [PATCH v3 2/3] usb: typec: thunderbolt: Check " Andrei Kuchynski
2026-06-26 14:27 ` [PATCH v3 3/3] usb: typec: displayport: " Andrei Kuchynski

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=aj7GRSeN1UrvtGdc@google.com \
    --to=bleung@google.com \
    --cc=akuchynski@chromium.org \
    --cc=bleung@chromium.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=heikki.krogerus@linux.intel.com \
    --cc=jthies@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    /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 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.