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 <[email protected]> --- 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
