[PATCH 2/3] gpu: nova-core: trace driver probe and firmware messages

From: Zhi Wang

Date: Wed Aug 05 2026 - 04:06:21 EST


Use independently selectable trace streams for driver, GSP and FSP
activity. Replace the probe and GSP dev_dbg() calls with formatted
traces, and add FSP NVDM send and receive traces with the message type
and length.

Signed-off-by: Zhi Wang <zhiw@xxxxxxxxxx>
---
drivers/gpu/nova-core/driver.rs | 7 +++++--
drivers/gpu/nova-core/fsp.rs | 16 +++++++++++++++-
drivers/gpu/nova-core/gsp/cmdq.rs | 11 ++++++-----
drivers/gpu/nova-core/trace.rs | 9 ---------
4 files changed, 26 insertions(+), 17 deletions(-)

diff --git a/drivers/gpu/nova-core/driver.rs b/drivers/gpu/nova-core/driver.rs
index 5738d4ac521b..cb92ce9a594e 100644
--- a/drivers/gpu/nova-core/driver.rs
+++ b/drivers/gpu/nova-core/driver.rs
@@ -18,7 +18,10 @@
types::ForLt,
};

-use crate::gpu::Gpu;
+use crate::{
+ gpu::Gpu,
+ trace::nova_core_trace_driver, //
+};

/// Counter for generating unique auxiliary device IDs.
static AUXILIARY_ID_COUNTER: Atomic<u32> = Atomic::new(0);
@@ -73,7 +76,7 @@ fn probe<'bound>(
_info: &'bound Self::IdInfo,
) -> impl PinInit<Self::Data<'bound>, Error> + 'bound {
pin_init::pin_init_scope(move || {
- dev_dbg!(pdev, "Probe Nova Core GPU driver.\n");
+ nova_core_trace_driver!(pdev, "Probe Nova Core GPU driver.");

pdev.enable_device_mem()?;
pdev.set_master();
diff --git a/drivers/gpu/nova-core/fsp.rs b/drivers/gpu/nova-core/fsp.rs
index ba4544210e40..9dc919de2200 100644
--- a/drivers/gpu/nova-core/fsp.rs
+++ b/drivers/gpu/nova-core/fsp.rs
@@ -51,7 +51,8 @@
NvdmType, //
},
num,
- regs, //
+ regs,
+ trace::nova_core_trace_fsp, //
};

mod hal;
@@ -434,6 +435,12 @@ fn send_sync_fsp<M>(&mut self, dev: &device::Device, msg: &M) -> Result<KVec<u8>
where
M: MessageToFsp,
{
+ nova_core_trace_fsp!(
+ dev,
+ "FSP NVDM: send: type={:?}, length=0x{:x}",
+ M::NVDM_TYPE,
+ msg.as_bytes().len(),
+ );
self.falcon.send_msg(msg.as_bytes())?;

let response_buf = self.falcon.recv_msg().inspect_err(|e| {
@@ -489,6 +496,13 @@ fn send_sync_fsp<M>(&mut self, dev: &device::Device, msg: &M) -> Result<KVec<u8>
return Err(EIO);
}

+ nova_core_trace_fsp!(
+ dev,
+ "FSP NVDM: receive: type={:?}, length=0x{:x}",
+ M::NVDM_TYPE,
+ response_buf.len(),
+ );
+
Ok(response_buf)
}

diff --git a/drivers/gpu/nova-core/gsp/cmdq.rs b/drivers/gpu/nova-core/gsp/cmdq.rs
index cd844fe48f05..6137c60b6231 100644
--- a/drivers/gpu/nova-core/gsp/cmdq.rs
+++ b/drivers/gpu/nova-core/gsp/cmdq.rs
@@ -58,7 +58,8 @@
GSP_PAGE_SIZE, //
},
num,
- sbuffer::SBufferIter, //
+ sbuffer::SBufferIter,
+ trace::nova_core_trace_gsp, //
};

use super::regs;
@@ -675,9 +676,9 @@ fn send_single_command<M>(&mut self, bar: Bar0<'_>, command: M) -> Result
dst.contents.1,
])));

- dev_dbg!(
+ nova_core_trace_gsp!(
&self.dev,
- "GSP RPC: send: seq# {}, function={:?}, length=0x{:x}\n",
+ "GSP RPC: send: seq# {}, function={:?}, length=0x{:x}",
self.seq,
M::FUNCTION,
dst.header.length(),
@@ -754,9 +755,9 @@ fn wait_for_msg(&self, timeout: Delta) -> Result<GspMessage<'_>> {
// Extract the `GspMsgElement`.
let (header, slice_1) = GspMsgElement::from_bytes_prefix(slice_1).ok_or(EIO)?;

- dev_dbg!(
+ nova_core_trace_gsp!(
&self.dev,
- "GSP RPC: receive: seq# {}, function={:?}, length=0x{:x}\n",
+ "GSP RPC: receive: seq# {}, function={:?}, length=0x{:x}",
header.sequence(),
header.function(),
header.length(),
diff --git a/drivers/gpu/nova-core/trace.rs b/drivers/gpu/nova-core/trace.rs
index 893479b3fcb5..db975804f855 100644
--- a/drivers/gpu/nova-core/trace.rs
+++ b/drivers/gpu/nova-core/trace.rs
@@ -55,7 +55,6 @@ pub(crate) unsafe fn $event(
///
/// `trace` must synchronously consume `dev`, `message`, and `message_len`
/// according to the `nova_core_trace_class` event prototype.
-#[expect(dead_code)]
pub(crate) unsafe fn nova_core_trace_fmt(
dev: &CStr,
args: fmt::Arguments<'_>,
@@ -81,7 +80,6 @@ pub(crate) unsafe fn nova_core_trace_fmt(
}
}

-#[expect(unused_macros)]
macro_rules! nova_core_trace_impl {
($event:ident, $dev:expr, $($arg:tt)*) => {{
#[cfg(CONFIG_TRACEPOINTS)]
@@ -121,24 +119,20 @@ macro_rules! nova_core_trace_impl {

// Frontend macros expand in their caller's module and invoke this helper by
// path, so the re-export must be visible from the parent module.
-#[expect(unused_imports)]
pub(super) use nova_core_trace_impl;

-#[expect(unused_macros)]
macro_rules! nova_core_trace_driver {
($dev:expr, $($arg:tt)*) => {
$crate::trace::nova_core_trace_impl!(nova_core_trace_driver, $dev, $($arg)*)
};
}

-#[expect(unused_macros)]
macro_rules! nova_core_trace_fsp {
($dev:expr, $($arg:tt)*) => {
$crate::trace::nova_core_trace_impl!(nova_core_trace_fsp, $dev, $($arg)*)
};
}

-#[expect(unused_macros)]
macro_rules! nova_core_trace_gsp {
($dev:expr, $($arg:tt)*) => {
$crate::trace::nova_core_trace_impl!(nova_core_trace_gsp, $dev, $($arg)*)
@@ -152,11 +146,8 @@ macro_rules! nova_core_trace_vgpu {
};
}

-#[expect(unused_imports)]
pub(crate) use nova_core_trace_driver;
-#[expect(unused_imports)]
pub(crate) use nova_core_trace_fsp;
-#[expect(unused_imports)]
pub(crate) use nova_core_trace_gsp;
#[expect(unused_imports)]
pub(crate) use nova_core_trace_vgpu;
--
2.53.0