xref: /linux/drivers/gpu/nova-core/fb/hal/tu102.rs (revision 69f5cd67ce41ba128d3df18137c7a93a1faa84da)
1 // SPDX-License-Identifier: GPL-2.0
2 
3 use crate::driver::Bar0;
4 use crate::fb::hal::FbHal;
5 use crate::regs;
6 use kernel::prelude::*;
7 
8 /// Shift applied to the sysmem address before it is written into `NV_PFB_NISO_FLUSH_SYSMEM_ADDR`,
9 /// to be used by HALs.
10 pub(super) const FLUSH_SYSMEM_ADDR_SHIFT: u32 = 8;
11 
12 pub(super) fn read_sysmem_flush_page_gm107(bar: &Bar0) -> u64 {
13     (regs::NV_PFB_NISO_FLUSH_SYSMEM_ADDR::read(bar).adr_39_08() as u64) << FLUSH_SYSMEM_ADDR_SHIFT
14 }
15 
16 pub(super) fn write_sysmem_flush_page_gm107(bar: &Bar0, addr: u64) -> Result {
17     // Check that the address doesn't overflow the receiving 32-bit register.
18     if addr >> (u32::BITS + FLUSH_SYSMEM_ADDR_SHIFT) == 0 {
19         regs::NV_PFB_NISO_FLUSH_SYSMEM_ADDR::default()
20             .set_adr_39_08((addr >> FLUSH_SYSMEM_ADDR_SHIFT) as u32)
21             .write(bar);
22 
23         Ok(())
24     } else {
25         Err(EINVAL)
26     }
27 }
28 
29 struct Tu102;
30 
31 impl FbHal for Tu102 {
32     fn read_sysmem_flush_page(&self, bar: &Bar0) -> u64 {
33         read_sysmem_flush_page_gm107(bar)
34     }
35 
36     fn write_sysmem_flush_page(&self, bar: &Bar0, addr: u64) -> Result {
37         write_sysmem_flush_page_gm107(bar, addr)
38     }
39 }
40 
41 const TU102: Tu102 = Tu102;
42 pub(super) const TU102_HAL: &dyn FbHal = &TU102;
43