Add a new method to create PCI DeviceIds that match both a specific vendor and PCI class. This is more targeted than the existing from_class() method as it filters on both vendor and class criteria. Cc: Danilo Krummrich <dakr@xxxxxxxxxx> Cc: Alexandre Courbot <acourbot@xxxxxxxxxx> Cc: Elle Rhumsaa <elle@xxxxxxxxxxxxxxxxxxx> Signed-off-by: John Hubbard <jhubbard@xxxxxxxxxx> --- rust/kernel/pci.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/rust/kernel/pci.rs b/rust/kernel/pci.rs index d4675b7d4a86..504593c882c9 100644 --- a/rust/kernel/pci.rs +++ b/rust/kernel/pci.rs @@ -161,6 +161,27 @@ pub const fn from_class(class: u32, class_mask: u32) -> Self { override_only: 0, }) } + + /// Create a new `pci::DeviceId` from a class number, mask, and specific vendor. + /// + /// This is more targeted than [`DeviceId::from_class`]: in addition to matching by Vendor, it + /// also matches the PCI Class (up to the entire 24 bits, depending on the mask). + pub const fn from_class_and_vendor( + class: Class, + class_mask: ClassMask, + vendor: Vendor, + ) -> Self { + Self(bindings::pci_device_id { + vendor: vendor.as_raw(), + device: DeviceId::PCI_ANY_ID, + subvendor: DeviceId::PCI_ANY_ID, + subdevice: DeviceId::PCI_ANY_ID, + class: class.as_raw(), + class_mask: class_mask.as_raw(), + driver_data: 0, + override_only: 0, + }) + } } // SAFETY: `DeviceId` is a `#[repr(transparent)]` wrapper of `pci_device_id` and does not add -- 2.50.1