xref: /linux/drivers/gpu/nova-core/fb/hal/gh100.rs (revision 23d66dbab84e8518943563df2ced14aaab28b77a)
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