Commit 58d26d42 authored by Alexandre Courbot's avatar Alexandre Courbot
Browse files

gpu: nova-core: align LibosMemoryRegionInitArgument size to page size



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: default avatarTimur Tabi <ttabi@nvidia.com>
Reviewed-by: default avatarGary Guo <gary@garyguo.net>
Acked-by: default avatarDanilo Krummrich <dakr@kernel.org>
Link: https://patch.msgid.link/20260122222848.2555890-12-ttabi@nvidia.com


[acourbot@nvidia.com: GspArgumentsAligned -> GspArgumentsPadded]
Signed-off-by: default avatarAlexandre Courbot <acourbot@nvidia.com>
parent dbfb5aa4
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -27,7 +27,7 @@
use crate::{
    gsp::cmdq::Cmdq,
    gsp::fw::{
        GspArgumentsCached,
        GspArgumentsPadded,
        LibosMemoryRegionInitArgument, //
    },
    num,
@@ -114,7 +114,7 @@ pub(crate) struct Gsp {
    /// Command queue.
    pub(crate) cmdq: Cmdq,
    /// RM arguments.
    rmargs: CoherentAllocation<GspArgumentsCached>,
    rmargs: CoherentAllocation<GspArgumentsPadded>,
}

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::<GspArgumentsPadded>::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))?;
                },
            }))
+13 −1
Original line number Diff line number Diff line
@@ -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 GspArgumentsPadded {
    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 GspArgumentsPadded {}

// SAFETY: This struct only contains integer types for which all bit patterns
// are valid.
unsafe impl FromBytes for GspArgumentsCached {}
unsafe impl FromBytes for GspArgumentsPadded {}

/// Init arguments for the message queue.
#[repr(transparent)]