* [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-05-29 15:27 ` [PATCH v3 2/5] gpu: nova-core: export Rust symbols for dependent modules Alexandre Courbot
` (4 subsequent siblings)
5 siblings, 1 reply; 11+ 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] 11+ 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
0 siblings, 0 replies; 11+ 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] 11+ 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-05-29 15:27 ` [PATCH v3 3/5] gpu: nova-core: emit Rust metadata " Alexandre Courbot
` (3 subsequent siblings)
5 siblings, 0 replies; 11+ 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] 11+ 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-05-29 15:27 ` [PATCH v3 4/5] gpu: drm: nova: build after nova-core metadata Alexandre Courbot
` (2 subsequent siblings)
5 siblings, 0 replies; 11+ 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] 11+ 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-05-29 15:27 ` [PATCH POC v3 5/5] drm: nova: demonstrate interaction with nova-core Alexandre Courbot
2026-06-01 13:50 ` [PATCH v3 0/5] gpu: drm: nova: enable calling into nova-core Miguel Ojeda
5 siblings, 0 replies; 11+ 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] 11+ 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-01 13:50 ` [PATCH v3 0/5] gpu: drm: nova: enable calling into nova-core Miguel Ojeda
5 siblings, 0 replies; 11+ 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] 11+ 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
5 siblings, 2 replies; 11+ 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] 11+ 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; 11+ 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] 11+ 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; 11+ 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] 11+ 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; 11+ 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] 11+ messages in thread