| // 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 | |
| } | |
| } |