Skip to content

PCI: apple: Allow retained-link s2idle on J716c - #1199

Merged
DjDeveloperr merged 43 commits into
integration/aurorafrom
ewb/j716c-native-s2idle-linux
Nov 9, 2026
Merged

DjDeveloperr merged 43 commits into
integration/aurorafrom
ewb/j716c-native-s2idle-linux

Conversation

@erikwb

@erikwb erikwb commented Nov 8, 2026 •

Copy link
Copy Markdown
Contributor

Depends on #937. This PR is stacked on j716c/t6050-pcie; the intended
merge target after that prerequisite lands is integration/aurora.

The adopted J716c radio PCIe host currently rejects every noirq suspend with
-EBUSY. Allow suspend-to-idle when the controller and links are healthy and
the PCI hierarchy is accessible in D0, retain the running hierarchy, and
validate it again during noirq resume. Preserve existing behavior for
managed-SID hosts and the restrictions on other adopted platforms and deeper sleep.

Hardware qualification of this implementation on the native J716c bring-up
kernel 7.3.0-ewb48+ (before restacking onto this base):

  • Build, diff checks and checkpatch pass. Independent code review found no
    patch-introduced must-fix.
  • Staged PM tests and attended direct kernel sleep/wake pass.
  • Ten normal systemctl suspend requests with pm_async=1 completed sleep
    and resume on one boot: four on AC and six on battery, including a 313-second
    sleep. Desktop operation and a 16 MiB storage checksum were checked.
  • One request had an early-wake abort during ordinary device suspend before
    a successful systemd retry. No failed device was recorded; noirq and resume
    failure counters stayed zero. The following two cycles completed without
    another abort.
  • Post-resume GPU compute, explicit Wi-Fi disconnect/reconnect, and three
    minutes of verified traffic passed (360 MiB in each direction). Bluetooth
    controller discovery worked; no paired peripheral was available.

This retains the powered radio hierarchy. Sleep power consumption, connected
Bluetooth peripheral continuity, and recovery from a lost radio link remain
unqualified. Failed resume validation blocks configuration access but does not
implement radio-worker/MMIO containment.

Restacked onto the updated #937. The s2idle behavior diff is unchanged;
only surrounding base context moved. The PCIe driver object builds with
arm64 16 KiB pages, PM enabled and W=1; checkpatch and the PCIe-C policy
tests pass. This exact stacked kernel has not been boot-tested.

Reviewed with sol-loop: 3 rounds with GPT-6.1 Sol. Sol verdict: approved.

Created with GPT-6 Astra in Codex (T3 Code).

@DjDeveloperr DjDeveloperr left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved: static review, plus a no-regression check on the M5 Pro (J714sAP).

The new path is gated on apple,j716c, so on J714sAP an adopted host still refuses noirq suspend with -EBUSY, as before. This head was in the M5 Pro kernel used for #937 and #938 on three boots. Adoption, the N1's root-port reset, Wi-Fi and Bluetooth were unaffected. I didn't run s2idle on the M5: J714s isn't in the gate, and the machine is shared with the deep-sleep work.

Review: the hardware-PMCSR walk, the link checks at suspend and again at resume, and marking the ports link_failed when the link is lost all look right. resume_noirq returns 0 when the link wasn't kept, so the old -EBUSY path never reaches it.

funkzy and others added 24 commits November 9, 2026 22:39
…oader

Add apple,t6050-pcie, a T6050 (M5 Ultra) PCIe host whose root ports the
boot loader powered, trained and left running. Each such port is marked
apple,link-trained-by-bootloader and named by its port<n>, phy<n> and
intr2axi<n> register ranges and its port<n> interrupt; the host's local
MSI map starts at apple,msi-vector-base. The OS adopts the trained state
and never resets, retrains or changes the port's power: reset-gpios,
pwren-gpios and power-domains are not allowed on it.

Also name nonposted-mmio, which these hosts take.

Signed-off-by: Jeff Queisser <funkzy@users.noreply.github.com>

Developed with Claude Code.
Signed-off-by: Erik Bourget <erik@ebourget.net>
On the M5 Ultra (T6050, J775D) running Linux on the hardware, the boot
loader brings up the internal PCIe host's ports itself: it powers the
shared PHY, trains each port's link and leaves it up, with the endpoint
idle. Port 2 carries the onboard RTL8127 Ethernet controller and port 3
the ASM3142 xHCI behind the rear USB-A ports. Repeating the reset and
training sequence from Linux is not needed and not known to be safe on
this SoC.

Add apple,t6050-pcie, a host whose root ports marked
apple,link-trained-by-bootloader are adopted as they are: no reset, no
tunable replay, no clock or power change and no retraining. Every
resource comes from the DT by the port's index (port<n>, phy<n>,
intr2axi<n>, interrupt port<n>, the iommu-map entry for the endpoint's
RID). Before the first PCIe register write the driver checks that the
link is up and not retraining at Gen3 x1, that the boot loader numbered
the root port's buses (primary 0, one secondary), that the endpoint on
it is device 0 function 0 with DMA and MSI off and a well-formed
capability list, and that the port's RID table holds no valid entry. A
port that fails a check is left alone and the others are still adopted.
Then the endpoint's RID is routed to its SID, the host's MSI map is set
up from apple,msi-vector-base, and only the adopted root ports and the
endpoint behind each are enumerated. The links cannot be recovered by a
user reset or removal, since the boot loader owns them.

No other SoC sets adopt_link.

Testing: on J775D, every boot adopts port 2 (RTL8127, DHCP and SSH over
it on every boot) and port 3 (ASM3142, a USB keyboard and mouse driving
the desktop session).

Signed-off-by: Jeff Queisser <funkzy@users.noreply.github.com>

Developed with Claude Code.
Signed-off-by: Erik Bourget <erik@ebourget.net>
A driver's work item that rescans or resets part of a bus takes the
rescan/remove lock. When the device is being removed, the remover holds
that lock while it cancels the work, so a worker that blocks on the lock
deadlocks against its own cancellation.

Add pci_trylock_rescan_remove(), which takes the rescan/remove lock only
if it is free. A worker that cannot get it returns and retries later,
and the remover's cancellation completes.

Signed-off-by: Dj <hey@djdev.me>

Developed with Claude Code.
Signed-off-by: Erik Bourget <erik@ebourget.net>
…uences

An adopted T6050 port is left as the boot loader trained it, but an
endpoint that has to come back on a retrained link (the N1 on port 0,
after its ROM boot) needs the host to take the port down and bring it
up again. Add the sequences for that, on the port's own register blocks
(port<n>, phy<n> and intr2axi<n>) and the root port's config space:

- Disable: wait for the link to leave L1 and go idle, assert the
  port's PERST# through its handshake, then stop the lane clocks and
  the port's application clock.
- Enable: the port reset table, which also clears the RID2SID and MSI
  map tables, the port's tunables, then the application clock and the
  PERST# release handshake, until the port is ready and its link idle.
- Configure: with the root complex's read-only registers opened, its
  tunables and the per-rate shadow tunables, then a Gen3 x1 link
  (target speed, link width and capability) and a directed speed
  change; Intr2AXI enabled.
- Train: the lane's reference clocks, the endpoint's PERST# released
  through its pad, the LTSSM started, then the 100 ms wait after link
  up.

The tunables are the lists the boot loader copies onto the root port
node, groups of (offset, 4, mask, value); a list it did not copy is
skipped. The root-port reset that runs the sequences follows; until
then they are marked __maybe_unused.


Co-developed-by: Dj <hey@djdev.me>
Signed-off-by: Dj <hey@djdev.me>

Developed with Claude Code.
Signed-off-by: Erik Bourget <erik@ebourget.net>
… port

The N1 Wi-Fi/Bluetooth sits on apcie0 port 0, which the bootloader now
trains like ports 2 and 3. Two things the adoption assumed do not hold
for it:

- It is multi-function. In its ROM personality only function 0 answers;
  after its firmware starts, Control, Alpha and Beta (0-2) do. Each
  function's RID is routed to its own DART stream from the iommu-map
  (slot == SID) when it is enabled, instead of the one route set at
  adoption; config accesses on the adopted bus reach every function of
  device 0; teardown clears every slot it routed. Port 0 is accepted.
- Its ROM links at Gen1. Adoption takes an x1 link at Gen1 to Gen3 (the
  bootloader's target), not only Gen3; the endpoint picks the speed.
- After the ROM boot it must come back on a retrained link. The host
  provides reset_root_port for an adopted port that names its PERST# pad
  (perst<n>): PME_Turn_Off to L2, PERST#, then the T6050 port disable,
  reset, enable, configure and train sequences, with the routes and the
  MSI map rewritten in between. Tunables the boot loader copied onto the
  root port node are applied; absent ones are skipped.

Signed-off-by: Jeff Queisser <funkzy@users.noreply.github.com>

Developed with Claude Code.
Signed-off-by: Erik Bourget <erik@ebourget.net>
The adopted port 0 named its PERST# pad as a 4-byte reg of the host
(perst0, one word inside the pin controller's block) and wrote it raw.
With the pin controller in the device tree the two nodes claim the same
MMIO word, and whichever probes second fails: when pinctrl wins, the
host's port setup stops with -EBUSY and no port is adopted, so the
Ethernet and USB behind ports 2 and 3 are gone with it.

One owner for the pad: the pin controller. The port node carries
reset-gpios, as every other Apple host's port nodes do, and the host
takes the line as the bootloader left it (GPIOD_ASIS: probe never
touches a trained link's reset) and drives it only in the root-port
reset, as a GPIO output at the logical level the reset asks for. The
raw pad write set the same things (function bits cleared, mode output,
the data bit) plus the pad's input enable, which the pin controller
leaves as the bootloader set it. Probe asks for the line before any
port is set up, so a host whose pin controller is not up yet defers
instead of adopting nothing; an adopted port without reset-gpios has no
reset, as before (reset_root_port answers -EOPNOTSUPP). The perst<n>
reg, its binding entry and the raw pad write go; the binding allows
reset-gpios on an adopted port again.

Probe names the port whose line it cannot have, as the probe of the
other hosts' ports does: a line the pin controller reserves
(gpio-reserved-ranges) is refused with -EINVAL, which the host's probe
otherwise returned with no word of which port or property.

Signed-off-by: Jeff Queisser <funkzy@users.noreply.github.com>

Developed with Claude Code.
Signed-off-by: Erik Bourget <erik@ebourget.net>
The PCIe-C policy test extracts driver macro definitions to compile its
production-code fixture. Taking only the first physical line truncates
T6050_ROUTE and joins the following directive to its trailing backslash,
so the fixture fails to compile after the T6050 host support is added.

Copy continuation lines along with their define. The production fixture
and both negative controls now pass.

Developed with Claude Code.
Signed-off-by: Erik Bourget <erik@ebourget.net>
Add the T6050 DisplayPort/USB combo PHY and four-clock display crossbar profile. Carry the current Type-C, USB2, USB3 PIPE sequencing, and teardown behavior from the published T6050 source.

Source snapshot: t6050-gpu ee68abb105200e99636a5edfc647a5cfc1d89954
Integration base: 9cbdd07

Signed-off-by: Dj <hey@djdev.me>
Signed-off-by: Erik Bourget <erik@ebourget.net>
The combo PHY's USB2 PHY and digital banks are in the USB controller's
power domain. Let a combo PHY name it fourth, as "usb", so the PHY can
hold it on a port with no USB controller bound. The fixed DisplayPort
PHY keeps exactly three domains.

Signed-off-by: Jeff Queisser <funkzy@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Erik Bourget <erik@ebourget.net>
The combo PHY's USB2 PHY and digital banks are in the USB controller's
power domain. Only a bound USB controller holds that domain, so on a
port with no controller (a DisplayPort-only port, as on J775D with Linux
on the hardware) the first Type-C mode switch wrote an unclocked bank
and took an SError.

A combo PHY node may now name that domain as a fourth power domain,
"usb". When it does, the PHY holds it from combo start to combo stop,
after the common domain on the way up and before it on the way down.
Nodes that name three domains probe and run exactly as before, and the
fixed DisplayPort PHY still takes exactly three.

Testing: on J775D (M5 Ultra), with the fourth domain named on each combo
port, Type-C mode switches and DisplayPort on the rear ports ran without
an SError on every boot since 2026-10-30.

Signed-off-by: Jeff Queisser <funkzy@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Erik Bourget <erik@ebourget.net>
apple,port-index has an enum but no type, so dtschema cannot decode the
cell and every combo PHY node fails with "b'\x00\x00\x00\x02' is not one
of [1, 2]" and a core-schema type error, whatever port it names. Give it
the uint32 type.

Signed-off-by: Jeff Queisser <funkzy@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Erik Bourget <erik@ebourget.net>
Add apple,t6050-dwc3, the T6050 (J775D) DWC3 on bare metal. It uses the
shared tunable table, extended with the tables Diljit Singh's T6050 USB
support applies, in the same order: the T6040 tables plus CIO (the Apple
region from 0xcd20, after the fixed CIO values), bulk fabric and AUSBC
debug (the optional drd-bulk and drd-ausbc regions).

It is host-only, like T6040. The USB2 port reset follows the root hub's
start (a no-op without a PHY reset op), and a USB3 PHY failure is fatal,
as on T8132.

Signed-off-by: Jeff Queisser <funkzy@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Erik Bourget <erik@ebourget.net>
dwc3_apple_init() now resets the USB2 port through phy_reset() once the
host is up. The dwc3 teardown model extracts dwc3_apple_init() and the
PHY core functions it calls, so it needs phy_reset() and a reset member
in its phy_ops; none of its PHYs has one, as on every SoC before T6050.

neo-stability-tests also builds dwc3_apple_init() against a reduced
dwc3_apple. Give it the usb2_phy member and a no-op phy_reset().

Assisted-by: LLM
Signed-off-by: Ryan Murray <ryan@aurorasilicon.org>
The PIPE lock that starts the USB3 handoff is acknowledged only while
the combo PHY's dummy PIPE PHY is enabled (pipehandler
NONSELECTED_OVERRIDE bit 15), as on the earlier ATC PHYs (T8122,
T8140), and the bit resets to clear with the controller's domain.
Without it the lock timed out, the PHY faulted and rear port 2 had no
USB at all.

Enable it before the controller leaves reset. Each PIPE-switch step
returns its own code, and every fault of the PHY is logged with its
reason (the pipehandler registers for PIPE faults); dwc3-apple logs a
fatal USB3 PHY failure.

Signed-off-by: Jeff Queisser <funkzy@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Erik Bourget <erik@ebourget.net>
A USB3 PIPE switch can fail before the mux moves, with the PIPE still on
its dummy producer. The PHY then faulted and lost USB2 with it.

Leave the port on USB2 in that case, as four DisplayPort lanes do.

Signed-off-by: Jeff Queisser <funkzy@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Erik Bourget <erik@ebourget.net>
The combo PHY refused any apple,port-index other than 1 or 2, the two ports a
guest description produced. Nothing else in the driver reads the index: the
firmware buffer, banks and sequences are port-agnostic. Validate it against
the board's port set instead: 1 to 5, with 0 (the port that carries the boot
loader's debug link) still excluded, here and in the binding.

Signed-off-by: Jeff Queisser <funkzy@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Erik Bourget <erik@ebourget.net>
Describe the right-hand USB-C port: its SN201202x PD controller, the
ATC2 combo PHY, usb-drd2 and its DARTs, and their power domains.

On J716c the port's HPM is ADT /arm-io/nub-spmi-a1/hpm2 (SPMI address
0xc, port-location "right"), on its own SPMI bus, not on nub-spmi-a0
at address 8 as on J775D; on J716c that address is hpm5 (port-type
0x11), not a port's controller. Add nub-spmi-a1 to t6050-max.dtsi,
polled as nub-spmi-a0 is, put the HPM on it, and enable the ATC2 chain
that J775D leaves to the display handoff.

Add the atcphy2 alias so that the boot loader fills the PHY's tunables
from /arm-io/atc-phy2, and turn dcpext0's Type-C route off with
dcpext0: a mode-switch endpoint whose mux is never registered would
defer the PD controller forever.

Developed with Claude Code.

Signed-off-by: Erik Bourget <erik@ebourget.net>
On J716c the PIPE handler does not acknowledge the lock request when
the controller switches from the dummy producer to USB3, even with the
dummy PHY behind the mux enabled. The switch then fails and the port
falls back to USB2.

The switch works without the ACK. Wait 6 ms for the lock ACK, and for
an unlock ACK to clear, then log the PIPE handler state if it is
missing and complete the switch. With this, USB3 comes up on that
port.

Developed with Claude Code.

Signed-off-by: Erik Bourget <erik@ebourget.net>
On T6050 the CPU wrapper of each USB4 router is clocked through the CIO
reconfig request (the router CPU's clock gate CIOn_RECONFIG_V). Until it
has run, any access to the wrapper faults.

The request register uses the T8142 bit positions (request BIT(2 * port),
four ports) and sits at offset 0x60 of a page in the die's PMGR block,
0x280620000 on die 0. Its odd bit is a done flag rather than a busy
flag: it is set once the request is taken, then request and done clear
by themselves about 4 ms later. The wrapper takes an SError when it is
accessed before they clear.

Wait for both bits to clear (a reconfiguration still under way), store
the request, wait for the done flag, then wait for both bits to clear
again.

Developed with Claude Code.

Signed-off-by: Erik Bourget <erik@ebourget.net>
The CIO (USB4/Thunderbolt) mode has its own firmware register and
receiver tunables. They are optional: an absent one is skipped.

Developed with Claude Code.

Signed-off-by: Erik Bourget <erik@ebourget.net>
The T6050 combo PHY rejects TYPEC_MODE_USB4 and the Thunderbolt alternate
mode, so a USB4 dock that the PD controller has already entered USB4 with
gets no link: the PHY is never configured and DWC3 cannot start.

Add the CIO mode as a step recipe in the style of the USB ones:

- the mode-independent power-up;
- the common tunables, then the CIO set (AUS40CMN_SHM, AUSPLL_CORE,
  CIO4PLL_CORE) and the CIO80 set (UC_REGS_CIO, LN0/LN1_RX_TOP_CIO,
  LN0/LN1_RX_EQ_CIO), with no USB or DP lane masks;
- the crossbar in CIO, where orientation only selects TOP +0x78 bit 0;
- the sleep-control release of both lanes;
- the firmware start, UC_TNBL_DONE and the ACIOPHY reset release, without
  the PIPE BIST and the ATCPHY_CFG +0x8 orientation bit.

The shutdown powers both transmitters and receivers down, shuts the common
block down, stops the firmware and runs the usual sleep, clamp and reset
sequence.

USB2 runs beside the link, so the USB2 PHY is brought up as for USB. USB3
arrives through a tunnel later; in CIO the USB3 PHY set_mode leaves DWC3
on its dummy PIPE producer until a tunnel exists.

The five CIO80 tunables are optional DT properties
(apple,tunable-uc-regs-cio, -lane0/1-rx-top-cio, -lane0/1-rx-eq-cio); a
missing one is skipped. On J716c only the RX_TOP pair is non-empty.

Developed with Claude Code.

Signed-off-by: Erik Bourget <erik@ebourget.net>
The T6050 host router has the T8132 MxWrap CPU wrapper and LSTX pin,
four ACIO power domains instead of three, and a PCIe router AP
firmware block with its own tunables. Its NHI has a single register
range, one DART stream per ring, and an SRAM parity interrupt after
its 24 ring interrupts.

Developed with Claude Code.

Signed-off-by: Erik Bourget <erik@ebourget.net>
The M5 Max (T6050) host routers are Type 7 routers with an MxWrap CPU
wrapper, close to the M3 ones. They differ at start:

- The wrapper is only clocked once the CIO reset (the reconfig request)
  has run; any access before it faults. The reset is required, as on
  the other generations, and runs before the wrapper is touched.
- The CPU is released with a plain store of the RUN value rather than
  a read-modify-write, and halted again when the router stops.
- Both the rc block and the wrapper take an external abort when read
  before the CPU runs, so the M3_CTRL start of the other generations is
  skipped and their state is not logged. The rc block is first touched
  to hand LSTX over, once RTKit is up.
- The router takes the LSTX pin over only once its RTKit is up: write
  the LSTX control from the level the AP held, then mux the pin to the
  router. While the router is off, hold the pin as a GPIO at the level
  the router last drove.
- The PCIe router AP firmware tunable is applied with the other router
  tunables once the firmware is ready.
- The router firmware trains Gen4 links only when the cable word says
  the cable is Gen4. For a USB4 Gen4 cable from Enter_USB it expects
  0x801 (present and Gen4), without the 20 Gb/s bit.
- The NHI has a named SRAM parity interrupt after its 24 ring
  interrupts, which is not a ring.

Match apple,t6050-usb4-acio and apple,t6050-usb4-nhi. DisplayPort
tunnels stay off on T6050 for now.

Developed with Claude Code.

Signed-off-by: Erik Bourget <erik@ebourget.net>
…initialises

A T8110 DART that no boot loader sets up, such as a USB4 router's or
its PCIe-C tunnel's, needs the device tree to describe what the boot
loader otherwise does: its tunables, its bypass streams, every error
reported and the context cache flushed.

Add apple,full-error-reporting and apple,ctc-flush, and extend
apple,bypass-sids beyond the PCIe-C tunnel DARTs.

Developed with Claude Code.

Signed-off-by: Erik Bourget <erik@ebourget.net>
erikwb and others added 8 commits November 9, 2026 23:01
Describe the PCIe-C root port behind the right port's router and its
DART, in a node the router points at with apple,pcie-tunnel and
populates once it has enabled a PCIe tunnel, and the ATC2_PCIE power
state they sit in, in t6050-max.dtsi. The router powers ATC2_PCIE with
its other domains, so the port can be cold-initialized before its
children are populated.

Nothing initialises the DART, so like the router's it carries full error
reporting and its two bypass streams, 253 and 255, on which the port
issues its own writes, MSIs included; the board gives its tunables and
the port's. Its container is not named usb4-pcie-tunnel-N, which would
give it the fixed 64-stream topology of the older tunnel DARTs instead
of the 256 streams it reports. The bridge's MSIs are vectors 192-223 of
the window shared with the internal host.

Developed with Claude Code.

Signed-off-by: Erik Bourget <erik@ebourget.net>
T6050 can report a busy crossbar connection after selecting a valid
output. Log that status while retaining the selected route, so an active
USB4 DisplayPort tunnel can complete its display setup.

Developed with Claude Code.
Signed-off-by: Erik Bourget <erik@ebourget.net>
Reinitialize an inherited J716c boot-port USB2 connection before its
first connect notification, after suppliers and the Type-C port exist.
Limit the operation to the board property and normal host operation;
exclude the debug bridge modes. Allow SN201202x up to five seconds to
wake so a connected dock can restore its USB hub after boot.

Developed with Claude Code.
Signed-off-by: Erik Bourget <erik@ebourget.net>
… probe test

tipd_init() now calls cd321x_reset_inherited_connection() before it
reads the plug state. The probe-transaction model extracts tipd_init()
with device_property_read_bool() returning false, for which the real
function returns 0 without touching the controller, so stub it that way.

Assisted-by: LLM
Signed-off-by: Ryan Murray <ryan@aurorasilicon.org>
An attached J716c dock can leave DISC running beyond the default one-second command timeout. Probe then attempts LOCK while DISC still owns the command register, receives EBUSY, and abandons the port even though a later reprobe works.

Allow five seconds for DISC to acknowledge, matching the surrounding startup operations. Keep the automatic CC restore delay and the post-command application-mode check unchanged.

Developed with Claude Code.

Signed-off-by: Erik Bourget <erik@ebourget.net>
An empty SN201202x port can take 1.6 seconds to acknowledge LDCM at startup. Allow five seconds so a command still running is not treated as a failed mitigation change.

Removing mitigation can start a new measurement after a valid dry snapshot. Preserve that result while the new measurement is in progress, as the existing entry path does for a published result. Re-enabling mitigation immediately can hold the detector in the measuring state and permanently suppress a later dock attachment.

Keep failures and liquid results mitigated. Exercise the dry-to-measuring transition from every previous state and the failed re-read path in KUnit.

Developed with Claude Code.

Signed-off-by: Erik Bourget <erik@ebourget.net>
Reset recovery can invalidate the detector after tipd_remove cancels its work but before cd321x_remove drains resume work. Disable delayed work permanently at removal so this late producer cannot restart it after driver resources are released.

Exercise the production stop and invalidate callbacks in KUnit. The regression test runs the callback after cancellation on the old implementation and passes when work is disabled.

Developed with Claude Code.

Signed-off-by: Erik Bourget <erik@ebourget.net>
integration/aurora already describes apple,t6050-dp-phy and
apple,t6050-combo-phy in apple,combo-phy.yaml, with matrix-typed
tunables, the CIO tunables and the optional "usb" domain. The copy in
apple,t6050-dp-phy.yaml claims the same compatibles, so dt-validate
reports a duplicate schema, picks up its uint32-array types and its
required tunables, and every T6050 combo PHY node that the boot loader
fills in (J714s, J716s, J775c/d, J873s, K114/K116) fails validation.

Remove the copy, as erikwb's restacked #1268 does, so each compatible
has one schema.

Signed-off-by: Diljit Singh <hey@djdev.me>
DjDeveloperr and others added 2 commits November 9, 2026 12:01
integration/aurora now has the J713 display DART power gating (#1059),
whose register definitions sit where this series' DART commit adds the
v2.2/v2.4 error, client-partition and context-cache definitions. Keep
both blocks; they define different registers.

Signed-off-by: Diljit Singh <hey@djdev.me>
The adopted J716c radio host currently rejects every noirq suspend. Its
radio drivers save PCI state without entering D3, and the native host and
DART retain the running hierarchy during suspend-to-idle.

Allow this path only for J716c s2idle when the controller and ports are
healthy and all PCI devices are accessible in D0. Validate the retained
hierarchy again on resume and block downstream configuration access if
validation fails. Leave existing behavior for managed-SID hosts, other
adopted platforms and deeper sleep unchanged.

Developed with Claude Code.
Signed-off-by: Erik Bourget <erik@ebourget.net>
@DjDeveloperr
DjDeveloperr changed the base branch from j716c/t6050-pcie to integration/aurora November 9, 2026 17:02
@DjDeveloperr
DjDeveloperr force-pushed the ewb/j716c-native-s2idle-linux branch from df91ddb to d0c84b3 Compare November 9, 2026 17:02
@DjDeveloperr

Copy link
Copy Markdown
Contributor

Rebased and retargeted to integration/aurora on #1323's head 3b7ab89: #937, the old base, goes in through #1323. Only this commit remains, unchanged (it replayed without conflicts). The old head df91ddb is kept as backup/ewb/j716c-native-s2idle-linux-pre-rebase-20261109. pcie-apple.c here is identical to the retested M5 kernel, where an adopted J714s host still refuses noirq suspend as before and PCIe/N1 adoption and the root-port reset work. I'll merge after #1323 once CI passes.

🤖 Generated with Claude Code

@DjDeveloperr

Copy link
Copy Markdown
Contributor

Retested before merging on the M5 Pro (J714sAP, bare metal, SSD boot), kernel 7.3.0-m5-merge (the M5's integration kernel with this round's rebased heads; this PR's files identical to this head). CI green; merged after #1323, whose head this branch sits on.

  • No change on J714s, as intended: the retained-link path is gated on apple,j716c. PCIe port 0 adoption, the N1's root-port reset (link retrained after a root-port reset) and Wi-Fi/BT work.

🤖 Generated with Claude Code

@DjDeveloperr
DjDeveloperr merged commit d81c67b into integration/aurora Nov 9, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants