xref: /linux/drivers/gpu/nova-core/fb/hal/tu102.rs (revision 220994d61cebfc04f071d69049127657c7e8191b)
16554ad65SAlexandre Courbot // SPDX-License-Identifier: GPL-2.0
26554ad65SAlexandre Courbot 
36554ad65SAlexandre Courbot use crate::driver::Bar0;
46554ad65SAlexandre Courbot use crate::fb::hal::FbHal;
56554ad65SAlexandre Courbot use crate::regs;
66554ad65SAlexandre Courbot use kernel::prelude::*;
76554ad65SAlexandre Courbot 
86554ad65SAlexandre Courbot /// Shift applied to the sysmem address before it is written into `NV_PFB_NISO_FLUSH_SYSMEM_ADDR`,
96554ad65SAlexandre Courbot /// to be used by HALs.
106554ad65SAlexandre Courbot pub(super) const FLUSH_SYSMEM_ADDR_SHIFT: u32 = 8;
116554ad65SAlexandre Courbot 
read_sysmem_flush_page_gm107(bar: &Bar0) -> u64126554ad65SAlexandre Courbot pub(super) fn read_sysmem_flush_page_gm107(bar: &Bar0) -> u64 {
13*43ad65ecSDanilo Krummrich     u64::from(regs::NV_PFB_NISO_FLUSH_SYSMEM_ADDR::read(bar).adr_39_08()) << FLUSH_SYSMEM_ADDR_SHIFT
146554ad65SAlexandre Courbot }
156554ad65SAlexandre Courbot 
write_sysmem_flush_page_gm107(bar: &Bar0, addr: u64) -> Result166554ad65SAlexandre Courbot pub(super) fn write_sysmem_flush_page_gm107(bar: &Bar0, addr: u64) -> Result {
176554ad65SAlexandre Courbot     // Check that the address doesn't overflow the receiving 32-bit register.
186554ad65SAlexandre Courbot     if addr >> (u32::BITS + FLUSH_SYSMEM_ADDR_SHIFT) == 0 {
196554ad65SAlexandre Courbot         regs::NV_PFB_NISO_FLUSH_SYSMEM_ADDR::default()
206554ad65SAlexandre Courbot             .set_adr_39_08((addr >> FLUSH_SYSMEM_ADDR_SHIFT) as u32)
216554ad65SAlexandre Courbot             .write(bar);
226554ad65SAlexandre Courbot 
236554ad65SAlexandre Courbot         Ok(())
246554ad65SAlexandre Courbot     } else {
256554ad65SAlexandre Courbot         Err(EINVAL)
266554ad65SAlexandre Courbot     }
276554ad65SAlexandre Courbot }
286554ad65SAlexandre Courbot 
display_enabled_gm107(bar: &Bar0) -> bool2980213934SAlexandre Courbot pub(super) fn display_enabled_gm107(bar: &Bar0) -> bool {
3080213934SAlexandre Courbot     !regs::gm107::NV_FUSE_STATUS_OPT_DISPLAY::read(bar).display_disabled()
3180213934SAlexandre Courbot }
3280213934SAlexandre Courbot 
vidmem_size_gp102(bar: &Bar0) -> u643380213934SAlexandre Courbot pub(super) fn vidmem_size_gp102(bar: &Bar0) -> u64 {
3480213934SAlexandre Courbot     regs::NV_PFB_PRI_MMU_LOCAL_MEMORY_RANGE::read(bar).usable_fb_size()
3580213934SAlexandre Courbot }
3680213934SAlexandre Courbot 
376554ad65SAlexandre Courbot struct Tu102;
386554ad65SAlexandre Courbot 
396554ad65SAlexandre Courbot impl FbHal for Tu102 {
read_sysmem_flush_page(&self, bar: &Bar0) -> u64406554ad65SAlexandre Courbot     fn read_sysmem_flush_page(&self, bar: &Bar0) -> u64 {
416554ad65SAlexandre Courbot         read_sysmem_flush_page_gm107(bar)
426554ad65SAlexandre Courbot     }
436554ad65SAlexandre Courbot 
write_sysmem_flush_page(&self, bar: &Bar0, addr: u64) -> Result446554ad65SAlexandre Courbot     fn write_sysmem_flush_page(&self, bar: &Bar0, addr: u64) -> Result {
456554ad65SAlexandre Courbot         write_sysmem_flush_page_gm107(bar, addr)
466554ad65SAlexandre Courbot     }
4780213934SAlexandre Courbot 
supports_display(&self, bar: &Bar0) -> bool4880213934SAlexandre Courbot     fn supports_display(&self, bar: &Bar0) -> bool {
4980213934SAlexandre Courbot         display_enabled_gm107(bar)
5080213934SAlexandre Courbot     }
5180213934SAlexandre Courbot 
vidmem_size(&self, bar: &Bar0) -> u645280213934SAlexandre Courbot     fn vidmem_size(&self, bar: &Bar0) -> u64 {
5380213934SAlexandre Courbot         vidmem_size_gp102(bar)
5480213934SAlexandre Courbot     }
556554ad65SAlexandre Courbot }
566554ad65SAlexandre Courbot 
576554ad65SAlexandre Courbot const TU102: Tu102 = Tu102;
586554ad65SAlexandre Courbot pub(super) const TU102_HAL: &dyn FbHal = &TU102;
59