From: Alexandre Courbot Date: Thu, 22 Jan 2026 22:28:46 +0000 (-0600) Subject: gpu: nova-core: align LibosMemoryRegionInitArgument size to page size X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=58d26d42818c0f8c9b334cc7cf318b43046e675f;p=thirdparty%2Fkernel%2Flinux.git 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: Timur Tabi Reviewed-by: Gary Guo Acked-by: Danilo Krummrich Link: https://patch.msgid.link/20260122222848.2555890-12-ttabi@nvidia.com [acourbot@nvidia.com: GspArgumentsAligned -> GspArgumentsPadded] Signed-off-by: Alexandre Courbot --- diff --git a/drivers/gpu/nova-core/gsp.rs b/drivers/gpu/nova-core/gsp.rs index 766fd9905358..174feaca0a6b 100644 --- a/drivers/gpu/nova-core/gsp.rs +++ b/drivers/gpu/nova-core/gsp.rs @@ -27,7 +27,7 @@ pub(crate) use fw::{ 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, + rmargs: CoherentAllocation, } impl Gsp { @@ -133,7 +133,7 @@ impl Gsp { logintr: LogBuffer::new(dev)?, logrm: LogBuffer::new(dev)?, cmdq: Cmdq::new(dev)?, - rmargs: CoherentAllocation::::alloc_coherent( + rmargs: CoherentAllocation::::alloc_coherent( dev, 1, GFP_KERNEL | __GFP_ZERO, @@ -149,7 +149,7 @@ impl Gsp { 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..83ff91614e36 100644 --- a/drivers/gpu/nova-core/gsp/fw.rs +++ b/drivers/gpu/nova-core/gsp/fw.rs @@ -904,9 +904,21 @@ impl GspArgumentsCached { // 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::()], +} + +// 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)]