[PATCH v4 06/10] gpu: nova-core: gsp: cmdq: move RPC message logging to RpcMessage

From: Alexandre Courbot

Date: Fri Oct 09 2026 - 08:28:57 EST


The `RpcMessage` type is the right container for the `log_event` method,
since it contains all the data we passed to it. Move it there so callers
don't need to extract the required data themselves.

Signed-off-by: Alexandre Courbot <acourbot@xxxxxxxxxx>
---
drivers/gpu/nova-core/gsp/cmdq.rs | 66 ++++++++++++++++++---------------------
1 file changed, 31 insertions(+), 35 deletions(-)

diff --git a/drivers/gpu/nova-core/gsp/cmdq.rs b/drivers/gpu/nova-core/gsp/cmdq.rs
index 2ffb8f4b2ef4..a059ce74ba2d 100644
--- a/drivers/gpu/nova-core/gsp/cmdq.rs
+++ b/drivers/gpu/nova-core/gsp/cmdq.rs
@@ -615,6 +615,34 @@ fn parse(dev: &device::Device, element: GspMessage<'a>) -> Result<RpcMessage<'a>
contents: (slice_1, slice_2),
})
}
+
+ /// Logs an event, meaning a message that no caller was waiting for.
+ ///
+ /// An OS error or robust-channel record is logged at error level and an unknown function code
+ /// at warning level. Other events are not logged.
+ fn log(&self, dev: &device::Device) {
+ let function = self.header.function();
+ let seq = self.header.sequence();
+
+ match function {
+ Ok(MsgFunction::OsErrorLog) => {
+ dev_err!(dev, "GSP reported an OS error (seq {})\n", seq);
+ }
+ Ok(MsgFunction::RcTriggered) => {
+ dev_err!(dev, "GSP triggered robust-channel recovery (seq {})\n", seq);
+ }
+ // Nothing to do for the remaining known function codes.
+ Ok(_) => {}
+ Err(raw) => {
+ dev_warn!(
+ dev,
+ "unknown GSP message function {:#x} (seq {})\n",
+ raw,
+ seq
+ );
+ }
+ }
+ }
}

/// GSP command queue.
@@ -948,7 +976,7 @@ fn receive_msg<M: MessageFromGsp>(&mut self, timeout: Delta) -> Result<M>
}
})
} else {
- self.log_event(function, rpc_message.header.sequence());
+ rpc_message.log(self.dev);

Err(ENOMSG)
};
@@ -990,36 +1018,6 @@ fn await_msg<M: MessageFromGsp>(&mut self) -> Result<M>
}
}

- /// Logs an event, meaning a message that no caller was waiting for.
- ///
- /// An OS error or robust-channel record is logged at error level and an unknown function code
- /// at warning level. Every other event is recorded only by the receive trace in
- /// [`Self::wait_for_msg`].
- fn log_event(&self, function: Result<MsgFunction, u32>, seq: u32) {
- match function {
- Ok(MsgFunction::OsErrorLog) => {
- dev_err!(&self.dev, "GSP reported an OS error (seq {})\n", seq);
- }
- Ok(MsgFunction::RcTriggered) => {
- dev_err!(
- &self.dev,
- "GSP triggered robust-channel recovery (seq {})\n",
- seq
- );
- }
- // Nothing to do for the remaining known function codes.
- Ok(_) => {}
- Err(raw) => {
- dev_warn!(
- &self.dev,
- "unknown GSP message function {:#x} (seq {})\n",
- raw,
- seq
- );
- }
- }
- }
-
/// Logs and consumes every message the queue holds.
///
/// # Errors
@@ -1036,12 +1034,10 @@ fn drain(&mut self) -> Result {
dev_err!(&self.dev, "GSP drain: message length overflow\n");
EIO
})?;
- let rpc_msg = RpcMessage::parse(self.dev, msg)?;
- let function = rpc_msg.header.function();
- let seq = rpc_msg.header.sequence();
+
+ RpcMessage::parse(self.dev, msg)?.log(self.dev);

self.gsp_mem.advance_cpu_read_ptr(pages);
- self.log_event(function, seq);
}

Ok(())

--
2.56.0