From: Amit Sunil Dhamne <amitsd@google.com>
To: pip-izony <eeodqql09@gmail.com>,
Heikki Krogerus <heikki.krogerus@linux.intel.com>,
Guenter Roeck <linux@roeck-us.net>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Li Jun <jun.li@nxp.com>,
Kyungtae Kim <Kyungtae.Kim@dartmouth.edu>,
Badhri Jagan Sridharan <badhri@google.com>,
RD Babiera <rdbabiera@google.com>,
linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH RFC] usb: typec: tcpm: reject type-mismatched source/sink PDO pairs
Date: Wed, 23 Sep 2026 16:40:21 -0700 [thread overview]
Message-ID: <4e21dd18-1988-4eda-82cd-4dd64620fef7@google.com> (raw)
In-Reply-To: <20260923170301.415666-3-eeodqql09@gmail.com>
Hi Seungjin,
On 9/23/26 10:03 AM, pip-izony wrote:
> From: Seungjin Bae <eeodqql09@gmail.com>
>
> The tcpm_pd_select_pdo() function matches a source PDO against a sink
> PDO using their voltage ranges only, without checking that the two
> PDOs are of the same type. A source PDO and a sink PDO of different
> types (e.g. a Battery source PDO and a Fixed sink PDO) can therefore
> be matched as long as their voltage ranges overlap.
>
> tcpm_pd_build_request() then combines the matched pair with
> min_power()/min_current(), which apply the same accessor to both
> operands. Since pdo_max_current() and pdo_max_power() decode the same
> bits (9:0) with different scaling (x10 mA vs x250 mW), a type-mismatched
> sink operand is misinterpreted. This misreads the sink's capability and
> weakens the min() bound intended to cap the request to the sink's limit.
>
> Require the source and sink PDO types to match before a pair is
> selected.
IMO, you can finish the commit message here. The following bit feels a
little repetitive.
This keeps the voltage-range matching introduced by commit
> 53fe0de9a35d ("usb: typec: tcpm: pdo matching optimization") and covers
> both the min() computation and the mismatch branch in
> tcpm_pd_build_request().
>
> I found this by static analysis and have not observed it on hardware, so
> I am sending it as RFC.
Do not include the above ^ sentence in a commit message. It can go in
the "under the cut" section. Also, you can document any tools used using
the "Assisted-by:" tag.
>
> Fixes: 53fe0de9a35d ("usb: typec: tcpm: pdo matching optimization")
> Signed-off-by: Seungjin Bae <eeodqql09@gmail.com>
Please CC stable when you send the actual patch (the non-RFC one).
> ---
> drivers/usb/typec/tcpm/tcpm.c | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
> index 2d6b14aa2085..4959872050ae 100644
> --- a/drivers/usb/typec/tcpm/tcpm.c
> +++ b/drivers/usb/typec/tcpm/tcpm.c
> @@ -4514,8 +4514,9 @@ static int tcpm_pd_select_pdo(struct tcpm_port *port, int *sink_pdo,
> continue;
> }
>
> - if (max_src_mv <= max_snk_mv &&
> - min_src_mv >= min_snk_mv) {
> + if (pdo_type(port->source_caps[i]) == pdo_type(pdo) &&
nit: we could just use type instead of pdo_type(port->source_caps[i])?
From a technical standpoint the USB PD 3.2 spec does not explicitly
prohibit mix type matching. Say, if we match a fixed snk pdo with the
source's variable type pdo (the rdo structure is the same). However, it
could have potential issues (instability). For the rest of the PDO types
the rdo structure is different so obviously you can't match them. It
shouldn't impact our Pixel user. But I can't say about the others
especially considering the patch you intended to fix introduced the type
matching when types were mismatched:
https://lore.kernel.org/all/1521817127-23061-1-git-send-email-jun.li@nxp.com/
Thanks,
Amit
> + max_src_mv <= max_snk_mv &&
> + min_src_mv >= min_snk_mv) {
> /* Prefer higher voltages if available */
> if ((src_mw == max_mw && min_src_mv > max_mv) ||
> src_mw > max_mw) {
prev parent reply other threads:[~2026-09-23 23:40 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-20 21:29 usb: typec: tcpm: type-mismatched PDO handling in tcpm_pd_build_request() Seungjin Bae
2026-09-22 11:15 ` Heikki Krogerus
2026-09-22 17:34 ` Seungjin Bae
2026-09-23 17:03 ` [PATCH RFC] usb: typec: tcpm: reject type-mismatched source/sink PDO pairs pip-izony
2026-09-23 23:40 ` Amit Sunil Dhamne [this message]
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=4e21dd18-1988-4eda-82cd-4dd64620fef7@google.com \
--to=amitsd@google.com \
--cc=Kyungtae.Kim@dartmouth.edu \
--cc=badhri@google.com \
--cc=eeodqql09@gmail.com \
--cc=gregkh@linuxfoundation.org \
--cc=heikki.krogerus@linux.intel.com \
--cc=jun.li@nxp.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=linux@roeck-us.net \
--cc=rdbabiera@google.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®