mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-03-22 07:27:12 +08:00
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 <ttabi@nvidia.com> Reviewed-by: Gary Guo <gary@garyguo.net> Acked-by: Danilo Krummrich <dakr@kernel.org> Link: https://patch.msgid.link/20260122222848.2555890-12-ttabi@nvidia.com [acourbot@nvidia.com: GspArgumentsAligned -> GspArgumentsPadded] Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
This commit is contained in:
@@ -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<GspArgumentsCached>,
|
||||
rmargs: CoherentAllocation<GspArgumentsPadded>,
|
||||
}
|
||||
|
||||
impl Gsp {
|
||||
@@ -133,7 +133,7 @@ impl Gsp {
|
||||
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 @@ 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))?;
|
||||
},
|
||||
}))
|
||||
|
||||
@@ -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::<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)]
|
||||
|
||||
Reference in New Issue
Block a user