xref: /linux/rust/kernel/pci/id.rs (revision 416f99c3b16f582a3fc6d64a1f77f39d94b76de5)
1 // SPDX-License-Identifier: GPL-2.0
2 
3 //! PCI device identifiers and related types.
4 //!
5 //! This module contains PCI class codes, Vendor IDs, and supporting types.
6 
7 use crate::{
8     bindings,
9     fmt,
10     prelude::*, //
11 };
12 
13 /// PCI device class codes.
14 ///
15 /// Each entry contains the full 24-bit PCI class code (base class in bits
16 /// 23-16, subclass in bits 15-8, programming interface in bits 7-0).
17 ///
18 /// # Examples
19 ///
20 /// ```
21 /// # use kernel::{device::Core, pci::{self, Class}, prelude::*};
22 /// fn probe_device(pdev: &pci::Device<Core>) -> Result {
23 ///     let pci_class = pdev.pci_class();
24 ///     dev_info!(
25 ///         pdev.as_ref(),
26 ///         "Detected PCI class: {}\n",
27 ///         pci_class
28 ///     );
29 ///     Ok(())
30 /// }
31 /// ```
32 #[derive(Clone, Copy, PartialEq, Eq)]
33 #[repr(transparent)]
34 pub struct Class(u32);
35 
36 /// PCI class mask constants for matching [`Class`] codes.
37 #[repr(u32)]
38 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
39 pub enum ClassMask {
40     /// Match the full 24-bit class code.
41     Full = 0xffffff,
42     /// Match the upper 16 bits of the class code (base class and subclass only)
43     ClassSubclass = 0xffff00,
44 }
45 
46 macro_rules! define_all_pci_classes {
47     (
48         $($variant:ident = $binding:expr,)+
49     ) => {
50         impl Class {
51             $(
52                 #[allow(missing_docs)]
53                 pub const $variant: Self = Self(Self::to_24bit_class($binding));
54             )+
55         }
56 
57         impl fmt::Display for Class {
58             fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
59                 match self {
60                     $(
61                         &Self::$variant => write!(f, stringify!($variant)),
62                     )+
63                     _ => <Self as fmt::Debug>::fmt(self, f),
64                 }
65             }
66         }
67     };
68 }
69 
70 /// Once constructed, a [`Class`] contains a valid PCI class code.
71 impl Class {
72     /// Create a [`Class`] from a raw 24-bit class code.
73     #[inline]
from_raw(class_code: u32) -> Self74     pub(super) fn from_raw(class_code: u32) -> Self {
75         Self(class_code)
76     }
77 
78     /// Get the raw 24-bit class code value.
79     #[inline]
as_raw(self) -> u3280     pub const fn as_raw(self) -> u32 {
81         self.0
82     }
83 
84     // Converts a PCI class constant to 24-bit format.
85     //
86     // Many device drivers use only the upper 16 bits (base class and subclass),
87     // but some use the full 24 bits. In order to support both cases, store the
88     // class code as a 24-bit value, where 16-bit values are shifted up 8 bits.
to_24bit_class(val: u32) -> u3289     const fn to_24bit_class(val: u32) -> u32 {
90         if val > 0xFFFF {
91             val
92         } else {
93             val << 8
94         }
95     }
96 }
97 
98 impl fmt::Debug for Class {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result99     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
100         write!(f, "0x{:06x}", self.0)
101     }
102 }
103 
104 impl ClassMask {
105     /// Get the raw mask value.
106     #[inline]
as_raw(self) -> u32107     pub const fn as_raw(self) -> u32 {
108         self as u32
109     }
110 }
111 
112 impl TryFrom<u32> for ClassMask {
113     type Error = Error;
114 
try_from(value: u32) -> Result<Self, Self::Error>115     fn try_from(value: u32) -> Result<Self, Self::Error> {
116         match value {
117             0xffffff => Ok(ClassMask::Full),
118             0xffff00 => Ok(ClassMask::ClassSubclass),
119             _ => Err(EINVAL),
120         }
121     }
122 }
123 
124 /// PCI vendor IDs.
125 ///
126 /// Each entry contains the 16-bit PCI vendor ID as assigned by the PCI SIG.
127 #[derive(Clone, Copy, PartialEq, Eq)]
128 #[repr(transparent)]
129 pub struct Vendor(u16);
130 
131 macro_rules! define_all_pci_vendors {
132     (
133         $($variant:ident = $binding:expr,)+
134     ) => {
135         impl Vendor {
136             $(
137                 #[allow(missing_docs)]
138                 pub const $variant: Self = Self($binding as u16);
139             )+
140         }
141 
142         impl fmt::Display for Vendor {
143             fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
144                 match self {
145                     $(
146                         &Self::$variant => write!(f, stringify!($variant)),
147                     )+
148                     _ => <Self as fmt::Debug>::fmt(self, f),
149                 }
150             }
151         }
152     };
153 }
154 
155 /// Once constructed, a `Vendor` contains a valid PCI Vendor ID.
156 impl Vendor {
157     /// Create a Vendor from a raw 16-bit vendor ID.
158     #[inline]
from_raw(vendor_id: u16) -> Self159     pub(super) fn from_raw(vendor_id: u16) -> Self {
160         Self(vendor_id)
161     }
162 
163     /// Get the raw 16-bit vendor ID value.
164     #[inline]
as_raw(self) -> u16165     pub const fn as_raw(self) -> u16 {
166         self.0
167     }
168 }
169 
170 impl fmt::Debug for Vendor {
171     #[inline]
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result172     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
173         write!(f, "0x{:04x}", self.0)
174     }
175 }
176 
177 define_all_pci_classes! {
178     NOT_DEFINED                = bindings::PCI_CLASS_NOT_DEFINED,                // 0x000000
179     NOT_DEFINED_VGA            = bindings::PCI_CLASS_NOT_DEFINED_VGA,            // 0x000100
180 
181     STORAGE_SCSI               = bindings::PCI_CLASS_STORAGE_SCSI,               // 0x010000
182     STORAGE_IDE                = bindings::PCI_CLASS_STORAGE_IDE,                // 0x010100
183     STORAGE_FLOPPY             = bindings::PCI_CLASS_STORAGE_FLOPPY,             // 0x010200
184     STORAGE_IPI                = bindings::PCI_CLASS_STORAGE_IPI,                // 0x010300
185     STORAGE_RAID               = bindings::PCI_CLASS_STORAGE_RAID,               // 0x010400
186     STORAGE_SATA               = bindings::PCI_CLASS_STORAGE_SATA,               // 0x010600
187     STORAGE_SATA_AHCI          = bindings::PCI_CLASS_STORAGE_SATA_AHCI,          // 0x010601
188     STORAGE_SAS                = bindings::PCI_CLASS_STORAGE_SAS,                // 0x010700
189     STORAGE_EXPRESS            = bindings::PCI_CLASS_STORAGE_EXPRESS,            // 0x010802
190     STORAGE_OTHER              = bindings::PCI_CLASS_STORAGE_OTHER,              // 0x018000
191 
192     NETWORK_ETHERNET           = bindings::PCI_CLASS_NETWORK_ETHERNET,           // 0x020000
193     NETWORK_TOKEN_RING         = bindings::PCI_CLASS_NETWORK_TOKEN_RING,         // 0x020100
194     NETWORK_FDDI               = bindings::PCI_CLASS_NETWORK_FDDI,               // 0x020200
195     NETWORK_ATM                = bindings::PCI_CLASS_NETWORK_ATM,                // 0x020300
196     NETWORK_OTHER              = bindings::PCI_CLASS_NETWORK_OTHER,              // 0x028000
197 
198     DISPLAY_VGA                = bindings::PCI_CLASS_DISPLAY_VGA,                // 0x030000
199     DISPLAY_XGA                = bindings::PCI_CLASS_DISPLAY_XGA,                // 0x030100
200     DISPLAY_3D                 = bindings::PCI_CLASS_DISPLAY_3D,                 // 0x030200
201     DISPLAY_OTHER              = bindings::PCI_CLASS_DISPLAY_OTHER,              // 0x038000
202 
203     MULTIMEDIA_VIDEO           = bindings::PCI_CLASS_MULTIMEDIA_VIDEO,           // 0x040000
204     MULTIMEDIA_AUDIO           = bindings::PCI_CLASS_MULTIMEDIA_AUDIO,           // 0x040100
205     MULTIMEDIA_PHONE           = bindings::PCI_CLASS_MULTIMEDIA_PHONE,           // 0x040200
206     MULTIMEDIA_HD_AUDIO        = bindings::PCI_CLASS_MULTIMEDIA_HD_AUDIO,        // 0x040300
207     MULTIMEDIA_OTHER           = bindings::PCI_CLASS_MULTIMEDIA_OTHER,           // 0x048000
208 
209     MEMORY_RAM                 = bindings::PCI_CLASS_MEMORY_RAM,                 // 0x050000
210     MEMORY_FLASH               = bindings::PCI_CLASS_MEMORY_FLASH,               // 0x050100
211     MEMORY_CXL                 = bindings::PCI_CLASS_MEMORY_CXL,                 // 0x050200
212     MEMORY_OTHER               = bindings::PCI_CLASS_MEMORY_OTHER,               // 0x058000
213 
214     BRIDGE_HOST                = bindings::PCI_CLASS_BRIDGE_HOST,                // 0x060000
215     BRIDGE_ISA                 = bindings::PCI_CLASS_BRIDGE_ISA,                 // 0x060100
216     BRIDGE_EISA                = bindings::PCI_CLASS_BRIDGE_EISA,                // 0x060200
217     BRIDGE_MC                  = bindings::PCI_CLASS_BRIDGE_MC,                  // 0x060300
218     BRIDGE_PCI_NORMAL          = bindings::PCI_CLASS_BRIDGE_PCI_NORMAL,          // 0x060400
219     BRIDGE_PCI_SUBTRACTIVE     = bindings::PCI_CLASS_BRIDGE_PCI_SUBTRACTIVE,     // 0x060401
220     BRIDGE_PCMCIA              = bindings::PCI_CLASS_BRIDGE_PCMCIA,              // 0x060500
221     BRIDGE_NUBUS               = bindings::PCI_CLASS_BRIDGE_NUBUS,               // 0x060600
222     BRIDGE_CARDBUS             = bindings::PCI_CLASS_BRIDGE_CARDBUS,             // 0x060700
223     BRIDGE_RACEWAY             = bindings::PCI_CLASS_BRIDGE_RACEWAY,             // 0x060800
224     BRIDGE_OTHER               = bindings::PCI_CLASS_BRIDGE_OTHER,               // 0x068000
225 
226     COMMUNICATION_SERIAL       = bindings::PCI_CLASS_COMMUNICATION_SERIAL,       // 0x070000
227     COMMUNICATION_PARALLEL     = bindings::PCI_CLASS_COMMUNICATION_PARALLEL,     // 0x070100
228     COMMUNICATION_MULTISERIAL  = bindings::PCI_CLASS_COMMUNICATION_MULTISERIAL,  // 0x070200
229     COMMUNICATION_MODEM        = bindings::PCI_CLASS_COMMUNICATION_MODEM,        // 0x070300
230     COMMUNICATION_OTHER        = bindings::PCI_CLASS_COMMUNICATION_OTHER,        // 0x078000
231 
232     SYSTEM_PIC                 = bindings::PCI_CLASS_SYSTEM_PIC,                 // 0x080000
233     SYSTEM_PIC_IOAPIC          = bindings::PCI_CLASS_SYSTEM_PIC_IOAPIC,          // 0x080010
234     SYSTEM_PIC_IOXAPIC         = bindings::PCI_CLASS_SYSTEM_PIC_IOXAPIC,         // 0x080020
235     SYSTEM_DMA                 = bindings::PCI_CLASS_SYSTEM_DMA,                 // 0x080100
236     SYSTEM_TIMER               = bindings::PCI_CLASS_SYSTEM_TIMER,               // 0x080200
237     SYSTEM_RTC                 = bindings::PCI_CLASS_SYSTEM_RTC,                 // 0x080300
238     SYSTEM_PCI_HOTPLUG         = bindings::PCI_CLASS_SYSTEM_PCI_HOTPLUG,         // 0x080400
239     SYSTEM_SDHCI               = bindings::PCI_CLASS_SYSTEM_SDHCI,               // 0x080500
240     SYSTEM_RCEC                = bindings::PCI_CLASS_SYSTEM_RCEC,                // 0x080700
241     SYSTEM_OTHER               = bindings::PCI_CLASS_SYSTEM_OTHER,               // 0x088000
242 
243     INPUT_KEYBOARD             = bindings::PCI_CLASS_INPUT_KEYBOARD,             // 0x090000
244     INPUT_PEN                  = bindings::PCI_CLASS_INPUT_PEN,                  // 0x090100
245     INPUT_MOUSE                = bindings::PCI_CLASS_INPUT_MOUSE,                // 0x090200
246     INPUT_SCANNER              = bindings::PCI_CLASS_INPUT_SCANNER,              // 0x090300
247     INPUT_GAMEPORT             = bindings::PCI_CLASS_INPUT_GAMEPORT,             // 0x090400
248     INPUT_OTHER                = bindings::PCI_CLASS_INPUT_OTHER,                // 0x098000
249 
250     DOCKING_GENERIC            = bindings::PCI_CLASS_DOCKING_GENERIC,            // 0x0a0000
251     DOCKING_OTHER              = bindings::PCI_CLASS_DOCKING_OTHER,              // 0x0a8000
252 
253     PROCESSOR_386              = bindings::PCI_CLASS_PROCESSOR_386,              // 0x0b0000
254     PROCESSOR_486              = bindings::PCI_CLASS_PROCESSOR_486,              // 0x0b0100
255     PROCESSOR_PENTIUM          = bindings::PCI_CLASS_PROCESSOR_PENTIUM,          // 0x0b0200
256     PROCESSOR_ALPHA            = bindings::PCI_CLASS_PROCESSOR_ALPHA,            // 0x0b1000
257     PROCESSOR_POWERPC          = bindings::PCI_CLASS_PROCESSOR_POWERPC,          // 0x0b2000
258     PROCESSOR_MIPS             = bindings::PCI_CLASS_PROCESSOR_MIPS,             // 0x0b3000
259     PROCESSOR_CO               = bindings::PCI_CLASS_PROCESSOR_CO,               // 0x0b4000
260 
261     SERIAL_FIREWIRE            = bindings::PCI_CLASS_SERIAL_FIREWIRE,            // 0x0c0000
262     SERIAL_FIREWIRE_OHCI       = bindings::PCI_CLASS_SERIAL_FIREWIRE_OHCI,       // 0x0c0010
263     SERIAL_ACCESS              = bindings::PCI_CLASS_SERIAL_ACCESS,              // 0x0c0100
264     SERIAL_SSA                 = bindings::PCI_CLASS_SERIAL_SSA,                 // 0x0c0200
265     SERIAL_USB_UHCI            = bindings::PCI_CLASS_SERIAL_USB_UHCI,            // 0x0c0300
266     SERIAL_USB_OHCI            = bindings::PCI_CLASS_SERIAL_USB_OHCI,            // 0x0c0310
267     SERIAL_USB_EHCI            = bindings::PCI_CLASS_SERIAL_USB_EHCI,            // 0x0c0320
268     SERIAL_USB_XHCI            = bindings::PCI_CLASS_SERIAL_USB_XHCI,            // 0x0c0330
269     SERIAL_USB_CDNS            = bindings::PCI_CLASS_SERIAL_USB_CDNS,            // 0x0c0380
270     SERIAL_USB_DEVICE          = bindings::PCI_CLASS_SERIAL_USB_DEVICE,          // 0x0c03fe
271     SERIAL_FIBER               = bindings::PCI_CLASS_SERIAL_FIBER,               // 0x0c0400
272     SERIAL_SMBUS               = bindings::PCI_CLASS_SERIAL_SMBUS,               // 0x0c0500
273     SERIAL_IPMI_SMIC           = bindings::PCI_CLASS_SERIAL_IPMI_SMIC,           // 0x0c0700
274     SERIAL_IPMI_KCS            = bindings::PCI_CLASS_SERIAL_IPMI_KCS,            // 0x0c0701
275     SERIAL_IPMI_BT             = bindings::PCI_CLASS_SERIAL_IPMI_BT,             // 0x0c0702
276 
277     WIRELESS_RF_CONTROLLER     = bindings::PCI_CLASS_WIRELESS_RF_CONTROLLER,     // 0x0d1000
278     WIRELESS_WHCI              = bindings::PCI_CLASS_WIRELESS_WHCI,              // 0x0d1010
279 
280     INTELLIGENT_I2O            = bindings::PCI_CLASS_INTELLIGENT_I2O,            // 0x0e0000
281 
282     SATELLITE_TV               = bindings::PCI_CLASS_SATELLITE_TV,               // 0x0f0000
283     SATELLITE_AUDIO            = bindings::PCI_CLASS_SATELLITE_AUDIO,            // 0x0f0100
284     SATELLITE_VOICE            = bindings::PCI_CLASS_SATELLITE_VOICE,            // 0x0f0300
285     SATELLITE_DATA             = bindings::PCI_CLASS_SATELLITE_DATA,             // 0x0f0400
286 
287     CRYPT_NETWORK              = bindings::PCI_CLASS_CRYPT_NETWORK,              // 0x100000
288     CRYPT_ENTERTAINMENT        = bindings::PCI_CLASS_CRYPT_ENTERTAINMENT,        // 0x100100
289     CRYPT_OTHER                = bindings::PCI_CLASS_CRYPT_OTHER,                // 0x108000
290 
291     SP_DPIO                    = bindings::PCI_CLASS_SP_DPIO,                    // 0x110000
292     SP_OTHER                   = bindings::PCI_CLASS_SP_OTHER,                   // 0x118000
293 
294     ACCELERATOR_PROCESSING     = bindings::PCI_CLASS_ACCELERATOR_PROCESSING,     // 0x120000
295 
296     OTHERS                     = bindings::PCI_CLASS_OTHERS,                     // 0xff0000
297 }
298 
299 define_all_pci_vendors! {
300     PCI_SIG                  = bindings::PCI_VENDOR_ID_PCI_SIG,                  // 0x0001
301     LOONGSON                 = bindings::PCI_VENDOR_ID_LOONGSON,                 // 0x0014
302     SOLIDIGM                 = bindings::PCI_VENDOR_ID_SOLIDIGM,                 // 0x025e
303     TTTECH                   = bindings::PCI_VENDOR_ID_TTTECH,                   // 0x0357
304     DYNALINK                 = bindings::PCI_VENDOR_ID_DYNALINK,                 // 0x0675
305     UBIQUITI                 = bindings::PCI_VENDOR_ID_UBIQUITI,                 // 0x0777
306     BERKOM                   = bindings::PCI_VENDOR_ID_BERKOM,                   // 0x0871
307     ITTIM                    = bindings::PCI_VENDOR_ID_ITTIM,                    // 0x0b48
308     COMPAQ                   = bindings::PCI_VENDOR_ID_COMPAQ,                   // 0x0e11
309     LSI_LOGIC                = bindings::PCI_VENDOR_ID_LSI_LOGIC,                // 0x1000
310     ATI                      = bindings::PCI_VENDOR_ID_ATI,                      // 0x1002
311     VLSI                     = bindings::PCI_VENDOR_ID_VLSI,                     // 0x1004
312     ADL                      = bindings::PCI_VENDOR_ID_ADL,                      // 0x1005
313     NS                       = bindings::PCI_VENDOR_ID_NS,                       // 0x100b
314     TSENG                    = bindings::PCI_VENDOR_ID_TSENG,                    // 0x100c
315     WEITEK                   = bindings::PCI_VENDOR_ID_WEITEK,                   // 0x100e
316     DEC                      = bindings::PCI_VENDOR_ID_DEC,                      // 0x1011
317     CIRRUS                   = bindings::PCI_VENDOR_ID_CIRRUS,                   // 0x1013
318     IBM                      = bindings::PCI_VENDOR_ID_IBM,                      // 0x1014
319     UNISYS                   = bindings::PCI_VENDOR_ID_UNISYS,                   // 0x1018
320     COMPEX2                  = bindings::PCI_VENDOR_ID_COMPEX2,                  // 0x101a
321     WD                       = bindings::PCI_VENDOR_ID_WD,                       // 0x101c
322     AMI                      = bindings::PCI_VENDOR_ID_AMI,                      // 0x101e
323     AMD                      = bindings::PCI_VENDOR_ID_AMD,                      // 0x1022
324     TRIDENT                  = bindings::PCI_VENDOR_ID_TRIDENT,                  // 0x1023
325     AI                       = bindings::PCI_VENDOR_ID_AI,                       // 0x1025
326     DELL                     = bindings::PCI_VENDOR_ID_DELL,                     // 0x1028
327     MATROX                   = bindings::PCI_VENDOR_ID_MATROX,                   // 0x102B
328     MOBILITY_ELECTRONICS     = bindings::PCI_VENDOR_ID_MOBILITY_ELECTRONICS,     // 0x14f2
329     CT                       = bindings::PCI_VENDOR_ID_CT,                       // 0x102c
330     MIRO                     = bindings::PCI_VENDOR_ID_MIRO,                     // 0x1031
331     NEC                      = bindings::PCI_VENDOR_ID_NEC,                      // 0x1033
332     FD                       = bindings::PCI_VENDOR_ID_FD,                       // 0x1036
333     SI                       = bindings::PCI_VENDOR_ID_SI,                       // 0x1039
334     HP                       = bindings::PCI_VENDOR_ID_HP,                       // 0x103c
335     HP_3PAR                  = bindings::PCI_VENDOR_ID_HP_3PAR,                  // 0x1590
336     PCTECH                   = bindings::PCI_VENDOR_ID_PCTECH,                   // 0x1042
337     ASUSTEK                  = bindings::PCI_VENDOR_ID_ASUSTEK,                  // 0x1043
338     DPT                      = bindings::PCI_VENDOR_ID_DPT,                      // 0x1044
339     OPTI                     = bindings::PCI_VENDOR_ID_OPTI,                     // 0x1045
340     ELSA                     = bindings::PCI_VENDOR_ID_ELSA,                     // 0x1048
341     STMICRO                  = bindings::PCI_VENDOR_ID_STMICRO,                  // 0x104A
342     BUSLOGIC                 = bindings::PCI_VENDOR_ID_BUSLOGIC,                 // 0x104B
343     TI                       = bindings::PCI_VENDOR_ID_TI,                       // 0x104c
344     SONY                     = bindings::PCI_VENDOR_ID_SONY,                     // 0x104d
345     WINBOND2                 = bindings::PCI_VENDOR_ID_WINBOND2,                 // 0x1050
346     ANIGMA                   = bindings::PCI_VENDOR_ID_ANIGMA,                   // 0x1051
347     EFAR                     = bindings::PCI_VENDOR_ID_EFAR,                     // 0x1055
348     MOTOROLA                 = bindings::PCI_VENDOR_ID_MOTOROLA,                 // 0x1057
349     PROMISE                  = bindings::PCI_VENDOR_ID_PROMISE,                  // 0x105a
350     FOXCONN                  = bindings::PCI_VENDOR_ID_FOXCONN,                  // 0x105b
351     UMC                      = bindings::PCI_VENDOR_ID_UMC,                      // 0x1060
352     PICOPOWER                = bindings::PCI_VENDOR_ID_PICOPOWER,                // 0x1066
353     MYLEX                    = bindings::PCI_VENDOR_ID_MYLEX,                    // 0x1069
354     APPLE                    = bindings::PCI_VENDOR_ID_APPLE,                    // 0x106b
355     YAMAHA                   = bindings::PCI_VENDOR_ID_YAMAHA,                   // 0x1073
356     QLOGIC                   = bindings::PCI_VENDOR_ID_QLOGIC,                   // 0x1077
357     CYRIX                    = bindings::PCI_VENDOR_ID_CYRIX,                    // 0x1078
358     CONTAQ                   = bindings::PCI_VENDOR_ID_CONTAQ,                   // 0x1080
359     OLICOM                   = bindings::PCI_VENDOR_ID_OLICOM,                   // 0x108d
360     SUN                      = bindings::PCI_VENDOR_ID_SUN,                      // 0x108e
361     NI                       = bindings::PCI_VENDOR_ID_NI,                       // 0x1093
362     CMD                      = bindings::PCI_VENDOR_ID_CMD,                      // 0x1095
363     BROOKTREE                = bindings::PCI_VENDOR_ID_BROOKTREE,                // 0x109e
364     SGI                      = bindings::PCI_VENDOR_ID_SGI,                      // 0x10a9
365     WINBOND                  = bindings::PCI_VENDOR_ID_WINBOND,                  // 0x10ad
366     PLX                      = bindings::PCI_VENDOR_ID_PLX,                      // 0x10b5
367     MADGE                    = bindings::PCI_VENDOR_ID_MADGE,                    // 0x10b6
368     THREECOM                 = bindings::PCI_VENDOR_ID_3COM,                     // 0x10b7
369     AL                       = bindings::PCI_VENDOR_ID_AL,                       // 0x10b9
370     NEOMAGIC                 = bindings::PCI_VENDOR_ID_NEOMAGIC,                 // 0x10c8
371     TCONRAD                  = bindings::PCI_VENDOR_ID_TCONRAD,                  // 0x10da
372     ROHM                     = bindings::PCI_VENDOR_ID_ROHM,                     // 0x10db
373     NVIDIA                   = bindings::PCI_VENDOR_ID_NVIDIA,                   // 0x10de
374     IMS                      = bindings::PCI_VENDOR_ID_IMS,                      // 0x10e0
375     AMCC                     = bindings::PCI_VENDOR_ID_AMCC,                     // 0x10e8
376     AMPERE                   = bindings::PCI_VENDOR_ID_AMPERE,                   // 0x1def
377     INTERG                   = bindings::PCI_VENDOR_ID_INTERG,                   // 0x10ea
378     REALTEK                  = bindings::PCI_VENDOR_ID_REALTEK,                  // 0x10ec
379     XILINX                   = bindings::PCI_VENDOR_ID_XILINX,                   // 0x10ee
380     INIT                     = bindings::PCI_VENDOR_ID_INIT,                     // 0x1101
381     CREATIVE                 = bindings::PCI_VENDOR_ID_CREATIVE,                 // 0x1102
382     TTI                      = bindings::PCI_VENDOR_ID_TTI,                      // 0x1103
383     SIGMA                    = bindings::PCI_VENDOR_ID_SIGMA,                    // 0x1105
384     VIA                      = bindings::PCI_VENDOR_ID_VIA,                      // 0x1106
385     SIEMENS                  = bindings::PCI_VENDOR_ID_SIEMENS,                  // 0x110A
386     VORTEX                   = bindings::PCI_VENDOR_ID_VORTEX,                   // 0x1119
387     EF                       = bindings::PCI_VENDOR_ID_EF,                       // 0x111a
388     IDT                      = bindings::PCI_VENDOR_ID_IDT,                      // 0x111d
389     FORE                     = bindings::PCI_VENDOR_ID_FORE,                     // 0x1127
390     PHILIPS                  = bindings::PCI_VENDOR_ID_PHILIPS,                  // 0x1131
391     EICON                    = bindings::PCI_VENDOR_ID_EICON,                    // 0x1133
392     CISCO                    = bindings::PCI_VENDOR_ID_CISCO,                    // 0x1137
393     ZIATECH                  = bindings::PCI_VENDOR_ID_ZIATECH,                  // 0x1138
394     SYSKONNECT               = bindings::PCI_VENDOR_ID_SYSKONNECT,               // 0x1148
395     DIGI                     = bindings::PCI_VENDOR_ID_DIGI,                     // 0x114f
396     XIRCOM                   = bindings::PCI_VENDOR_ID_XIRCOM,                   // 0x115d
397     SERVERWORKS              = bindings::PCI_VENDOR_ID_SERVERWORKS,              // 0x1166
398     ALTERA                   = bindings::PCI_VENDOR_ID_ALTERA,                   // 0x1172
399     SBE                      = bindings::PCI_VENDOR_ID_SBE,                      // 0x1176
400     TOSHIBA                  = bindings::PCI_VENDOR_ID_TOSHIBA,                  // 0x1179
401     TOSHIBA_2                = bindings::PCI_VENDOR_ID_TOSHIBA_2,                // 0x102f
402     ATTO                     = bindings::PCI_VENDOR_ID_ATTO,                     // 0x117c
403     RICOH                    = bindings::PCI_VENDOR_ID_RICOH,                    // 0x1180
404     DLINK                    = bindings::PCI_VENDOR_ID_DLINK,                    // 0x1186
405     ARTOP                    = bindings::PCI_VENDOR_ID_ARTOP,                    // 0x1191
406     ZEITNET                  = bindings::PCI_VENDOR_ID_ZEITNET,                  // 0x1193
407     FUJITSU_ME               = bindings::PCI_VENDOR_ID_FUJITSU_ME,               // 0x119e
408     MARVELL                  = bindings::PCI_VENDOR_ID_MARVELL,                  // 0x11ab
409     MARVELL_EXT              = bindings::PCI_VENDOR_ID_MARVELL_EXT,              // 0x1b4b
410     V3                       = bindings::PCI_VENDOR_ID_V3,                       // 0x11b0
411     ATT                      = bindings::PCI_VENDOR_ID_ATT,                      // 0x11c1
412     SPECIALIX                = bindings::PCI_VENDOR_ID_SPECIALIX,                // 0x11cb
413     ANALOG_DEVICES           = bindings::PCI_VENDOR_ID_ANALOG_DEVICES,           // 0x11d4
414     ZORAN                    = bindings::PCI_VENDOR_ID_ZORAN,                    // 0x11de
415     COMPEX                   = bindings::PCI_VENDOR_ID_COMPEX,                   // 0x11f6
416     MICROSEMI                = bindings::PCI_VENDOR_ID_MICROSEMI,                // 0x11f8
417     RP                       = bindings::PCI_VENDOR_ID_RP,                       // 0x11fe
418     CYCLADES                 = bindings::PCI_VENDOR_ID_CYCLADES,                 // 0x120e
419     ESSENTIAL                = bindings::PCI_VENDOR_ID_ESSENTIAL,                // 0x120f
420     O2                       = bindings::PCI_VENDOR_ID_O2,                       // 0x1217
421     THREEDX                  = bindings::PCI_VENDOR_ID_3DFX,                     // 0x121a
422     AVM                      = bindings::PCI_VENDOR_ID_AVM,                      // 0x1244
423     STALLION                 = bindings::PCI_VENDOR_ID_STALLION,                 // 0x124d
424     AT                       = bindings::PCI_VENDOR_ID_AT,                       // 0x1259
425     ASIX                     = bindings::PCI_VENDOR_ID_ASIX,                     // 0x125b
426     ESS                      = bindings::PCI_VENDOR_ID_ESS,                      // 0x125d
427     SATSAGEM                 = bindings::PCI_VENDOR_ID_SATSAGEM,                 // 0x1267
428     ENSONIQ                  = bindings::PCI_VENDOR_ID_ENSONIQ,                  // 0x1274
429     TRANSMETA                = bindings::PCI_VENDOR_ID_TRANSMETA,                // 0x1279
430     ROCKWELL                 = bindings::PCI_VENDOR_ID_ROCKWELL,                 // 0x127A
431     ITE                      = bindings::PCI_VENDOR_ID_ITE,                      // 0x1283
432     ALTEON                   = bindings::PCI_VENDOR_ID_ALTEON,                   // 0x12ae
433     NVIDIA_SGS               = bindings::PCI_VENDOR_ID_NVIDIA_SGS,               // 0x12d2
434     PERICOM                  = bindings::PCI_VENDOR_ID_PERICOM,                  // 0x12D8
435     AUREAL                   = bindings::PCI_VENDOR_ID_AUREAL,                   // 0x12eb
436     ELECTRONICDESIGNGMBH     = bindings::PCI_VENDOR_ID_ELECTRONICDESIGNGMBH,     // 0x12f8
437     ESDGMBH                  = bindings::PCI_VENDOR_ID_ESDGMBH,                  // 0x12fe
438     CB                       = bindings::PCI_VENDOR_ID_CB,                       // 0x1307
439     SIIG                     = bindings::PCI_VENDOR_ID_SIIG,                     // 0x131f
440     RADISYS                  = bindings::PCI_VENDOR_ID_RADISYS,                  // 0x1331
441     MICRO_MEMORY             = bindings::PCI_VENDOR_ID_MICRO_MEMORY,             // 0x1332
442     DOMEX                    = bindings::PCI_VENDOR_ID_DOMEX,                    // 0x134a
443     INTASHIELD               = bindings::PCI_VENDOR_ID_INTASHIELD,               // 0x135a
444     QUATECH                  = bindings::PCI_VENDOR_ID_QUATECH,                  // 0x135C
445     SEALEVEL                 = bindings::PCI_VENDOR_ID_SEALEVEL,                 // 0x135e
446     HYPERCOPE                = bindings::PCI_VENDOR_ID_HYPERCOPE,                // 0x1365
447     DIGIGRAM                 = bindings::PCI_VENDOR_ID_DIGIGRAM,                 // 0x1369
448     KAWASAKI                 = bindings::PCI_VENDOR_ID_KAWASAKI,                 // 0x136b
449     CNET                     = bindings::PCI_VENDOR_ID_CNET,                     // 0x1371
450     LMC                      = bindings::PCI_VENDOR_ID_LMC,                      // 0x1376
451     NETGEAR                  = bindings::PCI_VENDOR_ID_NETGEAR,                  // 0x1385
452     APPLICOM                 = bindings::PCI_VENDOR_ID_APPLICOM,                 // 0x1389
453     MOXA                     = bindings::PCI_VENDOR_ID_MOXA,                     // 0x1393
454     CCD                      = bindings::PCI_VENDOR_ID_CCD,                      // 0x1397
455     EXAR                     = bindings::PCI_VENDOR_ID_EXAR,                     // 0x13a8
456     MICROGATE                = bindings::PCI_VENDOR_ID_MICROGATE,                // 0x13c0
457     THREEWARE                = bindings::PCI_VENDOR_ID_3WARE,                    // 0x13C1
458     IOMEGA                   = bindings::PCI_VENDOR_ID_IOMEGA,                   // 0x13ca
459     ABOCOM                   = bindings::PCI_VENDOR_ID_ABOCOM,                   // 0x13D1
460     SUNDANCE                 = bindings::PCI_VENDOR_ID_SUNDANCE,                 // 0x13f0
461     CMEDIA                   = bindings::PCI_VENDOR_ID_CMEDIA,                   // 0x13f6
462     ADVANTECH                = bindings::PCI_VENDOR_ID_ADVANTECH,                // 0x13fe
463     MEILHAUS                 = bindings::PCI_VENDOR_ID_MEILHAUS,                 // 0x1402
464     LAVA                     = bindings::PCI_VENDOR_ID_LAVA,                     // 0x1407
465     TIMEDIA                  = bindings::PCI_VENDOR_ID_TIMEDIA,                  // 0x1409
466     ICE                      = bindings::PCI_VENDOR_ID_ICE,                      // 0x1412
467     MICROSOFT                = bindings::PCI_VENDOR_ID_MICROSOFT,                // 0x1414
468     OXSEMI                   = bindings::PCI_VENDOR_ID_OXSEMI,                   // 0x1415
469     CHELSIO                  = bindings::PCI_VENDOR_ID_CHELSIO,                  // 0x1425
470     EDIMAX                   = bindings::PCI_VENDOR_ID_EDIMAX,                   // 0x1432
471     ADLINK                   = bindings::PCI_VENDOR_ID_ADLINK,                   // 0x144a
472     SAMSUNG                  = bindings::PCI_VENDOR_ID_SAMSUNG,                  // 0x144d
473     GIGABYTE                 = bindings::PCI_VENDOR_ID_GIGABYTE,                 // 0x1458
474     AMBIT                    = bindings::PCI_VENDOR_ID_AMBIT,                    // 0x1468
475     MYRICOM                  = bindings::PCI_VENDOR_ID_MYRICOM,                  // 0x14c1
476     MEDIATEK                 = bindings::PCI_VENDOR_ID_MEDIATEK,                 // 0x14c3
477     TITAN                    = bindings::PCI_VENDOR_ID_TITAN,                    // 0x14D2
478     PANACOM                  = bindings::PCI_VENDOR_ID_PANACOM,                  // 0x14d4
479     SIPACKETS                = bindings::PCI_VENDOR_ID_SIPACKETS,                // 0x14d9
480     AFAVLAB                  = bindings::PCI_VENDOR_ID_AFAVLAB,                  // 0x14db
481     AMPLICON                 = bindings::PCI_VENDOR_ID_AMPLICON,                 // 0x14dc
482     BCM_GVC                  = bindings::PCI_VENDOR_ID_BCM_GVC,                  // 0x14a4
483     BROADCOM                 = bindings::PCI_VENDOR_ID_BROADCOM,                 // 0x14e4
484     TOPIC                    = bindings::PCI_VENDOR_ID_TOPIC,                    // 0x151f
485     MAINPINE                 = bindings::PCI_VENDOR_ID_MAINPINE,                 // 0x1522
486     ENE                      = bindings::PCI_VENDOR_ID_ENE,                      // 0x1524
487     SYBA                     = bindings::PCI_VENDOR_ID_SYBA,                     // 0x1592
488     MORETON                  = bindings::PCI_VENDOR_ID_MORETON,                  // 0x15aa
489     VMWARE                   = bindings::PCI_VENDOR_ID_VMWARE,                   // 0x15ad
490     ZOLTRIX                  = bindings::PCI_VENDOR_ID_ZOLTRIX,                  // 0x15b0
491     MELLANOX                 = bindings::PCI_VENDOR_ID_MELLANOX,                 // 0x15b3
492     DFI                      = bindings::PCI_VENDOR_ID_DFI,                      // 0x15bd
493     QUICKNET                 = bindings::PCI_VENDOR_ID_QUICKNET,                 // 0x15e2
494     ADDIDATA                 = bindings::PCI_VENDOR_ID_ADDIDATA,                 // 0x15B8
495     PDC                      = bindings::PCI_VENDOR_ID_PDC,                      // 0x15e9
496     FARSITE                  = bindings::PCI_VENDOR_ID_FARSITE,                  // 0x1619
497     ARIMA                    = bindings::PCI_VENDOR_ID_ARIMA,                    // 0x161f
498     BROCADE                  = bindings::PCI_VENDOR_ID_BROCADE,                  // 0x1657
499     SIBYTE                   = bindings::PCI_VENDOR_ID_SIBYTE,                   // 0x166d
500     ATHEROS                  = bindings::PCI_VENDOR_ID_ATHEROS,                  // 0x168c
501     NETCELL                  = bindings::PCI_VENDOR_ID_NETCELL,                  // 0x169c
502     CENATEK                  = bindings::PCI_VENDOR_ID_CENATEK,                  // 0x16CA
503     SYNOPSYS                 = bindings::PCI_VENDOR_ID_SYNOPSYS,                 // 0x16c3
504     USR                      = bindings::PCI_VENDOR_ID_USR,                      // 0x16ec
505     VITESSE                  = bindings::PCI_VENDOR_ID_VITESSE,                  // 0x1725
506     LINKSYS                  = bindings::PCI_VENDOR_ID_LINKSYS,                  // 0x1737
507     ALTIMA                   = bindings::PCI_VENDOR_ID_ALTIMA,                   // 0x173b
508     CAVIUM                   = bindings::PCI_VENDOR_ID_CAVIUM,                   // 0x177d
509     TECHWELL                 = bindings::PCI_VENDOR_ID_TECHWELL,                 // 0x1797
510     BELKIN                   = bindings::PCI_VENDOR_ID_BELKIN,                   // 0x1799
511     RDC                      = bindings::PCI_VENDOR_ID_RDC,                      // 0x17f3
512     GLI                      = bindings::PCI_VENDOR_ID_GLI,                      // 0x17a0
513     LENOVO                   = bindings::PCI_VENDOR_ID_LENOVO,                   // 0x17aa
514     QCOM                     = bindings::PCI_VENDOR_ID_QCOM,                     // 0x17cb
515     CDNS                     = bindings::PCI_VENDOR_ID_CDNS,                     // 0x17cd
516     ARECA                    = bindings::PCI_VENDOR_ID_ARECA,                    // 0x17d3
517     S2IO                     = bindings::PCI_VENDOR_ID_S2IO,                     // 0x17d5
518     SITECOM                  = bindings::PCI_VENDOR_ID_SITECOM,                  // 0x182d
519     TOPSPIN                  = bindings::PCI_VENDOR_ID_TOPSPIN,                  // 0x1867
520     COMMTECH                 = bindings::PCI_VENDOR_ID_COMMTECH,                 // 0x18f7
521     SILAN                    = bindings::PCI_VENDOR_ID_SILAN,                    // 0x1904
522     RENESAS                  = bindings::PCI_VENDOR_ID_RENESAS,                  // 0x1912
523     SOLARFLARE               = bindings::PCI_VENDOR_ID_SOLARFLARE,               // 0x1924
524     TDI                      = bindings::PCI_VENDOR_ID_TDI,                      // 0x192E
525     NXP                      = bindings::PCI_VENDOR_ID_NXP,                      // 0x1957
526     PASEMI                   = bindings::PCI_VENDOR_ID_PASEMI,                   // 0x1959
527     ATTANSIC                 = bindings::PCI_VENDOR_ID_ATTANSIC,                 // 0x1969
528     JMICRON                  = bindings::PCI_VENDOR_ID_JMICRON,                  // 0x197B
529     KORENIX                  = bindings::PCI_VENDOR_ID_KORENIX,                  // 0x1982
530     HUAWEI                   = bindings::PCI_VENDOR_ID_HUAWEI,                   // 0x19e5
531     NETRONOME                = bindings::PCI_VENDOR_ID_NETRONOME,                // 0x19ee
532     QMI                      = bindings::PCI_VENDOR_ID_QMI,                      // 0x1a32
533     AZWAVE                   = bindings::PCI_VENDOR_ID_AZWAVE,                   // 0x1a3b
534     REDHAT_QUMRANET          = bindings::PCI_VENDOR_ID_REDHAT_QUMRANET,          // 0x1af4
535     ASMEDIA                  = bindings::PCI_VENDOR_ID_ASMEDIA,                  // 0x1b21
536     REDHAT                   = bindings::PCI_VENDOR_ID_REDHAT,                   // 0x1b36
537     WCHIC                    = bindings::PCI_VENDOR_ID_WCHIC,                    // 0x1c00
538     SILICOM_DENMARK          = bindings::PCI_VENDOR_ID_SILICOM_DENMARK,          // 0x1c2c
539     AMAZON_ANNAPURNA_LABS    = bindings::PCI_VENDOR_ID_AMAZON_ANNAPURNA_LABS,    // 0x1c36
540     CIRCUITCO                = bindings::PCI_VENDOR_ID_CIRCUITCO,                // 0x1cc8
541     AMAZON                   = bindings::PCI_VENDOR_ID_AMAZON,                   // 0x1d0f
542     ZHAOXIN                  = bindings::PCI_VENDOR_ID_ZHAOXIN,                  // 0x1d17
543     ROCKCHIP                 = bindings::PCI_VENDOR_ID_ROCKCHIP,                 // 0x1d87
544     HYGON                    = bindings::PCI_VENDOR_ID_HYGON,                    // 0x1d94
545     META                     = bindings::PCI_VENDOR_ID_META,                     // 0x1d9b
546     FUNGIBLE                 = bindings::PCI_VENDOR_ID_FUNGIBLE,                 // 0x1dad
547     HXT                      = bindings::PCI_VENDOR_ID_HXT,                      // 0x1dbf
548     TEKRAM                   = bindings::PCI_VENDOR_ID_TEKRAM,                   // 0x1de1
549     RPI                      = bindings::PCI_VENDOR_ID_RPI,                      // 0x1de4
550     ALIBABA                  = bindings::PCI_VENDOR_ID_ALIBABA,                  // 0x1ded
551     CXL                      = bindings::PCI_VENDOR_ID_CXL,                      // 0x1e98
552     TEHUTI                   = bindings::PCI_VENDOR_ID_TEHUTI,                   // 0x1fc9
553     SUNIX                    = bindings::PCI_VENDOR_ID_SUNIX,                    // 0x1fd4
554     HINT                     = bindings::PCI_VENDOR_ID_HINT,                     // 0x3388
555     THREEDLABS               = bindings::PCI_VENDOR_ID_3DLABS,                   // 0x3d3d
556     NETXEN                   = bindings::PCI_VENDOR_ID_NETXEN,                   // 0x4040
557     AKS                      = bindings::PCI_VENDOR_ID_AKS,                      // 0x416c
558     WCHCN                    = bindings::PCI_VENDOR_ID_WCHCN,                    // 0x4348
559     ACCESSIO                 = bindings::PCI_VENDOR_ID_ACCESSIO,                 // 0x494f
560     S3                       = bindings::PCI_VENDOR_ID_S3,                       // 0x5333
561     DUNORD                   = bindings::PCI_VENDOR_ID_DUNORD,                   // 0x5544
562     DCI                      = bindings::PCI_VENDOR_ID_DCI,                      // 0x6666
563     GLENFLY                  = bindings::PCI_VENDOR_ID_GLENFLY,                  // 0x6766
564     INTEL                    = bindings::PCI_VENDOR_ID_INTEL,                    // 0x8086
565     WANGXUN                  = bindings::PCI_VENDOR_ID_WANGXUN,                  // 0x8088
566     SCALEMP                  = bindings::PCI_VENDOR_ID_SCALEMP,                  // 0x8686
567     COMPUTONE                = bindings::PCI_VENDOR_ID_COMPUTONE,                // 0x8e0e
568     KTI                      = bindings::PCI_VENDOR_ID_KTI,                      // 0x8e2e
569     ADAPTEC                  = bindings::PCI_VENDOR_ID_ADAPTEC,                  // 0x9004
570     ADAPTEC2                 = bindings::PCI_VENDOR_ID_ADAPTEC2,                 // 0x9005
571     HOLTEK                   = bindings::PCI_VENDOR_ID_HOLTEK,                   // 0x9412
572     NETMOS                   = bindings::PCI_VENDOR_ID_NETMOS,                   // 0x9710
573     THREECOM_2               = bindings::PCI_VENDOR_ID_3COM_2,                   // 0xa727
574     SOLIDRUN                 = bindings::PCI_VENDOR_ID_SOLIDRUN,                 // 0xd063
575     DIGIUM                   = bindings::PCI_VENDOR_ID_DIGIUM,                   // 0xd161
576     TIGERJET                 = bindings::PCI_VENDOR_ID_TIGERJET,                 // 0xe159
577     XILINX_RME               = bindings::PCI_VENDOR_ID_XILINX_RME,               // 0xea60
578     XEN                      = bindings::PCI_VENDOR_ID_XEN,                      // 0x5853
579     OCZ                      = bindings::PCI_VENDOR_ID_OCZ,                      // 0x1b85
580     NCUBE                    = bindings::PCI_VENDOR_ID_NCUBE,                    // 0x10ff
581 }
582