[PATCH RFC v6 15/26] nova-core: mm: Add GpuMm centralized memory manager
From: Joel Fernandes <joelagnelf@nvidia.com>
Date: 2026-01-20 20:44:33
Also in:
amd-gfx, dri-devel, intel-gfx, intel-xe, linux-doc, lkml, nouveau, rust-for-linux
Subsystem:
core driver for nvidia gpus [rust], drm drivers, drm drivers and common infrastructure [rust], the rest · Maintainers:
Danilo Krummrich, Alexandre Courbot, David Airlie, Simona Vetter, Alice Ryhl, Linus Torvalds
Introduce GpuMm as the centralized GPU memory manager that owns: - Buddy allocator for VRAM allocation. - PRAMIN window for direct VRAM access. - TLB manager for translation buffer operations. This provides clean ownership model where GpuMm provides accessor methods for its components that can be used for memory management operations. Signed-off-by: Joel Fernandes <joelagnelf@nvidia.com> --- drivers/gpu/nova-core/gpu.rs | 14 +++++++++ drivers/gpu/nova-core/mm/mod.rs | 55 ++++++++++++++++++++++++++++++++- 2 files changed, 68 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs
index 9b042ef1a308..572e6d4502bc 100644
--- a/drivers/gpu/nova-core/gpu.rs
+++ b/drivers/gpu/nova-core/gpu.rs@@ -4,8 +4,10 @@ device, devres::Devres, fmt, + gpu::buddy::GpuBuddyParams, pci, prelude::*, + sizes::{SZ_1M, SZ_4K}, sync::Arc, // };
@@ -19,6 +21,7 @@ fb::SysmemFlush, gfw, gsp::Gsp, + mm::GpuMm, regs, };
@@ -249,6 +252,8 @@ pub(crate) struct Gpu { gsp_falcon: Falcon<GspFalcon>, /// SEC2 falcon instance, used for GSP boot up and cleanup. sec2_falcon: Falcon<Sec2Falcon>, + /// GPU memory manager owning memory management resources. + mm: GpuMm, /// GSP runtime data. Temporarily an empty placeholder. #[pin] gsp: Gsp,
@@ -281,6 +286,15 @@ pub(crate) fn new<'a>( sec2_falcon: Falcon::new(pdev.as_ref(), spec.chipset)?, + // Create GPU memory manager owning memory management resources. + // This will be initialized with the usable VRAM region from GSP in a later + // patch. For now, we use a placeholder of 1MB. + mm: GpuMm::new(devres_bar.clone(), GpuBuddyParams { + base_offset_bytes: 0, + physical_memory_size_bytes: SZ_1M as u64, + chunk_size_bytes: SZ_4K as u64, + })?, + gsp <- Gsp::new(pdev), _: { gsp.boot(pdev, bar, spec.chipset, gsp_falcon, sec2_falcon)? },
diff --git a/drivers/gpu/nova-core/mm/mod.rs b/drivers/gpu/nova-core/mm/mod.rs
index 39635f2d0156..56c72bf51431 100644
--- a/drivers/gpu/nova-core/mm/mod.rs
+++ b/drivers/gpu/nova-core/mm/mod.rs@@ -8,7 +8,60 @@ pub(crate) mod pramin; pub(crate) mod tlb; -use kernel::sizes::SZ_4K; +use kernel::{ + devres::Devres, + gpu::buddy::{ + GpuBuddy, + GpuBuddyParams, // + }, + prelude::*, + sizes::SZ_4K, + sync::Arc, // +}; + +use crate::driver::Bar0; + +pub(crate) use tlb::Tlb; + +/// GPU Memory Manager - owns all core MM components. +/// +/// Provides centralized ownership of memory management resources: +/// - [`GpuBuddy`] allocator for VRAM page table allocation. +/// - [`pramin::Window`] for direct VRAM access. +/// - [`Tlb`] manager for translation buffer flush operations. +/// +/// No pinning required, all fields manage their own pinning internally. +pub(crate) struct GpuMm { + buddy: GpuBuddy, + pramin: pramin::Window, + tlb: Tlb, +} + +impl GpuMm { + /// Create a new `GpuMm` object. + pub(crate) fn new(bar: Arc<Devres<Bar0>>, buddy_params: GpuBuddyParams) -> Result<Self> { + Ok(Self { + buddy: GpuBuddy::new(buddy_params)?, + pramin: pramin::Window::new(bar.clone())?, + tlb: Tlb::new(bar), + }) + } + + /// Access the [`GpuBuddy`] allocator. + pub(crate) fn buddy(&self) -> &GpuBuddy { + &self.buddy + } + + /// Access the [`pramin::Window`]. + pub(crate) fn pramin(&mut self) -> &mut pramin::Window { + &mut self.pramin + } + + /// Access the [`Tlb`] manager. + pub(crate) fn tlb(&self) -> &Tlb { + &self.tlb + } +} /// Page size in bytes (4 KiB). pub(crate) const PAGE_SIZE: usize = SZ_4K;
--
2.34.1