[PATCH 00/17] nova-core: GPU interrupt support and GSP event delivery

From: John Hubbard

Date: Fri Aug 07 2026 - 23:11:38 EST


This series adds support for GIN, the GPU Interrupt and Notification
unit and the GPU's interrupt controller, so that GSP events reach the
driver as interrupts instead of only when the driver polls.

The series builds the path from the bottom up: the GIN register
definitions, a type-state API for walking the two-level tree, a
per-architecture HAL for the tree size and the rearm method, and a PCI
vector allocation sized to the subtrees nova-core services. On top of
that sits a threaded handler on the GSP notification vector, whose top
half touches only registers and whose IRQ thread drains the message
queue.

Driving that queue from an interrupt rather than from a polling loop
exposed three problems polling had hidden, so patches 10 through 13 fix
those before the handler arrives in patch 14.

A few rust/ changes were needed first, patches 1 through 3.

Patch 17 adds interrupts.rst, which is the place to start.

Joel Fernandes wrote the first versions of the tree API and the
self-test, and Will Pierce reviewed the interrupt work and the document.

Based on drm-rust-next plus Danilo Krummrich's "rust: irq: make
Registration compatible with lifetime-bound drivers".

There is a git branch with the patches as applied to drm-rust-next:

https://github.com/johnhubbard/linux/tree/nova-core-gin-interrupt-tree-v0/

Testing: the 14 KUnit tests this series adds all pass. Probe succeeds
with the delivery self-test enabled on TU117 (Turing), GA104 (Ampere),
and GB202 (Blackwell). All three were granted MSI rather than MSI-X, so
the pre-Hopper configuration-mirror rearm and the Hopper-plus TOP cycle
both ran on hardware. Only KUnit covers the MSI-X per-subtree rearm.

An earlier version of this series has serviced real GSP events, in a
setup where the GSP posts them after probe. This version has not been
re-tested there yet. Patch 15's reordering runs on Turing without
regression, but the two races it closes are timing-dependent and I did
not reproduce either one.

One known gap: driver_read_area still reads the GSP producer pointer
with no acquire barrier. Gary Guo's barrier series puts dma_mb(Read) at
exactly that point [1], so let's just wait for his fix to land.

[1] https://lore.kernel.org/all/20260609-rust-barrier-v2-4-30fcc48e1cd0@xxxxxxxxxxx/

Joel Fernandes (3):
rust: sync: completion: add wait_for_completion_timeout()
gpu: nova-core: allocate PCI MSI vector during probe
gpu: nova-core: add the GIN interrupt tree API

John Hubbard (14):
rust: pci: expose the whole interrupt vector allocation
rust: pci: expose the allocated interrupt type
gpu: nova-core: add the GIN CPU interrupt tree and MSI EOI registers
gpu: nova-core: add the per-architecture GIN CPU interrupt HAL
gpu: nova-core: allocate interrupt vectors for the serviced subtrees
gpu: nova-core: add an interrupt delivery self-test
gpu: nova-core: dispatch GSP events instead of discarding them
gpu: nova-core: match GSP RPC replies by sequence, not just function
gpu: nova-core: recover the GSP receive path from corrupt framing
gpu: nova-core: bound a GSP wait by a single deadline
gpu: nova-core: drive GSP events with the SWGEN0 interrupt
gpu: nova-core: retrigger the GSP falcon and clear every latched cause
gpu: nova-core: add KUnit tests for the interrupt tree and HALs
gpu: nova-core: document the GIN interrupt controller and GSP events

Documentation/gpu/nova/core/interrupts.rst | 686 ++++++++++++++++++++
Documentation/gpu/nova/index.rst | 1 +
drivers/gpu/nova-core/Kconfig | 15 +
drivers/gpu/nova-core/driver.rs | 54 +-
drivers/gpu/nova-core/falcon/gsp.rs | 71 +-
drivers/gpu/nova-core/falcon/hal.rs | 32 +
drivers/gpu/nova-core/gpu.rs | 28 +-
drivers/gpu/nova-core/gsp.rs | 17 +-
drivers/gpu/nova-core/gsp/cmdq.rs | 286 ++++++--
drivers/gpu/nova-core/gsp/commands.rs | 8 +-
drivers/gpu/nova-core/gsp/fw.rs | 13 +-
drivers/gpu/nova-core/gsp/sequencer.rs | 8 +-
drivers/gpu/nova-core/irq.rs | 99 +++
drivers/gpu/nova-core/irq/doorbell_test.rs | 328 ++++++++++
drivers/gpu/nova-core/irq/gsp.rs | 254 ++++++++
drivers/gpu/nova-core/irq/hal.rs | 215 ++++++
drivers/gpu/nova-core/irq/hal/gh100.rs | 30 +
drivers/gpu/nova-core/irq/hal/tu102.rs | 29 +
drivers/gpu/nova-core/irq/interrupt_tree.rs | 425 ++++++++++++
drivers/gpu/nova-core/nova_core.rs | 1 +
drivers/gpu/nova-core/regs.rs | 95 +++
rust/helpers/pci.c | 11 +
rust/kernel/pci.rs | 1 +
rust/kernel/pci/irq.rs | 143 ++--
rust/kernel/sync/completion.rs | 34 +-
25 files changed, 2737 insertions(+), 147 deletions(-)
create mode 100644 Documentation/gpu/nova/core/interrupts.rst
create mode 100644 drivers/gpu/nova-core/irq.rs
create mode 100644 drivers/gpu/nova-core/irq/doorbell_test.rs
create mode 100644 drivers/gpu/nova-core/irq/gsp.rs
create mode 100644 drivers/gpu/nova-core/irq/hal.rs
create mode 100644 drivers/gpu/nova-core/irq/hal/gh100.rs
create mode 100644 drivers/gpu/nova-core/irq/hal/tu102.rs
create mode 100644 drivers/gpu/nova-core/irq/interrupt_tree.rs


base-commit: 4c9ba407018e8deb06dbc643112bac8f40404f95
prerequisite-patch-id: 63224325d5ec73f06517bb35f8c366a086bbea19
--
2.55.0