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)]