Re: [PATCH V4 00/17] i3c: mipi-i3c-hci: DMA abort, recovery and related improvements
Adrian Hunter <[email protected]>
| Newsgroups | org.infradead.lists.linux-i3c,org.kernel.vger.linux-kernel |
|---|---|
| Organization | Intel Finland Oy, Registered Address: c/o Alberga Business Park, 6 krs, Bertel Jungin Aukio 5, 02600 Espoo, Business Identity Code: 0357606 - 4, Domiciled in Helsinki |
| Message-ID | <[email protected]> |
On 15/05/2026 19:26, Adrian Hunter wrote: > Hi > > This series improves the robustness of the MIPI I3C HCI DMA mode driver, > addressing issues observed during error handling and recovery. Any comments on V4? > > Patch 1 ensures suspend always invokes io->suspend. > > Patches 2-4 fix issues in the existing DMA abort path: preserving the RUN > bit during abort per the MIPI specification, blocking enqueue during > abort/error, and waiting for ring restart completion. > > Patches 5-8 improve how partially completed transfer lists are handled > during dequeue: moving hci_dma_xfer_done() earlier so completed > responses are processed before NoOp replacement, completing transfer > lists immediately on error rather than deferring, and detecting when an > abort races with transfer completion to avoid restarting the wrong > transfer list. > > Patches 9-11 add Intel-specific quirks for DMA ring abort: a PIO queue > reset after abort, and an HC_CONTROL ABORT before the ring-level abort. > > Patch 12 factors out a reset-and-restore helper from the suspend path > for reuse. > > Patch 13 adds a full DMA recovery path for internal controller errors. > When the hardware reports a TID mismatch or the ring becomes stuck, the > driver now resets and restores the controller, terminating all in-flight > transfers with an error status. > > Patch 14 makes NoOp command handling observable: instead of discarding > NoOp responses, the driver now waits for them to complete and triggers > recovery if they fail. > > Patch 15 adjusts transfer timeout accounting to start from when a > transfer actually begins execution rather than when it was queued, > preventing premature timeouts behind slow predecessors. > > Patches 16-17 are minor optimizations: consolidating the DMA command and > response ring into a single coherent allocation, and increasing the ring > size to the maximum 255 entries to avoid ring-space exhaustion. > > > Changes in V4: > > i3c: mipi-i3c-hci: Add DMA ring abort/reset quirk for Intel controllers > Inline HCI_QUIRK_DMA_ABORT_REQUIRES_PIO_RESET check at call site > instead of using a helper function > > i3c: mipi-i3c-hci: Factor out hci_dma_abort() > New patch > > i3c: mipi-i3c-hci: Add DMA ring abort quirk for Intel controllers > Factor out hci_dma_abort() into a preceding patch > Make hci_dma_requires_hc_abort_quirk() void; move quirk check to caller > > i3c: mipi-i3c-hci: Base timeouts on actual transfer start time > Rename start_time to start_jiffies > > i3c: mipi-i3c-hci: Consolidate DMA ring allocation > Cache allocation size in xfer_alloc_sz to avoid recomputing in > hci_dma_free() > > > Changes in V3: > > i3c: mipi-i3c-hci: Fix suspend behavior when bus disable falls back to software reset > i3c: mipi-i3c-hci: Preserve RUN bit when aborting DMA ring > Add Frank's rev'd-by > > i3c: mipi-i3c-hci: Add DMA-mode recovery for internal controller errors > When erroring out transfers, ensure the final transfer of a > transfer list is processed last > > > Changes in V2: > > i3c: mipi-i3c-hci: Fix suspend behavior when bus disable falls back to software reset > Always return 0 from suspend callback > Amend commit message > > i3c: mipi-i3c-hci: Preserve RUN bit when aborting DMA ring > Improve commit message > > i3c: mipi-i3c-hci: Prevent DMA enqueue while ring is aborting or in error > Improve commit message > > i3c: mipi-i3c-hci: Wait for DMA ring restart to complete > None > > i3c: mipi-i3c-hci: Move hci_dma_xfer_done() definition > Add Frank's Rev'd-by > > i3c: mipi-i3c-hci: Call hci_dma_xfer_done() from dequeue path > Add Frank's Rev'd-by > > i3c: mipi-i3c-hci: Complete transfer lists immediately on error > Rename completing_xfer to final_xfer > > i3c: mipi-i3c-hci: Avoid restarting DMA ring after aborting wrong transfer > Rename completing_xfer to final_xfer > > i3c: mipi-i3c-hci: Add DMA ring abort/reset quirk for Intel controllers > None > > i3c: mipi-i3c-hci: Add DMA ring abort quirk for Intel controllers > None > > i3c: mipi-i3c-hci: Factor out reset-and-restore helper > Drop redundant i3c_hci_sync_irq_inactive(hci) > from i3c_hci_reset_and_restore() because it is called by > hci->io->suspend() anyway > > i3c: mipi-i3c-hci: Add DMA-mode recovery for internal controller errors > Rename completing_xfer to final_xfer > Add hci_dma_xfer_done() before checking for an already complete > transfer > Improve commit message > > i3c: mipi-i3c-hci: Wait for NoOp commands to complete > Rename completing_xfer to final_xfer > Add missing reinit_completion() > > i3c: mipi-i3c-hci: Base timeouts on actual transfer start time > Do not flag the next transfer as started when there is an error > which halts the controller > Instead flag it started at the end of hci_dma_dequeue_xfer() > Use hci_start_xfer() in pio.c > > i3c: mipi-i3c-hci: Consolidate DMA ring allocation > Check for failed allocation before assignments to avoid doing > arithmetic with NULL pointers > > i3c: mipi-i3c-hci: Increase DMA transfer ring size to maximum > None > > > Adrian Hunter (17): > i3c: mipi-i3c-hci: Fix suspend behavior when bus disable falls back to software reset > i3c: mipi-i3c-hci: Preserve RUN bit when aborting DMA ring > i3c: mipi-i3c-hci: Prevent DMA enqueue while ring is aborting or in error > i3c: mipi-i3c-hci: Wait for DMA ring restart to complete > i3c: mipi-i3c-hci: Move hci_dma_xfer_done() definition > i3c: mipi-i3c-hci: Call hci_dma_xfer_done() from dequeue path > i3c: mipi-i3c-hci: Complete transfer lists immediately on error > i3c: mipi-i3c-hci: Avoid restarting DMA ring after aborting wrong transfer > i3c: mipi-i3c-hci: Add DMA ring abort/reset quirk for Intel controllers > i3c: mipi-i3c-hci: Factor out hci_dma_abort() > i3c: mipi-i3c-hci: Add DMA ring abort quirk for Intel controllers > i3c: mipi-i3c-hci: Factor out reset-and-restore helper > i3c: mipi-i3c-hci: Add DMA-mode recovery for internal controller errors > i3c: mipi-i3c-hci: Wait for NoOp commands to complete > i3c: mipi-i3c-hci: Base timeouts on actual transfer start time > i3c: mipi-i3c-hci: Consolidate DMA ring allocation > i3c: mipi-i3c-hci: Increase DMA transfer ring size to maximum > > drivers/i3c/master/mipi-i3c-hci/cmd.h | 6 + > drivers/i3c/master/mipi-i3c-hci/core.c | 82 ++++++-- > drivers/i3c/master/mipi-i3c-hci/dma.c | 333 +++++++++++++++++++++++++-------- > drivers/i3c/master/mipi-i3c-hci/hci.h | 22 +++ > drivers/i3c/master/mipi-i3c-hci/pio.c | 1 + > 5 files changed, 354 insertions(+), 90 deletions(-) > > > Regards > Adrian -- linux-i3c mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-i3c