On Sat Jan 24, 2026 at 3:14 AM JST, Gary Guo wrote: > 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?
Sounds good, let me convert when applying.
