1 // SPDX-License-Identifier: GPL-2.0 2 // SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. 3 4 use kernel::{ 5 io::Io, 6 num::Bounded, 7 prelude::*, 8 sizes::SizeConstants, // 9 }; 10 11 use crate::{ 12 driver::Bar0, 13 fb::hal::FbHal, 14 regs, // 15 }; 16 17 struct Gh100; 18 19 fn read_sysmem_flush_page_gh100(bar: Bar0<'_>) -> u64 { 20 let lo = u64::from(bar.read(regs::NV_PFB_FBHUB_PCIE_FLUSH_SYSMEM_ADDR_LO).adr()); 21 let hi = u64::from(bar.read(regs::NV_PFB_FBHUB_PCIE_FLUSH_SYSMEM_ADDR_HI).adr()); 22 23 (hi << 32) | lo 24 } 25 26 /// Write the sysmem flush page address through the Hopper FBHUB registers. 27 fn write_sysmem_flush_page_gh100(bar: Bar0<'_>, addr: Bounded<u64, 52>) { 28 // Write HI first. The hardware will trigger the flush on the LO write. 29 bar.write_reg( 30 regs::NV_PFB_FBHUB_PCIE_FLUSH_SYSMEM_ADDR_HI::zeroed() 31 .with_adr(addr.shr::<32, 20>().cast::<u32>()), 32 ); 33 bar.write_reg( 34 // CAST: lower 32 bits. Hardware ignores bits 7:0. 35 regs::NV_PFB_FBHUB_PCIE_FLUSH_SYSMEM_ADDR_LO::zeroed().with_adr(*addr as u32), 36 ); 37 } 38 39 impl FbHal for Gh100 { 40 fn read_sysmem_flush_page(&self, bar: Bar0<'_>) -> u64 { 41 read_sysmem_flush_page_gh100(bar) 42 } 43 44 fn write_sysmem_flush_page(&self, bar: Bar0<'_>, addr: u64) -> Result { 45 let addr = Bounded::<u64, 52>::try_new(addr).ok_or(EINVAL)?; 46 47 write_sysmem_flush_page_gh100(bar, addr); 48 49 Ok(()) 50 } 51 52 fn supports_display(&self, bar: Bar0<'_>) -> bool { 53 super::ga100::display_enabled_ga100(bar) 54 } 55 56 fn vidmem_size(&self, bar: Bar0<'_>) -> u64 { 57 super::ga102::vidmem_size_ga102(bar) 58 } 59 60 fn pmu_reserved_size(&self) -> u32 { 61 super::tu102::pmu_reserved_size_tu102() 62 } 63 64 fn non_wpr_heap_size(&self) -> u32 { 65 // Non-WPR heap for Hopper (see Open RM: kgspCalculateFbLayout_GH100). 66 u32::SZ_2M 67 } 68 69 fn frts_size(&self) -> u64 { 70 super::tu102::frts_size_tu102() 71 } 72 } 73 74 const GH100: Gh100 = Gh100; 75 pub(super) const GH100_HAL: &dyn FbHal = &GH100; 76