diff options
| author | Alexandre Courbot <acourbot@nvidia.com> | 2026-03-19 15:00:40 +0900 |
|---|---|---|
| committer | Alexandre Courbot <acourbot@nvidia.com> | 2026-03-24 15:45:22 +0900 |
| commit | 651c27d6a7e2b92eb30f56738dc45e861c975921 (patch) | |
| tree | 6276393f61ea822c2b46379f30258b9fc308c5e1 /drivers/gpu/nova-core | |
| parent | 55fd681cdd8599edc82013674cbf87c2f22d58f8 (diff) | |
gpu: nova-core: gsp: move Cmdq's DMA handle to a struct member
The command-queue structure has a `dma_handle` method that returns the
DMA handle to the memory segment shared with the GSP. This works, but is
not ideal for the following reasons:
- That method is effectively only ever called once, and is technically
an accessor method since the handle doesn't change over time,
- It feels a bit out-of-place with the other methods of `Cmdq` which
only deal with the sending or receiving of messages,
- The method has `pub(crate)` visibility, allowing other driver code to
access this highly-sensitive handle.
Address all these issues by turning `dma_handle` into a struct member
with `pub(super)` visibility. This keeps the method space focused, and
also ensures the member is not visible outside of the modules that need
it.
Reviewed-by: Eliot Courtney <ecourtney@nvidia.com>
Reviewed-by: Danilo Krummrich <dakr@kernel.org>
Link: https://patch.msgid.link/20260319-b4-cmdq-dma-handle-v1-1-57840b4a4f90@nvidia.com
Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
Diffstat (limited to 'drivers/gpu/nova-core')
| -rw-r--r-- | drivers/gpu/nova-core/gsp/cmdq.rs | 26 | ||||
| -rw-r--r-- | drivers/gpu/nova-core/gsp/fw.rs | 2 |
2 files changed, 16 insertions, 12 deletions
diff --git a/drivers/gpu/nova-core/gsp/cmdq.rs b/drivers/gpu/nova-core/gsp/cmdq.rs index f38790601a0f..c853be23e3a5 100644 --- a/drivers/gpu/nova-core/gsp/cmdq.rs +++ b/drivers/gpu/nova-core/gsp/cmdq.rs @@ -30,6 +30,8 @@ use continuation::{ SplitState, // }; +use pin_init::pin_init_scope; + use crate::{ driver::Bar0, gsp::{ @@ -452,6 +454,8 @@ pub(crate) struct Cmdq { /// Inner mutex-protected state. #[pin] inner: Mutex<CmdqInner>, + /// DMA handle of the command queue's shared memory region. + pub(super) dma_handle: DmaAddress, } impl Cmdq { @@ -476,12 +480,17 @@ impl Cmdq { /// Creates a new command queue for `dev`. pub(crate) fn new(dev: &device::Device<device::Bound>) -> impl PinInit<Self, Error> + '_ { - try_pin_init!(Self { - inner <- new_mutex!(CmdqInner { - dev: dev.into(), - gsp_mem: DmaGspMem::new(dev)?, - seq: 0, - }), + pin_init_scope(move || { + let gsp_mem = DmaGspMem::new(dev)?; + + Ok(try_pin_init!(Self { + dma_handle: gsp_mem.0.dma_handle(), + inner <- new_mutex!(CmdqInner { + dev: dev.into(), + gsp_mem, + seq: 0, + }), + })) }) } @@ -567,11 +576,6 @@ impl Cmdq { { self.inner.lock().receive_msg(timeout) } - - /// Returns the DMA handle of the command queue's shared memory region. - pub(crate) fn dma_handle(&self) -> DmaAddress { - self.inner.lock().gsp_mem.0.dma_handle() - } } /// Inner mutex protected state of [`Cmdq`]. diff --git a/drivers/gpu/nova-core/gsp/fw.rs b/drivers/gpu/nova-core/gsp/fw.rs index 847b5eb215d4..0c8a74f0e8ac 100644 --- a/drivers/gpu/nova-core/gsp/fw.rs +++ b/drivers/gpu/nova-core/gsp/fw.rs @@ -912,7 +912,7 @@ impl MessageQueueInitArguments { #[allow(non_snake_case)] fn new(cmdq: &Cmdq) -> impl Init<Self> + '_ { init!(MessageQueueInitArguments { - sharedMemPhysAddr: cmdq.dma_handle(), + sharedMemPhysAddr: cmdq.dma_handle, pageTableEntryCount: num::usize_into_u32::<{ Cmdq::NUM_PTES }>(), cmdQueueOffset: num::usize_as_u64(Cmdq::CMDQ_OFFSET), statQueueOffset: num::usize_as_u64(Cmdq::STATQ_OFFSET), |
