[PATCH v6 1/5] rust: pci: provide access to PCI Class and Class-related items

John Hubbard jhubbard at nvidia.com
Tue Aug 26 02:22:56 UTC 2025


On 8/25/25 5:17 AM, Alexandre Courbot wrote:
>> +        /// Convert a raw 24-bit class code value to a `Class`.
>> +        impl From<u32> for Class {
>> +            fn from(value: u32) -> Self {
>> +                match value {
>> +                    $(x if x == Self::$variant.0 => Self::$variant,)+
>> +                    _ => Self::UNKNOWN,
>> +                }
>> +            }
> 
> Should we normalize `value` to 24 bits (i.e. call `to_24bit_class`)
> before doing the match? The constants we compare against are all
> normalized, but if we pass a 16-bit class to this method the result will
> be `UNKNOWN`, unless I missed something.
> 
> Being able to store a class as either a 16-bit or 24-bit representation
> in the same type also opens the door to bugs, which we can avoid if we
> always normalize to 24-bit and make the class/subclass representation
> accessible through a convenience method only.

It's constrained by the PCI ID patterns, and should only be used in
order to get values from the C bindings, actually.

> 
>> +        }
>> +    };
>> +}
>> +
>> +/// Once constructed, a `Class` contains a valid PCI Class code.
>> +impl Class {
>> +    /// Create a new Class from a raw 24-bit class code.
>> +    pub fn new(class_code: u32) -> Self {
>> +        Self::from(class_code)
>> +    }
> 
> Do we need a `new` method when the `From` implementation does exactly
> the same thing and has the same signature?
> 

Looks like I'll remove the From, and only provide new, based on the other
thread.

thanks,
-- 
John Hubbard



More information about the Nouveau mailing list