1) Decouple Revision from boot0. 2) Enhance Revision, which in turn simplifies Spec::new().
3) Also, slightly enhance the comment about Spec, to be more precise. Cc: Alexandre Courbot <[email protected]> Cc: Danilo Krummrich <[email protected]> Cc: Timur Tabi <[email protected]> Signed-off-by: John Hubbard <[email protected]> --- drivers/gpu/nova-core/gpu.rs | 25 ++++++++++++------------- drivers/gpu/nova-core/regs.rs | 11 ++++++++++- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index 7fd9e91771a6..acf564fee9c8 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -143,17 +143,8 @@ fn try_from(value: u8) -> Result<Self> { } pub(crate) struct Revision { - major: u8, - minor: u8, -} - -impl Revision { - fn from_boot0(boot0: regs::NV_PMC_BOOT_0) -> Self { - Self { - major: boot0.major_revision(), - minor: boot0.minor_revision(), - } - } + pub(crate) major: u8, + pub(crate) minor: u8, } impl fmt::Display for Revision { @@ -162,7 +153,7 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { } } -/// Structure holding the metadata of the GPU. +/// Structure holding a basic description of the GPU: Architecture, Chipset and Revision. pub(crate) struct Spec { chipset: Chipset, /// The revision of the chipset. @@ -173,9 +164,17 @@ impl Spec { fn new(bar: &Bar0) -> Result<Spec> { let boot0 = regs::NV_PMC_BOOT_0::read(bar); + Spec::try_from(boot0) + } +} + +impl TryFrom<regs::NV_PMC_BOOT_0> for Spec { + type Error = Error; + + fn try_from(boot0: regs::NV_PMC_BOOT_0) -> Result<Self> { Ok(Self { chipset: boot0.chipset()?, - revision: Revision::from_boot0(boot0), + revision: boot0.revision(), }) } } diff --git a/drivers/gpu/nova-core/regs.rs b/drivers/gpu/nova-core/regs.rs index 934003cab8a8..8c9af3c59708 100644 --- a/drivers/gpu/nova-core/regs.rs +++ b/drivers/gpu/nova-core/regs.rs @@ -24,7 +24,8 @@ }, gpu::{ Architecture, - Chipset, // + Chipset, + Revision, // }, num::FromSafeCast, }; @@ -56,6 +57,14 @@ pub(crate) fn chipset(self) -> Result<Chipset> { }) .and_then(Chipset::try_from) } + + /// Returns the revision information of the chip. + pub(crate) fn revision(self) -> Revision { + Revision { + major: self.major_revision(), + minor: self.minor_revision(), + } + } } // PBUS -- 2.51.2
