From: Neil Armstrong <neil.armstrong@linaro.org>
To: Chen-Yu Tsai <wenst@chromium.org>
Cc: "Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
"Felipe Balbi" <balbi@kernel.org>,
"Rob Herring" <robh@kernel.org>,
"Krzysztof Kozlowski" <krzk+dt@kernel.org>,
"Conor Dooley" <conor+dt@kernel.org>,
linux-usb@vger.kernel.org, devicetree@vger.kernel.org,
"Kevin Hilman" <khilman@baylibre.com>,
"Jerome Brunet" <jbrunet@baylibre.com>,
"Martin Blumenstingl" <martin.blumenstingl@googlemail.com>,
"Sven Peter" <sven@kernel.org>, "Janne Grunau" <j@jannau.net>,
"Neal Gompa" <neal@gompa.dev>, "Joel Stanley" <joel@jms.id.au>,
"Andrew Jeffery" <andrew@codeconstruct.com.au>,
"Ryan Chen" <ryan_chen@aspeedtech.com>,
"Billy Tsai" <billy_tsai@aspeedtech.com>,
"Michal Simek" <michal.simek@amd.com>,
"Frank Li" <Frank.Li@nxp.com>,
"Sascha Hauer" <s.hauer@pengutronix.de>,
"Pengutronix Kernel Team" <kernel@pengutronix.de>,
"Fabio Estevam" <festevam@gmail.com>,
"Peter Griffin" <peter.griffin@linaro.org>,
"André Draszik" <andre.draszik@linaro.org>,
"Tudor Ambarus" <tudor.ambarus@linaro.org>,
"Heiko Stuebner" <heiko@sntech.de>,
"Alim Akhtar" <alim.akhtar@samsung.com>,
"Kunihiko Hayashi" <hayashi.kunihiko@socionext.com>,
"Masami Hiramatsu" <mhiramat@kernel.org>,
"Yixun Lan" <dlan@kernel.org>,
"Troy Mitchell" <troy.mitchell@linux.spacemit.com>,
"Minda Chen" <minda.chen@starfivetech.com>,
"Shyam Pandey" <radhey.shyam.pandey@amd.com>,
"Wei Yang" <yangwei1@eswincomputing.com>,
"Senchuan Zhang" <zhangsenchuan@eswincomputing.com>,
"Hang Cao" <caohang@eswincomputing.com>,
"Li Jun" <jun.li@nxp.com>, "Peng Fan" <peng.fan@nxp.com>,
"Roy Luo" <royluo@google.com>,
"Yang Xiwen" <forbidden405@foxmail.com>,
"Ahmad Zainie" <wan.ahmad.zainie.wan.mohamad@intel.com>,
"Robert Marko" <robert.marko@sartura.hr>,
"Xu Yang" <xu.yang_2@nxp.com>,
"Wesley Cheng" <quic_wcheng@quicinc.com>,
"Stanley Chang" <stanley_chang@realtek.com>,
"Ze Huang" <huang.ze@linux.dev>,
"Aswath Govindraju" <a-govindraju@ti.com>,
"Roger Quadros" <rogerq@kernel.org>,
linux-arm-kernel@lists.infradead.org,
linux-amlogic@lists.infradead.org, linux-kernel@vger.kernel.org,
asahi@lists.linux.dev, linux-aspeed@lists.ozlabs.org,
imx@lists.linux.dev, linux-samsung-soc@vger.kernel.org,
linux-arm-msm@vger.kernel.org,
linux-rockchip@lists.infradead.org,
linux-riscv@lists.infradead.org, spacemit@lists.linux.dev
Subject: Re: [PATCH 2/2] dt-bindings: usb: snps,dwc3: Fix downstream port numbering
Date: Wed, 14 Oct 2026 14:15:28 +0200 [thread overview]
Message-ID: <a47f24bb-7c49-4e39-9aac-69da552fb2b0@linaro.org> (raw)
In-Reply-To: <CAGXv+5H+ZZXnZKB4EzXP0O9f4YGHBHsz3YCRyRJgX9V6RW1eug@mail.gmail.com>
On 10/14/26 12:14, Chen-Yu Tsai wrote:
> On Wed, Oct 14, 2026 at 6:44 PM Neil Armstrong
> <neil.armstrong@linaro.org> wrote:
>>
>> On 10/14/26 11:29, Chen-Yu Tsai wrote:
>>> On Wed, Oct 14, 2026 at 5:28 PM Neil Armstrong
>>> <neil.armstrong@linaro.org> wrote:
>>>>
>>>> On 10/14/26 10:20, Chen-Yu Tsai wrote:
>>>>> The DWC3 controller can operate in host mode. It does so with a XHCI
>>>>> compliant host controller. The XHCI has two downstream ports, one for
>>>>> HS and one for SS. USB downstream ports start from 1, not 0.
>>>>
>>>> Is there something in index 0 we will need to define at some point ?
>>>
>>> On the host side, no. Downstream ports start at 1.
>>>
>>> On the device mode side, I believe the numbers are completely made up.
>>>
>>>> Using 0 as base for numbering in DT isn't incompatible with the USB
>>>> spec using base 1 for numbering,
>>>
>>> But you end up with diverging numbering schemes, and it diverges
>>> from other USB controllers, particularly XHCI, which DWC3 embeds.
>>>
>>> And it also differs from the numbering currently used for directly
>>> connected onboard devices (like hubs), which use or expect the USB
>>> numbering scheme.
>>>
>>> Sure we can make DWC3 "special", drop inclusion of usb-hcd.yaml,
>>> and duplicate the section for onboard devices. On Linux, we can
>>> add some more code to xhci_find_raw_port_number() to make an
>>> exception for DWC3 controllers.
>>>
>>> Also, usb_of_get_connect_type() is already broken for DWC3 based
>>> controllers that only describe the HS connection but not the SS
>>> connection. usb_of_get_connect_type() currently doesn't call
>>> usb_hcd_find_raw_port_number() so both HS and SS get mapped to port 1,
>>> which wouldn't be in the DT since HS is currently port@0. But even if
>>> it did, SS would get mapped to port 2 anyway.
>>>
>>>
>>> IMHO having consistent numbering across controller types would be
>>> better. This avoids making the USB core and hub code deal with more
>>> exceptions, and also easier to understand and write device trees.
>>
>> I was in the impression the port number not necessarily reflects
>> an actual physical numbering, and can be a logical number we would
>> then map in the kernel.
>>
>> I don't see any issue here having base 0 for the bindings and then
>> converting it to base 1 for the XHCI port numbering.
>>
>> Each controller (Host, Device, OTG) will have it's own numbering anyway,
>> so using the XHCI numbering only sounds a bad idea TBH.
>
> OK. So we keep the port numbering, which is different from the embedded
> device numbering, even for the same dual role controller? See below.
>
> I hope you see why I think it is confusing.
>
>>>
>>>>> Reconcile the downstream port numbering with the common USB host
>>>>> binding, renumbering the downstream port numbers from 0 and 1 to
>>>>> 1 and 2.
>>>>>
>>>>> This is non-backwards compatible, however it won't break current
>>>>> major implementations:
>>>>>
>>>>> - dwc3 "gadget mode" in Linux kernel only requires a connection to be
>>>>> present; it doesn't matter which port it is
>>>>> - dwc3 "host mode" OF graph connections aren't supported yet [1]
>>>>> - FreeBSD doesn't use the OF graph for anything
>>>>> - U-boot doesn't use the OF graph for USB
>>>>> - OpenBSD doesn't support dwc3, only the XHCI in dwc3, and doesn't use
>>>>> the OF graph for USB
>>>>> - coreboot doesn't use the OF graph for anything
>>>>> - Zephyr doesn't support dwc3
>>>>> - TF-A doesn't use the OF graph for anything
>>>>> - EDK2 doesn't support dwc3 and doesn't support OF graph
>>>>> - OP-TEE doesn't support dwc3 and doesn't support OF graph
>>>>>
>>>>> [1] WIP to tie OF graph port node to USB port device
>>>>>
>>>>> Fixes: a33113f73693 ("dt-bindings: usb: snps,dwc3: document HS & SS OF graph ports")
>>>>> Signed-off-by: Chen-Yu Tsai <wenst@chromium.org>
>>>>> ---
>>>>> It is unclear to me whether the HS/SS numbering is fixed for all dwc3
>>>>> variants. I checked Allwinner H616 and Rockchip RK3588 and they both
>>>>> have HS as port 1 and SS as port 2.
>>>>>
>>>>> This also doesn't cover a potential "multi-port" DWC3 implementation,
>>>>> which Qualcomm seems to have.
>>>>
>>>> It breaks the current Qualcomm numbering on numerous boards.
>>>
>>> Yes. It breaks _everyone_ using the current numbering in the sense that
>>> they are no longer valid, but should not affect actual usage.
>>
>> Older DT are supposed to be working on new kernels, you will break ABI
>> and will break usage if the port numbering is enforced to enabled embedded
>> hubs for example.
>
> On that front, embedded hubs already require you to use the USB numbering.
>
> If you write
>
> dwc3 {
> hub@0 {
> compatible = "usb0123,abcd";
> reg = "0";
> };
> };
>
> It won't match anything. The current USB HCD binding doesn't prevent you
> from using port 0, but the kernel won't tie the USB device to it, even
> if it is a single port USB controller. As I mentioned, USB downstream
> ports start at 1, even for root hubs that only have 1 downstream port.
>
> The kernel also doesn't check if the compatible property is correct, but
> that is a separate issue. Maybe it should though, so people can see that
> their DT is incorrect, like if they swapped HS and SS ports for a USB 3.x
> hub.
TBH this USB device bindings for embedded hubs is wrong in many of ways.
So, is the downstream port index a numbering scheme from Linux ? Will each port
will have the same number on every OS implementation ? Do all OSes implement
the root as a the virtual root hub ? do they always use the same indexing ?
My comparison is PCI(e) where the controller port number is a Linux internal
numbering we don't use in DT, we only use the BDF of the downstream bus/endpoints
enumeration which is standardized.
So I think we should actually use the same scheme for usb, but having a subnode
per controller usb port with a hierarchy of nodes representing devices.
Keeping the current USB device bindings and trying to make it work is wrong here.
Neil
>
>
> ChenYu
>
>
>> Neil
>>
>>>
>>> This comment refers to "multiport" controllers from Qualcomm [1], which
>>> would have ports beyond 1 and 2.
>>>
>>> [1] https://lore.kernel.org/all/20240420044901.884098-8-quic_kriskura@quicinc.com/
>>>
>>>
>>>>> ---
>>>>> Documentation/devicetree/bindings/usb/snps,dwc3-common.yaml | 4 ++--
>>>>> 1 file changed, 2 insertions(+), 2 deletions(-)
>>>>>
>>>>> diff --git a/Documentation/devicetree/bindings/usb/snps,dwc3-common.yaml b/Documentation/devicetree/bindings/usb/snps,dwc3-common.yaml
>>>>> index 6c0b8b653824..4b6304bd2ec1 100644
>>>>> --- a/Documentation/devicetree/bindings/usb/snps,dwc3-common.yaml
>>>>> +++ b/Documentation/devicetree/bindings/usb/snps,dwc3-common.yaml
>>>>> @@ -410,11 +410,11 @@ properties:
>>>>> property is used.
>>>>>
>>>>> properties:
>>>>> - port@0:
>>>>> + port@1:
>>>>> $ref: /schemas/graph.yaml#/properties/port
>>>>> description: High Speed (HS) data bus.
>>>>>
>>>>> - port@1:
>>>>> + port@2:
>>>>> $ref: /schemas/graph.yaml#/properties/port
>>>>> description: Super Speed (SS) data bus.
>>>>>
>>>>
>>
next prev parent reply other threads:[~2026-10-14 12:15 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-14 8:20 [PATCH 0/2] dt-bindings: usb: downstream host ports for hcd and dwc3 Chen-Yu Tsai
2026-10-14 8:20 ` [PATCH 1/2] dt-bindings: usb: hcd: Add downstream USB ports Chen-Yu Tsai
2026-10-14 8:31 ` sashiko-bot
2026-10-14 10:16 ` Chen-Yu Tsai
2026-10-14 8:20 ` [PATCH 2/2] dt-bindings: usb: snps,dwc3: Fix downstream port numbering Chen-Yu Tsai
2026-10-14 8:28 ` Neil Armstrong
2026-10-14 9:29 ` Chen-Yu Tsai
2026-10-14 9:44 ` Neil Armstrong
2026-10-14 10:14 ` Chen-Yu Tsai
2026-10-14 12:15 ` Neil Armstrong [this message]
2026-10-14 16:36 ` Konrad Dybcio
2026-10-14 8:31 ` sashiko-bot
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=a47f24bb-7c49-4e39-9aac-69da552fb2b0@linaro.org \
--to=neil.armstrong@linaro.org \
--cc=Frank.Li@nxp.com \
--cc=a-govindraju@ti.com \
--cc=alim.akhtar@samsung.com \
--cc=andre.draszik@linaro.org \
--cc=andrew@codeconstruct.com.au \
--cc=asahi@lists.linux.dev \
--cc=balbi@kernel.org \
--cc=billy_tsai@aspeedtech.com \
--cc=caohang@eswincomputing.com \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=dlan@kernel.org \
--cc=festevam@gmail.com \
--cc=forbidden405@foxmail.com \
--cc=gregkh@linuxfoundation.org \
--cc=hayashi.kunihiko@socionext.com \
--cc=heiko@sntech.de \
--cc=huang.ze@linux.dev \
--cc=imx@lists.linux.dev \
--cc=j@jannau.net \
--cc=jbrunet@baylibre.com \
--cc=joel@jms.id.au \
--cc=jun.li@nxp.com \
--cc=kernel@pengutronix.de \
--cc=khilman@baylibre.com \
--cc=krzk+dt@kernel.org \
--cc=linux-amlogic@lists.infradead.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-aspeed@lists.ozlabs.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=linux-rockchip@lists.infradead.org \
--cc=linux-samsung-soc@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=martin.blumenstingl@googlemail.com \
--cc=mhiramat@kernel.org \
--cc=michal.simek@amd.com \
--cc=minda.chen@starfivetech.com \
--cc=neal@gompa.dev \
--cc=peng.fan@nxp.com \
--cc=peter.griffin@linaro.org \
--cc=quic_wcheng@quicinc.com \
--cc=radhey.shyam.pandey@amd.com \
--cc=robert.marko@sartura.hr \
--cc=robh@kernel.org \
--cc=rogerq@kernel.org \
--cc=royluo@google.com \
--cc=ryan_chen@aspeedtech.com \
--cc=s.hauer@pengutronix.de \
--cc=spacemit@lists.linux.dev \
--cc=stanley_chang@realtek.com \
--cc=sven@kernel.org \
--cc=troy.mitchell@linux.spacemit.com \
--cc=tudor.ambarus@linaro.org \
--cc=wan.ahmad.zainie.wan.mohamad@intel.com \
--cc=wenst@chromium.org \
--cc=xu.yang_2@nxp.com \
--cc=yangwei1@eswincomputing.com \
--cc=zhangsenchuan@eswincomputing.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