| File: | obj-scan-build/../linux/src/drivers/pci/pci.c |
| Location: | line 955, column 12 |
| Description: | Null pointer argument in call to string length function |
| 1 | /* | |||
| 2 | * drivers/pci/pci.c | |||
| 3 | * | |||
| 4 | * PCI services that are built on top of the BIOS32 service. | |||
| 5 | * | |||
| 6 | * Copyright 1993, 1994, 1995 Drew Eckhardt, Frederic Potter, | |||
| 7 | * David Mosberger-Tang | |||
| 8 | * | |||
| 9 | * Apr 12, 1998 : Fixed handling of alien header types. [mj] | |||
| 10 | */ | |||
| 11 | ||||
| 12 | #include <linux/config.h> | |||
| 13 | #include <linux/ptrace.h> | |||
| 14 | #include <linux/types.h> | |||
| 15 | #include <linux/kernel.h> | |||
| 16 | #include <linux/bios32.h> | |||
| 17 | #include <linux/pci.h> | |||
| 18 | #include <linux/string.h> | |||
| 19 | ||||
| 20 | #include <asm/page.h> | |||
| 21 | ||||
| 22 | struct pci_bus pci_root; | |||
| 23 | struct pci_dev *pci_devices = 0; | |||
| 24 | ||||
| 25 | ||||
| 26 | /* | |||
| 27 | * The bridge_id field is an offset of an item into the array | |||
| 28 | * BRIDGE_MAPPING_TYPE. 0xff indicates that the device is not a PCI | |||
| 29 | * bridge, or that we don't know for the moment how to configure it. | |||
| 30 | * I'm trying to do my best so that the kernel stays small. Different | |||
| 31 | * chipset can have same optimization structure. i486 and pentium | |||
| 32 | * chipsets from the same manufacturer usually have the same | |||
| 33 | * structure. | |||
| 34 | */ | |||
| 35 | #define DEVICE(vid,did,name){PCI_VENDOR_ID_vid, PCI_DEVICE_ID_did, (name), 0xff} \ | |||
| 36 | {PCI_VENDOR_ID_##vid, PCI_DEVICE_ID_##did, (name), 0xff} | |||
| 37 | ||||
| 38 | #define BRIDGE(vid,did,name,bridge){PCI_VENDOR_ID_vid, PCI_DEVICE_ID_did, (name), (bridge)} \ | |||
| 39 | {PCI_VENDOR_ID_##vid, PCI_DEVICE_ID_##did, (name), (bridge)} | |||
| 40 | ||||
| 41 | /* | |||
| 42 | * Sorted in ascending order by vendor and device. | |||
| 43 | * Use binary search for lookup. If you add a device make sure | |||
| 44 | * it is sequential by both vendor and device id. | |||
| 45 | */ | |||
| 46 | struct pci_dev_info dev_info[] = { | |||
| 47 | DEVICE( COMPAQ, COMPAQ_1280, "QVision 1280/p"){0x0e11, 0x3033, ("QVision 1280/p"), 0xff}, | |||
| 48 | DEVICE( COMPAQ, COMPAQ_SMART2P, "Smart-2/P RAID Controller"){0x0e11, 0xae10, ("Smart-2/P RAID Controller"), 0xff}, | |||
| 49 | DEVICE( COMPAQ, COMPAQ_NETEL100,"Netelligent 10/100"){0x0e11, 0xae32, ("Netelligent 10/100"), 0xff}, | |||
| 50 | DEVICE( COMPAQ, COMPAQ_NETEL10, "Netelligent 10"){0x0e11, 0xae34, ("Netelligent 10"), 0xff}, | |||
| 51 | DEVICE( COMPAQ, COMPAQ_NETFLEX3I,"NetFlex 3"){0x0e11, 0xae35, ("NetFlex 3"), 0xff}, | |||
| 52 | DEVICE( COMPAQ, COMPAQ_NETEL100D,"Netelligent 10/100 Dual"){0x0e11, 0xae40, ("Netelligent 10/100 Dual"), 0xff}, | |||
| 53 | DEVICE( COMPAQ, COMPAQ_NETEL100PI,"Netelligent 10/100 ProLiant"){0x0e11, 0xae43, ("Netelligent 10/100 ProLiant"), 0xff}, | |||
| 54 | DEVICE( COMPAQ, COMPAQ_NETEL100I,"Netelligent 10/100 Integrated"){0x0e11, 0xb011, ("Netelligent 10/100 Integrated"), 0xff}, | |||
| 55 | DEVICE( COMPAQ, COMPAQ_THUNDER, "ThunderLAN"){0x0e11, 0xf130, ("ThunderLAN"), 0xff}, | |||
| 56 | DEVICE( COMPAQ, COMPAQ_NETFLEX3B,"NetFlex 3 BNC"){0x0e11, 0xf150, ("NetFlex 3 BNC"), 0xff}, | |||
| 57 | DEVICE( NCR, NCR_53C810, "53c810"){0x1000, 0x0001, ("53c810"), 0xff}, | |||
| 58 | DEVICE( NCR, NCR_53C820, "53c820"){0x1000, 0x0002, ("53c820"), 0xff}, | |||
| 59 | DEVICE( NCR, NCR_53C825, "53c825"){0x1000, 0x0003, ("53c825"), 0xff}, | |||
| 60 | DEVICE( NCR, NCR_53C815, "53c815"){0x1000, 0x0004, ("53c815"), 0xff}, | |||
| 61 | DEVICE( NCR, NCR_53C860, "53c860"){0x1000, 0x0006, ("53c860"), 0xff}, | |||
| 62 | DEVICE( NCR, NCR_53C896, "53c896"){0x1000, 0x000b, ("53c896"), 0xff}, | |||
| 63 | DEVICE( NCR, NCR_53C895, "53c895"){0x1000, 0x000c, ("53c895"), 0xff}, | |||
| 64 | DEVICE( NCR, NCR_53C885, "53c885"){0x1000, 0x000d, ("53c885"), 0xff}, | |||
| 65 | DEVICE( NCR, NCR_53C875, "53c875"){0x1000, 0x000f, ("53c875"), 0xff}, | |||
| 66 | DEVICE( NCR, NCR_53C875J, "53c875J"){0x1000, 0x008f, ("53c875J"), 0xff}, | |||
| 67 | DEVICE( ATI, ATI_68800, "68800AX"){0x1002, 0x4158, ("68800AX"), 0xff}, | |||
| 68 | DEVICE( ATI, ATI_215CT222, "215CT222"){0x1002, 0x4354, ("215CT222"), 0xff}, | |||
| 69 | DEVICE( ATI, ATI_210888CX, "210888CX"){0x1002, 0x4358, ("210888CX"), 0xff}, | |||
| 70 | DEVICE( ATI, ATI_215GB, "Mach64 GB"){0x1002, 0x4742, ("Mach64 GB"), 0xff}, | |||
| 71 | DEVICE( ATI, ATI_215GD, "Mach64 GD (Rage Pro)"){0x1002, 0x4744, ("Mach64 GD (Rage Pro)"), 0xff}, | |||
| 72 | DEVICE( ATI, ATI_215GI, "Mach64 GI (Rage Pro)"){0x1002, 0x4749, ("Mach64 GI (Rage Pro)"), 0xff}, | |||
| 73 | DEVICE( ATI, ATI_215GP, "Mach64 GP (Rage Pro)"){0x1002, 0x4750, ("Mach64 GP (Rage Pro)"), 0xff}, | |||
| 74 | DEVICE( ATI, ATI_215GQ, "Mach64 GQ (Rage Pro)"){0x1002, 0x4751, ("Mach64 GQ (Rage Pro)"), 0xff}, | |||
| 75 | DEVICE( ATI, ATI_215GT, "Mach64 GT (Rage II)"){0x1002, 0x4754, ("Mach64 GT (Rage II)"), 0xff}, | |||
| 76 | DEVICE( ATI, ATI_215GTB, "Mach64 GT (Rage II)"){0x1002, 0x4755, ("Mach64 GT (Rage II)"), 0xff}, | |||
| 77 | DEVICE( ATI, ATI_210888GX, "210888GX"){0x1002, 0x4758, ("210888GX"), 0xff}, | |||
| 78 | DEVICE( ATI, ATI_215LG, "Mach64 LG (3D Rage LT)"){0x1002, 0x4c47, ("Mach64 LG (3D Rage LT)"), 0xff}, | |||
| 79 | DEVICE( ATI, ATI_264LT, "Mach64 LT"){0x1002, 0x4c54, ("Mach64 LT"), 0xff}, | |||
| 80 | DEVICE( ATI, ATI_264VT, "Mach64 VT"){0x1002, 0x5654, ("Mach64 VT"), 0xff}, | |||
| 81 | DEVICE( VLSI, VLSI_82C592, "82C592-FC1"){0x1004, 0x0005, ("82C592-FC1"), 0xff}, | |||
| 82 | DEVICE( VLSI, VLSI_82C593, "82C593-FC1"){0x1004, 0x0006, ("82C593-FC1"), 0xff}, | |||
| 83 | DEVICE( VLSI, VLSI_82C594, "82C594-AFC2"){0x1004, 0x0007, ("82C594-AFC2"), 0xff}, | |||
| 84 | DEVICE( VLSI, VLSI_82C597, "82C597-AFC2"){0x1004, 0x0009, ("82C597-AFC2"), 0xff}, | |||
| 85 | DEVICE( VLSI, VLSI_82C541, "82C541 Lynx"){0x1004, 0x000c, ("82C541 Lynx"), 0xff}, | |||
| 86 | DEVICE( VLSI, VLSI_82C543, "82C543 Lynx ISA"){0x1004, 0x000d, ("82C543 Lynx ISA"), 0xff}, | |||
| 87 | DEVICE( VLSI, VLSI_82C532, "82C532"){0x1004, 0x0101, ("82C532"), 0xff}, | |||
| 88 | DEVICE( VLSI, VLSI_82C534, "82C534"){0x1004, 0x0102, ("82C534"), 0xff}, | |||
| 89 | DEVICE( VLSI, VLSI_82C535, "82C535"){0x1004, 0x0104, ("82C535"), 0xff}, | |||
| 90 | DEVICE( VLSI, VLSI_82C147, "82C147"){0x1004, 0x0105, ("82C147"), 0xff}, | |||
| 91 | DEVICE( VLSI, VLSI_VAS96011, "VAS96011 (Golden Gate II)"){0x1004, 0x0702, ("VAS96011 (Golden Gate II)"), 0xff}, | |||
| 92 | DEVICE( ADL, ADL_2301, "2301"){0x1005, 0x2301, ("2301"), 0xff}, | |||
| 93 | DEVICE( NS, NS_87415, "87415"){0x100b, 0x0002, ("87415"), 0xff}, | |||
| 94 | DEVICE( NS, NS_87410, "87410"){0x100b, 0xd001, ("87410"), 0xff}, | |||
| 95 | DEVICE( TSENG, TSENG_W32P_2, "ET4000W32P"){0x100c, 0x3202, ("ET4000W32P"), 0xff}, | |||
| 96 | DEVICE( TSENG, TSENG_W32P_b, "ET4000W32P rev B"){0x100c, 0x3205, ("ET4000W32P rev B"), 0xff}, | |||
| 97 | DEVICE( TSENG, TSENG_W32P_c, "ET4000W32P rev C"){0x100c, 0x3206, ("ET4000W32P rev C"), 0xff}, | |||
| 98 | DEVICE( TSENG, TSENG_W32P_d, "ET4000W32P rev D"){0x100c, 0x3207, ("ET4000W32P rev D"), 0xff}, | |||
| 99 | DEVICE( TSENG, TSENG_ET6000, "ET6000"){0x100c, 0x3208, ("ET6000"), 0xff}, | |||
| 100 | DEVICE( WEITEK, WEITEK_P9000, "P9000"){0x100e, 0x9001, ("P9000"), 0xff}, | |||
| 101 | DEVICE( WEITEK, WEITEK_P9100, "P9100"){0x100e, 0x9100, ("P9100"), 0xff}, | |||
| 102 | BRIDGE( DEC, DEC_BRD, "DC21050", 0x00){0x1011, 0x0001, ("DC21050"), (0x00)}, | |||
| 103 | DEVICE( DEC, DEC_TULIP, "DC21040"){0x1011, 0x0002, ("DC21040"), 0xff}, | |||
| 104 | DEVICE( DEC, DEC_TGA, "DC21030 (TGA)"){0x1011, 0x0004, ("DC21030 (TGA)"), 0xff}, | |||
| 105 | DEVICE( DEC, DEC_TULIP_FAST, "DC21140"){0x1011, 0x0009, ("DC21140"), 0xff}, | |||
| 106 | DEVICE( DEC, DEC_TGA2, "TGA2"){0x1011, 0x000D, ("TGA2"), 0xff}, | |||
| 107 | DEVICE( DEC, DEC_FDDI, "DEFPA"){0x1011, 0x000F, ("DEFPA"), 0xff}, | |||
| 108 | DEVICE( DEC, DEC_TULIP_PLUS, "DC21041"){0x1011, 0x0014, ("DC21041"), 0xff}, | |||
| 109 | DEVICE( DEC, DEC_21142, "DC21142"){0x1011, 0x0019, ("DC21142"), 0xff}, | |||
| 110 | DEVICE( DEC, DEC_21052, "DC21052"){0x1011, 0x0021, ("DC21052"), 0xff}, | |||
| 111 | DEVICE( DEC, DEC_21150, "DC21150"){0x1011, 0x0022, ("DC21150"), 0xff}, | |||
| 112 | DEVICE( DEC, DEC_21152, "DC21152"){0x1011, 0x0024, ("DC21152"), 0xff}, | |||
| 113 | DEVICE( CIRRUS, CIRRUS_7548, "GD 7548"){0x1013, 0x0038, ("GD 7548"), 0xff}, | |||
| 114 | DEVICE( CIRRUS, CIRRUS_5430, "GD 5430"){0x1013, 0x00a0, ("GD 5430"), 0xff}, | |||
| 115 | DEVICE( CIRRUS, CIRRUS_5434_4, "GD 5434"){0x1013, 0x00a4, ("GD 5434"), 0xff}, | |||
| 116 | DEVICE( CIRRUS, CIRRUS_5434_8, "GD 5434"){0x1013, 0x00a8, ("GD 5434"), 0xff}, | |||
| 117 | DEVICE( CIRRUS, CIRRUS_5436, "GD 5436"){0x1013, 0x00ac, ("GD 5436"), 0xff}, | |||
| 118 | DEVICE( CIRRUS, CIRRUS_5446, "GD 5446"){0x1013, 0x00b8, ("GD 5446"), 0xff}, | |||
| 119 | DEVICE( CIRRUS, CIRRUS_5480, "GD 5480"){0x1013, 0x00bc, ("GD 5480"), 0xff}, | |||
| 120 | DEVICE( CIRRUS, CIRRUS_5464, "GD 5464"){0x1013, 0x00d4, ("GD 5464"), 0xff}, | |||
| 121 | DEVICE( CIRRUS, CIRRUS_5465, "GD 5465"){0x1013, 0x00d6, ("GD 5465"), 0xff}, | |||
| 122 | DEVICE( CIRRUS, CIRRUS_6729, "CL 6729"){0x1013, 0x1100, ("CL 6729"), 0xff}, | |||
| 123 | DEVICE( CIRRUS, CIRRUS_6832, "PD 6832"){0x1013, 0x1110, ("PD 6832"), 0xff}, | |||
| 124 | DEVICE( CIRRUS, CIRRUS_7542, "CL 7542"){0x1013, 0x1200, ("CL 7542"), 0xff}, | |||
| 125 | DEVICE( CIRRUS, CIRRUS_7543, "CL 7543"){0x1013, 0x1202, ("CL 7543"), 0xff}, | |||
| 126 | DEVICE( CIRRUS, CIRRUS_7541, "CL 7541"){0x1013, 0x1204, ("CL 7541"), 0xff}, | |||
| 127 | DEVICE( IBM, IBM_FIRE_CORAL, "Fire Coral"){0x1014, 0x000a, ("Fire Coral"), 0xff}, | |||
| 128 | DEVICE( IBM, IBM_TR, "Token Ring"){0x1014, 0x0018, ("Token Ring"), 0xff}, | |||
| 129 | DEVICE( IBM, IBM_82G2675, "82G2675"){0x1014, 0x001d, ("82G2675"), 0xff}, | |||
| 130 | DEVICE( IBM, IBM_MCA, "MicroChannel"){0x1014, 0x0020, ("MicroChannel"), 0xff}, | |||
| 131 | DEVICE( IBM, IBM_82351, "82351"){0x1014, 0x0022, ("82351"), 0xff}, | |||
| 132 | DEVICE( IBM, IBM_SERVERAID, "ServeRAID"){0x1014, 0x002e, ("ServeRAID"), 0xff}, | |||
| 133 | DEVICE( IBM, IBM_TR_WAKE, "Wake On LAN Token Ring"){0x1014, 0x003e, ("Wake On LAN Token Ring"), 0xff}, | |||
| 134 | DEVICE( IBM, IBM_3780IDSP, "MWave DSP"){0x1014, 0x007d, ("MWave DSP"), 0xff}, | |||
| 135 | DEVICE( WD, WD_7197, "WD 7197"){0x101c, 0x3296, ("WD 7197"), 0xff}, | |||
| 136 | DEVICE( AMD, AMD_LANCE, "79C970"){0x1022, 0x2000, ("79C970"), 0xff}, | |||
| 137 | DEVICE( AMD, AMD_SCSI, "53C974"){0x1022, 0x2020, ("53C974"), 0xff}, | |||
| 138 | DEVICE( TRIDENT, TRIDENT_9397, "Cyber9397"){0x1023, 0x9397, ("Cyber9397"), 0xff}, | |||
| 139 | DEVICE( TRIDENT, TRIDENT_9420, "TG 9420"){0x1023, 0x9420, ("TG 9420"), 0xff}, | |||
| 140 | DEVICE( TRIDENT, TRIDENT_9440, "TG 9440"){0x1023, 0x9440, ("TG 9440"), 0xff}, | |||
| 141 | DEVICE( TRIDENT, TRIDENT_9660, "TG 9660 / Cyber9385"){0x1023, 0x9660, ("TG 9660 / Cyber9385"), 0xff}, | |||
| 142 | DEVICE( TRIDENT, TRIDENT_9750, "Image 975"){0x1023, 0x9750, ("Image 975"), 0xff}, | |||
| 143 | DEVICE( AI, AI_M1435, "M1435"){0x1025, 0x1435, ("M1435"), 0xff}, | |||
| 144 | DEVICE( MATROX, MATROX_MGA_2, "Atlas PX2085"){0x102B, 0x0518, ("Atlas PX2085"), 0xff}, | |||
| 145 | DEVICE( MATROX, MATROX_MIL, "Millennium"){0x102B, 0x0519, ("Millennium"), 0xff}, | |||
| 146 | DEVICE( MATROX, MATROX_MYS, "Mystique"){0x102B, 0x051A, ("Mystique"), 0xff}, | |||
| 147 | DEVICE( MATROX, MATROX_MIL_2, "Millennium II"){0x102B, 0x051b, ("Millennium II"), 0xff}, | |||
| 148 | DEVICE( MATROX, MATROX_MIL_2_AGP,"Millennium II AGP"){0x102B, 0x051f, ("Millennium II AGP"), 0xff}, | |||
| 149 | DEVICE( MATROX, MATROX_MGA_IMP, "MGA Impression"){0x102B, 0x0d10, ("MGA Impression"), 0xff}, | |||
| 150 | DEVICE( CT, CT_65545, "65545"){0x102c, 0x00d8, ("65545"), 0xff}, | |||
| 151 | DEVICE( CT, CT_65548, "65548"){0x102c, 0x00dc, ("65548"), 0xff}, | |||
| 152 | DEVICE( CT, CT_65550, "65550"){0x102c, 0x00e0, ("65550"), 0xff}, | |||
| 153 | DEVICE( CT, CT_65554, "65554"){0x102c, 0x00e4, ("65554"), 0xff}, | |||
| 154 | DEVICE( CT, CT_65555, "65555"){0x102c, 0x00e5, ("65555"), 0xff}, | |||
| 155 | DEVICE( MIRO, MIRO_36050, "ZR36050"){0x1031, 0x5601, ("ZR36050"), 0xff}, | |||
| 156 | DEVICE( NEC, NEC_PCX2, "PowerVR PCX2"){0x1033, 0x0046, ("PowerVR PCX2"), 0xff}, | |||
| 157 | DEVICE( FD, FD_36C70, "TMC-18C30"){0x1036, 0x0000, ("TMC-18C30"), 0xff}, | |||
| 158 | DEVICE( SI, SI_5591_AGP, "5591/5592 AGP"){0x1039, 0x0001, ("5591/5592 AGP"), 0xff}, | |||
| 159 | DEVICE( SI, SI_6202, "6202"){0x1039, 0x0002, ("6202"), 0xff}, | |||
| 160 | DEVICE( SI, SI_503, "85C503"){0x1039, 0x0008, ("85C503"), 0xff}, | |||
| 161 | DEVICE( SI, SI_ACPI, "ACPI"){0x1039, 0x0009, ("ACPI"), 0xff}, | |||
| 162 | DEVICE( SI, SI_5597_VGA, "5597/5598 VGA"){0x1039, 0x0200, ("5597/5598 VGA"), 0xff}, | |||
| 163 | DEVICE( SI, SI_6205, "6205"){0x1039, 0x0205, ("6205"), 0xff}, | |||
| 164 | DEVICE( SI, SI_501, "85C501"){0x1039, 0x0406, ("85C501"), 0xff}, | |||
| 165 | DEVICE( SI, SI_496, "85C496"){0x1039, 0x0496, ("85C496"), 0xff}, | |||
| 166 | DEVICE( SI, SI_601, "85C601"){0x1039, 0x0601, ("85C601"), 0xff}, | |||
| 167 | DEVICE( SI, SI_5107, "5107"){0x1039, 0x5107, ("5107"), 0xff}, | |||
| 168 | DEVICE( SI, SI_5511, "85C5511"){0x1039, 0x5511, ("85C5511"), 0xff}, | |||
| 169 | DEVICE( SI, SI_5513, "85C5513"){0x1039, 0x5513, ("85C5513"), 0xff}, | |||
| 170 | DEVICE( SI, SI_5571, "5571"){0x1039, 0x5571, ("5571"), 0xff}, | |||
| 171 | DEVICE( SI, SI_5591, "5591/5592 Host"){0x1039, 0x5591, ("5591/5592 Host"), 0xff}, | |||
| 172 | DEVICE( SI, SI_5597, "5597/5598 Host"){0x1039, 0x5597, ("5597/5598 Host"), 0xff}, | |||
| 173 | DEVICE( SI, SI_7001, "7001 USB"){0x1039, 0x7001, ("7001 USB"), 0xff}, | |||
| 174 | DEVICE( HP, HP_J2585A, "J2585A"){0x103c, 0x1030, ("J2585A"), 0xff}, | |||
| 175 | DEVICE( HP, HP_J2585B, "J2585B (Lassen)"){0x103c, 0x1031, ("J2585B (Lassen)"), 0xff}, | |||
| 176 | DEVICE( PCTECH, PCTECH_RZ1000, "RZ1000 (buggy)"){0x1042, 0x1000, ("RZ1000 (buggy)"), 0xff}, | |||
| 177 | DEVICE( PCTECH, PCTECH_RZ1001, "RZ1001 (buggy?)"){0x1042, 0x1001, ("RZ1001 (buggy?)"), 0xff}, | |||
| 178 | DEVICE( PCTECH, PCTECH_SAMURAI_0,"Samurai 0"){0x1042, 0x3000, ("Samurai 0"), 0xff}, | |||
| 179 | DEVICE( PCTECH, PCTECH_SAMURAI_1,"Samurai 1"){0x1042, 0x3010, ("Samurai 1"), 0xff}, | |||
| 180 | DEVICE( PCTECH, PCTECH_SAMURAI_IDE,"Samurai IDE"){0x1042, 0x3020, ("Samurai IDE"), 0xff}, | |||
| 181 | DEVICE( DPT, DPT, "SmartCache/Raid"){0x1044, 0xa400, ("SmartCache/Raid"), 0xff}, | |||
| 182 | DEVICE( OPTI, OPTI_92C178, "92C178"){0x1045, 0xc178, ("92C178"), 0xff}, | |||
| 183 | DEVICE( OPTI, OPTI_82C557, "82C557 Viper-M"){0x1045, 0xc557, ("82C557 Viper-M"), 0xff}, | |||
| 184 | DEVICE( OPTI, OPTI_82C558, "82C558 Viper-M ISA+IDE"){0x1045, 0xc558, ("82C558 Viper-M ISA+IDE"), 0xff}, | |||
| 185 | DEVICE( OPTI, OPTI_82C621, "82C621"){0x1045, 0xc621, ("82C621"), 0xff}, | |||
| 186 | DEVICE( OPTI, OPTI_82C700, "82C700"){0x1045, 0xc700, ("82C700"), 0xff}, | |||
| 187 | DEVICE( OPTI, OPTI_82C701, "82C701 FireStar Plus"){0x1045, 0xc701, ("82C701 FireStar Plus"), 0xff}, | |||
| 188 | DEVICE( OPTI, OPTI_82C814, "82C814 Firebridge 1"){0x1045, 0xc814, ("82C814 Firebridge 1"), 0xff}, | |||
| 189 | DEVICE( OPTI, OPTI_82C822, "82C822"){0x1045, 0xc822, ("82C822"), 0xff}, | |||
| 190 | DEVICE( OPTI, OPTI_82C825, "82C825 Firebridge 2"){0x1045, 0xd568, ("82C825 Firebridge 2"), 0xff}, | |||
| 191 | DEVICE( SGS, SGS_2000, "STG 2000X"){0x104a, 0x0008, ("STG 2000X"), 0xff}, | |||
| 192 | DEVICE( SGS, SGS_1764, "STG 1764X"){0x104a, 0x0009, ("STG 1764X"), 0xff}, | |||
| 193 | DEVICE( BUSLOGIC, BUSLOGIC_MULTIMASTER_NC, "MultiMaster NC"){0x104B, 0x0140, ("MultiMaster NC"), 0xff}, | |||
| 194 | DEVICE( BUSLOGIC, BUSLOGIC_MULTIMASTER, "MultiMaster"){0x104B, 0x1040, ("MultiMaster"), 0xff}, | |||
| 195 | DEVICE( BUSLOGIC, BUSLOGIC_FLASHPOINT, "FlashPoint"){0x104B, 0x8130, ("FlashPoint"), 0xff}, | |||
| 196 | DEVICE( TI, TI_TVP4010, "TVP4010 Permedia"){0x104c, 0x3d04, ("TVP4010 Permedia"), 0xff}, | |||
| 197 | DEVICE( TI, TI_TVP4020, "TVP4020 Permedia 2"){0x104c, 0x3d07, ("TVP4020 Permedia 2"), 0xff}, | |||
| 198 | DEVICE( TI, TI_PCI1130, "PCI1130"){0x104c, 0xac12, ("PCI1130"), 0xff}, | |||
| 199 | DEVICE( TI, TI_PCI1131, "PCI1131"){0x104c, 0xac15, ("PCI1131"), 0xff}, | |||
| 200 | DEVICE( TI, TI_PCI1250, "PCI1250"){0x104c, 0xac16, ("PCI1250"), 0xff}, | |||
| 201 | DEVICE( OAK, OAK_OTI107, "OTI107"){0x104e, 0x0107, ("OTI107"), 0xff}, | |||
| 202 | DEVICE( WINBOND2, WINBOND2_89C940,"NE2000-PCI"){0x1050, 0x0940, ("NE2000-PCI"), 0xff}, | |||
| 203 | DEVICE( MOTOROLA, MOTOROLA_MPC105,"MPC105 Eagle"){0x1057, 0x0001, ("MPC105 Eagle"), 0xff}, | |||
| 204 | DEVICE( MOTOROLA, MOTOROLA_MPC106,"MPC106 Grackle"){0x1057, 0x0002, ("MPC106 Grackle"), 0xff}, | |||
| 205 | DEVICE( MOTOROLA, MOTOROLA_RAVEN, "Raven"){0x1057, 0x4801, ("Raven"), 0xff}, | |||
| 206 | DEVICE( PROMISE, PROMISE_20246, "IDE UltraDMA/33"){0x105a, 0x4d33, ("IDE UltraDMA/33"), 0xff}, | |||
| 207 | DEVICE( PROMISE, PROMISE_5300, "DC5030"){0x105a, 0x5300, ("DC5030"), 0xff}, | |||
| 208 | DEVICE( N9, N9_I128, "Imagine 128"){0x105d, 0x2309, ("Imagine 128"), 0xff}, | |||
| 209 | DEVICE( N9, N9_I128_2, "Imagine 128v2"){0x105d, 0x2339, ("Imagine 128v2"), 0xff}, | |||
| 210 | DEVICE( UMC, UMC_UM8673F, "UM8673F"){0x1060, 0x0101, ("UM8673F"), 0xff}, | |||
| 211 | BRIDGE( UMC, UMC_UM8891A, "UM8891A", 0x01){0x1060, 0x0891, ("UM8891A"), (0x01)}, | |||
| 212 | DEVICE( UMC, UMC_UM8886BF, "UM8886BF"){0x1060, 0x673a, ("UM8886BF"), 0xff}, | |||
| 213 | DEVICE( UMC, UMC_UM8886A, "UM8886A"){0x1060, 0x886a, ("UM8886A"), 0xff}, | |||
| 214 | BRIDGE( UMC, UMC_UM8881F, "UM8881F", 0x02){0x1060, 0x8881, ("UM8881F"), (0x02)}, | |||
| 215 | DEVICE( UMC, UMC_UM8886F, "UM8886F"){0x1060, 0x8886, ("UM8886F"), 0xff}, | |||
| 216 | DEVICE( UMC, UMC_UM9017F, "UM9017F"){0x1060, 0x9017, ("UM9017F"), 0xff}, | |||
| 217 | DEVICE( UMC, UMC_UM8886N, "UM8886N"){0x1060, 0xe886, ("UM8886N"), 0xff}, | |||
| 218 | DEVICE( UMC, UMC_UM8891N, "UM8891N"){0x1060, 0xe891, ("UM8891N"), 0xff}, | |||
| 219 | DEVICE( X, X_AGX016, "ITT AGX016"){0x1061, 0x0001, ("ITT AGX016"), 0xff}, | |||
| 220 | DEVICE( PICOP, PICOP_PT86C52X, "PT86C52x Vesuvius"){0x1066, 0x0001, ("PT86C52x Vesuvius"), 0xff}, | |||
| 221 | DEVICE( PICOP, PICOP_PT80C524, "PT80C524 Nile"){0x1066, 0x8002, ("PT80C524 Nile"), 0xff}, | |||
| 222 | DEVICE( APPLE, APPLE_BANDIT, "Bandit"){0x106b, 0x0001, ("Bandit"), 0xff}, | |||
| 223 | DEVICE( APPLE, APPLE_GC, "Grand Central"){0x106b, 0x0002, ("Grand Central"), 0xff}, | |||
| 224 | DEVICE( APPLE, APPLE_HYDRA, "Hydra"){0x106b, 0x000e, ("Hydra"), 0xff}, | |||
| 225 | DEVICE( NEXGEN, NEXGEN_82C501, "82C501"){0x1074, 0x4e78, ("82C501"), 0xff}, | |||
| 226 | DEVICE( QLOGIC, QLOGIC_ISP1020, "ISP1020"){0x1077, 0x1020, ("ISP1020"), 0xff}, | |||
| 227 | DEVICE( QLOGIC, QLOGIC_ISP1022, "ISP1022"){0x1077, 0x1022, ("ISP1022"), 0xff}, | |||
| 228 | DEVICE( CYRIX, CYRIX_5510, "5510"){0x1078, 0x0000, ("5510"), 0xff}, | |||
| 229 | DEVICE( CYRIX, CYRIX_PCI_MASTER,"PCI Master"){0x1078, 0x0001, ("PCI Master"), 0xff}, | |||
| 230 | DEVICE( CYRIX, CYRIX_5520, "5520"){0x1078, 0x0002, ("5520"), 0xff}, | |||
| 231 | DEVICE( CYRIX, CYRIX_5530_LEGACY,"5530 Kahlua Legacy"){0x1078, 0x0100, ("5530 Kahlua Legacy"), 0xff}, | |||
| 232 | DEVICE( CYRIX, CYRIX_5530_SMI, "5530 Kahlua SMI"){0x1078, 0x0101, ("5530 Kahlua SMI"), 0xff}, | |||
| 233 | DEVICE( CYRIX, CYRIX_5530_IDE, "5530 Kahlua IDE"){0x1078, 0x0102, ("5530 Kahlua IDE"), 0xff}, | |||
| 234 | DEVICE( CYRIX, CYRIX_5530_AUDIO,"5530 Kahlua Audio"){0x1078, 0x0103, ("5530 Kahlua Audio"), 0xff}, | |||
| 235 | DEVICE( CYRIX, CYRIX_5530_VIDEO,"5530 Kahlua Video"){0x1078, 0x0104, ("5530 Kahlua Video"), 0xff}, | |||
| 236 | DEVICE( LEADTEK, LEADTEK_805, "S3 805"){0x107d, 0x0000, ("S3 805"), 0xff}, | |||
| 237 | DEVICE( CONTAQ, CONTAQ_82C599, "82C599"){0x1080, 0x0600, ("82C599"), 0xff}, | |||
| 238 | DEVICE( CONTAQ, CONTAQ_82C693, "82C693"){0x1080, 0xc693, ("82C693"), 0xff}, | |||
| 239 | DEVICE( OLICOM, OLICOM_OC3136, "OC-3136/3137"){0x108d, 0x0001, ("OC-3136/3137"), 0xff}, | |||
| 240 | DEVICE( OLICOM, OLICOM_OC2315, "OC-2315"){0x108d, 0x0011, ("OC-2315"), 0xff}, | |||
| 241 | DEVICE( OLICOM, OLICOM_OC2325, "OC-2325"){0x108d, 0x0012, ("OC-2325"), 0xff}, | |||
| 242 | DEVICE( OLICOM, OLICOM_OC2183, "OC-2183/2185"){0x108d, 0x0013, ("OC-2183/2185"), 0xff}, | |||
| 243 | DEVICE( OLICOM, OLICOM_OC2326, "OC-2326"){0x108d, 0x0014, ("OC-2326"), 0xff}, | |||
| 244 | DEVICE( OLICOM, OLICOM_OC6151, "OC-6151/6152"){0x108d, 0x0021, ("OC-6151/6152"), 0xff}, | |||
| 245 | DEVICE( SUN, SUN_EBUS, "EBUS"){0x108e, 0x1000, ("EBUS"), 0xff}, | |||
| 246 | DEVICE( SUN, SUN_HAPPYMEAL, "Happy Meal Ethernet"){0x108e, 0x1001, ("Happy Meal Ethernet"), 0xff}, | |||
| 247 | DEVICE( SUN, SUN_SIMBA, "Advanced PCI Bridge"){0x108e, 0x5000, ("Advanced PCI Bridge"), 0xff}, | |||
| 248 | DEVICE( SUN, SUN_PBM, "PCI Bus Module"){0x108e, 0x8000, ("PCI Bus Module"), 0xff}, | |||
| 249 | DEVICE( SUN, SUN_SABRE, "Ultra IIi PCI"){0x108e, 0xa000, ("Ultra IIi PCI"), 0xff}, | |||
| 250 | DEVICE( CMD, CMD_640, "640 (buggy)"){0x1095, 0x0640, ("640 (buggy)"), 0xff}, | |||
| 251 | DEVICE( CMD, CMD_643, "643"){0x1095, 0x0643, ("643"), 0xff}, | |||
| 252 | DEVICE( CMD, CMD_646, "646"){0x1095, 0x0646, ("646"), 0xff}, | |||
| 253 | DEVICE( CMD, CMD_670, "670"){0x1095, 0x0670, ("670"), 0xff}, | |||
| 254 | DEVICE( VISION, VISION_QD8500, "QD-8500"){0x1098, 0x0001, ("QD-8500"), 0xff}, | |||
| 255 | DEVICE( VISION, VISION_QD8580, "QD-8580"){0x1098, 0x0002, ("QD-8580"), 0xff}, | |||
| 256 | DEVICE( BROOKTREE, BROOKTREE_848, "Bt848"){0x109e, 0x0350, ("Bt848"), 0xff}, | |||
| 257 | DEVICE( BROOKTREE, BROOKTREE_849A, "Bt849"){0x109e, 0x0351, ("Bt849"), 0xff}, | |||
| 258 | DEVICE( BROOKTREE, BROOKTREE_8474, "Bt8474"){0x109e, 0x8474, ("Bt8474"), 0xff}, | |||
| 259 | DEVICE( SIERRA, SIERRA_STB, "STB Horizon 64"){0x10a8, 0x0000, ("STB Horizon 64"), 0xff}, | |||
| 260 | DEVICE( ACC, ACC_2056, "2056"){0x10aa, 0x0000, ("2056"), 0xff}, | |||
| 261 | DEVICE( WINBOND, WINBOND_83769, "W83769F"){0x10ad, 0x0001, ("W83769F"), 0xff}, | |||
| 262 | DEVICE( WINBOND, WINBOND_82C105, "SL82C105"){0x10ad, 0x0105, ("SL82C105"), 0xff}, | |||
| 263 | DEVICE( WINBOND, WINBOND_83C553, "W83C553"){0x10ad, 0x0565, ("W83C553"), 0xff}, | |||
| 264 | DEVICE( DATABOOK, DATABOOK_87144, "DB87144"){0x10b3, 0xb106, ("DB87144"), 0xff}, | |||
| 265 | DEVICE( PLX, PLX_SPCOM200, "SPCom 200 PCI serial I/O"){0x10b5, 0x1103, ("SPCom 200 PCI serial I/O"), 0xff}, | |||
| 266 | DEVICE( PLX, PLX_9050, "PLX9050 PCI <-> IOBus Bridge"){0x10b5, 0x9050, ("PLX9050 PCI <-> IOBus Bridge"), 0xff }, | |||
| 267 | DEVICE( PLX, PLX_9080, "PCI9080 I2O"){0x10b5, 0x9080, ("PCI9080 I2O"), 0xff}, | |||
| 268 | DEVICE( MADGE, MADGE_MK2, "Smart 16/4 BM Mk2 Ringnode"){0x10b6, 0x0002, ("Smart 16/4 BM Mk2 Ringnode"), 0xff}, | |||
| 269 | DEVICE( 3COM, 3COM_3C339, "3C339 TokenRing"){0x10b7, 0x3390, ("3C339 TokenRing"), 0xff}, | |||
| 270 | DEVICE( 3COM, 3COM_3C590, "3C590 10bT"){0x10b7, 0x5900, ("3C590 10bT"), 0xff}, | |||
| 271 | DEVICE( 3COM, 3COM_3C595TX, "3C595 100bTX"){0x10b7, 0x5950, ("3C595 100bTX"), 0xff}, | |||
| 272 | DEVICE( 3COM, 3COM_3C595T4, "3C595 100bT4"){0x10b7, 0x5951, ("3C595 100bT4"), 0xff}, | |||
| 273 | DEVICE( 3COM, 3COM_3C595MII, "3C595 100b-MII"){0x10b7, 0x5952, ("3C595 100b-MII"), 0xff}, | |||
| 274 | DEVICE( 3COM, 3COM_3C900TPO, "3C900 10bTPO"){0x10b7, 0x9000, ("3C900 10bTPO"), 0xff}, | |||
| 275 | DEVICE( 3COM, 3COM_3C900COMBO,"3C900 10b Combo"){0x10b7, 0x9001, ("3C900 10b Combo"), 0xff}, | |||
| 276 | DEVICE( 3COM, 3COM_3C905TX, "3C905 100bTX"){0x10b7, 0x9050, ("3C905 100bTX"), 0xff}, | |||
| 277 | DEVICE( 3COM, 3COM_3C905T4, "3C905 100bT4"){0x10b7, 0x9051, ("3C905 100bT4"), 0xff}, | |||
| 278 | DEVICE( 3COM, 3COM_3C905B_TX, "3C905B 100bTX"){0x10b7, 0x9055, ("3C905B 100bTX"), 0xff}, | |||
| 279 | DEVICE( SMC, SMC_EPIC100, "9432 TX"){0x10b8, 0x0005, ("9432 TX"), 0xff}, | |||
| 280 | DEVICE( AL, AL_M1445, "M1445"){0x10b9, 0x1445, ("M1445"), 0xff}, | |||
| 281 | DEVICE( AL, AL_M1449, "M1449"){0x10b9, 0x1449, ("M1449"), 0xff}, | |||
| 282 | DEVICE( AL, AL_M1451, "M1451"){0x10b9, 0x1451, ("M1451"), 0xff}, | |||
| 283 | DEVICE( AL, AL_M1461, "M1461"){0x10b9, 0x1461, ("M1461"), 0xff}, | |||
| 284 | DEVICE( AL, AL_M1489, "M1489"){0x10b9, 0x1489, ("M1489"), 0xff}, | |||
| 285 | DEVICE( AL, AL_M1511, "M1511"){0x10b9, 0x1511, ("M1511"), 0xff}, | |||
| 286 | DEVICE( AL, AL_M1513, "M1513"){0x10b9, 0x1513, ("M1513"), 0xff}, | |||
| 287 | DEVICE( AL, AL_M1521, "M1521"){0x10b9, 0x1521, ("M1521"), 0xff}, | |||
| 288 | DEVICE( AL, AL_M1523, "M1523"){0x10b9, 0x1523, ("M1523"), 0xff}, | |||
| 289 | DEVICE( AL, AL_M1531, "M1531 Aladdin IV"){0x10b9, 0x1531, ("M1531 Aladdin IV"), 0xff}, | |||
| 290 | DEVICE( AL, AL_M1533, "M1533 Aladdin IV"){0x10b9, 0x1533, ("M1533 Aladdin IV"), 0xff}, | |||
| 291 | DEVICE( AL, AL_M3307, "M3307 MPEG-1 decoder"){0x10b9, 0x3307, ("M3307 MPEG-1 decoder"), 0xff}, | |||
| 292 | DEVICE( AL, AL_M4803, "M4803"){0x10b9, 0x5215, ("M4803"), 0xff}, | |||
| 293 | DEVICE( AL, AL_M5219, "M5219"){0x10b9, 0x5219, ("M5219"), 0xff}, | |||
| 294 | DEVICE( AL, AL_M5229, "M5229 TXpro"){0x10b9, 0x5229, ("M5229 TXpro"), 0xff}, | |||
| 295 | DEVICE( AL, AL_M5237, "M5237 USB"){0x10b9, 0x5237, ("M5237 USB"), 0xff}, | |||
| 296 | DEVICE( SURECOM, SURECOM_NE34, "NE-34PCI LAN"){0x10bd, 0x0e34, ("NE-34PCI LAN"), 0xff}, | |||
| 297 | DEVICE( NEOMAGIC, NEOMAGIC_MAGICGRAPH_NM2070, "Magicgraph NM2070"){0x10c8, 0x0001, ("Magicgraph NM2070"), 0xff}, | |||
| 298 | DEVICE( NEOMAGIC, NEOMAGIC_MAGICGRAPH_128V, "MagicGraph 128V"){0x10c8, 0x0002, ("MagicGraph 128V"), 0xff}, | |||
| 299 | DEVICE( NEOMAGIC, NEOMAGIC_MAGICGRAPH_128ZV, "MagicGraph 128ZV"){0x10c8, 0x0003, ("MagicGraph 128ZV"), 0xff}, | |||
| 300 | DEVICE( NEOMAGIC, NEOMAGIC_MAGICGRAPH_NM2160, "MagicGraph NM2160"){0x10c8, 0x0004, ("MagicGraph NM2160"), 0xff}, | |||
| 301 | DEVICE( ASP, ASP_ABP940, "ABP940"){0x10cd, 0x1200, ("ABP940"), 0xff}, | |||
| 302 | DEVICE( ASP, ASP_ABP940U, "ABP940U"){0x10cd, 0x1300, ("ABP940U"), 0xff}, | |||
| 303 | DEVICE( ASP, ASP_ABP940UW, "ABP940UW"){0x10cd, 0x2300, ("ABP940UW"), 0xff}, | |||
| 304 | DEVICE( MACRONIX, MACRONIX_MX98713,"MX98713"){0x10d9, 0x0512, ("MX98713"), 0xff}, | |||
| 305 | DEVICE( MACRONIX, MACRONIX_MX987x5,"MX98715 / MX98725"){0x10d9, 0x0531, ("MX98715 / MX98725"), 0xff}, | |||
| 306 | DEVICE( CERN, CERN_SPSB_PMC, "STAR/RD24 SCI-PCI (PMC)"){0x10dc, 0x0001, ("STAR/RD24 SCI-PCI (PMC)"), 0xff}, | |||
| 307 | DEVICE( CERN, CERN_SPSB_PCI, "STAR/RD24 SCI-PCI (PMC)"){0x10dc, 0x0002, ("STAR/RD24 SCI-PCI (PMC)"), 0xff}, | |||
| 308 | DEVICE( CERN, CERN_HIPPI_DST, "HIPPI destination"){0x10dc, 0x0021, ("HIPPI destination"), 0xff}, | |||
| 309 | DEVICE( CERN, CERN_HIPPI_SRC, "HIPPI source"){0x10dc, 0x0022, ("HIPPI source"), 0xff}, | |||
| 310 | DEVICE( IMS, IMS_8849, "8849"){0x10e0, 0x8849, ("8849"), 0xff}, | |||
| 311 | DEVICE( TEKRAM2, TEKRAM2_690c, "DC690c"){0x10e1, 0x690c, ("DC690c"), 0xff}, | |||
| 312 | DEVICE( TUNDRA, TUNDRA_CA91C042,"CA91C042 Universe"){0x10e3, 0x0000, ("CA91C042 Universe"), 0xff}, | |||
| 313 | DEVICE( AMCC, AMCC_MYRINET, "Myrinet PCI (M2-PCI-32)"){0x10e8, 0x8043, ("Myrinet PCI (M2-PCI-32)"), 0xff}, | |||
| 314 | DEVICE( AMCC, AMCC_S5933, "S5933"){0x10e8, 0x807d, ("S5933"), 0xff}, | |||
| 315 | DEVICE( AMCC, AMCC_S5933_HEPC3,"S5933 Traquair HEPC3"){0x10e8, 0x809c, ("S5933 Traquair HEPC3"), 0xff}, | |||
| 316 | DEVICE( INTERG, INTERG_1680, "IGA-1680"){0x10ea, 0x1680, ("IGA-1680"), 0xff}, | |||
| 317 | DEVICE( INTERG, INTERG_1682, "IGA-1682"){0x10ea, 0x1682, ("IGA-1682"), 0xff}, | |||
| 318 | DEVICE( REALTEK, REALTEK_8029, "8029"){0x10ec, 0x8029, ("8029"), 0xff}, | |||
| 319 | DEVICE( REALTEK, REALTEK_8129, "8129"){0x10ec, 0x8129, ("8129"), 0xff}, | |||
| 320 | DEVICE( REALTEK, REALTEK_8139, "8139"){0x10ec, 0x8139, ("8139"), 0xff}, | |||
| 321 | DEVICE( TRUEVISION, TRUEVISION_T1000,"TARGA 1000"){0x10fa, 0x000c, ("TARGA 1000"), 0xff}, | |||
| 322 | DEVICE( INIT, INIT_320P, "320 P"){0x1101, 0x9100, ("320 P"), 0xff}, | |||
| 323 | DEVICE( INIT, INIT_360P, "360 P"){0x1101, 0x9500, ("360 P"), 0xff}, | |||
| 324 | DEVICE( VIA, VIA_82C505, "VT 82C505"){0x1106, 0x0505, ("VT 82C505"), 0xff}, | |||
| 325 | DEVICE( VIA, VIA_82C561, "VT 82C561"){0x1106, 0x0561, ("VT 82C561"), 0xff}, | |||
| 326 | DEVICE( VIA, VIA_82C586_1, "VT 82C586 Apollo IDE"){0x1106, 0x0571, ("VT 82C586 Apollo IDE"), 0xff}, | |||
| 327 | DEVICE( VIA, VIA_82C576, "VT 82C576 3V"){0x1106, 0x0576, ("VT 82C576 3V"), 0xff}, | |||
| 328 | DEVICE( VIA, VIA_82C585, "VT 82C585 Apollo VP1/VPX"){0x1106, 0x0585, ("VT 82C585 Apollo VP1/VPX"), 0xff}, | |||
| 329 | DEVICE( VIA, VIA_82C586_0, "VT 82C586 Apollo ISA"){0x1106, 0x0586, ("VT 82C586 Apollo ISA"), 0xff}, | |||
| 330 | DEVICE( VIA, VIA_82C595, "VT 82C595 Apollo VP2"){0x1106, 0x0595, ("VT 82C595 Apollo VP2"), 0xff}, | |||
| 331 | DEVICE( VIA, VIA_82C597_0, "VT 82C597 Apollo VP3"){0x1106, 0x0597, ("VT 82C597 Apollo VP3"), 0xff}, | |||
| 332 | DEVICE( VIA, VIA_82C926, "VT 82C926 Amazon"){0x1106, 0x0926, ("VT 82C926 Amazon"), 0xff}, | |||
| 333 | DEVICE( VIA, VIA_82C416, "VT 82C416MV"){0x1106, 0x1571, ("VT 82C416MV"), 0xff}, | |||
| 334 | DEVICE( VIA, VIA_82C595_97, "VT 82C595 Apollo VP2/97"){0x1106, 0x1595, ("VT 82C595 Apollo VP2/97"), 0xff}, | |||
| 335 | DEVICE( VIA, VIA_82C586_2, "VT 82C586 Apollo USB"){0x1106, 0x3038, ("VT 82C586 Apollo USB"), 0xff}, | |||
| 336 | DEVICE( VIA, VIA_82C586_3, "VT 82C586B Apollo ACPI"){0x1106, 0x3040, ("VT 82C586B Apollo ACPI"), 0xff}, | |||
| 337 | DEVICE( VIA, VIA_86C100A, "VT 86C100A"){0x1106, 0x6100, ("VT 86C100A"), 0xff}, | |||
| 338 | DEVICE( VIA, VIA_82C597_1, "VT 82C597 Apollo VP3 AGP"){0x1106, 0x8597, ("VT 82C597 Apollo VP3 AGP"), 0xff}, | |||
| 339 | DEVICE( VORTEX, VORTEX_GDT60x0, "GDT 60x0"){0x1119, 0x0000, ("GDT 60x0"), 0xff}, | |||
| 340 | DEVICE( VORTEX, VORTEX_GDT6000B,"GDT 6000b"){0x1119, 0x0001, ("GDT 6000b"), 0xff}, | |||
| 341 | DEVICE( VORTEX, VORTEX_GDT6x10, "GDT 6110/6510"){0x1119, 0x0002, ("GDT 6110/6510"), 0xff}, | |||
| 342 | DEVICE( VORTEX, VORTEX_GDT6x20, "GDT 6120/6520"){0x1119, 0x0003, ("GDT 6120/6520"), 0xff}, | |||
| 343 | DEVICE( VORTEX, VORTEX_GDT6530, "GDT 6530"){0x1119, 0x0004, ("GDT 6530"), 0xff}, | |||
| 344 | DEVICE( VORTEX, VORTEX_GDT6550, "GDT 6550"){0x1119, 0x0005, ("GDT 6550"), 0xff}, | |||
| 345 | DEVICE( VORTEX, VORTEX_GDT6x17, "GDT 6117/6517"){0x1119, 0x0006, ("GDT 6117/6517"), 0xff}, | |||
| 346 | DEVICE( VORTEX, VORTEX_GDT6x27, "GDT 6127/6527"){0x1119, 0x0007, ("GDT 6127/6527"), 0xff}, | |||
| 347 | DEVICE( VORTEX, VORTEX_GDT6537, "GDT 6537"){0x1119, 0x0008, ("GDT 6537"), 0xff}, | |||
| 348 | DEVICE( VORTEX, VORTEX_GDT6557, "GDT 6557"){0x1119, 0x0009, ("GDT 6557"), 0xff}, | |||
| 349 | DEVICE( VORTEX, VORTEX_GDT6x15, "GDT 6115/6515"){0x1119, 0x000a, ("GDT 6115/6515"), 0xff}, | |||
| 350 | DEVICE( VORTEX, VORTEX_GDT6x25, "GDT 6125/6525"){0x1119, 0x000b, ("GDT 6125/6525"), 0xff}, | |||
| 351 | DEVICE( VORTEX, VORTEX_GDT6535, "GDT 6535"){0x1119, 0x000c, ("GDT 6535"), 0xff}, | |||
| 352 | DEVICE( VORTEX, VORTEX_GDT6555, "GDT 6555"){0x1119, 0x000d, ("GDT 6555"), 0xff}, | |||
| 353 | DEVICE( VORTEX, VORTEX_GDT6x17RP,"GDT 6117RP/6517RP"){0x1119, 0x0100, ("GDT 6117RP/6517RP"), 0xff}, | |||
| 354 | DEVICE( VORTEX, VORTEX_GDT6x27RP,"GDT 6127RP/6527RP"){0x1119, 0x0101, ("GDT 6127RP/6527RP"), 0xff}, | |||
| 355 | DEVICE( VORTEX, VORTEX_GDT6537RP,"GDT 6537RP"){0x1119, 0x0102, ("GDT 6537RP"), 0xff}, | |||
| 356 | DEVICE( VORTEX, VORTEX_GDT6557RP,"GDT 6557RP"){0x1119, 0x0103, ("GDT 6557RP"), 0xff}, | |||
| 357 | DEVICE( VORTEX, VORTEX_GDT6x11RP,"GDT 6111RP/6511RP"){0x1119, 0x0104, ("GDT 6111RP/6511RP"), 0xff}, | |||
| 358 | DEVICE( VORTEX, VORTEX_GDT6x21RP,"GDT 6121RP/6521RP"){0x1119, 0x0105, ("GDT 6121RP/6521RP"), 0xff}, | |||
| 359 | DEVICE( VORTEX, VORTEX_GDT6x17RP1,"GDT 6117RP1/6517RP1"){0x1119, 0x0110, ("GDT 6117RP1/6517RP1"), 0xff}, | |||
| 360 | DEVICE( VORTEX, VORTEX_GDT6x27RP1,"GDT 6127RP1/6527RP1"){0x1119, 0x0111, ("GDT 6127RP1/6527RP1"), 0xff}, | |||
| 361 | DEVICE( VORTEX, VORTEX_GDT6537RP1,"GDT 6537RP1"){0x1119, 0x0112, ("GDT 6537RP1"), 0xff}, | |||
| 362 | DEVICE( VORTEX, VORTEX_GDT6557RP1,"GDT 6557RP1"){0x1119, 0x0113, ("GDT 6557RP1"), 0xff}, | |||
| 363 | DEVICE( VORTEX, VORTEX_GDT6x11RP1,"GDT 6111RP1/6511RP1"){0x1119, 0x0114, ("GDT 6111RP1/6511RP1"), 0xff}, | |||
| 364 | DEVICE( VORTEX, VORTEX_GDT6x21RP1,"GDT 6121RP1/6521RP1"){0x1119, 0x0115, ("GDT 6121RP1/6521RP1"), 0xff}, | |||
| 365 | DEVICE( VORTEX, VORTEX_GDT6x17RP2,"GDT 6117RP2/6517RP2"){0x1119, 0x0120, ("GDT 6117RP2/6517RP2"), 0xff}, | |||
| 366 | DEVICE( VORTEX, VORTEX_GDT6x27RP2,"GDT 6127RP2/6527RP2"){0x1119, 0x0121, ("GDT 6127RP2/6527RP2"), 0xff}, | |||
| 367 | DEVICE( VORTEX, VORTEX_GDT6537RP2,"GDT 6537RP2"){0x1119, 0x0122, ("GDT 6537RP2"), 0xff}, | |||
| 368 | DEVICE( VORTEX, VORTEX_GDT6557RP2,"GDT 6557RP2"){0x1119, 0x0123, ("GDT 6557RP2"), 0xff}, | |||
| 369 | DEVICE( VORTEX, VORTEX_GDT6x11RP2,"GDT 6111RP2/6511RP2"){0x1119, 0x0124, ("GDT 6111RP2/6511RP2"), 0xff}, | |||
| 370 | DEVICE( VORTEX, VORTEX_GDT6x21RP2,"GDT 6121RP2/6521RP2"){0x1119, 0x0125, ("GDT 6121RP2/6521RP2"), 0xff}, | |||
| 371 | DEVICE( EF, EF_ATM_FPGA, "155P-MF1 (FPGA)"){0x111a, 0x0000, ("155P-MF1 (FPGA)"), 0xff}, | |||
| 372 | DEVICE( EF, EF_ATM_ASIC, "155P-MF1 (ASIC)"){0x111a, 0x0002, ("155P-MF1 (ASIC)"), 0xff}, | |||
| 373 | DEVICE( FORE, FORE_PCA200PC, "PCA-200PC"){0x1127, 0x0210, ("PCA-200PC"), 0xff}, | |||
| 374 | DEVICE( FORE, FORE_PCA200E, "PCA-200E"){0x1127, 0x0300, ("PCA-200E"), 0xff}, | |||
| 375 | DEVICE( IMAGINGTECH, IMAGINGTECH_ICPCI, "MVC IC-PCI"){0x112f, 0x0000, ("MVC IC-PCI"), 0xff}, | |||
| 376 | DEVICE( PHILIPS, PHILIPS_SAA7146,"SAA7146"){0x1131, 0x7146, ("SAA7146"), 0xff}, | |||
| 377 | DEVICE( CYCLONE, CYCLONE_SDK, "SDK"){0x113c, 0x0001, ("SDK"), 0xff}, | |||
| 378 | DEVICE( ALLIANCE, ALLIANCE_PROMOTIO, "Promotion-6410"){0x1142, 0x3210, ("Promotion-6410"), 0xff}, | |||
| 379 | DEVICE( ALLIANCE, ALLIANCE_PROVIDEO, "Provideo"){0x1142, 0x6422, ("Provideo"), 0xff}, | |||
| 380 | DEVICE( ALLIANCE, ALLIANCE_AT24, "AT24"){0x1142, 0x6424, ("AT24"), 0xff}, | |||
| 381 | DEVICE( ALLIANCE, ALLIANCE_AT3D, "AT3D"){0x1142, 0x643d, ("AT3D"), 0xff}, | |||
| 382 | DEVICE( VMIC, VMIC_VME, "VMIVME-7587"){0x114a, 0x7587, ("VMIVME-7587"), 0xff}, | |||
| 383 | DEVICE( DIGI, DIGI_EPC, "AccelPort EPC"){0x114f, 0x0002, ("AccelPort EPC"), 0xff}, | |||
| 384 | DEVICE( DIGI, DIGI_RIGHTSWITCH, "RightSwitch SE-6"){0x114f, 0x0003, ("RightSwitch SE-6"), 0xff}, | |||
| 385 | DEVICE( DIGI, DIGI_XEM, "AccelPort Xem"){0x114f, 0x0004, ("AccelPort Xem"), 0xff}, | |||
| 386 | DEVICE( DIGI, DIGI_XR, "AccelPort Xr"){0x114f, 0x0005, ("AccelPort Xr"), 0xff}, | |||
| 387 | DEVICE( DIGI, DIGI_CX, "AccelPort C/X"){0x114f, 0x0006, ("AccelPort C/X"), 0xff}, | |||
| 388 | DEVICE( DIGI, DIGI_XRJ, "AccelPort Xr/J"){0x114f, 0x0009, ("AccelPort Xr/J"), 0xff}, | |||
| 389 | DEVICE( DIGI, DIGI_EPCJ, "AccelPort EPC/J"){0x114f, 0x000a, ("AccelPort EPC/J"), 0xff}, | |||
| 390 | DEVICE( DIGI, DIGI_XR_920, "AccelPort Xr 920"){0x114f, 0x0027, ("AccelPort Xr 920"), 0xff}, | |||
| 391 | DEVICE( MUTECH, MUTECH_MV1000, "MV-1000"){0x1159, 0x0001, ("MV-1000"), 0xff}, | |||
| 392 | DEVICE( RENDITION, RENDITION_VERITE,"Verite 1000"){0x1163, 0x0001, ("Verite 1000"), 0xff}, | |||
| 393 | DEVICE( RENDITION, RENDITION_VERITE2100,"Verite 2100"){0x1163, 0x2000, ("Verite 2100"), 0xff}, | |||
| 394 | DEVICE( TOSHIBA, TOSHIBA_601, "Laptop"){0x1179, 0x0601, ("Laptop"), 0xff}, | |||
| 395 | DEVICE( TOSHIBA, TOSHIBA_TOPIC95,"ToPIC95"){0x1179, 0x060a, ("ToPIC95"), 0xff}, | |||
| 396 | DEVICE( TOSHIBA, TOSHIBA_TOPIC97,"ToPIC97"){0x1179, 0x060f, ("ToPIC97"), 0xff}, | |||
| 397 | DEVICE( RICOH, RICOH_RL5C466, "RL5C466"){0x1180, 0x0466, ("RL5C466"), 0xff}, | |||
| 398 | DEVICE( ARTOP, ARTOP_ATP850UF, "ATP850UF"){0x1191, 0x0005, ("ATP850UF"), 0xff}, | |||
| 399 | DEVICE( ZEITNET, ZEITNET_1221, "1221"){0x1193, 0x0001, ("1221"), 0xff}, | |||
| 400 | DEVICE( ZEITNET, ZEITNET_1225, "1225"){0x1193, 0x0002, ("1225"), 0xff}, | |||
| 401 | DEVICE( OMEGA, OMEGA_82C092G, "82C092G"){0x119b, 0x1221, ("82C092G"), 0xff}, | |||
| 402 | DEVICE( LITEON, LITEON_LNE100TX,"LNE100TX"){0x11ad, 0x0002, ("LNE100TX"), 0xff}, | |||
| 403 | DEVICE( NP, NP_PCI_FDDI, "NP-PCI"){0x11bc, 0x0001, ("NP-PCI"), 0xff}, | |||
| 404 | DEVICE( ATT, ATT_L56XMF, "L56xMF"){0x11c1, 0x0440, ("L56xMF"), 0xff}, | |||
| 405 | DEVICE( SPECIALIX, SPECIALIX_IO8, "IO8+/PCI"){0x11cb, 0x2000, ("IO8+/PCI"), 0xff}, | |||
| 406 | DEVICE( SPECIALIX, SPECIALIX_XIO, "XIO/SIO host"){0x11cb, 0x4000, ("XIO/SIO host"), 0xff}, | |||
| 407 | DEVICE( SPECIALIX, SPECIALIX_RIO, "RIO host"){0x11cb, 0x8000, ("RIO host"), 0xff}, | |||
| 408 | DEVICE( AURAVISION, AURAVISION_VXP524,"VXP524"){0x11d1, 0x01f7, ("VXP524"), 0xff}, | |||
| 409 | DEVICE( IKON, IKON_10115, "10115 Greensheet"){0x11d5, 0x0115, ("10115 Greensheet"), 0xff}, | |||
| 410 | DEVICE( IKON, IKON_10117, "10117 Greensheet"){0x11d5, 0x0117, ("10117 Greensheet"), 0xff}, | |||
| 411 | DEVICE( ZORAN, ZORAN_36057, "ZR36057"){0x11de, 0x6057, ("ZR36057"), 0xff}, | |||
| 412 | DEVICE( ZORAN, ZORAN_36120, "ZR36120"){0x11de, 0x6120, ("ZR36120"), 0xff}, | |||
| 413 | DEVICE( KINETIC, KINETIC_2915, "2915 CAMAC"){0x11f4, 0x2915, ("2915 CAMAC"), 0xff}, | |||
| 414 | DEVICE( COMPEX, COMPEX_ENET100VG4, "Readylink ENET100-VG4"){0x11f6, 0x0112, ("Readylink ENET100-VG4"), 0xff}, | |||
| 415 | DEVICE( COMPEX, COMPEX_RL2000, "ReadyLink 2000"){0x11f6, 0x1401, ("ReadyLink 2000"), 0xff}, | |||
| 416 | DEVICE( RP, RP8OCTA, "RocketPort 8 Oct"){0x11fe, 0x0001, ("RocketPort 8 Oct"), 0xff}, | |||
| 417 | DEVICE( RP, RP8INTF, "RocketPort 8 Intf"){0x11fe, 0x0002, ("RocketPort 8 Intf"), 0xff}, | |||
| 418 | DEVICE( RP, RP16INTF, "RocketPort 16 Intf"){0x11fe, 0x0003, ("RocketPort 16 Intf"), 0xff}, | |||
| 419 | DEVICE( RP, RP32INTF, "RocketPort 32 Intf"){0x11fe, 0x0004, ("RocketPort 32 Intf"), 0xff}, | |||
| 420 | DEVICE( CYCLADES, CYCLOM_Y_Lo, "Cyclom-Y below 1Mbyte"){0x120e, 0x0100, ("Cyclom-Y below 1Mbyte"), 0xff}, | |||
| 421 | DEVICE( CYCLADES, CYCLOM_Y_Hi, "Cyclom-Y above 1Mbyte"){0x120e, 0x0101, ("Cyclom-Y above 1Mbyte"), 0xff}, | |||
| 422 | DEVICE( CYCLADES, CYCLOM_Z_Lo, "Cyclom-Z below 1Mbyte"){0x120e, 0x0200, ("Cyclom-Z below 1Mbyte"), 0xff}, | |||
| 423 | DEVICE( CYCLADES, CYCLOM_Z_Hi, "Cyclom-Z above 1Mbyte"){0x120e, 0x0201, ("Cyclom-Z above 1Mbyte"), 0xff}, | |||
| 424 | DEVICE( ESSENTIAL, ESSENTIAL_ROADRUNNER,"Roadrunner serial HIPPI"){0x120f, 0x0001, ("Roadrunner serial HIPPI"), 0xff}, | |||
| 425 | DEVICE( O2, O2_6832, "6832"){0x1217, 0x6832, ("6832"), 0xff}, | |||
| 426 | DEVICE( 3DFX, 3DFX_VOODOO, "Voodoo"){0x121a, 0x0001, ("Voodoo"), 0xff}, | |||
| 427 | DEVICE( 3DFX, 3DFX_VOODOO2, "Voodoo2"){0x121a, 0x0002, ("Voodoo2"), 0xff}, | |||
| 428 | DEVICE( SIGMADES, SIGMADES_6425, "REALmagic64/GX"){0x1236, 0x6401, ("REALmagic64/GX"), 0xff}, | |||
| 429 | DEVICE( STALLION, STALLION_ECHPCI832,"EasyConnection 8/32"){0x124d, 0x0000, ("EasyConnection 8/32"), 0xff}, | |||
| 430 | DEVICE( STALLION, STALLION_ECHPCI864,"EasyConnection 8/64"){0x124d, 0x0002, ("EasyConnection 8/64"), 0xff}, | |||
| 431 | DEVICE( STALLION, STALLION_EIOPCI,"EasyIO"){0x124d, 0x0003, ("EasyIO"), 0xff}, | |||
| 432 | DEVICE( OPTIBASE, OPTIBASE_FORGE, "MPEG Forge"){0x1255, 0x1110, ("MPEG Forge"), 0xff}, | |||
| 433 | DEVICE( OPTIBASE, OPTIBASE_FUSION,"MPEG Fusion"){0x1255, 0x1210, ("MPEG Fusion"), 0xff}, | |||
| 434 | DEVICE( OPTIBASE, OPTIBASE_VPLEX, "VideoPlex"){0x1255, 0x2110, ("VideoPlex"), 0xff}, | |||
| 435 | DEVICE( OPTIBASE, OPTIBASE_VPLEXCC,"VideoPlex CC"){0x1255, 0x2120, ("VideoPlex CC"), 0xff}, | |||
| 436 | DEVICE( OPTIBASE, OPTIBASE_VQUEST,"VideoQuest"){0x1255, 0x2130, ("VideoQuest"), 0xff}, | |||
| 437 | DEVICE( ASIX, ASIX_88140, "88140"){0x125b, 0x1400, ("88140"), 0xff}, | |||
| 438 | DEVICE( SATSAGEM, SATSAGEM_PCR2101,"PCR2101 DVB receiver"){0x1267, 0x5352, ("PCR2101 DVB receiver"), 0xff}, | |||
| 439 | DEVICE( SATSAGEM, SATSAGEM_TELSATTURBO,"Telsat Turbo DVB"){0x1267, 0x5a4b, ("Telsat Turbo DVB"), 0xff}, | |||
| 440 | DEVICE( ENSONIQ, ENSONIQ_AUDIOPCI,"AudioPCI"){0x1274, 0x5000, ("AudioPCI"), 0xff}, | |||
| 441 | DEVICE( PICTUREL, PICTUREL_PCIVST,"PCIVST"){0x12c5, 0x0081, ("PCIVST"), 0xff}, | |||
| 442 | DEVICE( NVIDIA_SGS, NVIDIA_SGS_RIVA128, "Riva 128"){0x12d2, 0x0018, ("Riva 128"), 0xff}, | |||
| 443 | DEVICE( CBOARDS, CBOARDS_DAS1602_16,"DAS1602/16"){0x1307, 0x0001, ("DAS1602/16"), 0xff}, | |||
| 444 | DEVICE( SYMPHONY, SYMPHONY_101, "82C101"){0x1c1c, 0x0001, ("82C101"), 0xff}, | |||
| 445 | DEVICE( TEKRAM, TEKRAM_DC290, "DC-290"){0x1de1, 0xdc29, ("DC-290"), 0xff}, | |||
| 446 | DEVICE( 3DLABS, 3DLABS_300SX, "GLINT 300SX"){0x3d3d, 0x0001, ("GLINT 300SX"), 0xff}, | |||
| 447 | DEVICE( 3DLABS, 3DLABS_500TX, "GLINT 500TX"){0x3d3d, 0x0002, ("GLINT 500TX"), 0xff}, | |||
| 448 | DEVICE( 3DLABS, 3DLABS_DELTA, "GLINT Delta"){0x3d3d, 0x0003, ("GLINT Delta"), 0xff}, | |||
| 449 | DEVICE( 3DLABS, 3DLABS_PERMEDIA,"PERMEDIA"){0x3d3d, 0x0004, ("PERMEDIA"), 0xff}, | |||
| 450 | DEVICE( 3DLABS, 3DLABS_MX, "GLINT MX"){0x3d3d, 0x0006, ("GLINT MX"), 0xff}, | |||
| 451 | DEVICE( AVANCE, AVANCE_ALG2064, "ALG2064i"){0x4005, 0x2064, ("ALG2064i"), 0xff}, | |||
| 452 | DEVICE( AVANCE, AVANCE_2302, "ALG-2302"){0x4005, 0x2302, ("ALG-2302"), 0xff}, | |||
| 453 | DEVICE( NETVIN, NETVIN_NV5000SC,"NV5000"){0x4a14, 0x5000, ("NV5000"), 0xff}, | |||
| 454 | DEVICE( S3, S3_PLATO_PXS, "PLATO/PX (system)"){0x5333, 0x0551, ("PLATO/PX (system)"), 0xff}, | |||
| 455 | DEVICE( S3, S3_ViRGE, "ViRGE"){0x5333, 0x5631, ("ViRGE"), 0xff}, | |||
| 456 | DEVICE( S3, S3_TRIO, "Trio32/Trio64"){0x5333, 0x8811, ("Trio32/Trio64"), 0xff}, | |||
| 457 | DEVICE( S3, S3_AURORA64VP, "Aurora64V+"){0x5333, 0x8812, ("Aurora64V+"), 0xff}, | |||
| 458 | DEVICE( S3, S3_TRIO64UVP, "Trio64UV+"){0x5333, 0x8814, ("Trio64UV+"), 0xff}, | |||
| 459 | DEVICE( S3, S3_ViRGE_VX, "ViRGE/VX"){0x5333, 0x883d, ("ViRGE/VX"), 0xff}, | |||
| 460 | DEVICE( S3, S3_868, "Vision 868"){0x5333, 0x8880, ("Vision 868"), 0xff}, | |||
| 461 | DEVICE( S3, S3_928, "Vision 928-P"){0x5333, 0x88b0, ("Vision 928-P"), 0xff}, | |||
| 462 | DEVICE( S3, S3_864_1, "Vision 864-P"){0x5333, 0x88c0, ("Vision 864-P"), 0xff}, | |||
| 463 | DEVICE( S3, S3_864_2, "Vision 864-P"){0x5333, 0x88c1, ("Vision 864-P"), 0xff}, | |||
| 464 | DEVICE( S3, S3_964_1, "Vision 964-P"){0x5333, 0x88d0, ("Vision 964-P"), 0xff}, | |||
| 465 | DEVICE( S3, S3_964_2, "Vision 964-P"){0x5333, 0x88d1, ("Vision 964-P"), 0xff}, | |||
| 466 | DEVICE( S3, S3_968, "Vision 968"){0x5333, 0x88f0, ("Vision 968"), 0xff}, | |||
| 467 | DEVICE( S3, S3_TRIO64V2, "Trio64V2/DX or /GX"){0x5333, 0x8901, ("Trio64V2/DX or /GX"), 0xff}, | |||
| 468 | DEVICE( S3, S3_PLATO_PXG, "PLATO/PX (graphics)"){0x5333, 0x8902, ("PLATO/PX (graphics)"), 0xff}, | |||
| 469 | DEVICE( S3, S3_ViRGE_DXGX, "ViRGE/DX or /GX"){0x5333, 0x8a01, ("ViRGE/DX or /GX"), 0xff}, | |||
| 470 | DEVICE( S3, S3_ViRGE_GX2, "ViRGE/GX2"){0x5333, 0x8a10, ("ViRGE/GX2"), 0xff}, | |||
| 471 | DEVICE( S3, S3_ViRGE_MX, "ViRGE/MX"){0x5333, 0x8c01, ("ViRGE/MX"), 0xff}, | |||
| 472 | DEVICE( S3, S3_ViRGE_MXP, "ViRGE/MX+"){0x5333, 0x8c02, ("ViRGE/MX+"), 0xff}, | |||
| 473 | DEVICE( S3, S3_ViRGE_MXPMV, "ViRGE/MX+MV"){0x5333, 0x8c03, ("ViRGE/MX+MV"), 0xff}, | |||
| 474 | DEVICE( S3, S3_SONICVIBES, "SonicVibes"){0x5333, 0xca00, ("SonicVibes"), 0xff}, | |||
| 475 | DEVICE( INTEL, INTEL_82375, "82375EB"){0x8086, 0x0482, ("82375EB"), 0xff}, | |||
| 476 | BRIDGE( INTEL, INTEL_82424, "82424ZX Saturn", 0x00){0x8086, 0x0483, ("82424ZX Saturn"), (0x00)}, | |||
| 477 | DEVICE( INTEL, INTEL_82378, "82378IB"){0x8086, 0x0484, ("82378IB"), 0xff}, | |||
| 478 | DEVICE( INTEL, INTEL_82430, "82430ZX Aries"){0x8086, 0x0486, ("82430ZX Aries"), 0xff}, | |||
| 479 | BRIDGE( INTEL, INTEL_82434, "82434LX Mercury/Neptune", 0x00){0x8086, 0x04a3, ("82434LX Mercury/Neptune"), (0x00)}, | |||
| 480 | DEVICE( INTEL, INTEL_82092AA_0,"82092AA PCMCIA bridge"){0x8086, 0x1221, ("82092AA PCMCIA bridge"), 0xff}, | |||
| 481 | DEVICE( INTEL, INTEL_82092AA_1,"82092AA EIDE"){0x8086, 0x1222, ("82092AA EIDE"), 0xff}, | |||
| 482 | DEVICE( INTEL, INTEL_7116, "SAA7116"){0x8086, 0x1223, ("SAA7116"), 0xff}, | |||
| 483 | DEVICE( INTEL, INTEL_82596, "82596"){0x8086, 0x1226, ("82596"), 0xff}, | |||
| 484 | DEVICE( INTEL, INTEL_82865, "82865"){0x8086, 0x1227, ("82865"), 0xff}, | |||
| 485 | DEVICE( INTEL, INTEL_82557, "82557"){0x8086, 0x1229, ("82557"), 0xff}, | |||
| 486 | DEVICE( INTEL, INTEL_82437, "82437"){0x8086, 0x122d, ("82437"), 0xff}, | |||
| 487 | DEVICE( INTEL, INTEL_82371_0, "82371 Triton PIIX"){0x8086, 0x122e, ("82371 Triton PIIX"), 0xff}, | |||
| 488 | DEVICE( INTEL, INTEL_82371_1, "82371 Triton PIIX"){0x8086, 0x1230, ("82371 Triton PIIX"), 0xff}, | |||
| 489 | DEVICE( INTEL, INTEL_82371MX, "430MX - 82371MX MPIIX"){0x8086, 0x1234, ("430MX - 82371MX MPIIX"), 0xff}, | |||
| 490 | DEVICE( INTEL, INTEL_82437MX, "430MX - 82437MX MTSC"){0x8086, 0x1235, ("430MX - 82437MX MTSC"), 0xff}, | |||
| 491 | DEVICE( INTEL, INTEL_82441, "82441FX Natoma"){0x8086, 0x1237, ("82441FX Natoma"), 0xff}, | |||
| 492 | DEVICE( INTEL, INTEL_82380FB, "82380FB Mobile"){0x8086, 0x124b, ("82380FB Mobile"), 0xff}, | |||
| 493 | DEVICE( INTEL, INTEL_82439, "82439HX Triton II"){0x8086, 0x1250, ("82439HX Triton II"), 0xff}, | |||
| 494 | DEVICE( INTEL, INTEL_82371SB_0,"82371SB PIIX3 ISA"){0x8086, 0x7000, ("82371SB PIIX3 ISA"), 0xff}, | |||
| 495 | DEVICE( INTEL, INTEL_82371SB_1,"82371SB PIIX3 IDE"){0x8086, 0x7010, ("82371SB PIIX3 IDE"), 0xff}, | |||
| 496 | DEVICE( INTEL, INTEL_82371SB_2,"82371SB PIIX3 USB"){0x8086, 0x7020, ("82371SB PIIX3 USB"), 0xff}, | |||
| 497 | DEVICE( INTEL, INTEL_82437VX, "82437VX Triton II"){0x8086, 0x7030, ("82437VX Triton II"), 0xff}, | |||
| 498 | DEVICE( INTEL, INTEL_82439TX, "82439TX"){0x8086, 0x7100, ("82439TX"), 0xff}, | |||
| 499 | DEVICE( INTEL, INTEL_82371AB_0,"82371AB PIIX4 ISA"){0x8086, 0x7110, ("82371AB PIIX4 ISA"), 0xff}, | |||
| 500 | DEVICE( INTEL, INTEL_82371AB, "82371AB PIIX4 IDE"){0x8086, 0x7111, ("82371AB PIIX4 IDE"), 0xff}, | |||
| 501 | DEVICE( INTEL, INTEL_82371AB_2,"82371AB PIIX4 USB"){0x8086, 0x7112, ("82371AB PIIX4 USB"), 0xff}, | |||
| 502 | DEVICE( INTEL, INTEL_82371AB_3,"82371AB PIIX4 ACPI"){0x8086, 0x7113, ("82371AB PIIX4 ACPI"), 0xff}, | |||
| 503 | DEVICE( INTEL, INTEL_82443LX_0,"440LX - 82443LX PAC Host"){0x8086, 0x7180, ("440LX - 82443LX PAC Host"), 0xff}, | |||
| 504 | DEVICE( INTEL, INTEL_82443LX_1,"440LX - 82443LX PAC AGP"){0x8086, 0x7181, ("440LX - 82443LX PAC AGP"), 0xff}, | |||
| 505 | DEVICE( INTEL, INTEL_82443BX_0,"440BX - 82443BX Host"){0x8086, 0x7190, ("440BX - 82443BX Host"), 0xff}, | |||
| 506 | DEVICE( INTEL, INTEL_82443BX_1,"440BX - 82443BX AGP"){0x8086, 0x7191, ("440BX - 82443BX AGP"), 0xff}, | |||
| 507 | DEVICE( INTEL, INTEL_82443BX_2,"440BX - 82443BX Host (no AGP)"){0x8086, 0x7192, ("440BX - 82443BX Host (no AGP)"), 0xff}, | |||
| 508 | DEVICE( INTEL, INTEL_82443GX_0,"440GX - 82443GX Host"){0x8086, 0x71A0, ("440GX - 82443GX Host"), 0xff}, | |||
| 509 | DEVICE( INTEL, INTEL_82443GX_1,"440GX - 82443GX AGP"){0x8086, 0x71A1, ("440GX - 82443GX AGP"), 0xff}, | |||
| 510 | DEVICE( INTEL, INTEL_82443GX_2,"440GX - 82443GX Host (no AGP)"){0x8086, 0x71A2, ("440GX - 82443GX Host (no AGP)"), 0xff}, | |||
| 511 | DEVICE( INTEL, INTEL_P6, "Orion P6"){0x8086, 0x84c4, ("Orion P6"), 0xff}, | |||
| 512 | DEVICE( INTEL, INTEL_82450GX, "82450GX Orion P6"){0x8086, 0x84c5, ("82450GX Orion P6"), 0xff}, | |||
| 513 | DEVICE( KTI, KTI_ET32P2, "ET32P2"){0x8e2e, 0x3000, ("ET32P2"), 0xff}, | |||
| 514 | DEVICE( ADAPTEC, ADAPTEC_7810, "AIC-7810 RAID"){0x9004, 0x1078, ("AIC-7810 RAID"), 0xff}, | |||
| 515 | DEVICE( ADAPTEC, ADAPTEC_7850, "AIC-7850"){0x9004, 0x5078, ("AIC-7850"), 0xff}, | |||
| 516 | DEVICE( ADAPTEC, ADAPTEC_7855, "AIC-7855"){0x9004, 0x5578, ("AIC-7855"), 0xff}, | |||
| 517 | DEVICE( ADAPTEC, ADAPTEC_5800, "AIC-5800"){0x9004, 0x5800, ("AIC-5800"), 0xff}, | |||
| 518 | DEVICE( ADAPTEC, ADAPTEC_7860, "AIC-7860"){0x9004, 0x6078, ("AIC-7860"), 0xff}, | |||
| 519 | DEVICE( ADAPTEC, ADAPTEC_7861, "AIC-7861"){0x9004, 0x6178, ("AIC-7861"), 0xff}, | |||
| 520 | DEVICE( ADAPTEC, ADAPTEC_7870, "AIC-7870"){0x9004, 0x7078, ("AIC-7870"), 0xff}, | |||
| 521 | DEVICE( ADAPTEC, ADAPTEC_7871, "AIC-7871"){0x9004, 0x7178, ("AIC-7871"), 0xff}, | |||
| 522 | DEVICE( ADAPTEC, ADAPTEC_7872, "AIC-7872"){0x9004, 0x7278, ("AIC-7872"), 0xff}, | |||
| 523 | DEVICE( ADAPTEC, ADAPTEC_7873, "AIC-7873"){0x9004, 0x7378, ("AIC-7873"), 0xff}, | |||
| 524 | DEVICE( ADAPTEC, ADAPTEC_7874, "AIC-7874"){0x9004, 0x7478, ("AIC-7874"), 0xff}, | |||
| 525 | DEVICE( ADAPTEC, ADAPTEC_7895, "AIC-7895U"){0x9004, 0x7895, ("AIC-7895U"), 0xff}, | |||
| 526 | DEVICE( ADAPTEC, ADAPTEC_7880, "AIC-7880U"){0x9004, 0x8078, ("AIC-7880U"), 0xff}, | |||
| 527 | DEVICE( ADAPTEC, ADAPTEC_7881, "AIC-7881U"){0x9004, 0x8178, ("AIC-7881U"), 0xff}, | |||
| 528 | DEVICE( ADAPTEC, ADAPTEC_7882, "AIC-7882U"){0x9004, 0x8278, ("AIC-7882U"), 0xff}, | |||
| 529 | DEVICE( ADAPTEC, ADAPTEC_7883, "AIC-7883U"){0x9004, 0x8378, ("AIC-7883U"), 0xff}, | |||
| 530 | DEVICE( ADAPTEC, ADAPTEC_7884, "AIC-7884U"){0x9004, 0x8478, ("AIC-7884U"), 0xff}, | |||
| 531 | DEVICE( ADAPTEC, ADAPTEC_1030, "ABA-1030 DVB receiver"){0x9004, 0x8b78, ("ABA-1030 DVB receiver"), 0xff}, | |||
| 532 | DEVICE( ADAPTEC2, ADAPTEC2_2940U2, "AHA-2940U2"){0x9005, 0x0010, ("AHA-2940U2"), 0xff}, | |||
| 533 | DEVICE( ADAPTEC2, ADAPTEC2_7890, "AIC-7890/1"){0x9005, 0x001f, ("AIC-7890/1"), 0xff}, | |||
| 534 | DEVICE( ADAPTEC2, ADAPTEC2_3940U2, "AHA-3940U2"){0x9005, 0x0050, ("AHA-3940U2"), 0xff}, | |||
| 535 | DEVICE( ADAPTEC2, ADAPTEC2_7896, "AIC-7896/7"){0x9005, 0x005f, ("AIC-7896/7"), 0xff}, | |||
| 536 | DEVICE( ATRONICS, ATRONICS_2015, "IDE-2015PL"){0x907f, 0x2015, ("IDE-2015PL"), 0xff}, | |||
| 537 | DEVICE( TIGERJET, TIGERJET_300, "Tiger300 ISDN"){0xe159, 0x0001, ("Tiger300 ISDN"), 0xff}, | |||
| 538 | DEVICE( ARK, ARK_STING, "Stingray"){0xedd8, 0xa091, ("Stingray"), 0xff}, | |||
| 539 | DEVICE( ARK, ARK_STINGARK, "Stingray ARK 2000PV"){0xedd8, 0xa099, ("Stingray ARK 2000PV"), 0xff}, | |||
| 540 | DEVICE( ARK, ARK_2000MT, "2000MT"){0xedd8, 0xa0a1, ("2000MT"), 0xff} | |||
| 541 | }; | |||
| 542 | ||||
| 543 | ||||
| 544 | #ifdef CONFIG_PCI_OPTIMIZE1 | |||
| 545 | ||||
| 546 | /* | |||
| 547 | * An item of this structure has the following meaning: | |||
| 548 | * for each optimization, the register address, the mask | |||
| 549 | * and value to write to turn it on. | |||
| 550 | * There are 5 optimizations for the moment: | |||
| 551 | * Cache L2 write back best than write through | |||
| 552 | * Posted Write for CPU to PCI enable | |||
| 553 | * Posted Write for CPU to MEMORY enable | |||
| 554 | * Posted Write for PCI to MEMORY enable | |||
| 555 | * PCI Burst enable | |||
| 556 | * | |||
| 557 | * Half of the bios I've meet don't allow you to turn that on, and you | |||
| 558 | * can gain more than 15% on graphic accesses using those | |||
| 559 | * optimizations... | |||
| 560 | */ | |||
| 561 | struct optimization_type { | |||
| 562 | const char *type; | |||
| 563 | const char *off; | |||
| 564 | const char *on; | |||
| 565 | } bridge_optimization[] = { | |||
| 566 | {"Cache L2", "write through", "write back"}, | |||
| 567 | {"CPU-PCI posted write", "off", "on"}, | |||
| 568 | {"CPU-Memory posted write", "off", "on"}, | |||
| 569 | {"PCI-Memory posted write", "off", "on"}, | |||
| 570 | {"PCI burst", "off", "on"} | |||
| 571 | }; | |||
| 572 | ||||
| 573 | #define NUM_OPTIMIZATIONS(sizeof(bridge_optimization) / sizeof(bridge_optimization[0]) ) \ | |||
| 574 | (sizeof(bridge_optimization) / sizeof(bridge_optimization[0])) | |||
| 575 | ||||
| 576 | struct bridge_mapping_type { | |||
| 577 | unsigned char addr; /* config space address */ | |||
| 578 | unsigned char mask; | |||
| 579 | unsigned char value; | |||
| 580 | } bridge_mapping[] = { | |||
| 581 | /* | |||
| 582 | * Intel Neptune/Mercury/Saturn: | |||
| 583 | * If the internal cache is write back, | |||
| 584 | * the L2 cache must be write through! | |||
| 585 | * I've to check out how to control that | |||
| 586 | * for the moment, we won't touch the cache | |||
| 587 | */ | |||
| 588 | {0x0 ,0x02 ,0x02 }, | |||
| 589 | {0x53 ,0x02 ,0x02 }, | |||
| 590 | {0x53 ,0x01 ,0x01 }, | |||
| 591 | {0x54 ,0x01 ,0x01 }, | |||
| 592 | {0x54 ,0x02 ,0x02 }, | |||
| 593 | ||||
| 594 | /* | |||
| 595 | * UMC 8891A Pentium chipset: | |||
| 596 | * Why did you think UMC was cheaper ?? | |||
| 597 | */ | |||
| 598 | {0x50 ,0x10 ,0x00 }, | |||
| 599 | {0x51 ,0x40 ,0x40 }, | |||
| 600 | {0x0 ,0x0 ,0x0 }, | |||
| 601 | {0x0 ,0x0 ,0x0 }, | |||
| 602 | {0x0 ,0x0 ,0x0 }, | |||
| 603 | ||||
| 604 | /* | |||
| 605 | * UMC UM8881F | |||
| 606 | * This is a dummy entry for my tests. | |||
| 607 | * I have this chipset and no docs.... | |||
| 608 | */ | |||
| 609 | {0x0 ,0x1 ,0x1 }, | |||
| 610 | {0x0 ,0x2 ,0x0 }, | |||
| 611 | {0x0 ,0x0 ,0x0 }, | |||
| 612 | {0x0 ,0x0 ,0x0 }, | |||
| 613 | {0x0 ,0x0 ,0x0 } | |||
| 614 | }; | |||
| 615 | ||||
| 616 | #endif /* CONFIG_PCI_OPTIMIZE */ | |||
| 617 | ||||
| 618 | ||||
| 619 | /* | |||
| 620 | * device_info[] is sorted so we can use binary search | |||
| 621 | */ | |||
| 622 | struct pci_dev_info *pci_lookup_dev(unsigned int vendor, unsigned int dev) | |||
| 623 | { | |||
| 624 | int min = 0, | |||
| 625 | max = sizeof(dev_info)/sizeof(dev_info[0]) - 1; | |||
| 626 | ||||
| 627 | for ( ; ; ) | |||
| 628 | { | |||
| 629 | int i = (min + max) >> 1; | |||
| 630 | long order; | |||
| 631 | ||||
| 632 | order = dev_info[i].vendor - (long) vendor; | |||
| 633 | if (!order) | |||
| 634 | order = dev_info[i].device - (long) dev; | |||
| 635 | ||||
| 636 | if (order < 0) | |||
| 637 | { | |||
| 638 | min = i + 1; | |||
| 639 | if ( min > max ) | |||
| 640 | return 0; | |||
| 641 | continue; | |||
| 642 | } | |||
| 643 | ||||
| 644 | if (order > 0) | |||
| 645 | { | |||
| 646 | max = i - 1; | |||
| 647 | if ( min > max ) | |||
| 648 | return 0; | |||
| 649 | continue; | |||
| 650 | } | |||
| 651 | ||||
| 652 | return & dev_info[ i ]; | |||
| 653 | } | |||
| 654 | } | |||
| 655 | ||||
| 656 | const char *pci_strclass (unsigned int class) | |||
| 657 | { | |||
| 658 | switch (class >> 8) { | |||
| 659 | case PCI_CLASS_NOT_DEFINED0x0000: return "Non-VGA device"; | |||
| 660 | case PCI_CLASS_NOT_DEFINED_VGA0x0001: return "VGA compatible device"; | |||
| 661 | ||||
| 662 | case PCI_CLASS_STORAGE_SCSI0x0100: return "SCSI storage controller"; | |||
| 663 | case PCI_CLASS_STORAGE_IDE0x0101: return "IDE interface"; | |||
| 664 | case PCI_CLASS_STORAGE_FLOPPY0x0102: return "Floppy disk controller"; | |||
| 665 | case PCI_CLASS_STORAGE_IPI0x0103: return "IPI bus controller"; | |||
| 666 | case PCI_CLASS_STORAGE_RAID0x0104: return "RAID bus controller"; | |||
| 667 | case PCI_CLASS_STORAGE_OTHER0x0180: return "Unknown mass storage controller"; | |||
| 668 | ||||
| 669 | case PCI_CLASS_NETWORK_ETHERNET0x0200: return "Ethernet controller"; | |||
| 670 | case PCI_CLASS_NETWORK_TOKEN_RING0x0201: return "Token ring network controller"; | |||
| 671 | case PCI_CLASS_NETWORK_FDDI0x0202: return "FDDI network controller"; | |||
| 672 | case PCI_CLASS_NETWORK_ATM0x0203: return "ATM network controller"; | |||
| 673 | case PCI_CLASS_NETWORK_OTHER0x0280: return "Network controller"; | |||
| 674 | ||||
| 675 | case PCI_CLASS_DISPLAY_VGA0x0300: return "VGA compatible controller"; | |||
| 676 | case PCI_CLASS_DISPLAY_XGA0x0301: return "XGA compatible controller"; | |||
| 677 | case PCI_CLASS_DISPLAY_OTHER0x0380: return "Display controller"; | |||
| 678 | ||||
| 679 | case PCI_CLASS_MULTIMEDIA_VIDEO0x0400: return "Multimedia video controller"; | |||
| 680 | case PCI_CLASS_MULTIMEDIA_AUDIO0x0401: return "Multimedia audio controller"; | |||
| 681 | case PCI_CLASS_MULTIMEDIA_OTHER0x0480: return "Multimedia controller"; | |||
| 682 | ||||
| 683 | case PCI_CLASS_MEMORY_RAM0x0500: return "RAM memory"; | |||
| 684 | case PCI_CLASS_MEMORY_FLASH0x0501: return "FLASH memory"; | |||
| 685 | case PCI_CLASS_MEMORY_OTHER0x0580: return "Memory"; | |||
| 686 | ||||
| 687 | case PCI_CLASS_BRIDGE_HOST0x0600: return "Host bridge"; | |||
| 688 | case PCI_CLASS_BRIDGE_ISA0x0601: return "ISA bridge"; | |||
| 689 | case PCI_CLASS_BRIDGE_EISA0x0602: return "EISA bridge"; | |||
| 690 | case PCI_CLASS_BRIDGE_MC0x0603: return "MicroChannel bridge"; | |||
| 691 | case PCI_CLASS_BRIDGE_PCI0x0604: return "PCI bridge"; | |||
| 692 | case PCI_CLASS_BRIDGE_PCMCIA0x0605: return "PCMCIA bridge"; | |||
| 693 | case PCI_CLASS_BRIDGE_NUBUS0x0606: return "NuBus bridge"; | |||
| 694 | case PCI_CLASS_BRIDGE_CARDBUS0x0607: return "CardBus bridge"; | |||
| 695 | case PCI_CLASS_BRIDGE_OTHER0x0680: return "Bridge"; | |||
| 696 | ||||
| 697 | case PCI_CLASS_COMMUNICATION_SERIAL0x0700: return "Serial controller"; | |||
| 698 | case PCI_CLASS_COMMUNICATION_PARALLEL0x0701: return "Parallel controller"; | |||
| 699 | case PCI_CLASS_COMMUNICATION_OTHER0x0780: return "Communication controller"; | |||
| 700 | ||||
| 701 | case PCI_CLASS_SYSTEM_PIC0x0800: return "PIC"; | |||
| 702 | case PCI_CLASS_SYSTEM_DMA0x0801: return "DMA controller"; | |||
| 703 | case PCI_CLASS_SYSTEM_TIMER0x0802: return "Timer"; | |||
| 704 | case PCI_CLASS_SYSTEM_RTC0x0803: return "RTC"; | |||
| 705 | case PCI_CLASS_SYSTEM_OTHER0x0880: return "System peripheral"; | |||
| 706 | ||||
| 707 | case PCI_CLASS_INPUT_KEYBOARD0x0900: return "Keyboard controller"; | |||
| 708 | case PCI_CLASS_INPUT_PEN0x0901: return "Digitizer Pen"; | |||
| 709 | case PCI_CLASS_INPUT_MOUSE0x0902: return "Mouse controller"; | |||
| 710 | case PCI_CLASS_INPUT_OTHER0x0980: return "Input device controller"; | |||
| 711 | ||||
| 712 | case PCI_CLASS_DOCKING_GENERIC0x0a00: return "Generic Docking Station"; | |||
| 713 | case PCI_CLASS_DOCKING_OTHER0x0a01: return "Docking Station"; | |||
| 714 | ||||
| 715 | case PCI_CLASS_PROCESSOR_3860x0b00: return "386"; | |||
| 716 | case PCI_CLASS_PROCESSOR_4860x0b01: return "486"; | |||
| 717 | case PCI_CLASS_PROCESSOR_PENTIUM0x0b02: return "Pentium"; | |||
| 718 | case PCI_CLASS_PROCESSOR_ALPHA0x0b10: return "Alpha"; | |||
| 719 | case PCI_CLASS_PROCESSOR_POWERPC0x0b20: return "Power PC"; | |||
| 720 | case PCI_CLASS_PROCESSOR_CO0x0b40: return "Co-processor"; | |||
| 721 | ||||
| 722 | case PCI_CLASS_SERIAL_FIREWIRE0x0c00: return "FireWire (IEEE 1394)"; | |||
| 723 | case PCI_CLASS_SERIAL_ACCESS0x0c01: return "ACCESS Bus"; | |||
| 724 | case PCI_CLASS_SERIAL_SSA0x0c02: return "SSA"; | |||
| 725 | case PCI_CLASS_SERIAL_USB0x0c03: return "USB Controller"; | |||
| 726 | case PCI_CLASS_SERIAL_FIBER0x0c04: return "Fiber Channel"; | |||
| 727 | ||||
| 728 | default: return "Unknown class"; | |||
| 729 | } | |||
| 730 | } | |||
| 731 | ||||
| 732 | ||||
| 733 | const char *pci_strvendor(unsigned int vendor) | |||
| 734 | { | |||
| 735 | switch (vendor) { | |||
| 736 | case PCI_VENDOR_ID_COMPAQ0x0e11: return "Compaq"; | |||
| 737 | case PCI_VENDOR_ID_NCR0x1000: return "NCR"; | |||
| 738 | case PCI_VENDOR_ID_ATI0x1002: return "ATI"; | |||
| 739 | case PCI_VENDOR_ID_VLSI0x1004: return "VLSI"; | |||
| 740 | case PCI_VENDOR_ID_ADL0x1005: return "Advance Logic"; | |||
| 741 | case PCI_VENDOR_ID_NS0x100b: return "NS"; | |||
| 742 | case PCI_VENDOR_ID_TSENG0x100c: return "Tseng'Lab"; | |||
| 743 | case PCI_VENDOR_ID_WEITEK0x100e: return "Weitek"; | |||
| 744 | case PCI_VENDOR_ID_DEC0x1011: return "DEC"; | |||
| 745 | case PCI_VENDOR_ID_CIRRUS0x1013: return "Cirrus Logic"; | |||
| 746 | case PCI_VENDOR_ID_IBM0x1014: return "IBM"; | |||
| 747 | case PCI_VENDOR_ID_WD0x101c: return "Western Digital"; | |||
| 748 | case PCI_VENDOR_ID_AMD0x1022: return "AMD"; | |||
| 749 | case PCI_VENDOR_ID_TRIDENT0x1023: return "Trident"; | |||
| 750 | case PCI_VENDOR_ID_AI0x1025: return "Acer Incorporated"; | |||
| 751 | case PCI_VENDOR_ID_MATROX0x102B: return "Matrox"; | |||
| 752 | case PCI_VENDOR_ID_CT0x102c: return "Chips & Technologies"; | |||
| 753 | case PCI_VENDOR_ID_MIRO0x1031: return "Miro"; | |||
| 754 | case PCI_VENDOR_ID_NEC0x1033: return "NEC"; | |||
| 755 | case PCI_VENDOR_ID_FD0x1036: return "Future Domain"; | |||
| 756 | case PCI_VENDOR_ID_SI0x1039: return "Silicon Integrated Systems"; | |||
| 757 | case PCI_VENDOR_ID_HP0x103c: return "Hewlett Packard"; | |||
| 758 | case PCI_VENDOR_ID_PCTECH0x1042: return "PCTECH"; | |||
| 759 | case PCI_VENDOR_ID_DPT0x1044: return "DPT"; | |||
| 760 | case PCI_VENDOR_ID_OPTI0x1045: return "OPTi"; | |||
| 761 | case PCI_VENDOR_ID_SGS0x104a: return "SGS Thomson"; | |||
| 762 | case PCI_VENDOR_ID_BUSLOGIC0x104B: return "BusLogic"; | |||
| 763 | case PCI_VENDOR_ID_TI0x104c: return "Texas Instruments"; | |||
| 764 | case PCI_VENDOR_ID_OAK0x104e: return "OAK"; | |||
| 765 | case PCI_VENDOR_ID_WINBOND20x1050: return "Winbond"; | |||
| 766 | case PCI_VENDOR_ID_MOTOROLA0x1057: return "Motorola"; | |||
| 767 | case PCI_VENDOR_ID_PROMISE0x105a: return "Promise Technology"; | |||
| 768 | case PCI_VENDOR_ID_APPLE0x106b: return "Apple"; | |||
| 769 | case PCI_VENDOR_ID_N90x105d: return "Number Nine"; | |||
| 770 | case PCI_VENDOR_ID_UMC0x1060: return "UMC"; | |||
| 771 | case PCI_VENDOR_ID_X0x1061: return "X TECHNOLOGY"; | |||
| 772 | case PCI_VENDOR_ID_NEXGEN0x1074: return "Nexgen"; | |||
| 773 | case PCI_VENDOR_ID_QLOGIC0x1077: return "Q Logic"; | |||
| 774 | case PCI_VENDOR_ID_LEADTEK0x107d: return "Leadtek Research"; | |||
| 775 | case PCI_VENDOR_ID_CONTAQ0x1080: return "Contaq"; | |||
| 776 | case PCI_VENDOR_ID_FOREX0x1083: return "Forex"; | |||
| 777 | case PCI_VENDOR_ID_OLICOM0x108d: return "Olicom"; | |||
| 778 | case PCI_VENDOR_ID_CMD0x1095: return "CMD"; | |||
| 779 | case PCI_VENDOR_ID_VISION0x1098: return "Vision"; | |||
| 780 | case PCI_VENDOR_ID_BROOKTREE0x109e: return "Brooktree"; | |||
| 781 | case PCI_VENDOR_ID_SIERRA0x10a8: return "Sierra"; | |||
| 782 | case PCI_VENDOR_ID_ACC0x10aa: return "ACC MICROELECTRONICS"; | |||
| 783 | case PCI_VENDOR_ID_WINBOND0x10ad: return "Winbond"; | |||
| 784 | case PCI_VENDOR_ID_DATABOOK0x10b3: return "Databook"; | |||
| 785 | case PCI_VENDOR_ID_3COM0x10b7: return "3Com"; | |||
| 786 | case PCI_VENDOR_ID_SMC0x10b8: return "SMC"; | |||
| 787 | case PCI_VENDOR_ID_AL0x10b9: return "Acer Labs"; | |||
| 788 | case PCI_VENDOR_ID_MITSUBISHI0x10ba: return "Mitsubishi"; | |||
| 789 | case PCI_VENDOR_ID_NEOMAGIC0x10c8: return "Neomagic"; | |||
| 790 | case PCI_VENDOR_ID_ASP0x10cd: return "Advanced System Products"; | |||
| 791 | case PCI_VENDOR_ID_CERN0x10dc: return "CERN"; | |||
| 792 | case PCI_VENDOR_ID_IMS0x10e0: return "IMS"; | |||
| 793 | case PCI_VENDOR_ID_TEKRAM20x10e1: return "Tekram"; | |||
| 794 | case PCI_VENDOR_ID_TUNDRA0x10e3: return "Tundra"; | |||
| 795 | case PCI_VENDOR_ID_AMCC0x10e8: return "AMCC"; | |||
| 796 | case PCI_VENDOR_ID_INTERG0x10ea: return "Intergraphics"; | |||
| 797 | case PCI_VENDOR_ID_REALTEK0x10ec: return "Realtek"; | |||
| 798 | case PCI_VENDOR_ID_TRUEVISION0x10fa: return "Truevision"; | |||
| 799 | case PCI_VENDOR_ID_INIT0x1101: return "Initio Corp"; | |||
| 800 | case PCI_VENDOR_ID_VIA0x1106: return "VIA Technologies"; | |||
| 801 | case PCI_VENDOR_ID_VORTEX0x1119: return "VORTEX"; | |||
| 802 | case PCI_VENDOR_ID_EF0x111a: return "Efficient Networks"; | |||
| 803 | case PCI_VENDOR_ID_FORE0x1127: return "Fore Systems"; | |||
| 804 | case PCI_VENDOR_ID_IMAGINGTECH0x112f: return "Imaging Technology"; | |||
| 805 | case PCI_VENDOR_ID_PHILIPS0x1131: return "Philips"; | |||
| 806 | case PCI_VENDOR_ID_PLX0x10b5: return "PLX"; | |||
| 807 | case PCI_VENDOR_ID_ALLIANCE0x1142: return "Alliance"; | |||
| 808 | case PCI_VENDOR_ID_VMIC0x114a: return "VMIC"; | |||
| 809 | case PCI_VENDOR_ID_DIGI0x114f: return "Digi Intl."; | |||
| 810 | case PCI_VENDOR_ID_MUTECH0x1159: return "Mutech"; | |||
| 811 | case PCI_VENDOR_ID_RENDITION0x1163: return "Rendition"; | |||
| 812 | case PCI_VENDOR_ID_TOSHIBA0x1179: return "Toshiba"; | |||
| 813 | case PCI_VENDOR_ID_RICOH0x1180: return "Ricoh"; | |||
| 814 | case PCI_VENDOR_ID_ZEITNET0x1193: return "ZeitNet"; | |||
| 815 | case PCI_VENDOR_ID_OMEGA0x119b: return "Omega Micro"; | |||
| 816 | case PCI_VENDOR_ID_NP0x11bc: return "Network Peripherals"; | |||
| 817 | case PCI_VENDOR_ID_SPECIALIX0x11cb: return "Specialix"; | |||
| 818 | case PCI_VENDOR_ID_IKON0x11d5: return "Ikon"; | |||
| 819 | case PCI_VENDOR_ID_ZORAN0x11de: return "Zoran"; | |||
| 820 | case PCI_VENDOR_ID_COMPEX0x11f6: return "Compex"; | |||
| 821 | case PCI_VENDOR_ID_RP0x11fe: return "Comtrol"; | |||
| 822 | case PCI_VENDOR_ID_CYCLADES0x120e: return "Cyclades"; | |||
| 823 | case PCI_VENDOR_ID_3DFX0x121a: return "3Dfx"; | |||
| 824 | case PCI_VENDOR_ID_SIGMADES0x1236: return "Sigma Designs"; | |||
| 825 | case PCI_VENDOR_ID_OPTIBASE0x1255: return "Optibase"; | |||
| 826 | case PCI_VENDOR_ID_NVIDIA_SGS0x12d2: return "NVidia/SGS Thomson"; | |||
| 827 | case PCI_VENDOR_ID_ENSONIQ0x1274: return "Ensoniq"; | |||
| 828 | case PCI_VENDOR_ID_SYMPHONY0x1c1c: return "Symphony"; | |||
| 829 | case PCI_VENDOR_ID_TEKRAM0x1de1: return "Tekram"; | |||
| 830 | case PCI_VENDOR_ID_3DLABS0x3d3d: return "3Dlabs"; | |||
| 831 | case PCI_VENDOR_ID_AVANCE0x4005: return "Avance"; | |||
| 832 | case PCI_VENDOR_ID_NETVIN0x4a14: return "NetVin"; | |||
| 833 | case PCI_VENDOR_ID_S30x5333: return "S3 Inc."; | |||
| 834 | case PCI_VENDOR_ID_INTEL0x8086: return "Intel"; | |||
| 835 | case PCI_VENDOR_ID_KTI0x8e2e: return "KTI"; | |||
| 836 | case PCI_VENDOR_ID_ADAPTEC0x9004: return "Adaptec"; | |||
| 837 | case PCI_VENDOR_ID_ADAPTEC20x9005: return "Adaptec"; | |||
| 838 | case PCI_VENDOR_ID_ATRONICS0x907f: return "Atronics"; | |||
| 839 | case PCI_VENDOR_ID_ARK0xedd8: return "ARK Logic"; | |||
| 840 | case PCI_VENDOR_ID_ASIX0x125b: return "ASIX"; | |||
| 841 | case PCI_VENDOR_ID_LITEON0x11ad: return "Lite-on"; | |||
| 842 | default: return "Unknown vendor"; | |||
| 843 | } | |||
| 844 | } | |||
| 845 | ||||
| 846 | ||||
| 847 | const char *pci_strdev(unsigned int vendor, unsigned int device) | |||
| 848 | { | |||
| 849 | struct pci_dev_info *info; | |||
| 850 | ||||
| 851 | info = pci_lookup_dev(vendor, device); | |||
| 852 | return info ? info->name : "Unknown device"; | |||
| 853 | } | |||
| 854 | ||||
| 855 | ||||
| 856 | ||||
| 857 | /* | |||
| 858 | * Turn on/off PCI bridge optimization. This should allow benchmarking. | |||
| 859 | */ | |||
| 860 | static void burst_bridge(unsigned char bus, unsigned char devfn, | |||
| 861 | unsigned char pos, int turn_on) | |||
| 862 | { | |||
| 863 | #ifdef CONFIG_PCI_OPTIMIZE1 | |||
| 864 | struct bridge_mapping_type *bmap; | |||
| 865 | unsigned char val; | |||
| 866 | int i; | |||
| 867 | ||||
| 868 | pos *= NUM_OPTIMIZATIONS(sizeof(bridge_optimization) / sizeof(bridge_optimization[0]) ); | |||
| 869 | printk("PCI bridge optimization.\n"); | |||
| 870 | for (i = 0; i < NUM_OPTIMIZATIONS(sizeof(bridge_optimization) / sizeof(bridge_optimization[0]) ); i++) { | |||
| 871 | printk(" %s: ", bridge_optimization[i].type); | |||
| 872 | bmap = &bridge_mapping[pos + i]; | |||
| 873 | if (!bmap->addr) { | |||
| 874 | printk("Not supported."); | |||
| 875 | } else { | |||
| 876 | pcibios_read_config_byte(bus, devfn, bmap->addr, &val); | |||
| 877 | if ((val & bmap->mask) == bmap->value) { | |||
| 878 | printk("%s.", bridge_optimization[i].on); | |||
| 879 | if (!turn_on) { | |||
| 880 | pcibios_write_config_byte(bus, devfn, | |||
| 881 | bmap->addr, | |||
| 882 | (val | bmap->mask) | |||
| 883 | - bmap->value); | |||
| 884 | printk("Changed! Now %s.", bridge_optimization[i].off); | |||
| 885 | } | |||
| 886 | } else { | |||
| 887 | printk("%s.", bridge_optimization[i].off); | |||
| 888 | if (turn_on) { | |||
| 889 | pcibios_write_config_byte(bus, devfn, | |||
| 890 | bmap->addr, | |||
| 891 | (val & (0xff - bmap->mask)) | |||
| 892 | + bmap->value); | |||
| 893 | printk("Changed! Now %s.", bridge_optimization[i].on); | |||
| 894 | } | |||
| 895 | } | |||
| 896 | } | |||
| 897 | printk("\n"); | |||
| 898 | } | |||
| 899 | #endif /* CONFIG_PCI_OPTIMIZE */ | |||
| 900 | } | |||
| 901 | ||||
| 902 | ||||
| 903 | /* | |||
| 904 | * Convert some of the configuration space registers of the device at | |||
| 905 | * address (bus,devfn) into a string (possibly several lines each). | |||
| 906 | * The configuration string is stored starting at buf[len]. If the | |||
| 907 | * string would exceed the size of the buffer (SIZE), 0 is returned. | |||
| 908 | */ | |||
| 909 | static int sprint_dev_config(struct pci_dev *dev, char *buf, int size) | |||
| 910 | { | |||
| 911 | unsigned long base; | |||
| 912 | unsigned int l, class_rev, bus, devfn, last_reg; | |||
| 913 | unsigned short vendor, device, status; | |||
| 914 | unsigned char bist, latency, min_gnt, max_lat, hdr_type; | |||
| 915 | int reg, len = 0; | |||
| 916 | const char *str; | |||
| 917 | ||||
| 918 | bus = dev->bus->number; | |||
| 919 | devfn = dev->devfn; | |||
| 920 | ||||
| 921 | pcibios_read_config_byte (bus, devfn, PCI_HEADER_TYPE0x0e, &hdr_type); | |||
| 922 | pcibios_read_config_dword(bus, devfn, PCI_CLASS_REVISION0x08, &class_rev); | |||
| 923 | pcibios_read_config_word (bus, devfn, PCI_VENDOR_ID0x00, &vendor); | |||
| 924 | pcibios_read_config_word (bus, devfn, PCI_DEVICE_ID0x02, &device); | |||
| 925 | pcibios_read_config_word (bus, devfn, PCI_STATUS0x06, &status); | |||
| 926 | pcibios_read_config_byte (bus, devfn, PCI_BIST0x0f, &bist); | |||
| 927 | pcibios_read_config_byte (bus, devfn, PCI_LATENCY_TIMER0x0d, &latency); | |||
| 928 | pcibios_read_config_byte (bus, devfn, PCI_MIN_GNT0x3e, &min_gnt); | |||
| 929 | pcibios_read_config_byte (bus, devfn, PCI_MAX_LAT0x3f, &max_lat); | |||
| 930 | if (len + 80 > size) { | |||
| 931 | return -1; | |||
| 932 | } | |||
| 933 | len += sprintflinux_sprintf(buf + len, " Bus %2d, device %3d, function %2d:\n", | |||
| 934 | bus, PCI_SLOT(devfn)(((devfn) >> 3) & 0x1f), PCI_FUNC(devfn)((devfn) & 0x07)); | |||
| 935 | ||||
| 936 | if (len + 80 > size) { | |||
| 937 | return -1; | |||
| 938 | } | |||
| 939 | len += sprintflinux_sprintf(buf + len, " %s: %s %s (rev %d).\n ", | |||
| 940 | pci_strclass(class_rev >> 8), pci_strvendor(vendor), | |||
| 941 | pci_strdev(vendor, device), class_rev & 0xff); | |||
| 942 | ||||
| 943 | if (!pci_lookup_dev(vendor, device)) { | |||
| 944 | len += sprintflinux_sprintf(buf + len, | |||
| 945 | "Vendor id=%x. Device id=%x.\n ", | |||
| 946 | vendor, device); | |||
| 947 | } | |||
| 948 | ||||
| 949 | str = 0; /* to keep gcc shut... */ | |||
| 950 | switch (status & PCI_STATUS_DEVSEL_MASK0x600) { | |||
| 951 | case PCI_STATUS_DEVSEL_FAST0x000: str = "Fast devsel. "; break; | |||
| 952 | case PCI_STATUS_DEVSEL_MEDIUM0x200: str = "Medium devsel. "; break; | |||
| 953 | case PCI_STATUS_DEVSEL_SLOW0x400: str = "Slow devsel. "; break; | |||
| 954 | } | |||
| 955 | if (len + strlen(str) > size) { | |||
| ||||
| 956 | return -1; | |||
| 957 | } | |||
| 958 | len += sprintflinux_sprintf(buf + len, str); | |||
| 959 | ||||
| 960 | if (status & PCI_STATUS_FAST_BACK0x80) { | |||
| 961 | # define fast_b2b_capable "Fast back-to-back capable. " | |||
| 962 | if (len + strlen(fast_b2b_capable) > size) { | |||
| 963 | return -1; | |||
| 964 | } | |||
| 965 | len += sprintflinux_sprintf(buf + len, fast_b2b_capable); | |||
| 966 | # undef fast_b2b_capable | |||
| 967 | } | |||
| 968 | ||||
| 969 | if (bist & PCI_BIST_CAPABLE0x80) { | |||
| 970 | # define BIST_capable "BIST capable. " | |||
| 971 | if (len + strlen(BIST_capable) > size) { | |||
| 972 | return -1; | |||
| 973 | } | |||
| 974 | len += sprintflinux_sprintf(buf + len, BIST_capable); | |||
| 975 | # undef BIST_capable | |||
| 976 | } | |||
| 977 | ||||
| 978 | if (dev->irq) { | |||
| 979 | if (len + 40 > size) { | |||
| 980 | return -1; | |||
| 981 | } | |||
| 982 | len += sprintflinux_sprintf(buf + len, "IRQ %d. ", dev->irq); | |||
| 983 | } | |||
| 984 | ||||
| 985 | if (dev->master) { | |||
| 986 | if (len + 80 > size) { | |||
| 987 | return -1; | |||
| 988 | } | |||
| 989 | len += sprintflinux_sprintf(buf + len, "Master Capable. "); | |||
| 990 | if (latency) | |||
| 991 | len += sprintflinux_sprintf(buf + len, "Latency=%d. ", latency); | |||
| 992 | else | |||
| 993 | len += sprintflinux_sprintf(buf + len, "No bursts. "); | |||
| 994 | if (min_gnt) | |||
| 995 | len += sprintflinux_sprintf(buf + len, "Min Gnt=%d.", min_gnt); | |||
| 996 | if (max_lat) | |||
| 997 | len += sprintflinux_sprintf(buf + len, "Max Lat=%d.", max_lat); | |||
| 998 | } | |||
| 999 | ||||
| 1000 | switch (hdr_type & 0x7f) { | |||
| 1001 | case 0: | |||
| 1002 | last_reg = PCI_BASE_ADDRESS_50x24; | |||
| 1003 | break; | |||
| 1004 | case 1: | |||
| 1005 | last_reg = PCI_BASE_ADDRESS_10x14; | |||
| 1006 | break; | |||
| 1007 | default: | |||
| 1008 | last_reg = 0; | |||
| 1009 | } | |||
| 1010 | for (reg = PCI_BASE_ADDRESS_00x10; reg <= last_reg; reg += 4) { | |||
| 1011 | if (len + 40 > size) { | |||
| 1012 | return -1; | |||
| 1013 | } | |||
| 1014 | pcibios_read_config_dword(bus, devfn, reg, &l); | |||
| 1015 | base = l; | |||
| 1016 | if (!base) { | |||
| 1017 | continue; | |||
| 1018 | } | |||
| 1019 | ||||
| 1020 | if (base & PCI_BASE_ADDRESS_SPACE_IO0x01) { | |||
| 1021 | len += sprintflinux_sprintf(buf + len, | |||
| 1022 | "\n I/O at 0x%lx.", | |||
| 1023 | base & PCI_BASE_ADDRESS_IO_MASK(~0x03)); | |||
| 1024 | } else { | |||
| 1025 | const char *pref, *type = "unknown"; | |||
| 1026 | ||||
| 1027 | if (base & PCI_BASE_ADDRESS_MEM_PREFETCH0x08) { | |||
| 1028 | pref = "P"; | |||
| 1029 | } else { | |||
| 1030 | pref = "Non-p"; | |||
| 1031 | } | |||
| 1032 | switch (base & PCI_BASE_ADDRESS_MEM_TYPE_MASK0x06) { | |||
| 1033 | case PCI_BASE_ADDRESS_MEM_TYPE_320x00: | |||
| 1034 | type = "32 bit"; break; | |||
| 1035 | case PCI_BASE_ADDRESS_MEM_TYPE_1M0x02: | |||
| 1036 | type = "20 bit"; break; | |||
| 1037 | case PCI_BASE_ADDRESS_MEM_TYPE_640x04: | |||
| 1038 | type = "64 bit"; | |||
| 1039 | /* read top 32 bit address of base addr: */ | |||
| 1040 | reg += 4; | |||
| 1041 | pcibios_read_config_dword(bus, devfn, reg, &l); | |||
| 1042 | base |= ((u64) l) << 32; | |||
| 1043 | break; | |||
| 1044 | } | |||
| 1045 | len += sprintflinux_sprintf(buf + len, | |||
| 1046 | "\n %srefetchable %s memory at " | |||
| 1047 | "0x%lx.", pref, type, | |||
| 1048 | base & PCI_BASE_ADDRESS_MEM_MASK(~0x0f)); | |||
| 1049 | } | |||
| 1050 | } | |||
| 1051 | ||||
| 1052 | len += sprintflinux_sprintf(buf + len, "\n"); | |||
| 1053 | return len; | |||
| 1054 | } | |||
| 1055 | ||||
| 1056 | ||||
| 1057 | /* | |||
| 1058 | * Return list of PCI devices as a character string for /proc/pci. | |||
| 1059 | * BUF is a buffer that is PAGE_SIZE bytes long. | |||
| 1060 | */ | |||
| 1061 | int get_pci_list(char *buf) | |||
| 1062 | { | |||
| 1063 | int nprinted, len, size; | |||
| 1064 | struct pci_dev *dev; | |||
| 1065 | # define MSG"\nwarning: page-size limit reached!\n" "\nwarning: page-size limit reached!\n" | |||
| 1066 | ||||
| 1067 | /* reserve same for truncation warning message: */ | |||
| 1068 | size = PAGE_SIZE(1 << 12) - (strlen(MSG"\nwarning: page-size limit reached!\n") + 1); | |||
| 1069 | len = sprintflinux_sprintf(buf, "PCI devices found:\n"); | |||
| 1070 | ||||
| 1071 | for (dev = pci_devices; dev; dev = dev->next) { | |||
| ||||
| 1072 | nprinted = sprint_dev_config(dev, buf + len, size - len); | |||
| 1073 | if (nprinted < 0) { | |||
| 1074 | return len + sprintflinux_sprintf(buf + len, MSG"\nwarning: page-size limit reached!\n"); | |||
| 1075 | } | |||
| 1076 | len += nprinted; | |||
| 1077 | } | |||
| 1078 | return len; | |||
| 1079 | } | |||
| 1080 | ||||
| 1081 | ||||
| 1082 | /* | |||
| 1083 | * pci_malloc() returns initialized memory of size SIZE. Can be | |||
| 1084 | * used only while pci_init() is active. | |||
| 1085 | */ | |||
| 1086 | static void *pci_malloc(long size, unsigned long *mem_startp) | |||
| 1087 | { | |||
| 1088 | void *mem; | |||
| 1089 | ||||
| 1090 | #ifdef DEBUG | |||
| 1091 | printk("...pci_malloc(size=%ld,mem=%p)", size, *mem_startp); | |||
| 1092 | #endif | |||
| 1093 | mem = (void*) *mem_startp; | |||
| 1094 | *mem_startp += (size + sizeof(void*) - 1) & ~(sizeof(void*) - 1); | |||
| 1095 | memset(mem, 0, size)(__builtin_constant_p(0) ? (__builtin_constant_p((size)) ? __constant_c_and_count_memset (((mem)),((0x01010101UL*(unsigned char)(0))),((size))) : __constant_c_memset (((mem)),((0x01010101UL*(unsigned char)(0))),((size)))) : (__builtin_constant_p ((size)) ? __memset_generic((((mem))),(((0))),(((size)))) : __memset_generic (((mem)),((0)),((size))))); | |||
| 1096 | return mem; | |||
| 1097 | } | |||
| 1098 | ||||
| 1099 | ||||
| 1100 | static unsigned int scan_bus(struct pci_bus *bus, unsigned long *mem_startp) | |||
| 1101 | { | |||
| 1102 | unsigned int devfn, l, max; | |||
| 1103 | unsigned char cmd, tmp, hdr_type, ht, is_multi = 0; | |||
| 1104 | struct pci_dev_info *info; | |||
| 1105 | struct pci_dev *dev; | |||
| 1106 | struct pci_bus *child; | |||
| 1107 | ||||
| 1108 | #ifdef DEBUG | |||
| 1109 | printk("...scan_bus(busno=%d,mem=%p)\n", bus->number, *mem_startp); | |||
| 1110 | #endif | |||
| 1111 | ||||
| 1112 | max = bus->secondary; | |||
| 1113 | for (devfn = 0; devfn < 0xff; ++devfn) { | |||
| 1114 | if (PCI_FUNC(devfn)((devfn) & 0x07) && !is_multi) { | |||
| 1115 | /* Not a multi-function device */ | |||
| 1116 | continue; | |||
| 1117 | } | |||
| 1118 | pcibios_read_config_byte(bus->number, devfn, PCI_HEADER_TYPE0x0e, &hdr_type); | |||
| 1119 | if (!PCI_FUNC(devfn)((devfn) & 0x07)) | |||
| 1120 | is_multi = hdr_type & 0x80; | |||
| 1121 | ||||
| 1122 | pcibios_read_config_dword(bus->number, devfn, PCI_VENDOR_ID0x00, &l); | |||
| 1123 | /* some broken boards return 0 if a slot is empty: */ | |||
| 1124 | if (l == 0xffffffff || l == 0x00000000 || l == 0x0000ffff || l == 0xffff0000) | |||
| 1125 | continue; | |||
| 1126 | ||||
| 1127 | dev = pci_malloc(sizeof(*dev), mem_startp); | |||
| 1128 | dev->bus = bus; | |||
| 1129 | dev->devfn = devfn; | |||
| 1130 | dev->vendor = l & 0xffff; | |||
| 1131 | dev->device = (l >> 16) & 0xffff; | |||
| 1132 | ||||
| 1133 | /* | |||
| 1134 | * Check to see if we know about this device and report | |||
| 1135 | * a message at boot time. This is the only way to | |||
| 1136 | * learn about new hardware... | |||
| 1137 | */ | |||
| 1138 | info = pci_lookup_dev(dev->vendor, dev->device); | |||
| 1139 | if (!info) { | |||
| 1140 | #if 0 | |||
| 1141 | printk("Warning : Unknown PCI device (%x:%x). Please read include/linux/pci.h\n", | |||
| 1142 | dev->vendor, dev->device); | |||
| 1143 | #endif | |||
| 1144 | } else { | |||
| 1145 | /* Some BIOS' are lazy. Let's do their job: */ | |||
| 1146 | if (info->bridge_type != 0xff) { | |||
| 1147 | burst_bridge(bus->number, devfn, | |||
| 1148 | info->bridge_type, 1); | |||
| 1149 | } | |||
| 1150 | } | |||
| 1151 | ||||
| 1152 | /* non-destructively determine if device can be a master: */ | |||
| 1153 | pcibios_read_config_byte(bus->number, devfn, PCI_COMMAND0x04, | |||
| 1154 | &cmd); | |||
| 1155 | pcibios_write_config_byte(bus->number, devfn, PCI_COMMAND0x04, | |||
| 1156 | cmd | PCI_COMMAND_MASTER0x4); | |||
| 1157 | pcibios_read_config_byte(bus->number, devfn, PCI_COMMAND0x04, | |||
| 1158 | &tmp); | |||
| 1159 | dev->master = ((tmp & PCI_COMMAND_MASTER0x4) != 0); | |||
| 1160 | pcibios_write_config_byte(bus->number, devfn, PCI_COMMAND0x04, | |||
| 1161 | cmd); | |||
| 1162 | ||||
| 1163 | /* read irq level (may be changed during pcibios_fixup()): */ | |||
| 1164 | pcibios_read_config_byte(bus->number, devfn, | |||
| 1165 | PCI_INTERRUPT_LINE0x3c, &dev->irq); | |||
| 1166 | ||||
| 1167 | /* check to see if this device is a PCI-PCI bridge: */ | |||
| 1168 | pcibios_read_config_dword(bus->number, devfn, | |||
| 1169 | PCI_CLASS_REVISION0x08, &l); | |||
| 1170 | l = l >> 8; /* upper 3 bytes */ | |||
| 1171 | dev->class = l; | |||
| 1172 | ||||
| 1173 | /* | |||
| 1174 | * Check if the header type is known and consistent with | |||
| 1175 | * device type. PCI-to-PCI Bridges should have hdr_type 1, | |||
| 1176 | * CardBus Bridges 2, all other devices 0. | |||
| 1177 | */ | |||
| 1178 | switch (dev->class >> 8) { | |||
| 1179 | case PCI_CLASS_BRIDGE_PCI0x0604: | |||
| 1180 | ht = 1; | |||
| 1181 | break; | |||
| 1182 | case PCI_CLASS_BRIDGE_CARDBUS0x0607: | |||
| 1183 | ht = 2; | |||
| 1184 | break; | |||
| 1185 | default: | |||
| 1186 | ht = 0; | |||
| 1187 | } | |||
| 1188 | if (ht != (hdr_type & 0x7f)) { | |||
| 1189 | printk(KERN_WARNING"<4>" "PCI: %02x:%02x [%04x/%04x/%06x] has unknown header type %02x, ignoring.\n", | |||
| 1190 | bus->number, dev->devfn, dev->vendor, dev->device, dev->class, hdr_type); | |||
| 1191 | continue; | |||
| 1192 | } | |||
| 1193 | ||||
| 1194 | /* | |||
| 1195 | * Put it into the simple chain of all PCI devices. | |||
| 1196 | * It is used to find devices once everything is set up. | |||
| 1197 | */ | |||
| 1198 | dev->next = pci_devices; | |||
| 1199 | pci_devices = dev; | |||
| 1200 | ||||
| 1201 | /* | |||
| 1202 | * Now insert it into the list of devices held | |||
| 1203 | * by the parent bus. | |||
| 1204 | */ | |||
| 1205 | dev->sibling = bus->devices; | |||
| 1206 | bus->devices = dev; | |||
| 1207 | ||||
| 1208 | if (dev->class >> 8 == PCI_CLASS_BRIDGE_PCI0x0604) { | |||
| 1209 | unsigned int buses; | |||
| 1210 | unsigned short cr; | |||
| 1211 | ||||
| 1212 | /* | |||
| 1213 | * Insert it into the tree of buses. | |||
| 1214 | */ | |||
| 1215 | child = pci_malloc(sizeof(*child), mem_startp); | |||
| 1216 | child->next = bus->children; | |||
| 1217 | bus->children = child; | |||
| 1218 | child->self = dev; | |||
| 1219 | child->parent = bus; | |||
| 1220 | ||||
| 1221 | /* | |||
| 1222 | * Set up the primary, secondary and subordinate | |||
| 1223 | * bus numbers. | |||
| 1224 | */ | |||
| 1225 | child->number = child->secondary = ++max; | |||
| 1226 | child->primary = bus->secondary; | |||
| 1227 | child->subordinate = 0xff; | |||
| 1228 | /* | |||
| 1229 | * Clear all status bits and turn off memory, | |||
| 1230 | * I/O and master enables. | |||
| 1231 | */ | |||
| 1232 | pcibios_read_config_word(bus->number, devfn, | |||
| 1233 | PCI_COMMAND0x04, &cr); | |||
| 1234 | pcibios_write_config_word(bus->number, devfn, | |||
| 1235 | PCI_COMMAND0x04, 0x0000); | |||
| 1236 | pcibios_write_config_word(bus->number, devfn, | |||
| 1237 | PCI_STATUS0x06, 0xffff); | |||
| 1238 | /* | |||
| 1239 | * Read the existing primary/secondary/subordinate bus | |||
| 1240 | * number configuration to determine if the PCI bridge | |||
| 1241 | * has already been configured by the system. If so, | |||
| 1242 | * do not modify the configuration, merely note it. | |||
| 1243 | */ | |||
| 1244 | pcibios_read_config_dword(bus->number, devfn, 0x18, | |||
| 1245 | &buses); | |||
| 1246 | if ((buses & 0xFFFFFF) != 0) | |||
| 1247 | { | |||
| 1248 | child->primary = buses & 0xFF; | |||
| 1249 | child->secondary = (buses >> 8) & 0xFF; | |||
| 1250 | child->subordinate = (buses >> 16) & 0xFF; | |||
| 1251 | child->number = child->secondary; | |||
| 1252 | max = scan_bus(child, mem_startp); | |||
| 1253 | } | |||
| 1254 | else | |||
| 1255 | { | |||
| 1256 | /* | |||
| 1257 | * Configure the bus numbers for this bridge: | |||
| 1258 | */ | |||
| 1259 | buses &= 0xff000000; | |||
| 1260 | buses |= | |||
| 1261 | (((unsigned int)(child->primary) << 0) | | |||
| 1262 | ((unsigned int)(child->secondary) << 8) | | |||
| 1263 | ((unsigned int)(child->subordinate) << 16)); | |||
| 1264 | pcibios_write_config_dword(bus->number, devfn, 0x18, | |||
| 1265 | buses); | |||
| 1266 | /* | |||
| 1267 | * Now we can scan all subordinate buses: | |||
| 1268 | */ | |||
| 1269 | max = scan_bus(child, mem_startp); | |||
| 1270 | /* | |||
| 1271 | * Set the subordinate bus number to its real | |||
| 1272 | * value: | |||
| 1273 | */ | |||
| 1274 | child->subordinate = max; | |||
| 1275 | buses = (buses & 0xff00ffff) | |||
| 1276 | | ((unsigned int)(child->subordinate) << 16); | |||
| 1277 | pcibios_write_config_dword(bus->number, devfn, 0x18, | |||
| 1278 | buses); | |||
| 1279 | } | |||
| 1280 | pcibios_write_config_word(bus->number, devfn, | |||
| 1281 | PCI_COMMAND0x04, cr); | |||
| 1282 | } | |||
| 1283 | } | |||
| 1284 | /* | |||
| 1285 | * We've scanned the bus and so we know all about what's on | |||
| 1286 | * the other side of any bridges that may be on this bus plus | |||
| 1287 | * any devices. | |||
| 1288 | * | |||
| 1289 | * Return how far we've got finding sub-buses. | |||
| 1290 | */ | |||
| 1291 | return max; | |||
| 1292 | } | |||
| 1293 | ||||
| 1294 | ||||
| 1295 | unsigned long pci_init (unsigned long mem_start, unsigned long mem_end) | |||
| 1296 | { | |||
| 1297 | mem_start = pcibios_init(mem_start, mem_end); | |||
| 1298 | ||||
| 1299 | if (!pcibios_present()) { | |||
| 1300 | printk("pci_init: no BIOS32 detected\n"); | |||
| 1301 | return mem_start; | |||
| 1302 | } | |||
| 1303 | ||||
| 1304 | printk("Probing PCI hardware.\n"); | |||
| 1305 | ||||
| 1306 | memset(&pci_root, 0, sizeof(pci_root))(__builtin_constant_p(0) ? (__builtin_constant_p((sizeof(pci_root ))) ? __constant_c_and_count_memset(((&pci_root)),((0x01010101UL *(unsigned char)(0))),((sizeof(pci_root)))) : __constant_c_memset (((&pci_root)),((0x01010101UL*(unsigned char)(0))),((sizeof (pci_root))))) : (__builtin_constant_p((sizeof(pci_root))) ? __memset_generic ((((&pci_root))),(((0))),(((sizeof(pci_root))))) : __memset_generic (((&pci_root)),((0)),((sizeof(pci_root)))))); | |||
| 1307 | pci_root.subordinate = scan_bus(&pci_root, &mem_start); | |||
| 1308 | ||||
| 1309 | /* give BIOS a chance to apply platform specific fixes: */ | |||
| 1310 | mem_start = pcibios_fixup(mem_start, mem_end); | |||
| 1311 | ||||
| 1312 | #ifdef DEBUG | |||
| 1313 | { | |||
| 1314 | int len = get_pci_list((char*)mem_start); | |||
| 1315 | if (len) { | |||
| 1316 | ((char *) mem_start)[len] = '\0'; | |||
| 1317 | printk("%s\n", (char *) mem_start); | |||
| 1318 | } | |||
| 1319 | } | |||
| 1320 | #endif | |||
| 1321 | return mem_start; | |||
| 1322 | } |