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.

Reply via email to