[PATCH v5 03/11] drm: nova: Add GPU architecture enum to nova-drm UAPI
Alistair Popple <[email protected]>
| Newsgroups | dev.linux.lists.nova-gpu,org.freedesktop.lists.dri-devel,org.kernel.vger.linux-kernel,org.kernel.vger.rust-for-linux |
|---|---|
| Message-ID | <[email protected]> |
The GPU architecture to be exposed to user-space. This adds a public enum to the userspace headers for each chip architecture. Nova-core can then use this enum to define its architectures. This does create a coupling between nova-drm and nova-core whereby nova-core depends on the values defined by the user-space API for nova-drm. However this is entirely appropriate as nova-core must be bound by the UAPI headers as the enum values are read by nova-core and passed through to user-space. It also requires a minor change to the bounded_enum! macro to match the architecture values in an expression context. Signed-off-by: Alistair Popple <[email protected]> --- Changes since v4: - Rewritten for v5 as exposing chip-id was dropped. Changes since v3: - New for v4, split out from "drm: nova: Add GETPARAM parameter to read the GPU chipset" --- drivers/gpu/nova-core/gpu.rs | 28 +++++++++++++++++----------- drivers/gpu/nova-core/num.rs | 2 +- include/uapi/drm/nova_drm.h | 12 ++++++++++++ 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index 9e4232645a7e..0c12ef145981 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -10,7 +10,8 @@ num::Bounded, pci, prelude::*, - sizes::SizeConstants, // + sizes::SizeConstants, + uapi, // }; use crate::{ @@ -36,8 +37,9 @@ mod regs; macro_rules! define_chipset { - ({ $($variant:ident = $value:expr),* $(,)* }) => + ({ $($variant:ident = $value:literal),* $(,)* }) => { + ::kernel::macros::paste!( /// Enum representation of the GPU chipset. #[derive(fmt::Debug, Copy, Clone, PartialOrd, Ord, PartialEq, Eq)] pub(crate) enum Chipset { @@ -49,7 +51,6 @@ impl Chipset { $( Chipset::$variant, )* ]; - ::kernel::macros::paste!( /// Returns the name of this chipset, in lowercase. /// /// # Examples @@ -65,7 +66,6 @@ pub(crate) const fn name(&self) -> &'static str { )* } } - ); } // TODO[FPRI]: replace with something like derive(FromPrimitive) @@ -74,11 +74,14 @@ impl TryFrom<u32> for Chipset { fn try_from(value: u32) -> Result<Self, Self::Error> { match value { - $( $value => Ok(Chipset::$variant), )* + $( + $value => Ok(Chipset::$variant), + )* _ => Err(ENODEV), } } } + ); } } @@ -158,13 +161,16 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { bounded_enum! { /// Enum representation of the GPU generation. #[derive(fmt::Debug, Copy, Clone)] + #[repr(u32)] pub(crate) enum Architecture with TryFrom<Bounded<u32, 6>> { - Turing = 0x16, - Ampere = 0x17, - Hopper = 0x18, - Ada = 0x19, - BlackwellGB10x = 0x1a, - BlackwellGB20x = 0x1b, + Turing = uapi::drm_nova_architecture_NOVA_DRM_ARCHITECTURE_TURING, + Ampere = uapi::drm_nova_architecture_NOVA_DRM_ARCHITECTURE_AMPERE, + Hopper = uapi::drm_nova_architecture_NOVA_DRM_ARCHITECTURE_HOPPER, + Ada = uapi::drm_nova_architecture_NOVA_DRM_ARCHITECTURE_ADA, + BlackwellGB10x = + uapi::drm_nova_architecture_NOVA_DRM_ARCHITECTURE_BLACKWELL_GB10X, + BlackwellGB20x = + uapi::drm_nova_architecture_NOVA_DRM_ARCHITECTURE_BLACKWELL_GB20X, } } diff --git a/drivers/gpu/nova-core/num.rs b/drivers/gpu/nova-core/num.rs index 6eb174d136ab..f4169235bc24 100644 --- a/drivers/gpu/nova-core/num.rs +++ b/drivers/gpu/nova-core/num.rs @@ -263,7 +263,7 @@ fn try_from( ) -> kernel::error::Result<Self> { match value.get() { $( - $value => Ok($enum_type::$variant), + value if value == $value => Ok($enum_type::$variant), )* _ => Err(kernel::error::code::EINVAL), } diff --git a/include/uapi/drm/nova_drm.h b/include/uapi/drm/nova_drm.h index 3ca90ed9d2bb..f0dcbca1908d 100644 --- a/include/uapi/drm/nova_drm.h +++ b/include/uapi/drm/nova_drm.h @@ -25,6 +25,18 @@ extern "C" { */ #define NOVA_GETPARAM_VRAM_BAR_SIZE 0x1 +/** + * enum drm_nova_architecture - GPU architecture identifier + */ +enum drm_nova_architecture { + NOVA_DRM_ARCHITECTURE_TURING = 0x16, + NOVA_DRM_ARCHITECTURE_AMPERE = 0x17, + NOVA_DRM_ARCHITECTURE_HOPPER = 0x18, + NOVA_DRM_ARCHITECTURE_ADA = 0x19, + NOVA_DRM_ARCHITECTURE_BLACKWELL_GB10X = 0x1a, + NOVA_DRM_ARCHITECTURE_BLACKWELL_GB20X = 0x1b, +}; + /** * struct drm_nova_getparam - query GPU and driver metadata */ -- 2.54.0