On Wed, 25 Feb 2026 22:41:50 +0900 Eliot Courtney <[email protected]> wrote:
Looks good to me. Reviewed-by: Zhi Wang <[email protected]> > Make `Cmdq` a pinned type. This is needed to use Mutex, which is > needed to add locking to `Cmdq`. > > Signed-off-by: Eliot Courtney <[email protected]> > --- > drivers/gpu/nova-core/gsp.rs | 5 +++-- > drivers/gpu/nova-core/gsp/cmdq.rs | 9 ++++----- > 2 files changed, 7 insertions(+), 7 deletions(-) > > diff --git a/drivers/gpu/nova-core/gsp.rs > b/drivers/gpu/nova-core/gsp.rs index 174feaca0a6b..a6f3918c20b1 100644 > --- a/drivers/gpu/nova-core/gsp.rs > +++ b/drivers/gpu/nova-core/gsp.rs > @@ -112,6 +112,7 @@ pub(crate) struct Gsp { > /// RM log buffer. > logrm: LogBuffer, > /// Command queue. > + #[pin] > pub(crate) cmdq: Cmdq, > /// RM arguments. > rmargs: CoherentAllocation<GspArgumentsPadded>, > @@ -132,7 +133,7 @@ pub(crate) fn new(pdev: > &pci::Device<device::Bound>) -> impl PinInit<Self, Error loginit: > LogBuffer::new(dev)?, logintr: LogBuffer::new(dev)?, > logrm: LogBuffer::new(dev)?, > - cmdq: Cmdq::new(dev)?, > + cmdq <- Cmdq::new(dev), > rmargs: > CoherentAllocation::<GspArgumentsPadded>::alloc_coherent( dev, > 1, > @@ -149,7 +150,7 @@ pub(crate) fn new(pdev: > &pci::Device<device::Bound>) -> impl PinInit<Self, Error libos[1] = > LibosMemoryRegionInitArgument::new("LOGINTR", &logintr.0) )?; > dma_write!(libos[2] = > LibosMemoryRegionInitArgument::new("LOGRM", &logrm.0))?; > - dma_write!(rmargs[0].inner = > fw::GspArgumentsCached::new(cmdq))?; > + dma_write!(rmargs[0].inner = > fw::GspArgumentsCached::new(&cmdq))?; dma_write!(libos[3] = > LibosMemoryRegionInitArgument::new("RMARGS", rmargs))?; }, > })) > diff --git a/drivers/gpu/nova-core/gsp/cmdq.rs > b/drivers/gpu/nova-core/gsp/cmdq.rs index e1ca1bb9e07d..44c3e960c965 > 100644 --- a/drivers/gpu/nova-core/gsp/cmdq.rs > +++ b/drivers/gpu/nova-core/gsp/cmdq.rs > @@ -474,6 +474,7 @@ pub(crate) fn command_size<M>(command: &M) -> > usize /// > /// Provides the ability to send commands and receive messages from > the GSP using a shared memory /// area. > +#[pin_data] > pub(crate) struct Cmdq { > /// Device this command queue belongs to. > dev: ARef<device::Device>, > @@ -501,13 +502,11 @@ impl Cmdq { > pub(crate) const NUM_PTES: usize = size_of::<GspMem>() >> > GSP_PAGE_SHIFT; > /// Creates a new command queue for `dev`. > - pub(crate) fn new(dev: &device::Device<device::Bound>) -> > Result<Cmdq> { > - let gsp_mem = DmaGspMem::new(dev)?; > - > - Ok(Cmdq { > + pub(crate) fn new(dev: &device::Device<device::Bound>) -> impl > PinInit<Self, Error> + '_ { > + try_pin_init!(Self { > + gsp_mem: DmaGspMem::new(dev)?, > dev: dev.into(), > seq: 0, > - gsp_mem, > }) > } > >
