From: Sven Peter <sven@kernel.org>
To: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
Felipe Balbi <balbi@kernel.org>, Janne Grunau <j@jannau.net>,
Alyssa Rosenzweig <alyssa@rosenzweig.io>,
Neal Gompa <neal@gompa.dev>, Vinod Koul <vkoul@kernel.org>,
Kishon Vijay Abraham I <kishon@kernel.org>,
Heikki Krogerus <heikki.krogerus@linux.intel.com>,
Philipp Zabel <p.zabel@pengutronix.de>,
Frank Li <Frank.Li@nxp.com>, Ran Wang <ran.wang_1@nxp.com>,
Peter Chen <peter.chen@nxp.com>,
"linux-usb@vger.kernel.org" <linux-usb@vger.kernel.org>,
"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"asahi@lists.linux.dev" <asahi@lists.linux.dev>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>,
"linux-phy@lists.infradead.org" <linux-phy@lists.infradead.org>
Subject: Re: [PATCH v2 04/22] usb: dwc3: Add Apple Silicon DWC3 glue layer driver
Date: Sun, 21 Sep 2025 15:40:28 +0200 [thread overview]
Message-ID: <41bb000c-5643-4ed2-8d33-a6bd8a549409@kernel.org> (raw)
In-Reply-To: <20250919224016.gyao3aoka5ineear@synopsys.com>
Hi,
On 20.09.25 00:40, Thinh Nguyen wrote:
> On Sat, Sep 06, 2025, Sven Peter wrote:
>> As mad as it sounds, the dwc3 controller present on the Apple M1 must be
>> reset and reinitialized whenever a device is unplugged from the root
>> port or when the PHY mode is changed.
[....]
>> +/**
>> + * struct dwc3_apple - Apple-specific DWC3 USB controller
>> + * @dwc: Core DWC3 structure
>> + * @dev: Pointer to the device structure
>> + * @mmio_resource: Resource to be passed to dwc3_core_probe
>> + * @apple_regs: Apple-specific DWC3 registers
>> + * @resets: Reset control
>> + * @role_sw: USB role switch
>> + * @lock: Mutex for synchronizing access
>> + * @core_probe_done: True if dwc3_core_probe was already called after the first plug
>> + * @mode: Current mode of the controller (off/host/device)
>
> For this platform, current mode of the controller should only ever be
> host or device mode. Seems we're mixing power with usb role? ie. what
> DWC3_APPLE_OFF is being used for?
>
So this platform is very messed up and in order the bring up dwc3 and
the PHY there are four steps:
1) The PHY itself has to be brought up; for this we need to know the
mode (USB3, USB3+DisplayPort, USB4, etc) and the lane orientation. This
happens from typec_mux_set
2) DWC3 has to be brought up but we must not touch the gadget area or
start xhci yet
3) The PHY bring-up has to be finalized and dwc3's PIPE interface has to
be switched to the USB3 PHY, this is done inside phy_set_mode.
4) We can now initialize xhci or gadget mode.
I think we can switch 1 and 2 but 3 has to happen after (1 and 2) and 4
has to happen after 3.
And then to bring this all down again:
1) DWC3 has to exit host or gadget mode and must no longer touch those
registers
2) The PHY has to switch dwc3's PIPE interface back to the dummy backend
3) The PHY itself can be shut down, this happens from typec_mux_set
We also can't transition the PHY from one mode to another while dwc3 is
up and running (this is slightly wrong, some transitions are possible,
others aren't but because we have no documentation for this I'd rather
play it safe).
After both the PHY and dwc3 are initialized we will also only ever see a
single "new device connected" event. If we just keep them running only
the first device plugged in will ever work. XHCI's port status register
actually does show the correct state but no interrupt ever comes in. In
gadget mode we don't even get a USBDisconnected event and everything
looks like there's still something connected on the other end.
And to make this all extra fun: If we get the order of some of this
wrong either the port is just broken until a phy+dwc3 reset, or it's
broken until a full SoC reset (likely because we can't reset some parts
of the PHY), or some watchdog kicks in after a few seconds and forces a
full SoC reset (I've mostly seen this with USB4/Thunderbolt but there's
clearly some watchdog that hates invalid states).
So there's really no good way to keep dwc3 fully up and running after we
disconnect a cable because then we can't shut down the PHY anymore. And
if we kept the PHY running in whatever mode until the next cable is
connected we'd need to tear it all down and bring it back up again
anyway to detect and use the next device.
Instead, I just shutdown everything once a cable is disconnected and
that's this DWC3_APPLE_OFF state. Maybe I can put the explanation above
as a comment in there and maybe also rename "mode" to "state" here
because we may get something like DWC3_APPLE_USB4_TUNNEL in the future
here as well because the sequence might be a bit different there.
>> + */
>> +struct dwc3_apple {
[...]
>> + /*
>> + * Note that we only bring up dwc3 once the first device is attached because we need to know
>> + * the role (e.g. host), mode (e.g. USB3) and lane orientation to bring up the PHY which is
>> + * tightly coupled to dwc3.
>> + */
>
> The wording here is odd. You can wait for attach to do this, but it
> should not be a requirement. You might not know whether you need to
> switch role, but you should be able to initialize the controller in
> either host or device mode prior to attachment.
>
> Any particular reason we need to do this? If not, we can do away with
> the core_probe_done condition.
Because I can't really bring up dwc3 fully to any mode without
cooperation from the PHY and bringing it up here doesn't really buy us
much (see above). What I could do here is already call dwc3_core_probe
and then immediately dwc3_core_exit again to get rid of that condition.
Thanks,
Sven
next prev parent reply other threads:[~2025-09-21 13:40 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-06 15:43 [PATCH v2 00/22] Apple Silicon USB3 support Sven Peter
2025-09-06 15:43 ` [PATCH v2 01/22] dt-bindings: usb: Add Apple dwc3 Sven Peter
2025-09-07 9:45 ` Krzysztof Kozlowski
2025-09-06 15:43 ` [PATCH v2 02/22] usb: dwc3: dwc3_power_off_all_roothub_ports: Use ioremap_np when required Sven Peter
2025-09-11 1:37 ` Thinh Nguyen
2025-09-06 15:43 ` [PATCH v2 03/22] usb: dwc3: glue: Allow more fine grained control over mode switches Sven Peter
2025-09-19 21:40 ` Thinh Nguyen
2025-09-20 11:48 ` Sven Peter
2025-09-24 22:49 ` Thinh Nguyen
2025-09-06 15:43 ` [PATCH v2 04/22] usb: dwc3: Add Apple Silicon DWC3 glue layer driver Sven Peter
2025-09-11 1:46 ` Thinh Nguyen
2025-09-19 22:40 ` Thinh Nguyen
2025-09-21 13:40 ` Sven Peter [this message]
2025-09-24 22:36 ` Thinh Nguyen
2025-09-06 15:43 ` [PATCH v2 05/22] usb: typec: tipd: Clear interrupts first Sven Peter
2025-09-06 15:43 ` [PATCH v2 06/22] usb: typec: tipd: Move initial irq mask to tipd_data Sven Peter
2025-09-06 15:43 ` [PATCH v2 07/22] usb: typec: tipd: Move switch_power_state " Sven Peter
2025-09-06 15:43 ` [PATCH v2 08/22] usb: typec: tipd: Trace data status for CD321x correctly Sven Peter
2025-09-06 15:43 ` [PATCH v2 09/22] usb: typec: tipd: Add cd321x struct with separate size Sven Peter
2025-09-06 15:43 ` [PATCH v2 10/22] usb: typec: tipd: Read USB4, Thunderbolt and DisplayPort status for cd321x Sven Peter
2025-09-09 9:41 ` Heikki Krogerus
2025-09-06 15:43 ` [PATCH v2 11/22] usb: typec: tipd: Register DisplayPort and Thunderbolt altmodes " Sven Peter
2025-09-09 9:47 ` Heikki Krogerus
2025-09-06 15:43 ` [PATCH v2 12/22] usb: typec: tipd: Update partner identity when power status was updated Sven Peter
2025-09-07 8:54 ` Sergey Shtylyov
2025-09-07 18:59 ` Sven Peter
2025-09-06 15:43 ` [PATCH v2 13/22] usb: typec: tipd: Use read_power_status function in probe Sven Peter
2025-09-09 9:56 ` Heikki Krogerus
2025-09-06 15:43 ` [PATCH v2 14/22] usb: typec: tipd: Read data status in probe and cache its value Sven Peter
2025-09-09 10:02 ` Heikki Krogerus
2025-09-09 10:03 ` Heikki Krogerus
2025-09-06 15:43 ` [PATCH v2 15/22] usb: typec: tipd: Handle mode transitions for CD321x Sven Peter
2025-09-09 10:10 ` Heikki Krogerus
2025-09-11 9:26 ` Janne Grunau
2025-09-06 15:43 ` [PATCH v2 16/22] dt-bindings: phy: Add Apple Type-C PHY Sven Peter
2025-09-09 17:04 ` Rob Herring
2025-09-06 15:43 ` [PATCH v2 17/22] soc: apple: Add hardware tunable support Sven Peter
2025-09-07 12:46 ` Alyssa Anne Rosenzweig
2025-09-06 15:43 ` [PATCH v2 18/22] phy: apple: Add Apple Type-C PHY Sven Peter
2025-09-07 13:12 ` Alyssa Anne Rosenzweig
2025-09-07 13:15 ` Alyssa Anne Rosenzweig
2025-09-08 15:04 ` Philipp Zabel
2025-09-08 18:12 ` Janne Grunau
2025-09-09 22:25 ` Nathan Chancellor
2025-09-06 15:43 ` [PATCH v2 19/22] arm64: dts: apple: t8103: Mark ATC USB AON domains as always-on Sven Peter
2025-09-06 15:43 ` [PATCH v2 20/22] arm64: dts: apple: t8103: Add Apple Type-C PHY and dwc3 nodes Sven Peter
2025-09-07 9:47 ` Krzysztof Kozlowski
2025-09-07 12:43 ` Alyssa Anne Rosenzweig
2025-09-07 12:51 ` Greg Kroah-Hartman
2025-09-07 15:01 ` Krzysztof Kozlowski
2025-09-07 19:02 ` Sven Peter
2025-09-06 15:43 ` [PATCH v2 21/22] arm64: dts: apple: t8112: " Sven Peter
2025-09-06 15:43 ` [PATCH v2 22/22] arm64: dts: apple: t600x: " Sven Peter
2025-09-11 10:10 ` [PATCH v2 00/22] Apple Silicon USB3 support Neal Gompa
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=41bb000c-5643-4ed2-8d33-a6bd8a549409@kernel.org \
--to=sven@kernel.org \
--cc=Frank.Li@nxp.com \
--cc=Thinh.Nguyen@synopsys.com \
--cc=alyssa@rosenzweig.io \
--cc=asahi@lists.linux.dev \
--cc=balbi@kernel.org \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=gregkh@linuxfoundation.org \
--cc=heikki.krogerus@linux.intel.com \
--cc=j@jannau.net \
--cc=kishon@kernel.org \
--cc=krzk+dt@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-phy@lists.infradead.org \
--cc=linux-usb@vger.kernel.org \
--cc=neal@gompa.dev \
--cc=p.zabel@pengutronix.de \
--cc=peter.chen@nxp.com \
--cc=ran.wang_1@nxp.com \
--cc=robh@kernel.org \
--cc=vkoul@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).