| // SPDX-License-Identifier: GPL-2.0 |
| |
| use crate::driver::Bar0; |
| |
| // TODO |
| // |
| // Create register definitions via generic macros. See task "Generic register |
| // abstraction" in Documentation/gpu/nova/core/todo.rst. |
| |
| const BOOT0_OFFSET: usize = 0x00000000; |
| |
| // 3:0 - chipset minor revision |
| const BOOT0_MINOR_REV_SHIFT: u8 = 0; |
| const BOOT0_MINOR_REV_MASK: u32 = 0x0000000f; |
| |
| // 7:4 - chipset major revision |
| const BOOT0_MAJOR_REV_SHIFT: u8 = 4; |
| const BOOT0_MAJOR_REV_MASK: u32 = 0x000000f0; |
| |
| // 23:20 - chipset implementation Identifier (depends on architecture) |
| const BOOT0_IMPL_SHIFT: u8 = 20; |
| const BOOT0_IMPL_MASK: u32 = 0x00f00000; |
| |
| // 28:24 - chipset architecture identifier |
| const BOOT0_ARCH_MASK: u32 = 0x1f000000; |
| |
| // 28:20 - chipset identifier (virtual register field combining BOOT0_IMPL and |
| // BOOT0_ARCH) |
| const BOOT0_CHIPSET_SHIFT: u8 = BOOT0_IMPL_SHIFT; |
| const BOOT0_CHIPSET_MASK: u32 = BOOT0_IMPL_MASK | BOOT0_ARCH_MASK; |
| |
| #[derive(Copy, Clone)] |
| pub(crate) struct Boot0(u32); |
| |
| impl Boot0 { |
| #[inline] |
| pub(crate) fn read(bar: &Bar0) -> Self { |
| Self(bar.read32(BOOT0_OFFSET)) |
| } |
| |
| #[inline] |
| pub(crate) fn chipset(&self) -> u32 { |
| (self.0 & BOOT0_CHIPSET_MASK) >> BOOT0_CHIPSET_SHIFT |
| } |
| |
| #[inline] |
| pub(crate) fn minor_rev(&self) -> u8 { |
| ((self.0 & BOOT0_MINOR_REV_MASK) >> BOOT0_MINOR_REV_SHIFT) as u8 |
| } |
| |
| #[inline] |
| pub(crate) fn major_rev(&self) -> u8 { |
| ((self.0 & BOOT0_MAJOR_REV_MASK) >> BOOT0_MAJOR_REV_SHIFT) as u8 |
| } |
| } |