Skip to contentSkip to conversation

gpu: nova-core: miscellaneous improvements

PATCH In review Alexandre Courbot 2 participants 15 messages Feb 17 – Feb 25

Subsystems (4)
lore
Share & tools
lore

Alexandre Courbot

author maintainer
#0 lore raw

v3 cover gpu: nova-core: miscellaneous improvements

A few simple, loosely-related small improvements for nova-core, including reporting unprocessed data in GSP messages, removal of unnecessary code in GSP and the sequencer, and leveraging the Zeroable derive macro and core library's CStr. Probably nothing too controversial, so I plan on applying it soon after -rc1 gets released.

This revision is based on master.

---
Changes in v3:
- Use inspect() to warn about remaining data in the GSP command queue.
- Drop "firmware: fwsec: do not require bound device when unneeded".
- Drop "simplify str_from_null_terminated" as str_from_null_terminated has been removed.
- Derive Zeroable on the original GspStaticConfigInfo tuple struct.
- Link to v2: https://patch.msgid.link/[email protected]

Changes in v2:
- Rebase on drm-rust-next.
- Add a patch to reuse previously acquired reference to define in GSP boot sequence.
- Link to v1: https://patch.msgid.link/[email protected]

---
Alexandre Courbot (8):
gpu: nova-core: gsp: warn if data remains after processing a message
gpu: nova-core: gsp: remove unnecessary Display impls
gpu: nova-core: gsp: simplify sequencer opcode parsing
gpu: nova-core: gsp: remove unneeded sequencer trait
gpu: nova-core: gsp: derive Debug on more sequencer types
gpu: nova-core: gsp: derive Zeroable for GspStaticConfigInfo
gpu: nova-core: use core library's CStr instead of kernel one
gpu: nova-core: gsp: use available device reference

 drivers/gpu/nova-core/firmware.rs        |   2 +-
 drivers/gpu/nova-core/firmware/gsp.rs    |   6 +-
 drivers/gpu/nova-core/gsp/boot.rs        |  34 +++-------
 drivers/gpu/nova-core/gsp/cmdq.rs        |  14 ++++-
 drivers/gpu/nova-core/gsp/fw.rs          | 104 +++----------------------------
 drivers/gpu/nova-core/gsp/fw/commands.rs |   5 +-
 drivers/gpu/nova-core/gsp/sequencer.rs   |  18 +++---
 drivers/gpu/nova-core/nova_core.rs       |   2 +-
 8 files changed, 45 insertions(+), 140 deletions(-)

---
base-commit: 9702969978695d9a699a1f34771580cdbb153b33
change-id: 20251208-nova-misc-1d797b5d64f2

Best regards,

Signature · 1 line
Alexandre Courbot <[email protected]>
author maintainer
#1 lore raw

PATCH v3 1/8 gpu: nova-core: gsp: warn if data remains after processing a message

Not processing the whole data from a received message is a strong indicator of a bug - emit a warning when such cases are detected.

---
 drivers/gpu/nova-core/gsp/cmdq.rs | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)
drivers/gpu/nova-core/gsp/cmdq.rs +11 -1
index 46819a82a51a..607fb9ad69b0 100644
@@ -661,7 +661,17 @@ pub(crate) fn receive_msg<M: MessageFromGsp>(&mut self, timeout: Delta) -> Resul
             let (cmd, contents_1) = M::Message::from_bytes_prefix(message.contents.0).ok_or(EIO)?;
             let mut sbuffer = SBufferIter::new_reader([contents_1, message.contents.1]);
 
-            M::read(cmd, &mut sbuffer).map_err(|e| e.into())
+            M::read(cmd, &mut sbuffer)
+                .map_err(|e| e.into())
+                .inspect(|_| {
+                    if !sbuffer.is_empty() {
+                        dev_warn!(
+                            &self.dev,
+                            "GSP message {:?} has unprocessed data\n",
+                            function
+                        );
+                    }
+                })
         } else {
             Err(ERANGE)
         };
Signature · 1 line
2.53.0
author maintainer
#2 lore raw

PATCH v3 2/8 gpu: nova-core: gsp: remove unnecessary Display impls

In reply to Alexandre Courbot

We only ever display these in debug context, for which the automatically derived Debug impls work just fine - so use them and remove these boilerplate-looking implementations.

---
 drivers/gpu/nova-core/gsp/cmdq.rs |  2 +-
 drivers/gpu/nova-core/gsp/fw.rs   | 54 ---------------------------------------
 2 files changed, 1 insertion(+), 55 deletions(-)
drivers/gpu/nova-core/gsp/cmdq.rs +1 -1
index 607fb9ad69b0..9eabec49849d 100644
@@ -531,7 +531,7 @@ pub(crate) fn send_command<M>(&mut self, bar: &Bar0, command: M) -> Result
 
         dev_dbg!(
             &self.dev,
-            "GSP RPC: send: seq# {}, function={}, length=0x{:x}\n",
+            "GSP RPC: send: seq# {}, function={:?}, length=0x{:x}\n",
             self.seq,
             M::FUNCTION,
             dst.header.length(),
drivers/gpu/nova-core/gsp/fw.rs +0 -54

72 lines not on this page · raw message

Signature · 1 line
2.53.0
author maintainer
#3 lore raw

PATCH v3 3/8 gpu: nova-core: gsp: simplify sequencer opcode parsing

In reply to Alexandre Courbot

The opcodes are already the right type in the C union, so we can use them directly instead of converting them to a byte stream and back again using FromBytes.

---
 drivers/gpu/nova-core/gsp/fw.rs | 40 +++++-----------------------------------
 1 file changed, 5 insertions(+), 35 deletions(-)
drivers/gpu/nova-core/gsp/fw.rs +5 -35
index 3c26b165038e..624f5670ed50 100644
@@ -472,13 +472,7 @@ pub(crate) fn reg_write_payload(&self) -> Result<RegWritePayload> {
             return Err(EINVAL);
         }
         // SAFETY: Opcode is verified to be `RegWrite`, so union contains valid `RegWritePayload`.
-        let payload_bytes = unsafe {
-            core::slice::from_raw_parts(
-                core::ptr::addr_of!(self.0.payload.regWrite).cast::<u8>(),
-                core::mem::size_of::<RegWritePayload>(),
-            )
-        };
-        Ok(*RegWritePayload::from_bytes(payload_bytes).ok_or(EINVAL)?)
+        Ok(RegWritePayload(unsafe { self.0.payload.regWrite }))
     }
 
     /// Returns the register modify payload by value.
@@ -489,13 +483,7 @@ pub(crate) fn reg_modify_payload(&self) -> Result<RegModifyPayload> {
             return Err(EINVAL);
         }
         // SAFETY: Opcode is verified to be `RegModify`, so union contains valid `RegModifyPayload`.
-        let payload_bytes = unsafe {
-            core::slice::from_raw_parts(
-                core::ptr::addr_of!(self.0.payload.regModify).cast::<u8>(),
-                core::mem::size_of::<RegModifyPayload>(),
-            )
-        };
-        Ok(*RegModifyPayload::from_bytes(payload_bytes).ok_or(EINVAL)?)
+        Ok(RegModifyPayload(unsafe { self.0.payload.regModify }))
     }
 
     /// Returns the register poll payload by value.
@@ -506,13 +494,7 @@ pub(crate) fn reg_poll_payload(&self) -> Result<RegPollPayload> {
             return Err(EINVAL);
         }
         // SAFETY: Opcode is verified to be `RegPoll`, so union contains valid `RegPollPayload`.
-        let payload_bytes = unsafe {
-            core::slice::from_raw_parts(
-                core::ptr::addr_of!(self.0.payload.regPoll).cast::<u8>(),
-                core::mem::size_of::<RegPollPayload>(),
-            )
-        };
-        Ok(*RegPollPayload::from_bytes(payload_bytes).ok_or(EINVAL)?)
+        Ok(RegPollPayload(unsafe { self.0.payload.regPoll }))
     }
 
     /// Returns the delay payload by value.
@@ -523,13 +505,7 @@ pub(crate) fn delay_us_payload(&self) -> Result<DelayUsPayload> {
             return Err(EINVAL);
         }
         // SAFETY: Opcode is verified to be `DelayUs`, so union contains valid `DelayUsPayload`.
-        let payload_bytes = unsafe {
-            core::slice::from_raw_parts(
-                core::ptr::addr_of!(self.0.payload.delayUs).cast::<u8>(),
-                core::mem::size_of::<DelayUsPayload>(),
-            )
-        };
-        Ok(*DelayUsPayload::from_bytes(payload_bytes).ok_or(EINVAL)?)
+        Ok(DelayUsPayload(unsafe { self.0.payload.delayUs }))
     }
 
     /// Returns the register store payload by value.
@@ -540,13 +516,7 @@ pub(crate) fn reg_store_payload(&self) -> Result<RegStorePayload> {
             return Err(EINVAL);
         }
         // SAFETY: Opcode is verified to be `RegStore`, so union contains valid `RegStorePayload`.
-        let payload_bytes = unsafe {
-            core::slice::from_raw_parts(
-                core::ptr::addr_of!(self.0.payload.regStore).cast::<u8>(),
-                core::mem::size_of::<RegStorePayload>(),
-            )
-        };
-        Ok(*RegStorePayload::from_bytes(payload_bytes).ok_or(EINVAL)?)
+        Ok(RegStorePayload(unsafe { self.0.payload.regStore }))
     }
 }
 
Signature · 1 line
2.53.0
author maintainer
#4 lore raw

PATCH v3 4/8 gpu: nova-core: gsp: remove unneeded sequencer trait

In reply to Alexandre Courbot

The GspSeqCmdRunner trait is never used as we never call the run methods from generic code. Remove it.

---
 drivers/gpu/nova-core/gsp/sequencer.rs | 17 ++++++-----------
 1 file changed, 6 insertions(+), 11 deletions(-)
drivers/gpu/nova-core/gsp/sequencer.rs +6 -11
index e415a2aa3203..9278ffd5216d 100644
@@ -144,12 +144,7 @@ pub(crate) struct GspSequencer<'a> {
     dev: ARef<device::Device>,
 }
 
-/// Trait for running sequencer commands.
-pub(crate) trait GspSeqCmdRunner {
-    fn run(&self, sequencer: &GspSequencer<'_>) -> Result;
-}
-
-impl GspSeqCmdRunner for fw::RegWritePayload {
+impl fw::RegWritePayload {
     fn run(&self, sequencer: &GspSequencer<'_>) -> Result {
         let addr = usize::from_safe_cast(self.addr());
 
@@ -157,7 +152,7 @@ fn run(&self, sequencer: &GspSequencer<'_>) -> Result {
     }
 }
 
-impl GspSeqCmdRunner for fw::RegModifyPayload {
+impl fw::RegModifyPayload {
     fn run(&self, sequencer: &GspSequencer<'_>) -> Result {
         let addr = usize::from_safe_cast(self.addr());
 
@@ -169,7 +164,7 @@ fn run(&self, sequencer: &GspSequencer<'_>) -> Result {
     }
 }
 
-impl GspSeqCmdRunner for fw::RegPollPayload {
+impl fw::RegPollPayload {
     fn run(&self, sequencer: &GspSequencer<'_>) -> Result {
         let addr = usize::from_safe_cast(self.addr());
 
@@ -194,14 +189,14 @@ fn run(&self, sequencer: &GspSequencer<'_>) -> Result {
     }
 }
 
-impl GspSeqCmdRunner for fw::DelayUsPayload {
+impl fw::DelayUsPayload {
     fn run(&self, _sequencer: &GspSequencer<'_>) -> Result {
         fsleep(Delta::from_micros(i64::from(self.val())));
         Ok(())
     }
 }
 
-impl GspSeqCmdRunner for fw::RegStorePayload {
+impl fw::RegStorePayload {
     fn run(&self, sequencer: &GspSequencer<'_>) -> Result {
         let addr = usize::from_safe_cast(self.addr());
 
@@ -209,7 +204,7 @@ fn run(&self, sequencer: &GspSequencer<'_>) -> Result {
     }
 }
 
-impl GspSeqCmdRunner for GspSeqCmd {
+impl GspSeqCmd {
     fn run(&self, seq: &GspSequencer<'_>) -> Result {
         match self {
             GspSeqCmd::RegWrite(cmd) => cmd.run(seq),
Signature · 1 line
2.53.0
author maintainer
#5 lore raw

PATCH v3 5/8 gpu: nova-core: gsp: derive `Debug` on more sequencer types

In reply to Alexandre Courbot

Being able to print these is useful when debugging the sequencer.

---
 drivers/gpu/nova-core/gsp/fw.rs        | 10 +++++-----
 drivers/gpu/nova-core/gsp/sequencer.rs |  1 +
 2 files changed, 6 insertions(+), 5 deletions(-)
drivers/gpu/nova-core/gsp/fw.rs +5 -5
index 624f5670ed50..f1797e1f0d9d 100644
@@ -330,7 +330,7 @@ fn from(value: SeqBufOpcode) -> Self {
 
 /// Wrapper for GSP sequencer register write payload.
 #[repr(transparent)]
-#[derive(Copy, Clone)]
+#[derive(Copy, Clone, Debug)]
 pub(crate) struct RegWritePayload(bindings::GSP_SEQ_BUF_PAYLOAD_REG_WRITE);
 
 impl RegWritePayload {
@@ -353,7 +353,7 @@ unsafe impl AsBytes for RegWritePayload {}
 
 /// Wrapper for GSP sequencer register modify payload.
 #[repr(transparent)]
-#[derive(Copy, Clone)]
+#[derive(Copy, Clone, Debug)]
 pub(crate) struct RegModifyPayload(bindings::GSP_SEQ_BUF_PAYLOAD_REG_MODIFY);
 
 impl RegModifyPayload {
@@ -381,7 +381,7 @@ unsafe impl AsBytes for RegModifyPayload {}
 
 /// Wrapper for GSP sequencer register poll payload.
 #[repr(transparent)]
-#[derive(Copy, Clone)]
+#[derive(Copy, Clone, Debug)]
 pub(crate) struct RegPollPayload(bindings::GSP_SEQ_BUF_PAYLOAD_REG_POLL);
 
 impl RegPollPayload {
@@ -414,7 +414,7 @@ unsafe impl AsBytes for RegPollPayload {}
 
 /// Wrapper for GSP sequencer delay payload.
 #[repr(transparent)]
-#[derive(Copy, Clone)]
+#[derive(Copy, Clone, Debug)]
 pub(crate) struct DelayUsPayload(bindings::GSP_SEQ_BUF_PAYLOAD_DELAY_US);
 
 impl DelayUsPayload {
@@ -432,7 +432,7 @@ unsafe impl AsBytes for DelayUsPayload {}
 
 /// Wrapper for GSP sequencer register store payload.
 #[repr(transparent)]
-#[derive(Copy, Clone)]
+#[derive(Copy, Clone, Debug)]
 pub(crate) struct RegStorePayload(bindings::GSP_SEQ_BUF_PAYLOAD_REG_STORE);
 
 impl RegStorePayload {
drivers/gpu/nova-core/gsp/sequencer.rs +1 -0
index 9278ffd5216d..0cfbedc47fcf 100644
@@ -67,6 +67,7 @@ fn read(
 /// GSP Sequencer Command types with payload data.
 /// Commands have an opcode and an opcode-dependent struct.
 #[allow(clippy::enum_variant_names)]
+#[derive(Debug)]
 pub(crate) enum GspSeqCmd {
     RegWrite(fw::RegWritePayload),
     RegModify(fw::RegModifyPayload),
Signature · 1 line
2.53.0
author maintainer
#6 lore raw

PATCH v3 6/8 gpu: nova-core: gsp: derive Zeroable for GspStaticConfigInfo

In reply to Alexandre Courbot

We can now derive Zeroable on tuple structs, so do this instead of providing our own implementation.

---
 drivers/gpu/nova-core/gsp/fw/commands.rs | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)
drivers/gpu/nova-core/gsp/fw/commands.rs +1 -4
index 21be44199693..67f44421fcc3 100644
@@ -107,6 +107,7 @@ unsafe impl FromBytes for PackedRegistryTable {}
 
 /// Payload of the `GetGspStaticInfo` command and message.
 #[repr(transparent)]
+#[derive(Zeroable)]
 pub(crate) struct GspStaticConfigInfo(bindings::GspStaticConfigInfo_t);
 
 impl GspStaticConfigInfo {
@@ -122,7 +123,3 @@ unsafe impl AsBytes for GspStaticConfigInfo {}
 // SAFETY: This struct only contains integer types for which all bit patterns
 // are valid.
 unsafe impl FromBytes for GspStaticConfigInfo {}
-
-// SAFETY: This struct only contains integer types and fixed-size arrays for which
-// all bit patterns are valid.
-unsafe impl Zeroable for GspStaticConfigInfo {}
Signature · 1 line
2.53.0
author maintainer
#7 lore raw

PATCH v3 7/8 gpu: nova-core: use core library's CStr instead of kernel one

In reply to Alexandre Courbot

The kernel's own CStr type has been replaced by the one in the core library, and is now an alias to the latter. Change our imports to directly reference the actual type.

---
 drivers/gpu/nova-core/firmware.rs     | 2 +-
 drivers/gpu/nova-core/firmware/gsp.rs | 6 +++++-
 drivers/gpu/nova-core/nova_core.rs    | 2 +-
 3 files changed, 7 insertions(+), 3 deletions(-)
drivers/gpu/nova-core/firmware.rs +1 -1
index 68779540aa28..2f7249383e51 100644
@@ -424,7 +424,7 @@ const fn make_entry_chipset(self, chipset: &str) -> Self {
     }
 
     pub(crate) const fn create(
-        module_name: &'static kernel::str::CStr,
+        module_name: &'static core::ffi::CStr,
     ) -> firmware::ModInfoBuilder<N> {
         let mut this = Self(firmware::ModInfoBuilder::new(module_name));
         let mut i = 0;
drivers/gpu/nova-core/firmware/gsp.rs +5 -1
index 9488a626352f..ae3f6581c5b6 100644
@@ -32,9 +32,13 @@
 /// that scheme before nova-core becomes stable, which means this module will eventually be
 /// removed.
 mod elf {
+    use core::{
+        ffi::CStr,
+        mem::size_of, //
+    };
+
     use kernel::{
         bindings,
-        prelude::*,
         transmute::FromBytes, //
     };
 
drivers/gpu/nova-core/nova_core.rs +1 -1
index c1121e7c64c5..b5caf1044697 100644
@@ -18,7 +18,7 @@
 mod sbuffer;
 mod vbios;
 
-pub(crate) const MODULE_NAME: &kernel::str::CStr = <LocalModule as kernel::ModuleMetadata>::NAME;
+pub(crate) const MODULE_NAME: &core::ffi::CStr = <LocalModule as kernel::ModuleMetadata>::NAME;
 
 kernel::module_pci_driver! {
     type: driver::NovaCore,
Signature · 1 line
2.53.0
maintainer
#8 lore raw

Re: [PATCH v3 7/8] gpu: nova-core: use core library's CStr instead of kernel one

Quoted 34 lines · Alexandre Courbot

The kernel's own CStr type has been replaced by the one in the core library, and is now an alias to the latter. Change our imports to directly reference the actual type.

---
 drivers/gpu/nova-core/firmware.rs     | 2 +-
 drivers/gpu/nova-core/firmware/gsp.rs | 6 +++++-
 drivers/gpu/nova-core/nova_core.rs    | 2 +-
 3 files changed, 7 insertions(+), 3 deletions(-)
drivers/gpu/nova-core/firmware.rs +1 -1
index 68779540aa28..2f7249383e51 100644
@@ -424,7 +424,7 @@ const fn make_entry_chipset(self, chipset: &str) -> Self {
     }
 
     pub(crate) const fn create(
-        module_name: &'static kernel::str::CStr,
+        module_name: &'static core::ffi::CStr,
     ) -> firmware::ModInfoBuilder<N> {
         let mut this = Self(firmware::ModInfoBuilder::new(module_name));
         let mut i = 0;
drivers/gpu/nova-core/firmware/gsp.rs +0 -0
index 9488a626352f..ae3f6581c5b6 100644
@@ -32,9 +32,13 @@
 /// that scheme before nova-core becomes stable, which means this module will eventually be
 /// removed.
 mod elf {

drivers/gpu/nova-core/firmware/gsp.rs line 43

Quoted 10 lines
drivers/gpu/nova-core/firmware/gsp.rs +5 -1
+    use core::{
+        ffi::CStr,
+        mem::size_of, //
+    };
+
     use kernel::{
         bindings,
-        prelude::*,
         transmute::FromBytes, //
     };

What's the improvement in this change? Both of the ones factored out are already correctly imported through prelude. Let's keep it as is.

Quoted 16 lines
drivers/gpu/nova-core/nova_core.rs +1 -1
index c1121e7c64c5..b5caf1044697 100644
@@ -18,7 +18,7 @@
 mod sbuffer;
 mod vbios;
 
-pub(crate) const MODULE_NAME: &kernel::str::CStr = <LocalModule as kernel::ModuleMetadata>::NAME;
+pub(crate) const MODULE_NAME: &core::ffi::CStr = <LocalModule as kernel::ModuleMetadata>::NAME;
 
 kernel::module_pci_driver! {
     type: driver::NovaCore,
Signature · 2 lines
-- 
2.53.0
author maintainer
#9 lore raw

Re: [PATCH v3 7/8] gpu: nova-core: use core library's CStr instead of kernel one

Quoted 40 lines · Danilo Krummrich
Quoted 39 lines · Alexandre Courbot

The kernel's own CStr type has been replaced by the one in the core library, and is now an alias to the latter. Change our imports to directly reference the actual type.

---
 drivers/gpu/nova-core/firmware.rs     | 2 +-
 drivers/gpu/nova-core/firmware/gsp.rs | 6 +++++-
 drivers/gpu/nova-core/nova_core.rs    | 2 +-
 3 files changed, 7 insertions(+), 3 deletions(-)
drivers/gpu/nova-core/firmware.rs +1 -1
index 68779540aa28..2f7249383e51 100644
@@ -424,7 +424,7 @@ const fn make_entry_chipset(self, chipset: &str) -> Self {
     }
 
     pub(crate) const fn create(
-        module_name: &'static kernel::str::CStr,
+        module_name: &'static core::ffi::CStr,
     ) -> firmware::ModInfoBuilder<N> {
         let mut this = Self(firmware::ModInfoBuilder::new(module_name));
         let mut i = 0;
drivers/gpu/nova-core/firmware/gsp.rs +5 -0
index 9488a626352f..ae3f6581c5b6 100644
@@ -32,9 +32,13 @@
 /// that scheme before nova-core becomes stable, which means this module will eventually be
 /// removed.
 mod elf {
+    use core::{
+        ffi::CStr,
+        mem::size_of, //
+    };
+
Quoted 8 lines

drivers/gpu/nova-core/firmware/gsp.rs line 43

Quoted 5 lines
drivers/gpu/nova-core/firmware/gsp.rs +0 -1
     use kernel::{
         bindings,
-        prelude::*,
         transmute::FromBytes, //
     };

What's the improvement in this change? Both of the ones factored out are already correctly imported through prelude. Let's keep it as is.

Mmm, either they weren't at the time I initially wrote this patch, or I've been careless (the latter being more likely). I'll remove this.

author maintainer
#10 lore raw

PATCH v3 8/8 gpu: nova-core: gsp: use available device reference

In reply to Alexandre Courbot

We already have a regular reference to the Device, so we don't need to repeatedly acquire one in this method.

---
 drivers/gpu/nova-core/gsp/boot.rs | 34 ++++++++--------------------------
 1 file changed, 8 insertions(+), 26 deletions(-)
drivers/gpu/nova-core/gsp/boot.rs +8 -26
index be427fe26a58..93651243ab1b 100644
@@ -170,15 +170,10 @@ pub(crate) fn boot(
             Some(libos_handle as u32),
             Some((libos_handle >> 32) as u32),
         )?;
-        dev_dbg!(
-            pdev.as_ref(),
-            "GSP MBOX0: {:#x}, MBOX1: {:#x}\n",
-            mbox0,
-            mbox1
-        );
+        dev_dbg!(dev, "GSP MBOX0: {:#x}, MBOX1: {:#x}\n", mbox0, mbox1);
 
         dev_dbg!(
-            pdev.as_ref(),
+            dev,
             "Using SEC2 to load and run the booter_load firmware...\n"
         );
 
@@ -190,19 +185,10 @@ pub(crate) fn boot(
             Some(wpr_handle as u32),
             Some((wpr_handle >> 32) as u32),
         )?;
-        dev_dbg!(
-            pdev.as_ref(),
-            "SEC2 MBOX0: {:#x}, MBOX1{:#x}\n",
-            mbox0,
-            mbox1
-        );
+        dev_dbg!(dev, "SEC2 MBOX0: {:#x}, MBOX1{:#x}\n", mbox0, mbox1);
 
         if mbox0 != 0 {
-            dev_err!(
-                pdev.as_ref(),
-                "Booter-load failed with error {:#x}\n",
-                mbox0
-            );
+            dev_err!(dev, "Booter-load failed with error {:#x}\n", mbox0);
             return Err(ENODEV);
         }
 
@@ -216,11 +202,7 @@ pub(crate) fn boot(
             Delta::from_secs(5),
         )?;
 
-        dev_dbg!(
-            pdev.as_ref(),
-            "RISC-V active? {}\n",
-            gsp_falcon.is_riscv_active(bar),
-        );
+        dev_dbg!(dev, "RISC-V active? {}\n", gsp_falcon.is_riscv_active(bar),);
 
         // Create and run the GSP sequencer.
         let seq_params = GspSequencerParams {
@@ -228,7 +210,7 @@ pub(crate) fn boot(
             libos_dma_handle: libos_handle,
             gsp_falcon,
             sec2_falcon,
-            dev: pdev.as_ref().into(),
+            dev: dev.into(),
             bar,
         };
         GspSequencer::run(&mut self.cmdq, seq_params)?;
@@ -239,8 +221,8 @@ pub(crate) fn boot(
         // Obtain and display basic GPU information.
         let info = commands::get_gsp_info(&mut self.cmdq, bar)?;
         match info.gpu_name() {
-            Ok(name) => dev_info!(pdev.as_ref(), "GPU name: {}\n", name),
-            Err(e) => dev_warn!(pdev.as_ref(), "GPU name unavailable: {:?}\n", e),
+            Ok(name) => dev_info!(dev, "GPU name: {}\n", name),
+            Err(e) => dev_warn!(dev, "GPU name unavailable: {:?}\n", e),
         }
 
         Ok(())
Signature · 1 line
2.53.0
maintainer
#11 lore raw

Re: [PATCH v3 8/8] gpu: nova-core: gsp: use available device reference

Quoted 5 lines · Alexandre Courbot

We already have a regular reference to the Device, so we don't need to repeatedly acquire one in this method.

This conflicts with [1]. I think I will just drop [1] from my queue, since for nova-core specifically using the base Device here may be better, as eventually nova-core will work with both a pci::Device and a platform::Device.

(Which also reminds me that at some point we have to treat pci::Bar as generic I/O backend.)

I hope we can actually keep as many code paths in common as I imagine.

[1] https://lore.kernel.org/all/[email protected]/

maintainer Reviewed-by on the v3 series
#12 lore raw
In reply to Alexandre Courbot
Quoted 9 lines · Alexandre Courbot

A few simple, loosely-related small improvements for nova-core, including reporting unprocessed data in GSP messages, removal of unnecessary code in GSP and the sequencer, and leveraging the Zeroable derive macro and core library's CStr. Probably nothing too controversial, so I plan on applying it soon after -rc1 gets released.

This revision is based on master.

With my comments in patch 7 addressed,

author maintainer
#13 lore raw
Quoted 7 lines · Danilo Krummrich
Quoted 6 lines · Alexandre Courbot

A few simple, loosely-related small improvements for nova-core, including reporting unprocessed data in GSP messages, removal of unnecessary code in GSP and the sequencer, and leveraging the Zeroable derive macro and core library's CStr. Probably nothing too controversial, so I plan on applying it soon after -rc1 gets released.

Quoted 7 lines
Quoted 3 lines

This revision is based on master.

With my comments in patch 7 addressed,

Thanks! Staging for applying after -rc1 is released, with the comments on patch 7 addressed.

author maintainer
#14 lore raw
Quoted 10 lines · Alexandre Courbot
Quoted 9 lines · Danilo Krummrich
Quoted 8 lines · Alexandre Courbot

A few simple, loosely-related small improvements for nova-core, including reporting unprocessed data in GSP messages, removal of unnecessary code in GSP and the sequencer, and leveraging the Zeroable derive macro and core library's CStr. Probably nothing too controversial, so I plan on applying it soon after -rc1 gets released.

This revision is based on master.

Quoted 8 lines
Quoted 5 lines
Quoted 1 line

With my comments in patch 7 addressed,

Thanks! Staging for applying after -rc1 is released, with the comments on patch 7 addressed.

Pushed into drm-rust-next, with the exception of the last patch which has been superseeded by [1].

[1] https://patch.msgid.link/[email protected]