public inbox for drm-ai-reviews@public-inbox.freedesktop.org
 help / color / mirror / Atom feed
* [PATCH v3 0/5] gpu: drm: nova: enable calling into nova-core
@ 2026-05-29 15:27 Alexandre Courbot
  2026-05-29 15:27 ` [PATCH v3 1/5] rust: inline some init methods Alexandre Courbot
                   ` (6 more replies)
  0 siblings, 7 replies; 17+ messages in thread
From: Alexandre Courbot @ 2026-05-29 15:27 UTC (permalink / raw)
  To: Miguel Ojeda, Nathan Chancellor, Nicolas Schier, Miguel Ojeda,
	Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin,
	Andreas Hindborg, Alice Ryhl, Trevor Gross, Danilo Krummrich,
	David Airlie, Simona Vetter
  Cc: John Hubbard, Alistair Popple, Timur Tabi, Zhi Wang,
	Eliot Courtney, linux-kbuild, linux-kernel, rust-for-linux,
	nova-gpu, dri-devel, Alexandre Courbot, Joel Fernandes

`nova-drm` is scheduled to expose a user-space API to receive IOCTLs
from user-mode drivers, and to call into `nova-core` to perform the
actual work. We are about to reach the state where we need the ability
to call into `nova-core`, but the current Rust build system does not
support this, and the solution will likely take at least a couple of
cycles to be merged.

In the meantime, this series introduces a Nova-local workaround for
`nova-drm` to call into `nova-core`. It generates the `nova-core`
metadata that `nova-drm` can use to resolve references at build-time,
and also builds a list of exported symbols for symbol resolution when
modules are loaded.

Since Rust symbols are long, this work ran into the limits on symbol
sizes `modpost` can handle. Thus, the first patch instructs the compiler
to inline initializers for some Rust basic types to avoid those long
symbol names when symbols from `nova-core` are exported. Interestingly,
this also results in a smaller nova-core binary size [1].

The rest of the patches enable inter-module calls from nova-drm to
nova-core.

This series is based on `drm-rust-next`.

[1] https://lore.kernel.org/all/DIN76NTFEU1N.1RT6G4IFD62RG@nvidia.com/

Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
---
Changes in v3:
- Drop the modpost overflow detection patch as it is to be merged
  through the KBuild tree.
- Drop obsolete (and actually unnecessary) changes to `pin_init`.
- Do not inline methods returning `impl PinInit` as they cannot
  contribute to the long symbol names problem.
- Use `#[inline]` instead of `#[inline(always)]` for methods that could
  create excessively long symbols.
- Link to v2: https://patch.msgid.link/20260527-nova-exports-v2-0-06de4c556d55@nvidia.com

Changes in v2:
- Rebase on top of HRT v5.
- Inline some `pin_init` and Rust basic types methods to avoid long
  symbol names and optimize code.
- Print truncating modpost symbols and abort upon meeting them.
- Drop increase of `buf_printf`'s buffer.
- Drop obsolete nova-core renaming patch.
- Link to v1: https://patch.msgid.link/20260430-nova-exports-v1-0-7ca31664e983@nvidia.com

---
Alexandre Courbot (5):
      rust: inline some init methods
      gpu: nova-core: export Rust symbols for dependent modules
      gpu: nova-core: emit Rust metadata for dependent modules
      gpu: drm: nova: build after nova-core metadata
      [POC] drm: nova: demonstrate interaction with nova-core

 drivers/gpu/drm/nova/Makefile             | 15 ++++++++
 drivers/gpu/drm/nova/driver.rs            |  9 ++++-
 drivers/gpu/nova-core/Makefile            | 48 ++++++++++++++++++++++++-
 drivers/gpu/nova-core/driver.rs           | 59 +++++++++++++++++++++++--------
 drivers/gpu/nova-core/gpu.rs              |  9 +++--
 drivers/gpu/nova-core/nova_core.rs        |  4 +--
 drivers/gpu/nova-core/nova_core_exports.c | 13 +++++++
 rust/kernel/alloc/kbox.rs                 |  2 ++
 rust/kernel/init.rs                       |  1 +
 rust/kernel/sync/arc.rs                   |  2 ++
 10 files changed, 141 insertions(+), 21 deletions(-)
---
base-commit: 0e42ec83d46ab8877d38d37493328ed7d1a24de8
change-id: 20260430-nova-exports-502f996c5aab

Best regards,
--  
Alexandre Courbot <acourbot@nvidia.com>


^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH v3 1/5] rust: inline some init methods
  2026-05-29 15:27 [PATCH v3 0/5] gpu: drm: nova: enable calling into nova-core Alexandre Courbot
@ 2026-05-29 15:27 ` Alexandre Courbot
  2026-06-03 11:52   ` Gary Guo
  2026-06-04  6:23   ` Claude review: " Claude Code Review Bot
  2026-05-29 15:27 ` [PATCH v3 2/5] gpu: nova-core: export Rust symbols for dependent modules Alexandre Courbot
                   ` (5 subsequent siblings)
  6 siblings, 2 replies; 17+ messages in thread
From: Alexandre Courbot @ 2026-05-29 15:27 UTC (permalink / raw)
  To: Miguel Ojeda, Nathan Chancellor, Nicolas Schier, Miguel Ojeda,
	Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin,
	Andreas Hindborg, Alice Ryhl, Trevor Gross, Danilo Krummrich,
	David Airlie, Simona Vetter
  Cc: John Hubbard, Alistair Popple, Timur Tabi, Zhi Wang,
	Eliot Courtney, linux-kbuild, linux-kernel, rust-for-linux,
	nova-gpu, dri-devel, Alexandre Courbot

These methods should be inlined for optimization reasons. Failure to do
so can also produce symbol names larger than what `modpost` or `objtool`
can handle.

Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
---
 rust/kernel/alloc/kbox.rs | 2 ++
 rust/kernel/init.rs       | 1 +
 rust/kernel/sync/arc.rs   | 2 ++
 3 files changed, 5 insertions(+)

diff --git a/rust/kernel/alloc/kbox.rs b/rust/kernel/alloc/kbox.rs
index 2f8c16473c2c..1264a8118aca 100644
--- a/rust/kernel/alloc/kbox.rs
+++ b/rust/kernel/alloc/kbox.rs
@@ -433,6 +433,7 @@ impl<T, A> InPlaceWrite<T> for Box<MaybeUninit<T>, A>
 {
     type Initialized = Box<T, A>;
 
+    #[inline]
     fn write_init<E>(mut self, init: impl Init<T, E>) -> Result<Self::Initialized, E> {
         let slot = self.as_mut_ptr();
         // SAFETY: When init errors/panics, slot will get deallocated but not dropped,
@@ -442,6 +443,7 @@ fn write_init<E>(mut self, init: impl Init<T, E>) -> Result<Self::Initialized, E
         Ok(unsafe { Box::assume_init(self) })
     }
 
+    #[inline]
     fn write_pin_init<E>(mut self, init: impl PinInit<T, E>) -> Result<Pin<Self::Initialized>, E> {
         let slot = self.as_mut_ptr();
         // SAFETY: When init errors/panics, slot will get deallocated but not dropped,
diff --git a/rust/kernel/init.rs b/rust/kernel/init.rs
index 7a0d4559d7b5..b2f330d42221 100644
--- a/rust/kernel/init.rs
+++ b/rust/kernel/init.rs
@@ -151,6 +151,7 @@ fn try_pin_init<E>(init: impl PinInit<T, E>, flags: Flags) -> Result<Self::Pinne
     /// type.
     ///
     /// If `T: !Unpin` it will not be able to move afterwards.
+    #[inline]
     fn pin_init<E>(init: impl PinInit<T, E>, flags: Flags) -> error::Result<Self::PinnedSelf>
     where
         Error: From<E>,
diff --git a/rust/kernel/sync/arc.rs b/rust/kernel/sync/arc.rs
index 18d6c0d62ce0..b9f480040c55 100644
--- a/rust/kernel/sync/arc.rs
+++ b/rust/kernel/sync/arc.rs
@@ -712,6 +712,7 @@ fn try_init<E>(init: impl Init<T, E>, flags: Flags) -> Result<Self, E>
 impl<T> InPlaceWrite<T> for UniqueArc<MaybeUninit<T>> {
     type Initialized = UniqueArc<T>;
 
+    #[inline]
     fn write_init<E>(mut self, init: impl Init<T, E>) -> Result<Self::Initialized, E> {
         let slot = self.as_mut_ptr();
         // SAFETY: When init errors/panics, slot will get deallocated but not dropped,
@@ -721,6 +722,7 @@ fn write_init<E>(mut self, init: impl Init<T, E>) -> Result<Self::Initialized, E
         Ok(unsafe { self.assume_init() })
     }
 
+    #[inline]
     fn write_pin_init<E>(mut self, init: impl PinInit<T, E>) -> Result<Pin<Self::Initialized>, E> {
         let slot = self.as_mut_ptr();
         // SAFETY: When init errors/panics, slot will get deallocated but not dropped,

-- 
2.54.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v3 2/5] gpu: nova-core: export Rust symbols for dependent modules
  2026-05-29 15:27 [PATCH v3 0/5] gpu: drm: nova: enable calling into nova-core Alexandre Courbot
  2026-05-29 15:27 ` [PATCH v3 1/5] rust: inline some init methods Alexandre Courbot
@ 2026-05-29 15:27 ` Alexandre Courbot
  2026-06-04  6:23   ` Claude review: " Claude Code Review Bot
  2026-05-29 15:27 ` [PATCH v3 3/5] gpu: nova-core: emit Rust metadata " Alexandre Courbot
                   ` (4 subsequent siblings)
  6 siblings, 1 reply; 17+ messages in thread
From: Alexandre Courbot @ 2026-05-29 15:27 UTC (permalink / raw)
  To: Miguel Ojeda, Nathan Chancellor, Nicolas Schier, Miguel Ojeda,
	Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin,
	Andreas Hindborg, Alice Ryhl, Trevor Gross, Danilo Krummrich,
	David Airlie, Simona Vetter
  Cc: John Hubbard, Alistair Popple, Timur Tabi, Zhi Wang,
	Eliot Courtney, linux-kbuild, linux-kernel, rust-for-linux,
	nova-gpu, dri-devel, Alexandre Courbot, Joel Fernandes

Export `nova-core`'s Rust symbols so that other loadable modules,
particularly `nova-drm`, can resolve references to `nova-core` at
runtime.

This is done by generating declarations and `EXPORT_SYMBOL_GPL()` calls
for Rust global text symbols using `nm` and compiling them into the
module as `nova_core_exports.o`.

This is a workaround until the build system supports Rust cross-crate
dependencies natively.

Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
Reviewed-by: Joel Fernandes <joelagnelf@nvidia.com>
---
 drivers/gpu/nova-core/Makefile            | 24 +++++++++++++++++++++++-
 drivers/gpu/nova-core/nova_core_exports.c | 13 +++++++++++++
 2 files changed, 36 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/nova-core/Makefile b/drivers/gpu/nova-core/Makefile
index 4ae544f808f4..59ac25488896 100644
--- a/drivers/gpu/nova-core/Makefile
+++ b/drivers/gpu/nova-core/Makefile
@@ -1,4 +1,26 @@
 # SPDX-License-Identifier: GPL-2.0
 
 obj-$(CONFIG_NOVA_CORE) += nova-core.o
-nova-core-y := nova_core.o
+nova-core-y := nova_core.o nova_core_exports.o
+
+# Export Rust symbols so dependent modules can use them at runtime.
+#
+# This is a workaround until the build system supports Rust cross-module
+# dependencies natively.
+# Kbuild uses Rust v0 mangling, whose symbols start with "_R".
+rust_exports = \
+	$(NM) -p --defined-only $(1) | \
+	awk '$$2 == "T" && $$3 ~ /^_R/ { \
+		printf "extern void %s(void); EXPORT_SYMBOL_GPL(%s);\n", $$3, $$3 \
+	}'
+
+define filechk_nova_core_exports
+	$(call rust_exports,$(obj)/nova_core.o)
+endef
+
+$(obj)/exports_nova_core_generated.h: $(obj)/nova_core.o FORCE
+	$(call filechk,nova_core_exports)
+
+targets += exports_nova_core_generated.h
+
+$(obj)/nova_core_exports.o: $(obj)/exports_nova_core_generated.h
diff --git a/drivers/gpu/nova-core/nova_core_exports.c b/drivers/gpu/nova-core/nova_core_exports.c
new file mode 100644
index 000000000000..480472b039db
--- /dev/null
+++ b/drivers/gpu/nova-core/nova_core_exports.c
@@ -0,0 +1,13 @@
+// SPDX-License-Identifier: GPL-2.0
+// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+
+/*
+ * Exports Rust symbols from the `nova_core` crate for use by dependent modules.
+ *
+ * This is a workaround until the build system supports Rust cross-module
+ * dependencies natively.
+ */
+
+#include <linux/export.h>
+
+#include "exports_nova_core_generated.h"

-- 
2.54.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v3 3/5] gpu: nova-core: emit Rust metadata for dependent modules
  2026-05-29 15:27 [PATCH v3 0/5] gpu: drm: nova: enable calling into nova-core Alexandre Courbot
  2026-05-29 15:27 ` [PATCH v3 1/5] rust: inline some init methods Alexandre Courbot
  2026-05-29 15:27 ` [PATCH v3 2/5] gpu: nova-core: export Rust symbols for dependent modules Alexandre Courbot
@ 2026-05-29 15:27 ` Alexandre Courbot
  2026-06-04  6:23   ` Claude review: " Claude Code Review Bot
  2026-05-29 15:27 ` [PATCH v3 4/5] gpu: drm: nova: build after nova-core metadata Alexandre Courbot
                   ` (3 subsequent siblings)
  6 siblings, 1 reply; 17+ messages in thread
From: Alexandre Courbot @ 2026-05-29 15:27 UTC (permalink / raw)
  To: Miguel Ojeda, Nathan Chancellor, Nicolas Schier, Miguel Ojeda,
	Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin,
	Andreas Hindborg, Alice Ryhl, Trevor Gross, Danilo Krummrich,
	David Airlie, Simona Vetter
  Cc: John Hubbard, Alistair Popple, Timur Tabi, Zhi Wang,
	Eliot Courtney, linux-kbuild, linux-kernel, rust-for-linux,
	nova-gpu, dri-devel, Alexandre Courbot

Emit nova-core's `.rmeta` crate metadata so dependent Rust modules can
resolve nova-core's types and functions via `--extern`.

The metadata is exposed as an explicit Kbuild target instead of relying
on an untracked side effect of the object build. This lets dependent
modules ask for the metadata directly, including single-target builds
where `nova-core`'s object may already be up to date.

This is a workaround until the build system supports Rust cross-crate
dependencies natively.

Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
---
 drivers/gpu/nova-core/Makefile | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/drivers/gpu/nova-core/Makefile b/drivers/gpu/nova-core/Makefile
index 59ac25488896..b8ccea78b2d2 100644
--- a/drivers/gpu/nova-core/Makefile
+++ b/drivers/gpu/nova-core/Makefile
@@ -24,3 +24,27 @@ $(obj)/exports_nova_core_generated.h: $(obj)/nova_core.o FORCE
 targets += exports_nova_core_generated.h
 
 $(obj)/nova_core_exports.o: $(obj)/exports_nova_core_generated.h
+
+# Dependent Rust drivers need `nova-core`'s crate metadata.
+# Expose it as an explicit target so they can request it directly.
+nova_core_rmeta := libnova_core.rmeta
+nova_core_rmeta_private := .nova_core_rmeta/$(nova_core_rmeta)
+targets += $(nova_core_rmeta) $(nova_core_rmeta_private)
+
+# Build in a private directory to avoid racing with `nova_core.o` on rustc's
+# intermediate object names during parallel builds.
+quiet_cmd_rustc_rmeta_rs = RUSTC RMETA $@
+      cmd_rustc_rmeta_rs = mkdir -p $(dir $@); \
+		$(rust_common_cmd) --emit=metadata=$@ \
+		--emit=obj=$(basename $@).o $<; \
+		rm -f $(basename $@).o
+
+$(obj)/$(nova_core_rmeta_private): private __modname := nova-core
+$(obj)/$(nova_core_rmeta_private): private part-of-builtin := $(if $(filter y,$(CONFIG_NOVA_CORE)),y)
+$(obj)/$(nova_core_rmeta_private): private part-of-module := $(if $(filter m,$(CONFIG_NOVA_CORE)),y)
+$(obj)/$(nova_core_rmeta_private): $(obj)/nova_core.rs FORCE
+	+$(call if_changed_dep,rustc_rmeta_rs)
+
+# Keep the metadata available at a stable path for consumers.
+$(obj)/$(nova_core_rmeta): $(obj)/$(nova_core_rmeta_private) FORCE
+	$(call if_changed,copy)

-- 
2.54.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v3 4/5] gpu: drm: nova: build after nova-core metadata
  2026-05-29 15:27 [PATCH v3 0/5] gpu: drm: nova: enable calling into nova-core Alexandre Courbot
                   ` (2 preceding siblings ...)
  2026-05-29 15:27 ` [PATCH v3 3/5] gpu: nova-core: emit Rust metadata " Alexandre Courbot
@ 2026-05-29 15:27 ` Alexandre Courbot
  2026-06-04  6:23   ` Claude review: " Claude Code Review Bot
  2026-05-29 15:27 ` [PATCH POC v3 5/5] drm: nova: demonstrate interaction with nova-core Alexandre Courbot
                   ` (2 subsequent siblings)
  6 siblings, 1 reply; 17+ messages in thread
From: Alexandre Courbot @ 2026-05-29 15:27 UTC (permalink / raw)
  To: Miguel Ojeda, Nathan Chancellor, Nicolas Schier, Miguel Ojeda,
	Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin,
	Andreas Hindborg, Alice Ryhl, Trevor Gross, Danilo Krummrich,
	David Airlie, Simona Vetter
  Cc: John Hubbard, Alistair Popple, Timur Tabi, Zhi Wang,
	Eliot Courtney, linux-kbuild, linux-kernel, rust-for-linux,
	nova-gpu, dri-devel, Alexandre Courbot

Point rustc to `nova-core`'s `.rmeta` file so `nova-drm` can use
`nova_core`'s types and functions at compile time.

Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
---
 drivers/gpu/drm/nova/Makefile | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/drivers/gpu/drm/nova/Makefile b/drivers/gpu/drm/nova/Makefile
index f8527b2b7b4a..6ed4ccbfbcdc 100644
--- a/drivers/gpu/drm/nova/Makefile
+++ b/drivers/gpu/drm/nova/Makefile
@@ -2,3 +2,18 @@
 
 obj-$(CONFIG_DRM_NOVA) += nova-drm.o
 nova-drm-y := nova.o
+
+nova_core_rmeta := drivers/gpu/nova-core/libnova_core.rmeta
+
+rustflags-y += --extern nova_core=$(objtree)/$(nova_core_rmeta)
+
+# `nova-drm` imports `nova-core` at compile time, so request `nova-core`'s
+# explicit metadata target before compiling nova.o.
+$(obj)/nova.o: | $(objtree)/$(nova_core_rmeta)
+
+# Build `nova-core`'s metadata by invoking make.
+#
+# This is ugly but only temporary until the build system natively supports
+# cross-crate dependencies.
+$(objtree)/$(nova_core_rmeta): FORCE
+	$(Q)$(MAKE) $(build)=drivers/gpu/nova-core $(nova_core_rmeta)

-- 
2.54.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH POC v3 5/5] drm: nova: demonstrate interaction with nova-core
  2026-05-29 15:27 [PATCH v3 0/5] gpu: drm: nova: enable calling into nova-core Alexandre Courbot
                   ` (3 preceding siblings ...)
  2026-05-29 15:27 ` [PATCH v3 4/5] gpu: drm: nova: build after nova-core metadata Alexandre Courbot
@ 2026-05-29 15:27 ` Alexandre Courbot
  2026-06-04  6:23   ` Claude review: " Claude Code Review Bot
  2026-06-01 13:50 ` [PATCH v3 0/5] gpu: drm: nova: enable calling into nova-core Miguel Ojeda
  2026-06-04  6:23 ` Claude review: " Claude Code Review Bot
  6 siblings, 1 reply; 17+ messages in thread
From: Alexandre Courbot @ 2026-05-29 15:27 UTC (permalink / raw)
  To: Miguel Ojeda, Nathan Chancellor, Nicolas Schier, Miguel Ojeda,
	Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin,
	Andreas Hindborg, Alice Ryhl, Trevor Gross, Danilo Krummrich,
	David Airlie, Simona Vetter
  Cc: John Hubbard, Alistair Popple, Timur Tabi, Zhi Wang,
	Eliot Courtney, linux-kbuild, linux-kernel, rust-for-linux,
	nova-gpu, dri-devel, Alexandre Courbot

Export a few items from nova-core and use them from nova-drm in order to
print the chipset of the GPU being probed.

Some documentation items are added to make Clippy happy.

This is only meant for demonstration purposes, and won't be merged.

Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
---
 drivers/gpu/drm/nova/driver.rs     |  9 +++++-
 drivers/gpu/nova-core/driver.rs    | 59 +++++++++++++++++++++++++++++---------
 drivers/gpu/nova-core/gpu.rs       |  9 ++++--
 drivers/gpu/nova-core/nova_core.rs |  4 +--
 4 files changed, 61 insertions(+), 20 deletions(-)

diff --git a/drivers/gpu/drm/nova/driver.rs b/drivers/gpu/drm/nova/driver.rs
index 4289df7de01c..2a3f47974079 100644
--- a/drivers/gpu/drm/nova/driver.rs
+++ b/drivers/gpu/drm/nova/driver.rs
@@ -9,12 +9,15 @@
         ioctl, //
     },
     prelude::*,
-    sync::aref::ARef, //
+    sync::aref::ARef,
+    types::ForLt, //
 };
 
 use crate::file::File;
 use crate::gem::NovaObject;
 
+use nova_core::driver::AuxData;
+
 pub(crate) struct NovaDriver;
 
 pub(crate) struct Nova {
@@ -60,6 +63,10 @@ fn probe<'bound>(
         adev: &'bound auxiliary::Device<Core<'_>>,
         _info: &'bound Self::IdInfo,
     ) -> impl PinInit<Self::Data<'bound>, Error> + 'bound {
+        let aux_data = adev.registration_data::<ForLt!(AuxData<'_>)>()?;
+
+        pr_info!("Chipset from nova-core: {}\n", aux_data.chipset());
+
         let data = try_pin_init!(NovaData { adev: adev.into() });
 
         let drm = drm::Device::<Self>::new(adev.as_ref(), data)?;
diff --git a/drivers/gpu/nova-core/driver.rs b/drivers/gpu/nova-core/driver.rs
index cff5034c2dcd..95fb4d13e676 100644
--- a/drivers/gpu/nova-core/driver.rs
+++ b/drivers/gpu/nova-core/driver.rs
@@ -1,5 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0
 
+//! Main driver module.
+
 use kernel::{
     auxiliary,
     device::Core,
@@ -20,18 +22,36 @@
     types::ForLt,
 };
 
-use crate::gpu::Gpu;
+use crate::gpu::{
+    Chipset,
+    Gpu, //
+};
 
 /// Counter for generating unique auxiliary device IDs.
 static AUXILIARY_ID_COUNTER: Atomic<u32> = Atomic::new(0);
 
+/// Data passed to the auxiliary device registration, for the sibling driver to use.
+pub struct AuxData<'bound> {
+    gpu: &'bound Gpu<'bound>,
+}
+
+impl AuxData<'_> {
+    /// Returns the chipset of this GPU.
+    pub fn chipset(&self) -> Chipset {
+        self.gpu.spec.chipset
+    }
+}
+
+/// Driver-associated data.
 #[pin_data]
-pub(crate) struct NovaCore<'bound> {
+pub struct NovaCore<'bound> {
+    // Fields are dropped in declaration order: unregister the auxiliary device before dropping
+    // `gpu`, and drop `gpu` before `bar` because `AuxData` borrows `gpu` and `Gpu` borrows `bar`.
+    #[allow(clippy::type_complexity)]
+    _reg: auxiliary::Registration<'bound, ForLt!(AuxData<'_>)>,
     #[pin]
     pub(crate) gpu: Gpu<'bound>,
     bar: pci::Bar<'bound, BAR0_SIZE>,
-    #[allow(clippy::type_complexity)]
-    _reg: auxiliary::Registration<'bound, ForLt!(())>,
 }
 
 pub(crate) struct NovaCoreDriver;
@@ -93,7 +113,7 @@ fn probe<'bound>(
             // other threads of execution.
             unsafe { pdev.dma_set_mask_and_coherent(DmaMask::new::<GPU_DMA_BITS>())? };
 
-            Ok(try_pin_init!(NovaCore {
+            Ok(try_pin_init!(&this in NovaCore {
                 bar: pdev.iomap_region_sized::<BAR0_SIZE>(0, c"nova-core/bar0")?,
                 // TODO: Use `&bar` self-referential pin-init syntax once available.
                 //
@@ -101,15 +121,26 @@ fn probe<'bound>(
                 // (`try_pin_init!()` initializes fields in declaration order), lives at a pinned
                 // stable address, and is dropped after `gpu` (struct field drop order).
                 gpu <- Gpu::new(pdev, unsafe { &*core::ptr::from_ref(bar) }),
-                _reg: auxiliary::Registration::new(
-                    pdev.as_ref(),
-                    c"nova-drm",
-                    // TODO[XARR]: Use XArray or perhaps IDA for proper ID allocation/recycling. For
-                    // now, use a simple atomic counter that never recycles IDs.
-                    AUXILIARY_ID_COUNTER.fetch_add(1, Relaxed),
-                    crate::MODULE_NAME,
-                    (),
-                )?,
+                // SAFETY: `NovaCore` is dropped when the device is unbound; i.e. `mem::forget()` is
+                // never called on it.
+                _reg: unsafe {
+                    auxiliary::Registration::new_with_lt(
+                        pdev.as_ref(),
+                        c"nova-drm",
+                        // TODO[XARR]: Use XArray or perhaps IDA for proper ID allocation/recycling.
+                        // For now, use a simple atomic counter that never recycles IDs.
+                        AUXILIARY_ID_COUNTER.fetch_add(1, Relaxed),
+                        crate::MODULE_NAME,
+                        AuxData {
+                            // TODO: Use `&gpu` self-referential pin-init syntax once available.
+                            //
+                            // SAFETY: `this.gpu` is initialized before this expression is
+                            // evaluated, lives at a pinned stable address, and is dropped after
+                            // `_reg` (struct field drop order).
+                            gpu: &*core::ptr::from_ref(&this.as_ref().gpu),
+                        },
+                    )?
+                },
             }))
         })
     }
diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs
index cf134cab49cd..5636659f24a8 100644
--- a/drivers/gpu/nova-core/gpu.rs
+++ b/drivers/gpu/nova-core/gpu.rs
@@ -1,5 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0
 
+//! Core types for the driver.
+
 use kernel::{
     device,
     fmt,
@@ -29,7 +31,8 @@ macro_rules! define_chipset {
     {
         /// Enum representation of the GPU chipset.
         #[derive(fmt::Debug, Copy, Clone, PartialOrd, Ord, PartialEq, Eq)]
-        pub(crate) enum Chipset {
+        #[allow(missing_docs)]
+        pub enum Chipset {
             $($variant = $value),*,
         }
 
@@ -183,7 +186,7 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
 /// Structure holding a basic description of the GPU: `Chipset` and `Revision`.
 #[derive(Clone, Copy)]
 pub(crate) struct Spec {
-    chipset: Chipset,
+    pub(crate) chipset: Chipset,
     revision: Revision,
 }
 
@@ -245,7 +248,7 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
 /// Structure holding the resources required to operate the GPU.
 #[pin_data]
 pub(crate) struct Gpu<'gpu> {
-    spec: Spec,
+    pub(crate) spec: Spec,
     /// MMIO mapping of PCI BAR 0.
     bar: &'gpu Bar0,
     /// System memory page required for flushing all pending GPU-side memory writes done through
diff --git a/drivers/gpu/nova-core/nova_core.rs b/drivers/gpu/nova-core/nova_core.rs
index 5a260062295f..5166e10ce8a0 100644
--- a/drivers/gpu/nova-core/nova_core.rs
+++ b/drivers/gpu/nova-core/nova_core.rs
@@ -13,11 +13,11 @@
 #[macro_use]
 mod bitfield;
 
-mod driver;
+pub mod driver;
 mod falcon;
 mod fb;
 mod firmware;
-mod gpu;
+pub mod gpu;
 mod gsp;
 #[macro_use]
 mod num;

-- 
2.54.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* Re: [PATCH v3 0/5] gpu: drm: nova: enable calling into nova-core
  2026-05-29 15:27 [PATCH v3 0/5] gpu: drm: nova: enable calling into nova-core Alexandre Courbot
                   ` (4 preceding siblings ...)
  2026-05-29 15:27 ` [PATCH POC v3 5/5] drm: nova: demonstrate interaction with nova-core Alexandre Courbot
@ 2026-06-01 13:50 ` Miguel Ojeda
  2026-06-01 17:00   ` Miguel Ojeda
  2026-06-03 10:30   ` Alexandre Courbot
  2026-06-04  6:23 ` Claude review: " Claude Code Review Bot
  6 siblings, 2 replies; 17+ messages in thread
From: Miguel Ojeda @ 2026-06-01 13:50 UTC (permalink / raw)
  To: Alexandre Courbot
  Cc: Miguel Ojeda, Nathan Chancellor, Nicolas Schier, Boqun Feng,
	Gary Guo, Björn Roy Baron, Benno Lossin, Andreas Hindborg,
	Alice Ryhl, Trevor Gross, Danilo Krummrich, David Airlie,
	Simona Vetter, John Hubbard, Alistair Popple, Timur Tabi,
	Zhi Wang, Eliot Courtney, linux-kbuild, linux-kernel,
	rust-for-linux, nova-gpu, dri-devel, Joel Fernandes

On Fri, May 29, 2026 at 5:28 PM Alexandre Courbot <acourbot@nvidia.com> wrote:
>
> In the meantime, this series introduces a Nova-local workaround for
> `nova-drm` to call into `nova-core`. It generates the `nova-core`
> metadata that `nova-drm` can use to resolve references at build-time,
> and also builds a list of exported symbols for symbol resolution when
> modules are loaded.

The "local approach" is essentially what I suggested back then, so if
this works for you then I am happy -- with the understanding that we
will replace it with the global support soon (it is good to have a use
case in-tree :)

I see you play some tricks to get the ordering right, including a
sub-make with a double build of the `.rmeta` in "private", which in
turn forces you also to do the `.o`, right?

What I originally had in mind was simply to do everything from a
single parent `Makefile` instead, precisely to avoid complexity (after
all, it is the local approach, so you don't need to force yourself to
handle that). That should remove all those shenanigans, and it is way
easier to get right. Did you consider it?

By the way, I think a `.gitignore` entry for the generated header is missing.

Cheers,
Miguel

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v3 0/5] gpu: drm: nova: enable calling into nova-core
  2026-06-01 13:50 ` [PATCH v3 0/5] gpu: drm: nova: enable calling into nova-core Miguel Ojeda
@ 2026-06-01 17:00   ` Miguel Ojeda
  2026-06-03 10:30   ` Alexandre Courbot
  1 sibling, 0 replies; 17+ messages in thread
From: Miguel Ojeda @ 2026-06-01 17:00 UTC (permalink / raw)
  To: Alexandre Courbot
  Cc: Miguel Ojeda, Nathan Chancellor, Nicolas Schier, Boqun Feng,
	Gary Guo, Björn Roy Baron, Benno Lossin, Andreas Hindborg,
	Alice Ryhl, Trevor Gross, Danilo Krummrich, David Airlie,
	Simona Vetter, John Hubbard, Alistair Popple, Timur Tabi,
	Zhi Wang, Eliot Courtney, linux-kbuild, linux-kernel,
	rust-for-linux, nova-gpu, dri-devel, Joel Fernandes

On Mon, Jun 1, 2026 at 3:50 PM Miguel Ojeda
<miguel.ojeda.sandonis@gmail.com> wrote:
>
> By the way, I think a `.gitignore` entry for the generated header is missing.

A few other notes:

  - The `exports` rule' `awk` filtering is stricter than the one we
normally use -- it is fine if you don't need `static`s etc., but I
will likely export `T|R|D|B` when I replace it, not just `T`.

  - Similarly, you don't use `EXPORT_SYMBOL_RUST_GPL` and the "dummy
symbol" is a function instead of the simple `int`. Is there a reason
for that? i.e. the ones you want to export are functions, but using
the global one (even defining `EXPORT_SYMBOL_RUST_GPL` the same way)
would reduce the divergence (so one less thing to think about later
when I replace it).

  - I noticed touching `nova-core` and then running a build twice will
only build `nova-drm.ko` the second time -- you may want to use
`--extern nova_core -L $(objtree)/...` like we do in `rust/Makefile`
instead of giving an explicit path to `--extern`.

I hope that helps!

Cheers,
Miguel

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v3 0/5] gpu: drm: nova: enable calling into nova-core
  2026-06-01 13:50 ` [PATCH v3 0/5] gpu: drm: nova: enable calling into nova-core Miguel Ojeda
  2026-06-01 17:00   ` Miguel Ojeda
@ 2026-06-03 10:30   ` Alexandre Courbot
  2026-06-03 11:49     ` Miguel Ojeda
  1 sibling, 1 reply; 17+ messages in thread
From: Alexandre Courbot @ 2026-06-03 10:30 UTC (permalink / raw)
  To: Miguel Ojeda
  Cc: Miguel Ojeda, Nathan Chancellor, Nicolas Schier, Boqun Feng,
	Gary Guo, Björn Roy Baron, Benno Lossin, Andreas Hindborg,
	Alice Ryhl, Trevor Gross, Danilo Krummrich, David Airlie,
	Simona Vetter, John Hubbard, Alistair Popple, Timur Tabi,
	Zhi Wang, Eliot Courtney, linux-kbuild, linux-kernel,
	rust-for-linux, nova-gpu, dri-devel, Joel Fernandes

> On Fri, May 29, 2026 at 5:28 PM Alexandre Courbot <acourbot@nvidia.com> wrote:
>>
>> In the meantime, this series introduces a Nova-local workaround for
>> `nova-drm` to call into `nova-core`. It generates the `nova-core`
>> metadata that `nova-drm` can use to resolve references at build-time,
>> and also builds a list of exported symbols for symbol resolution when
>> modules are loaded.
>
> The "local approach" is essentially what I suggested back then, so if
> this works for you then I am happy -- with the understanding that we
> will replace it with the global support soon (it is good to have a use
> case in-tree :)

Yup, I just want to have something that allows us to call from
`nova-drm` to `nova-core` as it becomes increasingly pressing for us to
be able to do so, but will be very happy to replace this with the global
support as soon as it is available.

This patchset won't make it for the 7.2 merge window, so if support in
the R4L build system comes during the next cycle we may even be able to
skip this altogether.

>
> I see you play some tricks to get the ordering right, including a
> sub-make with a double build of the `.rmeta` in "private", which in
> turn forces you also to do the `.o`, right?
>
> What I originally had in mind was simply to do everything from a
> single parent `Makefile` instead, precisely to avoid complexity (after
> all, it is the local approach, so you don't need to force yourself to
> handle that). That should remove all those shenanigans, and it is way
> easier to get right. Did you consider it?

I haven't thought about that, no - in that case the parent `Makefile`
would need to be the one in `drivers`? Or am I missing something?

>
> By the way, I think a `.gitignore` entry for the generated header is missing.

Thanks, I'll add that.

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v3 0/5] gpu: drm: nova: enable calling into nova-core
  2026-06-03 10:30   ` Alexandre Courbot
@ 2026-06-03 11:49     ` Miguel Ojeda
  0 siblings, 0 replies; 17+ messages in thread
From: Miguel Ojeda @ 2026-06-03 11:49 UTC (permalink / raw)
  To: Alexandre Courbot
  Cc: Miguel Ojeda, Nathan Chancellor, Nicolas Schier, Boqun Feng,
	Gary Guo, Björn Roy Baron, Benno Lossin, Andreas Hindborg,
	Alice Ryhl, Trevor Gross, Danilo Krummrich, David Airlie,
	Simona Vetter, John Hubbard, Alistair Popple, Timur Tabi,
	Zhi Wang, Eliot Courtney, linux-kbuild, linux-kernel,
	rust-for-linux, nova-gpu, dri-devel, Joel Fernandes

On Wed, Jun 3, 2026 at 12:30 PM Alexandre Courbot <acourbot@nvidia.com> wrote:
>
> Yup, I just want to have something that allows us to call from
> `nova-drm` to `nova-core` as it becomes increasingly pressing for us to
> be able to do so, but will be very happy to replace this with the global
> support as soon as it is available.
>
> This patchset won't make it for the 7.2 merge window, so if support in
> the R4L build system comes during the next cycle we may even be able to
> skip this altogether.

Sounds good.

> I haven't thought about that, no - in that case the parent `Makefile`
> would need to be the one in `drivers`? Or am I missing something?

I think `drivers/gpu/` should also work. Maybe it works inside a
deeper one, but I don't recall trying that.

So essentially you can move both `nova-drm` and `nova-core` (and the
exports of course) there, and then since everything is in a single
`Makefile`, we can just add the dependency between them as a standard
Make one.

I think you don't even need their old `Makefile`s anymore, and that
avoids the double building and so on and so forth. You still need to
emit the metadata, but I think we can pass the flag, avoiding the
custom rule too.

Cheers,
Miguel

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v3 1/5] rust: inline some init methods
  2026-05-29 15:27 ` [PATCH v3 1/5] rust: inline some init methods Alexandre Courbot
@ 2026-06-03 11:52   ` Gary Guo
  2026-06-04  6:23   ` Claude review: " Claude Code Review Bot
  1 sibling, 0 replies; 17+ messages in thread
From: Gary Guo @ 2026-06-03 11:52 UTC (permalink / raw)
  To: Alexandre Courbot, Miguel Ojeda, Nathan Chancellor,
	Nicolas Schier, Boqun Feng, Gary Guo, Björn Roy Baron,
	Benno Lossin, Andreas Hindborg, Alice Ryhl, Trevor Gross,
	Danilo Krummrich, David Airlie, Simona Vetter
  Cc: John Hubbard, Alistair Popple, Timur Tabi, Zhi Wang,
	Eliot Courtney, linux-kbuild, linux-kernel, rust-for-linux,
	nova-gpu, dri-devel

On Fri May 29, 2026 at 4:27 PM BST, Alexandre Courbot wrote:
> These methods should be inlined for optimization reasons. Failure to do
> so can also produce symbol names larger than what `modpost` or `objtool`
> can handle.
> 
> Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>

Reviewed-by: Gary Guo <gary@garyguo.net>

> ---
>  rust/kernel/alloc/kbox.rs | 2 ++
>  rust/kernel/init.rs       | 1 +
>  rust/kernel/sync/arc.rs   | 2 ++
>  3 files changed, 5 insertions(+)


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Claude review: gpu: drm: nova: enable calling into nova-core
  2026-05-29 15:27 [PATCH v3 0/5] gpu: drm: nova: enable calling into nova-core Alexandre Courbot
                   ` (5 preceding siblings ...)
  2026-06-01 13:50 ` [PATCH v3 0/5] gpu: drm: nova: enable calling into nova-core Miguel Ojeda
@ 2026-06-04  6:23 ` Claude Code Review Bot
  6 siblings, 0 replies; 17+ messages in thread
From: Claude Code Review Bot @ 2026-06-04  6:23 UTC (permalink / raw)
  To: dri-devel-reviews

Overall Series Review

Subject: gpu: drm: nova: enable calling into nova-core
Author: Alexandre Courbot <acourbot@nvidia.com>
Patches: 11
Reviewed: 2026-06-04T16:23:29.159435

---

This is a 5-patch series from Alexandre Courbot (NVIDIA) that enables `nova-drm` to call into `nova-core` by working around the current lack of native Rust cross-crate module dependency support in the kernel build system. The approach has three parts: (1) inline some Rust init methods to avoid excessively long symbol names, (2) export nova-core's Rust symbols via a generated C file with `EXPORT_SYMBOL_GPL()`, and (3) emit Rust `.rmeta` metadata so nova-drm can resolve nova-core's types at compile time.

**Strengths:**
- Well-documented as a temporary workaround with clear rationale
- The `#[inline]` patch (1/5) has standalone merit beyond the workaround
- Build system integration is thoughtful (private directory to avoid parallel build races, order-only dependencies, `filechk` for generated headers)
- Patch 5 is honestly labeled as POC/not-for-merge

**Concerns:**
- Patch 2 exports ALL Rust text symbols from nova-core, which is far more than nova-drm needs — this leaks internal API surface via `EXPORT_SYMBOL_GPL()`
- Patch 3 effectively compiles nova-core twice (once for the .o, once for the .rmeta), increasing build time
- The patches are based on `drm-rust-next` which has diverged significantly from the `drm-next` tree (the whole `'bound` lifetime / HRT v5 infrastructure), so they could not be verified against the reference tree

**Overall: The series is a reasonable pragmatic workaround. Patches 1-4 look correct for their stated purpose. The POC patch 5 demonstrates sound design for the inter-module data flow but has some rough edges typical of demo code.**

---

---
Generated by Claude Code Patch Reviewer

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Claude review: rust: inline some init methods
  2026-05-29 15:27 ` [PATCH v3 1/5] rust: inline some init methods Alexandre Courbot
  2026-06-03 11:52   ` Gary Guo
@ 2026-06-04  6:23   ` Claude Code Review Bot
  1 sibling, 0 replies; 17+ messages in thread
From: Claude Code Review Bot @ 2026-06-04  6:23 UTC (permalink / raw)
  To: dri-devel-reviews

Patch Review

**Status: Looks good**

Adds `#[inline]` to five methods across three files: `write_init` and `write_pin_init` on `Box<MaybeUninit<T>>` and `UniqueArc<MaybeUninit<T>>`, plus `pin_init` in the `InPlaceInit` trait.

The rationale is sound — these are generic methods that, when monomorphized with complex type parameters, produce excessively long mangled symbol names that exceed `modpost`/`objtool` limits. Using `#[inline]` (not `#[inline(always)]`) is the right choice: it hints the compiler without forcing inlining in every case. The cover letter notes that methods returning `impl PinInit` were deliberately excluded since they don't contribute to the long symbol name problem.

All five methods are small wrappers around unsafe blocks that delegate to `Init::__init` or `PinInit::__pinit`, making them good inlining candidates regardless of the symbol name motivation.

No concerns with this patch.

---
Generated by Claude Code Patch Reviewer

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Claude review: gpu: nova-core: export Rust symbols for dependent modules
  2026-05-29 15:27 ` [PATCH v3 2/5] gpu: nova-core: export Rust symbols for dependent modules Alexandre Courbot
@ 2026-06-04  6:23   ` Claude Code Review Bot
  0 siblings, 0 replies; 17+ messages in thread
From: Claude Code Review Bot @ 2026-06-04  6:23 UTC (permalink / raw)
  To: dri-devel-reviews

Patch Review

**Status: Acceptable as a workaround, with a concern**

This generates `EXPORT_SYMBOL_GPL()` calls for all Rust global text symbols in `nova_core.o` by piping `nm` output through `awk`:

```makefile
rust_exports = \
	$(NM) -p --defined-only $(1) | \
	awk '$$2 == "T" && $$3 ~ /^_R/ { \
		printf "extern void %s(void); EXPORT_SYMBOL_GPL(%s);\n", $$3, $$3 \
	}'
```

The filter is correct: Rust v0 mangled symbols start with `_R`, and checking `$$2 == "T"` restricts to global text symbols. The generated `extern void fn(void)` declarations are technically mistyped, but since only `EXPORT_SYMBOL_GPL()` uses them (no C code actually calls them with this signature), this is harmless.

**Concern: over-exporting.** This exports *every* Rust text symbol from nova-core, not just the ones nova-drm actually needs. This means internal implementation details, monomorphized generics, trait method implementations, etc. all become part of the module's exported API. While acceptable as a temporary workaround, this could interact poorly with symbol versioning or module loading if any internal symbols change. A more targeted approach (e.g., an explicit symbol list) would be cleaner but harder to maintain as a workaround.

The module composite object rename from `nova_core.o` → `nova-core.o` with `nova-core-y := nova_core.o nova_core_exports.o` is clean and follows standard Kbuild patterns.

---
Generated by Claude Code Patch Reviewer

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Claude review: gpu: nova-core: emit Rust metadata for dependent modules
  2026-05-29 15:27 ` [PATCH v3 3/5] gpu: nova-core: emit Rust metadata " Alexandre Courbot
@ 2026-06-04  6:23   ` Claude Code Review Bot
  0 siblings, 0 replies; 17+ messages in thread
From: Claude Code Review Bot @ 2026-06-04  6:23 UTC (permalink / raw)
  To: dri-devel-reviews

Patch Review

**Status: Looks good**

This adds Makefile rules to produce `libnova_core.rmeta` so dependent Rust modules can use `--extern nova_core=<path>` for compile-time type resolution.

The build is isolated in `.nova_core_rmeta/` to avoid racing with the main `nova_core.o` compilation on rustc's intermediate file names — this is a real problem since rustc writes intermediate objects with deterministic names. The implementation:

```makefile
cmd_rustc_rmeta_rs = mkdir -p $(dir $@); \
    $(rust_common_cmd) --emit=metadata=$@ \
    --emit=obj=$(basename $@).o $<; \
    rm -f $(basename $@).o
```

The `--emit=obj=...` followed by `rm -f` is necessary because some rustc versions require code generation to produce correct metadata. The discarded `.o` is placed in the private directory so it doesn't collide.

The two-step approach (private build → `if_changed,copy` to stable path) ensures consumers see a stable path and the copy only happens when content changes. The `private __modname`, `part-of-builtin`, and `part-of-module` settings correctly replicate the build context.

The downside is compiling nova-core effectively twice (once for .o, once for .rmeta), but this is acceptable for a temporary workaround.

---
Generated by Claude Code Patch Reviewer

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Claude review: gpu: drm: nova: build after nova-core metadata
  2026-05-29 15:27 ` [PATCH v3 4/5] gpu: drm: nova: build after nova-core metadata Alexandre Courbot
@ 2026-06-04  6:23   ` Claude Code Review Bot
  0 siblings, 0 replies; 17+ messages in thread
From: Claude Code Review Bot @ 2026-06-04  6:23 UTC (permalink / raw)
  To: dri-devel-reviews

Patch Review

**Status: Looks good**

Wires up nova-drm to consume nova-core's metadata:

```makefile
nova_core_rmeta := drivers/gpu/nova-core/libnova_core.rmeta
rustflags-y += --extern nova_core=$(objtree)/$(nova_core_rmeta)
$(obj)/nova.o: | $(objtree)/$(nova_core_rmeta)
```

The order-only dependency (`|`) is correct — nova-drm needs the rmeta to exist before compilation but doesn't need to rebuild when the rmeta content changes (since symbol resolution happens at module load time via the exports from patch 2).

The recursive `$(MAKE) $(build)=...` to build the rmeta target in another directory is ugly (as the comment acknowledges) but functional. This is the standard kernel pattern for cross-directory build dependencies.

No issues.

---
Generated by Claude Code Patch Reviewer

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Claude review: drm: nova: demonstrate interaction with nova-core
  2026-05-29 15:27 ` [PATCH POC v3 5/5] drm: nova: demonstrate interaction with nova-core Alexandre Courbot
@ 2026-06-04  6:23   ` Claude Code Review Bot
  0 siblings, 0 replies; 17+ messages in thread
From: Claude Code Review Bot @ 2026-06-04  6:23 UTC (permalink / raw)
  To: dri-devel-reviews

Patch Review

**Status: POC, not for merging — design is sound but has review-worthy patterns**

This demonstrates the end-to-end flow: nova-core exports an `AuxData` struct containing GPU information, and nova-drm retrieves it during probe.

**Field reordering for drop safety** is the most important change:

```rust
pub struct NovaCore<'bound> {
    _reg: auxiliary::Registration<'bound, ForLt!(AuxData<'_>)>,
    #[pin]
    pub(crate) gpu: Gpu<'bound>,
    bar: pci::Bar<'bound, BAR0_SIZE>,
}
```

Rust drops fields in declaration order, so `_reg` drops first (unregistering the auxiliary device and releasing the `AuxData` reference to `gpu`), then `gpu`, then `bar`. This is correct and the comment documenting the invariant is helpful.

**Initialization order** uses `try_pin_init!(&this in NovaCore { bar: ..., gpu <- ..., _reg: ... })` which initializes in *macro invocation order* (bar → gpu → _reg), not declaration order. This is correct: bar must exist before gpu (which references it), and gpu must exist before _reg (which stores a reference to it via AuxData).

**Unsafe self-referential pointer:**

```rust
gpu: &*core::ptr::from_ref(&this.as_ref().gpu),
```

This creates a reference from the `AuxData` to the in-place-initialized `gpu` field. The safety argument (pinned, stable address, dropped in correct order) is sound and follows the established pattern visible in `scatterlist.rs` and elsewhere in the kernel.

**Visibility changes** (`pub mod driver`, `pub mod gpu`, `pub(crate) chipset` → `pub(crate) chipset` on Spec field, `pub enum Chipset`) are necessary for cross-crate access. In a real implementation, you'd likely want a more controlled public API rather than exposing internal fields with `pub(crate)` on `Spec.chipset` and `Gpu.spec` — but for a POC this is fine.

**Minor note:** The `#[allow(missing_docs)]` on the `Chipset` enum and the added `//!` module docs are just to satisfy Clippy for public items, as noted in the commit message.

---
Generated by Claude Code Patch Reviewer

^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2026-06-04  6:23 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-29 15:27 [PATCH v3 0/5] gpu: drm: nova: enable calling into nova-core Alexandre Courbot
2026-05-29 15:27 ` [PATCH v3 1/5] rust: inline some init methods Alexandre Courbot
2026-06-03 11:52   ` Gary Guo
2026-06-04  6:23   ` Claude review: " Claude Code Review Bot
2026-05-29 15:27 ` [PATCH v3 2/5] gpu: nova-core: export Rust symbols for dependent modules Alexandre Courbot
2026-06-04  6:23   ` Claude review: " Claude Code Review Bot
2026-05-29 15:27 ` [PATCH v3 3/5] gpu: nova-core: emit Rust metadata " Alexandre Courbot
2026-06-04  6:23   ` Claude review: " Claude Code Review Bot
2026-05-29 15:27 ` [PATCH v3 4/5] gpu: drm: nova: build after nova-core metadata Alexandre Courbot
2026-06-04  6:23   ` Claude review: " Claude Code Review Bot
2026-05-29 15:27 ` [PATCH POC v3 5/5] drm: nova: demonstrate interaction with nova-core Alexandre Courbot
2026-06-04  6:23   ` Claude review: " Claude Code Review Bot
2026-06-01 13:50 ` [PATCH v3 0/5] gpu: drm: nova: enable calling into nova-core Miguel Ojeda
2026-06-01 17:00   ` Miguel Ojeda
2026-06-03 10:30   ` Alexandre Courbot
2026-06-03 11:49     ` Miguel Ojeda
2026-06-04  6:23 ` Claude review: " Claude Code Review Bot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox