From: John Hubbard <jhubbard@nvidia.com>
To: Danilo Krummrich <dakr@kernel.org>,
Alexandre Courbot <acourbot@nvidia.com>
Cc: "Timur Tabi" <ttabi@nvidia.com>,
"Alistair Popple" <apopple@nvidia.com>,
"Eliot Courtney" <ecourtney@nvidia.com>,
"Zhi Wang" <zhiw@nvidia.com>, "David Airlie" <airlied@gmail.com>,
"Simona Vetter" <simona@ffwll.ch>,
"Bjorn Helgaas" <bhelgaas@google.com>,
"Miguel Ojeda" <ojeda@kernel.org>,
"Alex Gaynor" <alex.gaynor@gmail.com>,
"Boqun Feng" <boqun.feng@gmail.com>,
"Gary Guo" <gary@garyguo.net>,
"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
"Benno Lossin" <lossin@kernel.org>,
"Andreas Hindborg" <a.hindborg@kernel.org>,
"Alice Ryhl" <aliceryhl@google.com>,
"Trevor Gross" <tmgross@umich.edu>,
nova-gpu@lists.linux.dev, LKML <linux-kernel@vger.kernel.org>,
"John Hubbard" <jhubbard@nvidia.com>
Subject: [PATCH v4 00/17] nova-core: GPU interrupt support and GSP event delivery
Date: Fri, 11 Sep 2026 21:43:43 -0700 [thread overview]
Message-ID: <20260912044400.677097-1-jhubbard@nvidia.com> (raw)
This series adds support for GIN, the GPU Interrupt and Notification
unit, which is the GPU's interrupt controller, so that GSP events reach
the driver as interrupts rather than only when the driver polls for
them.
The handler is threaded. The top half touches only GPU registers, and
the IRQ thread drains the GSP-to-CPU message queue.
This is based on drm-rust-next at d669686f8170 ("gpu: nova-core: mm: Add
BAR1 memory management self-tests"), which now includes the PRAMIN and
BAR1 memory management series from Joel and Eliot. The PRAMIN series
brought the NOVA_CORE_SELFTESTS option and the assertion macros for
probe-time hardware tests, and the interrupt self-test uses both.
Patches 7, 11 and 13 are new, so v4 has 17 patches where v3 had 14.
Changes in v4, at a high level:
* Rebased onto the current drm-rust-next.
* The comments, doc comments and commit messages are rewritten across
the series, and the design document is reworked.
* A GSP fault no longer hangs the CPU. The top half reads the falcon
causes back after clearing them, and disables the GSP vector instead
of retriggering the falcon when one is still set.
* The self-test allocates its own vectors and runs from probe, after
the GFW boot wait, which a new patch moves out of the Gpu
constructor. It shares the NOVA_CORE_SELFTESTS option and the
assertion macros with the memory management tests.
* A GSP message of the wrong type returns ENOMSG instead of ERANGE, in
a new patch.
* Three pieces moved out of the SWGEN0 patch: the GSP queue drain to a
new patch, a SubtreeSet method to patch 3, and the falcon interrupt
HAL to patch 14. The SWGEN0 patch now carries only the handler and
its registration.
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-v4/
The branch also carries two small bindgen warning fixes of mine below
the series. They are not part of it.
Changes in v4, in more detail:
* I rewrote the comments, doc comments and commit messages across
patches 3 through 17, and reworked patch 17's design document.
* Rebased onto the current drm-rust-next. Coherent DMA allocations are
tied to the device's bound lifetime there, so Cmdq and Gsp carry a
lifetime parameter and the GSP event handler borrows a Cmdq<'_>.
* Patch 6 has Tree::new() take a &SubtreeVectors, rather than the MSI
type and the serviced subtrees that its callers were unpacking from
one. (Alex)
* Patch 7 is new. It moves the wait for the GPU's own firmware from the
Gpu constructor out to the PCI probe, so that patch 8's self-test can
run from probe as the memory management self-tests do. The interrupt
self-test runs after that wait and before the GSP boot that the
constructor does, while the memory tests run after it. (Alex)
* Patch 8 uses NOVA_CORE_SELFTESTS and the selftest_assert macros
instead of its own Kconfig option. The memory management tests and
the interrupt test share the option but not the failure behavior: a
failed interrupt delivery test fails the PCI probe, while a PRAMIN or
BAR1 failure only logs. The option's help text says so. (Alex)
* Patch 8 also allocates the vectors for the doorbell's own subtree and
releases them, instead of borrowing the driver's allocation for the
GSP subtree, which worked only because both vectors are in subtree 2.
It registers as "nova-core-selftest". Every supported chip has the
doorbell at the same vector, so the test names it without asking
GSP-RM. (Alex)
* Patch 9 renames classify_event() to log_event(). The function only
logs, and never returns the classification that the old name
promised.
* Patch 10 warns when a GSP message is too short to decode as the
expected type. (Alex, Gary)
* Patch 11 is new: a message of the wrong type now returns ENOMSG
instead of ERANGE, which says nothing about a message. Two retry
loops still matched ERANGE, so the patch converts them to keep GSP
boot working. Patch 12 removes both loops. (Gary, Alex)
* Patch 12 refactors the deadline loop into one place, and drops a
reference to a private method from the public documentation. (Alex)
* Patch 13 is new, and carries the GSP message queue drain that v3
added inside the SWGEN0 patch. (Alex)
* Patch 14 carries the falcon interrupt HAL that v3 put in the SWGEN0
patch, as a HAL now rather than two functions matching on chipset.
It is separate from the falcon boot HAL, which the top half cannot
reach without allocating. (Alex)
* Patch 15 fixes the interrupt storm. IRQSCLR does not end a cause
driven from outside the falcon, so v3's retrigger re-emitted it at
once. The top half now reads the causes back after the clear, and
disables the GSP vector instead of retriggering when one is still
set. (Sashiko reported it. I have not reproduced it.)
* Patch 15 also returns the host-routed causes as a typed IRQSTAT value,
and replaces the module-wide expect(dead_code) with a per-item
cfg_attr on the items that the off-by-default self-test leaves dead.
* Patch 16 tests both falcon interrupt properties through the new HAL.
Will, I kept your Reviewed-by on patches 4, 5 and 6. I dropped it from
the rest, because the comments changed everywhere and patches 8, 14,
15, 16 and 17 changed in substance. Patch 15 is the one I would ask you
to look at first: its top half can now disable the GSP vector instead
of retriggering the falcon.
TESTING: to fill in after the test run. v3 was tested on Turing
(TU117), Ampere (GA104) and Blackwell (GB202), covering probe and
chipset identification, the interrupt self-test, a GSP name query over
the command queue, driver unload/reload, and the KUnit suites. I have
not produced a GSP fault on any of them, so the new fault path is
untested.
Joel Fernandes (2):
rust: sync: completion: add wait_for_completion_timeout()
gpu: nova-core: add the GIN interrupt tree and allocate its vectors
John Hubbard (15):
rust: pci: declare IrqType and IrqTypes with impl_flags
gpu: nova-core: add the GIN vector, leaf and subtree types
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: wait for GFW boot in probe, not in the Gpu constructor
gpu: nova-core: add an interrupt delivery self-test
gpu: nova-core: log GSP events instead of discarding them
gpu: nova-core: stop re-parsing a bad GSP message
gpu: nova-core: return ENOMSG for an unmatched GSP message
gpu: nova-core: bound a GSP wait by a single deadline
gpu: nova-core: add a GSP message queue drain
gpu: nova-core: add the falcon interrupt registers and their HAL
gpu: nova-core: service GSP events from the SWGEN0 interrupt
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 | 674 ++++++++++++++++++++
Documentation/gpu/nova/index.rst | 1 +
drivers/gpu/nova-core/Kconfig | 5 +
drivers/gpu/nova-core/driver.rs | 18 +-
drivers/gpu/nova-core/falcon/gsp.rs | 73 ++-
drivers/gpu/nova-core/falcon/hal.rs | 124 +++-
drivers/gpu/nova-core/falcon/hal/ga102.rs | 21 +-
drivers/gpu/nova-core/falcon/hal/tu102.rs | 36 +-
drivers/gpu/nova-core/gpu.rs | 85 ++-
drivers/gpu/nova-core/gsp.rs | 2 +-
drivers/gpu/nova-core/gsp/cmdq.rs | 260 ++++++--
drivers/gpu/nova-core/gsp/commands.rs | 8 +-
drivers/gpu/nova-core/gsp/sequencer.rs | 8 +-
drivers/gpu/nova-core/irq.rs | 149 +++++
drivers/gpu/nova-core/irq/doorbell_test.rs | 266 ++++++++
drivers/gpu/nova-core/irq/gsp.rs | 236 +++++++
drivers/gpu/nova-core/irq/hal.rs | 154 +++++
drivers/gpu/nova-core/irq/hal/gh100.rs | 28 +
drivers/gpu/nova-core/irq/hal/tu102.rs | 28 +
drivers/gpu/nova-core/irq/interrupt_tree.rs | 625 ++++++++++++++++++
drivers/gpu/nova-core/irq/regs.rs | 87 +++
drivers/gpu/nova-core/nova_core.rs | 1 +
drivers/gpu/nova-core/regs.rs | 69 ++
rust/kernel/pci/irq.rs | 68 +-
rust/kernel/sync/completion.rs | 23 +-
25 files changed, 2905 insertions(+), 144 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
create mode 100644 drivers/gpu/nova-core/irq/regs.rs
base-commit: d669686f8170c234edf12212fac9180ea18b1448
prerequisite-patch-id: 2e07fc4124e1e822f2a4eedf3e814f7e438a6afd
prerequisite-patch-id: 826e07a6bce50fa20188b01e9817fac0c7b6797c
--
2.55.0
next reply other threads:[~2026-09-12 4:44 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-12 4:43 John Hubbard [this message]
2026-09-12 4:43 ` [PATCH v4 01/17] rust: pci: declare IrqType and IrqTypes with impl_flags John Hubbard
2026-09-12 4:43 ` [PATCH v4 02/17] rust: sync: completion: add wait_for_completion_timeout() John Hubbard
2026-09-12 4:43 ` [PATCH v4 03/17] gpu: nova-core: add the GIN vector, leaf and subtree types John Hubbard
2026-09-12 4:43 ` [PATCH v4 04/17] gpu: nova-core: add the GIN CPU interrupt tree and MSI EOI registers John Hubbard
2026-09-12 4:43 ` [PATCH v4 05/17] gpu: nova-core: add the per-architecture GIN CPU interrupt HAL John Hubbard
2026-09-12 4:43 ` [PATCH v4 06/17] gpu: nova-core: add the GIN interrupt tree and allocate its vectors John Hubbard
2026-09-12 4:43 ` [PATCH v4 07/17] gpu: nova-core: wait for GFW boot in probe, not in the Gpu constructor John Hubbard
2026-09-12 4:43 ` [PATCH v4 08/17] gpu: nova-core: add an interrupt delivery self-test John Hubbard
2026-09-12 4:43 ` [PATCH v4 09/17] gpu: nova-core: log GSP events instead of discarding them John Hubbard
2026-09-12 4:43 ` [PATCH v4 10/17] gpu: nova-core: stop re-parsing a bad GSP message John Hubbard
2026-09-12 4:43 ` [PATCH v4 11/17] gpu: nova-core: return ENOMSG for an unmatched " John Hubbard
2026-09-12 4:43 ` [PATCH v4 12/17] gpu: nova-core: bound a GSP wait by a single deadline John Hubbard
2026-09-12 4:43 ` [PATCH v4 13/17] gpu: nova-core: add a GSP message queue drain John Hubbard
2026-09-12 4:43 ` [PATCH v4 14/17] gpu: nova-core: add the falcon interrupt registers and their HAL John Hubbard
2026-09-12 4:43 ` [PATCH v4 15/17] gpu: nova-core: service GSP events from the SWGEN0 interrupt John Hubbard
2026-09-12 4:43 ` [PATCH v4 16/17] gpu: nova-core: add KUnit tests for the interrupt tree and HALs John Hubbard
2026-09-12 4:44 ` [PATCH v4 17/17] gpu: nova-core: document the GIN interrupt controller and GSP events John Hubbard
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=20260912044400.677097-1-jhubbard@nvidia.com \
--to=jhubbard@nvidia.com \
--cc=a.hindborg@kernel.org \
--cc=acourbot@nvidia.com \
--cc=airlied@gmail.com \
--cc=alex.gaynor@gmail.com \
--cc=aliceryhl@google.com \
--cc=apopple@nvidia.com \
--cc=bhelgaas@google.com \
--cc=bjorn3_gh@protonmail.com \
--cc=boqun.feng@gmail.com \
--cc=dakr@kernel.org \
--cc=ecourtney@nvidia.com \
--cc=gary@garyguo.net \
--cc=linux-kernel@vger.kernel.org \
--cc=lossin@kernel.org \
--cc=nova-gpu@lists.linux.dev \
--cc=ojeda@kernel.org \
--cc=simona@ffwll.ch \
--cc=tmgross@umich.edu \
--cc=ttabi@nvidia.com \
--cc=zhiw@nvidia.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
all inboxes | Powered by JetHome®