On Thu Jan 22, 2026 at 10:28 PM GMT, Timur Tabi wrote:
> From: Alexandre Courbot <[email protected]>
>
> On Turing and GA100 (i.e. the versions that use Libos v2), GSP-RM insists
> that the 'size' parameter of the LibosMemoryRegionInitArgument struct be
> aligned to 4KB.  The logging buffers are already aligned to that size, so
> only the GSP_ARGUMENTS_CACHED struct needs to be adjusted.  Make that
> adjustment by adding padding to the end of the struct.
>
> Signed-off-by: Alexandre Courbot <[email protected]>
> Signed-off-by: Timur Tabi <[email protected]>
> ---
>  drivers/gpu/nova-core/gsp.rs    |  8 ++++----
>  drivers/gpu/nova-core/gsp/fw.rs | 14 +++++++++++++-
>  2 files changed, 17 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/nova-core/gsp.rs b/drivers/gpu/nova-core/gsp.rs
> index 766fd9905358..bcf6ce18a4a1 100644
> --- a/drivers/gpu/nova-core/gsp.rs
> +++ b/drivers/gpu/nova-core/gsp.rs
> @@ -27,7 +27,7 @@
>  use crate::{
>      gsp::cmdq::Cmdq,
>      gsp::fw::{
> -        GspArgumentsCached,
> +        GspArgumentsAligned,
>          LibosMemoryRegionInitArgument, //
>      },
>      num,
> @@ -114,7 +114,7 @@ pub(crate) struct Gsp {
>      /// Command queue.
>      pub(crate) cmdq: Cmdq,
>      /// RM arguments.
> -    rmargs: CoherentAllocation<GspArgumentsCached>,
> +    rmargs: CoherentAllocation<GspArgumentsAligned>,
>  }
>  
>  impl Gsp {
> @@ -133,7 +133,7 @@ pub(crate) fn new(pdev: &pci::Device<device::Bound>) -> 
> impl PinInit<Self, Error
>                  logintr: LogBuffer::new(dev)?,
>                  logrm: LogBuffer::new(dev)?,
>                  cmdq: Cmdq::new(dev)?,
> -                rmargs: 
> CoherentAllocation::<GspArgumentsCached>::alloc_coherent(
> +                rmargs: 
> CoherentAllocation::<GspArgumentsAligned>::alloc_coherent(
>                      dev,
>                      1,
>                      GFP_KERNEL | __GFP_ZERO,
> @@ -149,7 +149,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] = 
> 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/fw.rs b/drivers/gpu/nova-core/gsp/fw.rs
> index caeb0d251fe5..89be26b597d1 100644
> --- a/drivers/gpu/nova-core/gsp/fw.rs
> +++ b/drivers/gpu/nova-core/gsp/fw.rs
> @@ -904,9 +904,21 @@ pub(crate) fn new(cmdq: &Cmdq) -> Self {
>  // SAFETY: Padding is explicit and will not contain uninitialized data.
>  unsafe impl AsBytes for GspArgumentsCached {}
>  
> +/// On Turing and GA100, the entries in the `LibosMemoryRegionInitArgument`
> +/// must all be a multiple of GSP_PAGE_SIZE in size, so add padding to force 
> it
> +/// to that size.
> +#[repr(C)]
> +pub(crate) struct GspArgumentsAligned {

Hi Timir,

This is not "aligned" to GSP_PAGE_SIZE, but rather just "padded" to
GSP_PAGE_SIZE, so calling it `GspArgumentsAligned` would be a misnomer.

`GspArgumentsPadded`, perhaps?

Best,
Gary

> +    pub(crate) inner: GspArgumentsCached,
> +    _padding: [u8; GSP_PAGE_SIZE - 
> core::mem::size_of::<bindings::GSP_ARGUMENTS_CACHED>()],
> +}
> +
> +// SAFETY: Padding is explicit and will not contain uninitialized data.
> +unsafe impl AsBytes for GspArgumentsAligned {}
> +
>  // SAFETY: This struct only contains integer types for which all bit patterns
>  // are valid.
> -unsafe impl FromBytes for GspArgumentsCached {}
> +unsafe impl FromBytes for GspArgumentsAligned {}
>  
>  /// Init arguments for the message queue.
>  #[repr(transparent)]

Reply via email to