1 #include "openbios/config.h"
2 #include "openbios/bindings.h"
3 #include "openbios/pci.h"
4 #include "libc/vsprintf.h"
6 #include "pci_database.h"
8 /* PCI devices database */
10 typedef struct pci_class_t pci_class_t
;
11 typedef struct pci_subclass_t pci_subclass_t
;
12 typedef struct pci_iface_t pci_iface_t
;
18 const pci_dev_t
*devices
;
19 int (*config_cb
)(const pci_config_t
*config
);
23 struct pci_subclass_t
{
27 const pci_dev_t
*devices
;
28 const pci_iface_t
*iface
;
29 int (*config_cb
)(const pci_config_t
*config
);
36 const pci_subclass_t
*subc
;
39 /* Current machine description */
41 static const pci_subclass_t undef_subclass
[] = {
43 0xFF, NULL
, NULL
, NULL
, NULL
,
48 static const pci_dev_t ide_devices
[] = {
50 PCI_VENDOR_ID_CMD
, PCI_DEVICE_ID_CMD_646
, /* CMD646 IDE controller */
51 "pci-ide", "pci-ata", NULL
,
52 "pci1095,646\0pci1095,646\0pciclass,01018f\0",
58 NULL
, NULL
, NULL
, NULL
,
64 static const pci_subclass_t mass_subclass
[] = {
66 PCI_SUBCLASS_STORAGE_SCSI
, "SCSI bus controller",
71 PCI_SUBCLASS_STORAGE_IDE
, "IDE controller",
72 "ide", ide_devices
, NULL
,
76 PCI_SUBCLASS_STORAGE_FLOPPY
, "Floppy disk controller",
81 PCI_SUBCLASS_STORAGE_IPI
, "IPI bus controller",
86 PCI_SUBCLASS_STORAGE_RAID
, "RAID controller",
91 PCI_SUBCLASS_STORAGE_ATA
, "ATA controller",
96 PCI_SUBCLASS_STORAGE_OTHER
, "misc mass-storage controller",
107 static const pci_dev_t eth_devices
[] = {
109 PCI_VENDOR_ID_REALTEK
, PCI_DEVICE_ID_REALTEK_RTL8029
,
110 NULL
, "NE2000", "NE2000 PCI", NULL
,
116 NULL
, NULL
, NULL
, NULL
,
122 static const pci_subclass_t net_subclass
[] = {
124 PCI_SUBCLASS_NETWORK_ETHERNET
, "ethernet controller",
125 NULL
, eth_devices
, NULL
,
126 eth_config_cb
, "ethernet",
129 PCI_SUBCLASS_NETWORK_TOKEN_RING
, "token ring controller",
134 PCI_SUBCLASS_NETWORK_FDDI
, "FDDI controller",
139 PCI_SUBCLASS_NETWORK_ATM
, "ATM controller",
144 PCI_SUBCLASS_NETWORK_ISDN
, "ISDN controller",
149 PCI_SUBCLASS_NETWORK_WORDFIP
, "WordFip controller",
154 PCI_SUBCLASS_NETWORK_PICMG214
, "PICMG 2.14 controller",
159 PCI_SUBCLASS_NETWORK_OTHER
, "misc network controller",
170 static const pci_dev_t vga_devices
[] = {
172 PCI_VENDOR_ID_ATI
, PCI_DEVICE_ID_ATI_RAGE128_PF
,
173 NULL
, "ATY", "ATY Rage128", "VGA\0",
178 PCI_VENDOR_ID_QEMU
, PCI_DEVICE_ID_QEMU_VGA
,
179 NULL
, "QEMU,VGA", "Qemu VGA", "VGA\0",
185 NULL
, NULL
, NULL
, NULL
,
191 static const struct pci_iface_t vga_iface
[] = {
193 0x00, "VGA controller", NULL
,
194 vga_devices
, &vga_config_cb
, NULL
,
197 0x01, "8514 compatible controller", NULL
,
206 static const pci_subclass_t displ_subclass
[] = {
208 PCI_SUBCLASS_DISPLAY_VGA
, "display controller",
209 NULL
, NULL
, vga_iface
,
213 PCI_SUBCLASS_DISPLAY_XGA
, "XGA display controller",
218 PCI_SUBCLASS_DISPLAY_3D
, "3D display controller",
223 PCI_SUBCLASS_DISPLAY_OTHER
, "misc display controller",
234 static const pci_subclass_t media_subclass
[] = {
236 PCI_SUBCLASS_MULTIMEDIA_VIDEO
, "video device",
241 PCI_SUBCLASS_MULTIMEDIA_AUDIO
, "audio device",
246 PCI_SUBCLASS_MULTIMEDIA_PHONE
, "computer telephony device",
251 PCI_SUBCLASS_MULTIMEDIA_OTHER
, "misc multimedia device",
262 static const pci_subclass_t mem_subclass
[] = {
264 PCI_SUBCLASS_MEMORY_RAM
, "RAM controller",
269 PCI_SUBCLASS_MEMORY_FLASH
, "flash controller",
281 static const pci_dev_t hbrg_devices
[] = {
283 PCI_VENDOR_ID_APPLE
, PCI_DEVICE_ID_APPLE_UNI_N_AGP
, NULL
,
284 "pci", "AAPL,UniNorth", "uni-north\0",
289 PCI_VENDOR_ID_APPLE
, PCI_DEVICE_ID_APPLE_UNI_N_PCI
, NULL
,
290 "pci", "AAPL,UniNorth", "uni-north\0",
292 host_config_cb
, NULL
,
295 PCI_VENDOR_ID_APPLE
, PCI_DEVICE_ID_APPLE_UNI_N_I_PCI
, NULL
,
296 "pci", "AAPL,UniNorth", "uni-north\0",
301 PCI_VENDOR_ID_MOTOROLA
, PCI_DEVICE_ID_MOTOROLA_MPC106
, "pci",
302 "pci", "MOT,MPC106", "grackle\0",
307 PCI_VENDOR_ID_MOTOROLA
, PCI_DEVICE_ID_MOTOROLA_RAVEN
, NULL
,
308 "pci-bridge", "PREP Host PCI Bridge - Motorola Raven", NULL
,
313 PCI_VENDOR_ID_SUN
, PCI_DEVICE_ID_SUN_SABRE
, NULL
,
314 "pci", "SUNW,sabre", "pci108e,a000\0pciclass,0\0",
316 host_config_cb
, NULL
,
320 NULL
, NULL
, NULL
, NULL
,
326 static const pci_dev_t PCIbrg_devices
[] = {
328 PCI_VENDOR_ID_DEC
, PCI_DEVICE_ID_DEC_21154
, NULL
,
329 "pci-bridge", "DEV,21154", "DEV,21154\0pci-bridge\0",
331 bridge_config_cb
, NULL
,
334 PCI_VENDOR_ID_SUN
, PCI_DEVICE_ID_SUN_SIMBA
, NULL
,
335 "pci", "SUNW,simba", "pci108e,5000\0pciclass,060400\0",
337 bridge_config_cb
, NULL
,
341 NULL
, NULL
, NULL
, NULL
,
347 static const pci_dev_t miscbrg_devices
[] = {
349 PCI_VENDOR_ID_SUN
, PCI_DEVICE_ID_SUN_EBUS
, NULL
,
350 "ebus", "ebus", "pci108e,1000\0pciclass,068000\0",
352 ebus_config_cb
, NULL
,
356 NULL
, NULL
, NULL
, NULL
,
362 static const pci_subclass_t bridg_subclass
[] = {
364 PCI_SUBCLASS_BRIDGE_HOST
, "PCI host bridge",
365 NULL
, hbrg_devices
, NULL
,
369 PCI_SUBCLASS_BRIDGE_ISA
, "ISA bridge",
374 PCI_SUBCLASS_BRIDGE_EISA
, "EISA bridge",
379 PCI_SUBCLASS_BRIDGE_MC
, "MCA bridge",
384 PCI_SUBCLASS_BRIDGE_PCI
, "PCI-to-PCI bridge",
385 NULL
, PCIbrg_devices
, NULL
,
389 PCI_SUBCLASS_BRIDGE_PCMCIA
, "PCMCIA bridge",
394 PCI_SUBCLASS_BRIDGE_NUBUS
, "NUBUS bridge",
399 PCI_SUBCLASS_BRIDGE_CARDBUS
, "cardbus bridge",
404 PCI_SUBCLASS_BRIDGE_RACEWAY
, "raceway bridge",
409 PCI_SUBCLASS_BRIDGE_PCI_SEMITP
, "semi-transparent PCI-to-PCI bridge",
414 PCI_SUBCLASS_BRIDGE_IB_PCI
, "infiniband-to-PCI bridge",
419 PCI_SUBCLASS_BRIDGE_OTHER
, "misc PCI bridge",
420 NULL
, miscbrg_devices
, NULL
,
430 static const pci_iface_t serial_iface
[] = {
432 0x00, "XT serial controller", NULL
,
436 0x01, "16450 serial controller", NULL
,
440 0x02, "16550 serial controller", NULL
,
444 0x03, "16650 serial controller", NULL
,
448 0x04, "16750 serial controller", NULL
,
452 0x05, "16850 serial controller", NULL
,
456 0x06, "16950 serial controller", NULL
,
465 static const pci_iface_t par_iface
[] = {
467 0x00, "parallel port", NULL
,
471 0x01, "bi-directional parallel port", NULL
,
475 0x02, "ECP 1.x parallel port", NULL
,
479 0x03, "IEEE 1284 controller", NULL
,
483 0xFE, "IEEE 1284 device", NULL
,
492 static const pci_iface_t modem_iface
[] = {
494 0x00, "generic modem", NULL
,
498 0x01, "Hayes 16450 modem", NULL
,
502 0x02, "Hayes 16550 modem", NULL
,
506 0x03, "Hayes 16650 modem", NULL
,
510 0x04, "Hayes 16750 modem", NULL
,
519 static const pci_subclass_t comm_subclass
[] = {
521 PCI_SUBCLASS_COMMUNICATION_SERIAL
, "serial controller",
522 NULL
, NULL
, serial_iface
,
526 PCI_SUBCLASS_COMMUNICATION_PARALLEL
, "parallel port",
527 NULL
, NULL
, par_iface
,
531 PCI_SUBCLASS_COMMUNICATION_MULTISERIAL
, "multiport serial controller",
536 PCI_SUBCLASS_COMMUNICATION_MODEM
, "modem",
537 NULL
, NULL
, modem_iface
,
541 PCI_SUBCLASS_COMMUNICATION_GPIB
, "GPIB controller",
546 PCI_SUBCLASS_COMMUNICATION_SC
, "smart card",
551 PCI_SUBCLASS_COMMUNICATION_OTHER
, "misc communication device",
562 static const pci_iface_t pic_iface
[] = {
564 0x00, "8259 PIC", NULL
,
568 0x01, "ISA PIC", NULL
,
572 0x02, "EISA PIC", NULL
,
576 0x10, "I/O APIC", NULL
,
580 0x20, "I/O APIC", NULL
,
589 static const pci_iface_t dma_iface
[] = {
591 0x00, "8237 DMA controller", NULL
,
595 0x01, "ISA DMA controller", NULL
,
599 0x02, "EISA DMA controller", NULL
,
608 static const pci_iface_t tmr_iface
[] = {
610 0x00, "8254 system timer", NULL
,
614 0x01, "ISA system timer", NULL
,
618 0x02, "EISA system timer", NULL
,
627 static const pci_iface_t rtc_iface
[] = {
629 0x00, "generic RTC controller", NULL
,
633 0x01, "ISA RTC controller", NULL
,
642 static const pci_dev_t sys_devices
[] = {
643 /* IBM MPIC controller */
645 PCI_VENDOR_ID_IBM
, PCI_DEVICE_ID_IBM_OPENPIC
,
646 "open-pic", "MPIC", NULL
, "chrp,open-pic\0",
650 /* IBM MPIC2 controller */
652 PCI_VENDOR_ID_IBM
, PCI_DEVICE_ID_IBM_OPENPIC2
,
653 "open-pic", "MPIC2", NULL
, "chrp,open-pic\0",
659 NULL
, NULL
, NULL
, NULL
,
665 static const pci_subclass_t sys_subclass
[] = {
667 PCI_SUBCLASS_SYSTEM_PIC
, "PIC",
668 NULL
, NULL
, pic_iface
,
672 PCI_SUBCLASS_SYSTEM_DMA
, "DMA controller",
673 NULL
, NULL
, dma_iface
,
677 PCI_SUBCLASS_SYSTEM_TIMER
, "system timer",
678 NULL
, NULL
, tmr_iface
,
682 PCI_SUBCLASS_SYSTEM_RTC
, "RTC controller",
683 NULL
, NULL
, rtc_iface
,
687 PCI_SUBCLASS_SYSTEM_PCI_HOTPLUG
, "PCI hotplug controller",
692 PCI_SUBCLASS_SYSTEM_OTHER
, "misc system peripheral",
693 NULL
, sys_devices
, NULL
,
703 static const pci_subclass_t inp_subclass
[] = {
705 PCI_SUBCLASS_INPUT_KEYBOARD
, "keyboard controller",
710 PCI_SUBCLASS_INPUT_PEN
, "digitizer",
715 PCI_SUBCLASS_INPUT_MOUSE
, "mouse controller",
720 PCI_SUBCLASS_INPUT_SCANNER
, "scanner controller",
725 PCI_SUBCLASS_INPUT_GAMEPORT
, "gameport controller",
730 PCI_SUBCLASS_INPUT_OTHER
, "misc input device",
741 static const pci_subclass_t dock_subclass
[] = {
743 PCI_SUBCLASS_DOCKING_GENERIC
, "generic docking station",
748 PCI_SUBCLASS_DOCKING_OTHER
, "misc docking station",
759 static const pci_subclass_t cpu_subclass
[] = {
761 PCI_SUBCLASS_PROCESSOR_386
, "i386 processor",
766 PCI_SUBCLASS_PROCESSOR_486
, "i486 processor",
771 PCI_SUBCLASS_PROCESSOR_PENTIUM
, "pentium processor",
776 PCI_SUBCLASS_PROCESSOR_ALPHA
, "alpha processor",
781 PCI_SUBCLASS_PROCESSOR_POWERPC
, "PowerPC processor",
786 PCI_SUBCLASS_PROCESSOR_MIPS
, "MIPS processor",
791 PCI_SUBCLASS_PROCESSOR_CO
, "co-processor",
802 static const pci_iface_t usb_iface
[] = {
804 0x00, "UHCI USB controller", NULL
,
808 0x10, "OHCI USB controller", NULL
,
812 0x20, "EHCI USB controller", NULL
,
816 0x80, "misc USB controller", NULL
,
820 0xFE, "USB device", NULL
,
829 static const pci_iface_t ipmi_iface
[] = {
831 0x00, "IPMI SMIC interface", NULL
,
835 0x01, "IPMI keyboard interface", NULL
,
839 0x02, "IPMI block transfer interface", NULL
,
848 static const pci_subclass_t ser_subclass
[] = {
850 PCI_SUBCLASS_SERIAL_FIREWIRE
, "Firewire bus controller",
851 "ieee1394", NULL
, NULL
,
855 PCI_SUBCLASS_SERIAL_ACCESS
, "ACCESS bus controller",
860 PCI_SUBCLASS_SERIAL_SSA
, "SSA controller",
865 PCI_SUBCLASS_SERIAL_USB
, "USB controller",
866 "usb", NULL
, usb_iface
,
870 PCI_SUBCLASS_SERIAL_FIBER
, "fibre channel controller",
875 PCI_SUBCLASS_SERIAL_SMBUS
, "SMBus controller",
880 PCI_SUBCLASS_SERIAL_IB
, "InfiniBand controller",
885 PCI_SUBCLASS_SERIAL_IPMI
, "IPMI interface",
886 NULL
, NULL
, ipmi_iface
,
890 PCI_SUBCLASS_SERIAL_SERCOS
, "SERCOS controller",
891 NULL
, NULL
, ipmi_iface
,
895 PCI_SUBCLASS_SERIAL_CANBUS
, "CANbus controller",
896 NULL
, NULL
, ipmi_iface
,
906 static const pci_subclass_t wrl_subclass
[] = {
908 PCI_SUBCLASS_WIRELESS_IRDA
, "IRDA controller",
913 PCI_SUBCLASS_WIRELESS_CIR
, "consumer IR controller",
918 PCI_SUBCLASS_WIRELESS_RF_CONTROLLER
, "RF controller",
923 PCI_SUBCLASS_WIRELESS_BLUETOOTH
, "bluetooth controller",
928 PCI_SUBCLASS_WIRELESS_BROADBAND
, "broadband controller",
933 PCI_SUBCLASS_WIRELESS_OTHER
, "misc wireless controller",
944 static const pci_subclass_t sat_subclass
[] = {
946 PCI_SUBCLASS_SATELLITE_TV
, "satellite TV controller",
951 PCI_SUBCLASS_SATELLITE_AUDIO
, "satellite audio controller",
956 PCI_SUBCLASS_SATELLITE_VOICE
, "satellite voice controller",
961 PCI_SUBCLASS_SATELLITE_DATA
, "satellite data controller",
972 static const pci_subclass_t crypt_subclass
[] = {
974 PCI_SUBCLASS_CRYPT_NETWORK
, "cryptographic network controller",
979 PCI_SUBCLASS_CRYPT_ENTERTAINMENT
,
980 "cryptographic entertainment controller",
985 PCI_SUBCLASS_CRYPT_OTHER
, "misc cryptographic controller",
996 static const pci_subclass_t spc_subclass
[] = {
998 PCI_SUBCLASS_SP_DPIO
, "DPIO module",
1003 PCI_SUBCLASS_SP_PERF
, "performances counters",
1008 PCI_SUBCLASS_SP_SYNCH
, "communication synchronisation",
1013 PCI_SUBCLASS_SP_MANAGEMENT
, "management card",
1018 PCI_SUBCLASS_SP_OTHER
, "misc signal processing controller",
1029 static const pci_class_t pci_classes
[] = {
1031 { "undefined", NULL
, undef_subclass
, },
1033 { "mass-storage controller", NULL
, mass_subclass
, },
1035 { "network controller", "network", net_subclass
, },
1037 { "display controller", "display", displ_subclass
, },
1039 { "multimedia device", NULL
, media_subclass
, },
1041 { "memory controller", "memory-controller", mem_subclass
, },
1043 { "PCI bridge", "pci", bridg_subclass
, },
1045 { "communication device", NULL
, comm_subclass
,},
1047 { "system peripheral", NULL
, sys_subclass
, },
1049 { "input device", NULL
, inp_subclass
, },
1051 { "docking station", NULL
, dock_subclass
, },
1053 { "processor", NULL
, cpu_subclass
, },
1055 { "serial bus controller", NULL
, ser_subclass
, },
1057 { "wireless controller", NULL
, wrl_subclass
, },
1059 { "intelligent I/O controller", NULL
, NULL
, },
1061 { "satellite communication controller", NULL
, sat_subclass
, },
1063 { "cryptographic controller", NULL
, crypt_subclass
, },
1065 { "signal processing controller", NULL
, spc_subclass
, },
1068 static const pci_dev_t misc_pci
[] = {
1069 /* Heathrow Mac I/O */
1071 PCI_VENDOR_ID_APPLE
, PCI_DEVICE_ID_APPLE_343S1201
,
1072 "mac-io", "mac-io", "AAPL,343S1201", "heathrow\0",
1074 &macio_heathrow_config_cb
, NULL
,
1076 /* Paddington Mac I/O */
1078 PCI_VENDOR_ID_APPLE
, PCI_DEVICE_ID_APPLE_343S1211
,
1079 "mac-io", "mac-io", "AAPL,343S1211", "paddington\0heathrow\0",
1081 &macio_heathrow_config_cb
, NULL
,
1083 /* KeyLargo Mac I/O */
1085 PCI_VENDOR_ID_APPLE
, PCI_DEVICE_ID_APPLE_UNI_N_KEYL
,
1086 "mac-io", "mac-io", "AAPL,Keylargo", "Keylargo\0",
1088 &macio_keylargo_config_cb
, NULL
,
1092 NULL
, NULL
, NULL
, NULL
,
1098 const pci_dev_t
*pci_find_device (uint8_t class, uint8_t subclass
,
1099 uint8_t iface
, uint16_t vendor
,
1102 int (*config_cb
)(const pci_config_t
*config
);
1103 const pci_class_t
*pclass
;
1104 const pci_subclass_t
*psubclass
;
1105 const pci_iface_t
*piface
;
1106 const pci_dev_t
*dev
;
1107 const void *private;
1109 const char *name
, *type
;
1116 if (class == 0x00 && subclass
== 0x01) {
1117 /* Special hack for old style VGA devices */
1120 } else if (class == 0xFF) {
1121 /* Special case for misc devices */
1125 if (class > (sizeof(pci_classes
) / sizeof(pci_class_t
))) {
1126 name
= "invalid PCI device";
1130 pclass
= &pci_classes
[class];
1131 name
= pclass
->name
;
1132 type
= pclass
->type
;
1133 for (psubclass
= pclass
->subc
; ; psubclass
++) {
1134 if (psubclass
->subclass
== 0xFF)
1136 if (psubclass
->subclass
== subclass
) {
1137 if (psubclass
->name
!= NULL
)
1138 name
= psubclass
->name
;
1139 if (psubclass
->type
!= NULL
)
1140 type
= psubclass
->type
;
1141 if (psubclass
->config_cb
!= NULL
) {
1142 config_cb
= psubclass
->config_cb
;
1144 if (psubclass
->private != NULL
)
1145 private = psubclass
->private;
1146 if (psubclass
->iface
!= NULL
)
1148 dev
= psubclass
->devices
;
1152 for (piface
= psubclass
->iface
; ; piface
++) {
1153 if (piface
->iface
== 0xFF) {
1154 dev
= psubclass
->devices
;
1157 if (piface
->iface
== iface
) {
1158 if (piface
->name
!= NULL
)
1159 name
= piface
->name
;
1160 if (piface
->type
!= NULL
)
1161 type
= piface
->type
;
1162 if (piface
->config_cb
!= NULL
) {
1163 config_cb
= piface
->config_cb
;
1165 if (piface
->private != NULL
)
1166 private = piface
->private;
1167 dev
= piface
->devices
;
1175 if (dev
->vendor
== 0xFFFF && dev
->product
== 0xFFFF) {
1178 if (dev
->vendor
== vendor
&& dev
->product
== product
) {
1179 if (dev
->name
!= NULL
)
1181 if (dev
->type
!= NULL
)
1183 if (dev
->config_cb
!= NULL
) {
1184 config_cb
= dev
->config_cb
;
1186 if (dev
->private != NULL
)
1187 private = dev
->private;
1188 new = malloc(sizeof(pci_dev_t
));
1191 new->vendor
= vendor
;
1192 new->product
= product
;
1195 new->model
= dev
->model
;
1196 new->compat
= dev
->compat
;
1197 new->acells
= dev
->acells
;
1198 new->scells
= dev
->scells
;
1199 new->icells
= dev
->icells
;
1200 new->config_cb
= config_cb
;
1201 new->private = private;
1207 printk("Cannot manage '%s' PCI device type '%s':\n %x %x (%x %x %x)\n",
1208 name
, type
, vendor
, product
, class, subclass
, iface
);