kernel/pci/
id.rs

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