16554ad65SAlexandre Courbot // SPDX-License-Identifier: GPL-2.0
26554ad65SAlexandre Courbot
36554ad65SAlexandre Courbot struct Ga100;
46554ad65SAlexandre Courbot
56554ad65SAlexandre Courbot use kernel::prelude::*;
66554ad65SAlexandre Courbot
76554ad65SAlexandre Courbot use crate::driver::Bar0;
86554ad65SAlexandre Courbot use crate::fb::hal::FbHal;
96554ad65SAlexandre Courbot use crate::regs;
106554ad65SAlexandre Courbot
116554ad65SAlexandre Courbot use super::tu102::FLUSH_SYSMEM_ADDR_SHIFT;
126554ad65SAlexandre Courbot
read_sysmem_flush_page_ga100(bar: &Bar0) -> u64136554ad65SAlexandre Courbot pub(super) fn read_sysmem_flush_page_ga100(bar: &Bar0) -> u64 {
14*43ad65ecSDanilo Krummrich u64::from(regs::NV_PFB_NISO_FLUSH_SYSMEM_ADDR::read(bar).adr_39_08()) << FLUSH_SYSMEM_ADDR_SHIFT
15*43ad65ecSDanilo Krummrich | u64::from(regs::NV_PFB_NISO_FLUSH_SYSMEM_ADDR_HI::read(bar).adr_63_40())
166554ad65SAlexandre Courbot << FLUSH_SYSMEM_ADDR_SHIFT_HI
176554ad65SAlexandre Courbot }
186554ad65SAlexandre Courbot
write_sysmem_flush_page_ga100(bar: &Bar0, addr: u64)196554ad65SAlexandre Courbot pub(super) fn write_sysmem_flush_page_ga100(bar: &Bar0, addr: u64) {
206554ad65SAlexandre Courbot regs::NV_PFB_NISO_FLUSH_SYSMEM_ADDR_HI::default()
216554ad65SAlexandre Courbot .set_adr_63_40((addr >> FLUSH_SYSMEM_ADDR_SHIFT_HI) as u32)
226554ad65SAlexandre Courbot .write(bar);
236554ad65SAlexandre Courbot regs::NV_PFB_NISO_FLUSH_SYSMEM_ADDR::default()
246554ad65SAlexandre Courbot .set_adr_39_08((addr >> FLUSH_SYSMEM_ADDR_SHIFT) as u32)
256554ad65SAlexandre Courbot .write(bar);
266554ad65SAlexandre Courbot }
276554ad65SAlexandre Courbot
display_enabled_ga100(bar: &Bar0) -> bool2880213934SAlexandre Courbot pub(super) fn display_enabled_ga100(bar: &Bar0) -> bool {
2980213934SAlexandre Courbot !regs::ga100::NV_FUSE_STATUS_OPT_DISPLAY::read(bar).display_disabled()
3080213934SAlexandre Courbot }
3180213934SAlexandre Courbot
326554ad65SAlexandre Courbot /// Shift applied to the sysmem address before it is written into
336554ad65SAlexandre Courbot /// `NV_PFB_NISO_FLUSH_SYSMEM_ADDR_HI`,
346554ad65SAlexandre Courbot const FLUSH_SYSMEM_ADDR_SHIFT_HI: u32 = 40;
356554ad65SAlexandre Courbot
366554ad65SAlexandre Courbot impl FbHal for Ga100 {
read_sysmem_flush_page(&self, bar: &Bar0) -> u64376554ad65SAlexandre Courbot fn read_sysmem_flush_page(&self, bar: &Bar0) -> u64 {
386554ad65SAlexandre Courbot read_sysmem_flush_page_ga100(bar)
396554ad65SAlexandre Courbot }
406554ad65SAlexandre Courbot
write_sysmem_flush_page(&self, bar: &Bar0, addr: u64) -> Result416554ad65SAlexandre Courbot fn write_sysmem_flush_page(&self, bar: &Bar0, addr: u64) -> Result {
426554ad65SAlexandre Courbot write_sysmem_flush_page_ga100(bar, addr);
436554ad65SAlexandre Courbot
446554ad65SAlexandre Courbot Ok(())
456554ad65SAlexandre Courbot }
4680213934SAlexandre Courbot
supports_display(&self, bar: &Bar0) -> bool4780213934SAlexandre Courbot fn supports_display(&self, bar: &Bar0) -> bool {
4880213934SAlexandre Courbot display_enabled_ga100(bar)
4980213934SAlexandre Courbot }
5080213934SAlexandre Courbot
vidmem_size(&self, bar: &Bar0) -> u645180213934SAlexandre Courbot fn vidmem_size(&self, bar: &Bar0) -> u64 {
5280213934SAlexandre Courbot super::tu102::vidmem_size_gp102(bar)
5380213934SAlexandre Courbot }
546554ad65SAlexandre Courbot }
556554ad65SAlexandre Courbot
566554ad65SAlexandre Courbot const GA100: Ga100 = Ga100;
576554ad65SAlexandre Courbot pub(super) const GA100_HAL: &dyn FbHal = &GA100;
58