To support the maximum vGPUs on devices that support vGPU, a larger WPR2 heap size is required. On Ada with vGPU supported, the size should be set to at least 581MB.
When vGPU support is enabled, reserve a large WPR2 heap size up to 581MB, set the max supported VF to max in WPR2 meta. Signed-off-by: Zhi Wang <[email protected]> --- drivers/gpu/nova-core/fb.rs | 19 +++++++++++++++---- drivers/gpu/nova-core/gsp/boot.rs | 2 +- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/nova-core/fb.rs b/drivers/gpu/nova-core/fb.rs index 3c9cf151786c..9a5c40029f3a 100644 --- a/drivers/gpu/nova-core/fb.rs +++ b/drivers/gpu/nova-core/fb.rs @@ -119,7 +119,12 @@ pub(crate) struct FbLayout { impl FbLayout { /// Computes the FB layout for `chipset` required to run the `gsp_fw` GSP firmware. - pub(crate) fn new(chipset: Chipset, bar: &Bar0, gsp_fw: &GspFirmware) -> Result<Self> { + pub(crate) fn new( + chipset: Chipset, + bar: &Bar0, + gsp_fw: &GspFirmware, + vgpu_support: bool, + ) -> Result<Self> { let hal = hal::fb_hal(chipset); let fb = { @@ -181,8 +186,12 @@ pub(crate) fn new(chipset: Chipset, bar: &Bar0, gsp_fw: &GspFirmware) -> Result< let wpr2_heap = { const WPR2_HEAP_DOWN_ALIGN: Alignment = Alignment::new::<SZ_1M>(); - let wpr2_heap_size = - gsp::LibosParams::from_chipset(chipset).wpr_heap_size(chipset, fb.end); + let wpr2_heap_size = if !vgpu_support { + gsp::LibosParams::from_chipset(chipset).wpr_heap_size(chipset, fb.end) + } else { + 581 * usize_as_u64(SZ_1M) + }; + let wpr2_heap_addr = (elf.start - wpr2_heap_size).align_down(WPR2_HEAP_DOWN_ALIGN); wpr2_heap_addr..(elf.start).align_down(WPR2_HEAP_DOWN_ALIGN) @@ -202,6 +211,8 @@ pub(crate) fn new(chipset: Chipset, bar: &Bar0, gsp_fw: &GspFirmware) -> Result< wpr2.start - HEAP_SIZE..wpr2.start }; + let vf_partition_count = if vgpu_support { 32 } else { 0 }; + Ok(Self { fb, vga_workspace, @@ -211,7 +222,7 @@ pub(crate) fn new(chipset: Chipset, bar: &Bar0, gsp_fw: &GspFirmware) -> Result< wpr2_heap, wpr2, heap, - vf_partition_count: 0, + vf_partition_count, }) } } diff --git a/drivers/gpu/nova-core/gsp/boot.rs b/drivers/gpu/nova-core/gsp/boot.rs index 847ce550eccf..ec006c26f19f 100644 --- a/drivers/gpu/nova-core/gsp/boot.rs +++ b/drivers/gpu/nova-core/gsp/boot.rs @@ -146,7 +146,7 @@ pub(crate) fn boot( GFP_KERNEL, )?; - let fb_layout = FbLayout::new(chipset, bar, &gsp_fw)?; + let fb_layout = FbLayout::new(chipset, bar, &gsp_fw, vgpu_support)?; dev_dbg!(dev, "{:#x?}\n", fb_layout); Self::run_fwsec_frts(dev, gsp_falcon, bar, &bios, &fb_layout)?; -- 2.51.0
