Re: [PATCH v11 04/22] gpu: nova-core: Hopper/Blackwell: larger non-WPR heap
From: Alexandre Courbot
Date: Sun May 31 2026 - 22:24:57 EST
On Sat May 30, 2026 at 12:09 PM JST, John Hubbard wrote:
> Hopper and Blackwell need a larger non-WPR heap than the 1 MiB that
> earlier architectures use. Hopper and Blackwell GB10x need 2 MiB, while
> Blackwell GB20x needs 2 MiB + 128 KiB. Because GB10x and GB20x diverge
> here, give each Blackwell family its own framebuffer HAL and select the
> non-WPR heap size per chipset family.
>
> Signed-off-by: John Hubbard <jhubbard@xxxxxxxxxx>
> ---
> drivers/gpu/nova-core/fb.rs | 5 ++-
> drivers/gpu/nova-core/fb/hal.rs | 16 +++++++--
> drivers/gpu/nova-core/fb/hal/gb100.rs | 9 +++--
> drivers/gpu/nova-core/fb/hal/gb202.rs | 52 +++++++++++++++++++++++++++
> drivers/gpu/nova-core/fb/hal/gh100.rs | 10 +++++-
> 5 files changed, 84 insertions(+), 8 deletions(-)
> create mode 100644 drivers/gpu/nova-core/fb/hal/gb202.rs
>
> diff --git a/drivers/gpu/nova-core/fb.rs b/drivers/gpu/nova-core/fb.rs
> index d7a4dc944131..0aaee718c2c3 100644
> --- a/drivers/gpu/nova-core/fb.rs
> +++ b/drivers/gpu/nova-core/fb.rs
> @@ -252,9 +252,8 @@ pub(crate) fn new(chipset: Chipset, bar: &Bar0, gsp_fw: &GspFirmware) -> Result<
> };
>
> let heap = {
> - const HEAP_SIZE: u64 = u64::SZ_1M;
> -
> - FbRange(wpr2.start - HEAP_SIZE..wpr2.start)
> + let heap_size = u64::from(hal.non_wpr_heap_size());
> + FbRange(wpr2.start - heap_size..wpr2.start)
> };
>
> Ok(Self {
> diff --git a/drivers/gpu/nova-core/fb/hal.rs b/drivers/gpu/nova-core/fb/hal.rs
> index e6ac55bba9b9..acb934f9aa9f 100644
> --- a/drivers/gpu/nova-core/fb/hal.rs
> +++ b/drivers/gpu/nova-core/fb/hal.rs
> @@ -1,7 +1,10 @@
> // SPDX-License-Identifier: GPL-2.0
> // SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
>
> -use kernel::prelude::*;
> +use kernel::{
> + prelude::*,
> + sizes::SizeConstants, //
> +};
>
> use crate::{
> driver::Bar0,
> @@ -14,6 +17,7 @@
> mod ga100;
> mod ga102;
> mod gb100;
> +mod gb202;
> mod gh100;
> mod tu102;
>
> @@ -37,6 +41,13 @@ pub(crate) trait FbHal {
>
> /// Returns the FRTS size, in bytes.
> fn frts_size(&self) -> u64;
> +
> + /// Returns the non-WPR heap size for this chipset, in bytes.
> + ///
> + /// Older architectures use 1 MiB. Hopper and Blackwell override this.
> + fn non_wpr_heap_size(&self) -> u32 {
> + u32::SZ_1M
> + }
I'm not sure that there is a "default" value here - this carries the
risk that future implementations will forget to implement this method
and get the same value as Turing/Ampere. Could you instead use a
`non_wpr_heap_size_tu102` method that is called by ga100/ga102 as well?