update briq/mol/pearpc client interface to use ucell type (Igor Kovalenko)
[openbios.git] / drivers / pci_database.c
blobbb4012053cfba1d2e1ef0abe5b715aa372099758
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;
14 struct pci_iface_t {
15 uint8_t iface;
16 const char *name;
17 const char *type;
18 const pci_dev_t *devices;
19 int (*config_cb)(const pci_config_t *config);
20 const void *private;
23 struct pci_subclass_t {
24 uint8_t subclass;
25 const char *name;
26 const char *type;
27 const pci_dev_t *devices;
28 const pci_iface_t *iface;
29 int (*config_cb)(const pci_config_t *config);
30 const void *private;
33 struct pci_class_t {
34 const char *name;
35 const char *type;
36 const pci_subclass_t *subc;
39 /* Current machine description */
41 static const pci_subclass_t undef_subclass[] = {
43 0xFF, NULL, NULL, NULL, NULL,
44 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",
53 0, 0, 0,
54 ide_config_cb2, NULL,
57 0xFFFF, 0xFFFF,
58 NULL, NULL, NULL, NULL,
59 -1, -1, -1,
60 NULL, NULL,
64 static const pci_subclass_t mass_subclass[] = {
66 PCI_SUBCLASS_STORAGE_SCSI, "SCSI bus controller",
67 NULL, NULL, NULL,
68 NULL, NULL,
71 PCI_SUBCLASS_STORAGE_IDE, "IDE controller",
72 "ide", ide_devices, NULL,
73 NULL, NULL,
76 PCI_SUBCLASS_STORAGE_FLOPPY, "Floppy disk controller",
77 NULL, NULL, NULL,
78 NULL, NULL,
81 PCI_SUBCLASS_STORAGE_IPI, "IPI bus controller",
82 NULL, NULL, NULL,
83 NULL, NULL,
86 PCI_SUBCLASS_STORAGE_RAID, "RAID controller",
87 NULL, NULL, NULL,
88 NULL, NULL,
91 PCI_SUBCLASS_STORAGE_ATA, "ATA controller",
92 "ata", NULL, NULL,
93 NULL, NULL,
96 PCI_SUBCLASS_STORAGE_OTHER, "misc mass-storage controller",
97 NULL, NULL, NULL,
98 NULL, NULL,
101 0xFF, NULL,
102 NULL, NULL, NULL,
103 NULL, NULL,
107 static const pci_dev_t eth_devices[] = {
109 PCI_VENDOR_ID_REALTEK, PCI_DEVICE_ID_REALTEK_RTL8029,
110 NULL, "NE2000", "NE2000 PCI", NULL,
111 0, 0, 0,
112 NULL, "ethernet",
115 0xFFFF, 0xFFFF,
116 NULL, NULL, NULL, NULL,
117 -1, -1, -1,
118 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",
130 NULL, NULL, NULL,
131 NULL, NULL,
134 PCI_SUBCLASS_NETWORK_FDDI, "FDDI controller",
135 NULL, NULL, NULL,
136 NULL, NULL,
139 PCI_SUBCLASS_NETWORK_ATM, "ATM controller",
140 NULL, NULL, NULL,
141 NULL, NULL,
144 PCI_SUBCLASS_NETWORK_ISDN, "ISDN controller",
145 NULL, NULL, NULL,
146 NULL, NULL,
149 PCI_SUBCLASS_NETWORK_WORDFIP, "WordFip controller",
150 NULL, NULL, NULL,
151 NULL, NULL,
154 PCI_SUBCLASS_NETWORK_PICMG214, "PICMG 2.14 controller",
155 NULL, NULL, NULL,
156 NULL, NULL,
159 PCI_SUBCLASS_NETWORK_OTHER, "misc network controller",
160 NULL, NULL, NULL,
161 NULL, NULL,
164 0xFF, NULL,
165 NULL, NULL, NULL,
166 NULL, NULL,
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",
174 0, 0, 0,
175 NULL, NULL,
178 PCI_VENDOR_ID_QEMU, PCI_DEVICE_ID_QEMU_VGA,
179 NULL, "QEMU,VGA", "Qemu VGA", "VGA\0",
180 0, 0, 0,
181 NULL, NULL,
184 0xFFFF, 0xFFFF,
185 NULL, NULL, NULL, NULL,
186 -1, -1, -1,
187 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,
198 NULL, NULL, NULL,
201 0xFF, NULL, NULL,
202 NULL, NULL, NULL,
206 static const pci_subclass_t displ_subclass[] = {
208 PCI_SUBCLASS_DISPLAY_VGA, "display controller",
209 NULL, NULL, vga_iface,
210 NULL, NULL,
213 PCI_SUBCLASS_DISPLAY_XGA, "XGA display controller",
214 NULL, NULL, NULL,
215 NULL, NULL,
218 PCI_SUBCLASS_DISPLAY_3D, "3D display controller",
219 NULL, NULL, NULL,
220 NULL, NULL,
223 PCI_SUBCLASS_DISPLAY_OTHER, "misc display controller",
224 NULL, NULL, NULL,
225 NULL, NULL,
228 0xFF, NULL,
229 NULL, NULL, NULL,
230 NULL, NULL,
234 static const pci_subclass_t media_subclass[] = {
236 PCI_SUBCLASS_MULTIMEDIA_VIDEO, "video device",
237 NULL, NULL, NULL,
238 NULL, NULL,
241 PCI_SUBCLASS_MULTIMEDIA_AUDIO, "audio device",
242 NULL, NULL, NULL,
243 NULL, NULL,
246 PCI_SUBCLASS_MULTIMEDIA_PHONE, "computer telephony device",
247 NULL, NULL, NULL,
248 NULL, NULL,
251 PCI_SUBCLASS_MULTIMEDIA_OTHER, "misc multimedia device",
252 NULL, NULL, NULL,
253 NULL, NULL,
256 0xFF, NULL,
257 NULL, NULL, NULL,
258 NULL, NULL,
262 static const pci_subclass_t mem_subclass[] = {
264 PCI_SUBCLASS_MEMORY_RAM, "RAM controller",
265 NULL, NULL, NULL,
266 NULL, NULL,
269 PCI_SUBCLASS_MEMORY_FLASH, "flash controller",
270 NULL, NULL, NULL,
271 NULL, NULL,
274 0xFF, NULL,
275 NULL, NULL, NULL,
276 NULL, NULL,
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",
285 3, 2, 1,
286 NULL, NULL
289 PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_UNI_N_PCI, NULL,
290 "pci", "AAPL,UniNorth", "uni-north\0",
291 3, 2, 1,
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",
297 3, 2, 1,
298 NULL, NULL
301 PCI_VENDOR_ID_MOTOROLA, PCI_DEVICE_ID_MOTOROLA_MPC106, "pci",
302 "pci", "MOT,MPC106", "grackle\0",
303 3, 2, 1,
304 host_config_cb, NULL
307 PCI_VENDOR_ID_MOTOROLA, PCI_DEVICE_ID_MOTOROLA_RAVEN, NULL,
308 "pci-bridge", "PREP Host PCI Bridge - Motorola Raven", NULL,
309 3, 2, 1,
310 NULL, NULL,
313 PCI_VENDOR_ID_SUN, PCI_DEVICE_ID_SUN_SABRE, NULL,
314 "pci", "SUNW,sabre", "pci108e,a000\0pciclass,0\0",
315 3, 2, 1,
316 host_config_cb, NULL,
319 0xFFFF, 0xFFFF,
320 NULL, NULL, NULL, NULL,
321 -1, -1, -1,
322 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",
330 3, 2, 1,
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",
336 3, 2, 1,
337 bridge_config_cb, NULL,
340 0xFFFF, 0xFFFF,
341 NULL, NULL, NULL, NULL,
342 -1, -1, -1,
343 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",
351 3, 2, 1,
352 ebus_config_cb, NULL,
355 0xFFFF, 0xFFFF,
356 NULL, NULL, NULL, NULL,
357 -1, -1, -1,
358 NULL, NULL,
362 static const pci_subclass_t bridg_subclass[] = {
364 PCI_SUBCLASS_BRIDGE_HOST, "PCI host bridge",
365 NULL, hbrg_devices, NULL,
366 NULL, NULL,
369 PCI_SUBCLASS_BRIDGE_ISA, "ISA bridge",
370 NULL, NULL, NULL,
371 NULL, NULL,
374 PCI_SUBCLASS_BRIDGE_EISA, "EISA bridge",
375 NULL, NULL, NULL,
376 NULL, NULL,
379 PCI_SUBCLASS_BRIDGE_MC, "MCA bridge",
380 NULL, NULL, NULL,
381 NULL, NULL,
384 PCI_SUBCLASS_BRIDGE_PCI, "PCI-to-PCI bridge",
385 NULL, PCIbrg_devices, NULL,
386 NULL, NULL,
389 PCI_SUBCLASS_BRIDGE_PCMCIA, "PCMCIA bridge",
390 NULL, NULL, NULL,
391 NULL, NULL,
394 PCI_SUBCLASS_BRIDGE_NUBUS, "NUBUS bridge",
395 NULL, NULL, NULL,
396 NULL, NULL,
399 PCI_SUBCLASS_BRIDGE_CARDBUS, "cardbus bridge",
400 NULL, NULL, NULL,
401 NULL, NULL,
404 PCI_SUBCLASS_BRIDGE_RACEWAY, "raceway bridge",
405 NULL, NULL, NULL,
406 NULL, NULL,
409 PCI_SUBCLASS_BRIDGE_PCI_SEMITP, "semi-transparent PCI-to-PCI bridge",
410 NULL, NULL, NULL,
411 NULL, NULL,
414 PCI_SUBCLASS_BRIDGE_IB_PCI, "infiniband-to-PCI bridge",
415 NULL, NULL, NULL,
416 NULL, NULL,
419 PCI_SUBCLASS_BRIDGE_OTHER, "misc PCI bridge",
420 NULL, miscbrg_devices, NULL,
421 NULL, NULL,
424 0xFF, NULL,
425 NULL, NULL, NULL,
426 NULL, NULL,
430 static const pci_iface_t serial_iface[] = {
432 0x00, "XT serial controller", NULL,
433 NULL, NULL, NULL,
436 0x01, "16450 serial controller", NULL,
437 NULL, NULL, NULL,
440 0x02, "16550 serial controller", NULL,
441 NULL, NULL, NULL,
444 0x03, "16650 serial controller", NULL,
445 NULL, NULL, NULL,
448 0x04, "16750 serial controller", NULL,
449 NULL, NULL, NULL,
452 0x05, "16850 serial controller", NULL,
453 NULL, NULL, NULL,
456 0x06, "16950 serial controller", NULL,
457 NULL, NULL, NULL,
460 0xFF, NULL, NULL,
461 NULL, NULL, NULL,
465 static const pci_iface_t par_iface[] = {
467 0x00, "parallel port", NULL,
468 NULL, NULL, NULL,
471 0x01, "bi-directional parallel port", NULL,
472 NULL, NULL, NULL,
475 0x02, "ECP 1.x parallel port", NULL,
476 NULL, NULL, NULL,
479 0x03, "IEEE 1284 controller", NULL,
480 NULL, NULL, NULL,
483 0xFE, "IEEE 1284 device", NULL,
484 NULL, NULL, NULL,
487 0xFF, NULL, NULL,
488 NULL, NULL, NULL,
492 static const pci_iface_t modem_iface[] = {
494 0x00, "generic modem", NULL,
495 NULL, NULL, NULL,
498 0x01, "Hayes 16450 modem", NULL,
499 NULL, NULL, NULL,
502 0x02, "Hayes 16550 modem", NULL,
503 NULL, NULL, NULL,
506 0x03, "Hayes 16650 modem", NULL,
507 NULL, NULL, NULL,
510 0x04, "Hayes 16750 modem", NULL,
511 NULL, NULL, NULL,
514 0xFF, NULL, NULL,
515 NULL, NULL, NULL,
519 static const pci_subclass_t comm_subclass[] = {
521 PCI_SUBCLASS_COMMUNICATION_SERIAL, "serial controller",
522 NULL, NULL, serial_iface,
523 NULL, NULL,
526 PCI_SUBCLASS_COMMUNICATION_PARALLEL, "parallel port",
527 NULL, NULL, par_iface,
528 NULL, NULL,
531 PCI_SUBCLASS_COMMUNICATION_MULTISERIAL, "multiport serial controller",
532 NULL, NULL, NULL,
533 NULL, NULL,
536 PCI_SUBCLASS_COMMUNICATION_MODEM, "modem",
537 NULL, NULL, modem_iface,
538 NULL, NULL,
541 PCI_SUBCLASS_COMMUNICATION_GPIB, "GPIB controller",
542 NULL, NULL, NULL,
543 NULL, NULL,
546 PCI_SUBCLASS_COMMUNICATION_SC, "smart card",
547 NULL, NULL, NULL,
548 NULL, NULL,
551 PCI_SUBCLASS_COMMUNICATION_OTHER, "misc communication device",
552 NULL, NULL, NULL,
553 NULL, NULL,
556 0xFF, NULL,
557 NULL, NULL, NULL,
558 NULL, NULL,
562 static const pci_iface_t pic_iface[] = {
564 0x00, "8259 PIC", NULL,
565 NULL, NULL, NULL,
568 0x01, "ISA PIC", NULL,
569 NULL, NULL, NULL,
572 0x02, "EISA PIC", NULL,
573 NULL, NULL, NULL,
576 0x10, "I/O APIC", NULL,
577 NULL, NULL, NULL,
580 0x20, "I/O APIC", NULL,
581 NULL, NULL, NULL,
584 0xFF, NULL, NULL,
585 NULL, NULL, NULL,
589 static const pci_iface_t dma_iface[] = {
591 0x00, "8237 DMA controller", NULL,
592 NULL, NULL, NULL,
595 0x01, "ISA DMA controller", NULL,
596 NULL, NULL, NULL,
599 0x02, "EISA DMA controller", NULL,
600 NULL, NULL, NULL,
603 0xFF, NULL, NULL,
604 NULL, NULL, NULL,
608 static const pci_iface_t tmr_iface[] = {
610 0x00, "8254 system timer", NULL,
611 NULL, NULL, NULL,
614 0x01, "ISA system timer", NULL,
615 NULL, NULL, NULL,
618 0x02, "EISA system timer", NULL,
619 NULL, NULL, NULL,
622 0xFF, NULL, NULL,
623 NULL, NULL, NULL,
627 static const pci_iface_t rtc_iface[] = {
629 0x00, "generic RTC controller", NULL,
630 NULL, NULL, NULL,
633 0x01, "ISA RTC controller", NULL,
634 NULL, NULL, NULL,
637 0xFF, NULL, NULL,
638 NULL, NULL, 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",
647 0, 0, 2,
648 NULL, NULL,
650 /* IBM MPIC2 controller */
652 PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OPENPIC2,
653 "open-pic", "MPIC2", NULL, "chrp,open-pic\0",
654 0, 0, 2,
655 NULL, NULL,
658 0xFFFF, 0xFFFF,
659 NULL, NULL, NULL, NULL,
660 -1, -1, -1,
661 NULL, NULL,
665 static const pci_subclass_t sys_subclass[] = {
667 PCI_SUBCLASS_SYSTEM_PIC, "PIC",
668 NULL, NULL, pic_iface,
669 NULL, NULL,
672 PCI_SUBCLASS_SYSTEM_DMA, "DMA controller",
673 NULL, NULL, dma_iface,
674 NULL, NULL,
677 PCI_SUBCLASS_SYSTEM_TIMER, "system timer",
678 NULL, NULL, tmr_iface,
679 NULL, NULL,
682 PCI_SUBCLASS_SYSTEM_RTC, "RTC controller",
683 NULL, NULL, rtc_iface,
684 NULL, NULL,
687 PCI_SUBCLASS_SYSTEM_PCI_HOTPLUG, "PCI hotplug controller",
688 NULL, NULL, NULL,
689 NULL, NULL,
692 PCI_SUBCLASS_SYSTEM_OTHER, "misc system peripheral",
693 NULL, sys_devices, NULL,
694 NULL, NULL,
697 0xFF, NULL,
698 NULL, NULL, NULL,
699 NULL, NULL,
703 static const pci_subclass_t inp_subclass[] = {
705 PCI_SUBCLASS_INPUT_KEYBOARD, "keyboard controller",
706 NULL, NULL, NULL,
707 NULL, NULL,
710 PCI_SUBCLASS_INPUT_PEN, "digitizer",
711 NULL, NULL, NULL,
712 NULL, NULL,
715 PCI_SUBCLASS_INPUT_MOUSE, "mouse controller",
716 NULL, NULL, NULL,
717 NULL, NULL,
720 PCI_SUBCLASS_INPUT_SCANNER, "scanner controller",
721 NULL, NULL, NULL,
722 NULL, NULL,
725 PCI_SUBCLASS_INPUT_GAMEPORT, "gameport controller",
726 NULL, NULL, NULL,
727 NULL, NULL,
730 PCI_SUBCLASS_INPUT_OTHER, "misc input device",
731 NULL, NULL, NULL,
732 NULL, NULL,
735 0xFF, NULL,
736 NULL, NULL, NULL,
737 NULL, NULL,
741 static const pci_subclass_t dock_subclass[] = {
743 PCI_SUBCLASS_DOCKING_GENERIC, "generic docking station",
744 NULL, NULL, NULL,
745 NULL, NULL,
748 PCI_SUBCLASS_DOCKING_OTHER, "misc docking station",
749 NULL, NULL, NULL,
750 NULL, NULL,
753 0xFF, NULL,
754 NULL, NULL, NULL,
755 NULL, NULL,
759 static const pci_subclass_t cpu_subclass[] = {
761 PCI_SUBCLASS_PROCESSOR_386, "i386 processor",
762 NULL, NULL, NULL,
763 NULL, NULL,
766 PCI_SUBCLASS_PROCESSOR_486, "i486 processor",
767 NULL, NULL, NULL,
768 NULL, NULL,
771 PCI_SUBCLASS_PROCESSOR_PENTIUM, "pentium processor",
772 NULL, NULL, NULL,
773 NULL, NULL,
776 PCI_SUBCLASS_PROCESSOR_ALPHA, "alpha processor",
777 NULL, NULL, NULL,
778 NULL, NULL,
781 PCI_SUBCLASS_PROCESSOR_POWERPC, "PowerPC processor",
782 NULL, NULL, NULL,
783 NULL, NULL,
786 PCI_SUBCLASS_PROCESSOR_MIPS, "MIPS processor",
787 NULL, NULL, NULL,
788 NULL, NULL,
791 PCI_SUBCLASS_PROCESSOR_CO, "co-processor",
792 NULL, NULL, NULL,
793 NULL, NULL,
796 0xFF, NULL,
797 NULL, NULL, NULL,
798 NULL, NULL,
802 static const pci_iface_t usb_iface[] = {
804 0x00, "UHCI USB controller", NULL,
805 NULL, NULL, NULL,
808 0x10, "OHCI USB controller", NULL,
809 NULL, NULL, NULL,
812 0x20, "EHCI USB controller", NULL,
813 NULL, NULL, NULL,
816 0x80, "misc USB controller", NULL,
817 NULL, NULL, NULL,
820 0xFE, "USB device", NULL,
821 NULL, NULL, NULL,
824 0xFF, NULL, NULL,
825 NULL, NULL, NULL,
829 static const pci_iface_t ipmi_iface[] = {
831 0x00, "IPMI SMIC interface", NULL,
832 NULL, NULL, NULL,
835 0x01, "IPMI keyboard interface", NULL,
836 NULL, NULL, NULL,
839 0x02, "IPMI block transfer interface", NULL,
840 NULL, NULL, NULL,
843 0xFF, NULL, NULL,
844 NULL, NULL, NULL,
848 static const pci_subclass_t ser_subclass[] = {
850 PCI_SUBCLASS_SERIAL_FIREWIRE, "Firewire bus controller",
851 "ieee1394", NULL, NULL,
852 NULL, NULL,
855 PCI_SUBCLASS_SERIAL_ACCESS, "ACCESS bus controller",
856 NULL, NULL, NULL,
857 NULL, NULL,
860 PCI_SUBCLASS_SERIAL_SSA, "SSA controller",
861 NULL, NULL, NULL,
862 NULL, NULL,
865 PCI_SUBCLASS_SERIAL_USB, "USB controller",
866 "usb", NULL, usb_iface,
867 NULL, NULL,
870 PCI_SUBCLASS_SERIAL_FIBER, "fibre channel controller",
871 NULL, NULL, NULL,
872 NULL, NULL,
875 PCI_SUBCLASS_SERIAL_SMBUS, "SMBus controller",
876 NULL, NULL, NULL,
877 NULL, NULL,
880 PCI_SUBCLASS_SERIAL_IB, "InfiniBand controller",
881 NULL, NULL, NULL,
882 NULL, NULL,
885 PCI_SUBCLASS_SERIAL_IPMI, "IPMI interface",
886 NULL, NULL, ipmi_iface,
887 NULL, NULL,
890 PCI_SUBCLASS_SERIAL_SERCOS, "SERCOS controller",
891 NULL, NULL, ipmi_iface,
892 NULL, NULL,
895 PCI_SUBCLASS_SERIAL_CANBUS, "CANbus controller",
896 NULL, NULL, ipmi_iface,
897 NULL, NULL,
900 0xFF, NULL,
901 NULL, NULL, NULL,
902 NULL, NULL,
906 static const pci_subclass_t wrl_subclass[] = {
908 PCI_SUBCLASS_WIRELESS_IRDA, "IRDA controller",
909 NULL, NULL, NULL,
910 NULL, NULL,
913 PCI_SUBCLASS_WIRELESS_CIR, "consumer IR controller",
914 NULL, NULL, NULL,
915 NULL, NULL,
918 PCI_SUBCLASS_WIRELESS_RF_CONTROLLER, "RF controller",
919 NULL, NULL, NULL,
920 NULL, NULL,
923 PCI_SUBCLASS_WIRELESS_BLUETOOTH, "bluetooth controller",
924 NULL, NULL, NULL,
925 NULL, NULL,
928 PCI_SUBCLASS_WIRELESS_BROADBAND, "broadband controller",
929 NULL, NULL, NULL,
930 NULL, NULL,
933 PCI_SUBCLASS_WIRELESS_OTHER, "misc wireless controller",
934 NULL, NULL, NULL,
935 NULL, NULL,
938 0xFF, NULL,
939 NULL, NULL, NULL,
940 NULL, NULL,
944 static const pci_subclass_t sat_subclass[] = {
946 PCI_SUBCLASS_SATELLITE_TV, "satellite TV controller",
947 NULL, NULL, NULL,
948 NULL, NULL,
951 PCI_SUBCLASS_SATELLITE_AUDIO, "satellite audio controller",
952 NULL, NULL, NULL,
953 NULL, NULL,
956 PCI_SUBCLASS_SATELLITE_VOICE, "satellite voice controller",
957 NULL, NULL, NULL,
958 NULL, NULL,
961 PCI_SUBCLASS_SATELLITE_DATA, "satellite data controller",
962 NULL, NULL, NULL,
963 NULL, NULL,
966 0xFF, NULL,
967 NULL, NULL, NULL,
968 NULL, NULL,
972 static const pci_subclass_t crypt_subclass[] = {
974 PCI_SUBCLASS_CRYPT_NETWORK, "cryptographic network controller",
975 NULL, NULL, NULL,
976 NULL, NULL,
979 PCI_SUBCLASS_CRYPT_ENTERTAINMENT,
980 "cryptographic entertainment controller",
981 NULL, NULL, NULL,
982 NULL, NULL,
985 PCI_SUBCLASS_CRYPT_OTHER, "misc cryptographic controller",
986 NULL, NULL, NULL,
987 NULL, NULL,
990 0xFF, NULL,
991 NULL, NULL, NULL,
992 NULL, NULL,
996 static const pci_subclass_t spc_subclass[] = {
998 PCI_SUBCLASS_SP_DPIO, "DPIO module",
999 NULL, NULL, NULL,
1000 NULL, NULL,
1003 PCI_SUBCLASS_SP_PERF, "performances counters",
1004 NULL, NULL, NULL,
1005 NULL, NULL,
1008 PCI_SUBCLASS_SP_SYNCH, "communication synchronisation",
1009 NULL, NULL, NULL,
1010 NULL, NULL,
1013 PCI_SUBCLASS_SP_MANAGEMENT, "management card",
1014 NULL, NULL, NULL,
1015 NULL, NULL,
1018 PCI_SUBCLASS_SP_OTHER, "misc signal processing controller",
1019 NULL, NULL, NULL,
1020 NULL, NULL,
1023 0xFF, NULL,
1024 NULL, NULL, NULL,
1025 NULL, NULL,
1029 static const pci_class_t pci_classes[] = {
1030 /* 0x00 */
1031 { "undefined", NULL, undef_subclass, },
1032 /* 0x01 */
1033 { "mass-storage controller", NULL, mass_subclass, },
1034 /* 0x02 */
1035 { "network controller", "network", net_subclass, },
1036 /* 0x03 */
1037 { "display controller", "display", displ_subclass, },
1038 /* 0x04 */
1039 { "multimedia device", NULL, media_subclass, },
1040 /* 0x05 */
1041 { "memory controller", "memory-controller", mem_subclass, },
1042 /* 0x06 */
1043 { "PCI bridge", "pci", bridg_subclass, },
1044 /* 0x07 */
1045 { "communication device", NULL, comm_subclass,},
1046 /* 0x08 */
1047 { "system peripheral", NULL, sys_subclass, },
1048 /* 0x09 */
1049 { "input device", NULL, inp_subclass, },
1050 /* 0x0A */
1051 { "docking station", NULL, dock_subclass, },
1052 /* 0x0B */
1053 { "processor", NULL, cpu_subclass, },
1054 /* 0x0C */
1055 { "serial bus controller", NULL, ser_subclass, },
1056 /* 0x0D */
1057 { "wireless controller", NULL, wrl_subclass, },
1058 /* 0x0E */
1059 { "intelligent I/O controller", NULL, NULL, },
1060 /* 0x0F */
1061 { "satellite communication controller", NULL, sat_subclass, },
1062 /* 0x10 */
1063 { "cryptographic controller", NULL, crypt_subclass, },
1064 /* 0x11 */
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",
1073 1, 1, 1,
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",
1080 1, 1, 1,
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",
1087 1, 1, 2,
1088 &macio_keylargo_config_cb, NULL,
1091 0xFFFF, 0xFFFF,
1092 NULL, NULL, NULL, NULL,
1093 -1, -1, -1,
1094 NULL, NULL,
1098 const pci_dev_t *pci_find_device (uint8_t class, uint8_t subclass,
1099 uint8_t iface, uint16_t vendor,
1100 uint16_t product)
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;
1108 pci_dev_t *new;
1109 const char *name, *type;
1111 name = "unknown";
1112 type = "unknown";
1113 config_cb = NULL;
1114 private = NULL;
1116 if (class == 0x00 && subclass == 0x01) {
1117 /* Special hack for old style VGA devices */
1118 class = 0x03;
1119 subclass = 0x00;
1120 } else if (class == 0xFF) {
1121 /* Special case for misc devices */
1122 dev = misc_pci;
1123 goto find_device;
1125 if (class > (sizeof(pci_classes) / sizeof(pci_class_t))) {
1126 name = "invalid PCI device";
1127 type = "invalid";
1128 goto bad_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)
1135 goto bad_device;
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)
1147 break;
1148 dev = psubclass->devices;
1149 goto find_device;
1152 for (piface = psubclass->iface; ; piface++) {
1153 if (piface->iface == 0xFF) {
1154 dev = psubclass->devices;
1155 break;
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;
1168 break;
1171 find_device:
1172 if (dev == NULL)
1173 goto bad_device;
1174 for (;; dev++) {
1175 if (dev->vendor == 0xFFFF && dev->product == 0xFFFF) {
1176 goto bad_device;
1178 if (dev->vendor == vendor && dev->product == product) {
1179 if (dev->name != NULL)
1180 name = dev->name;
1181 if (dev->type != NULL)
1182 type = dev->type;
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));
1189 if (new == NULL)
1190 return NULL;
1191 new->vendor = vendor;
1192 new->product = product;
1193 new->type = type;
1194 new->name = name;
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;
1203 return new;
1206 bad_device:
1207 printk("Cannot manage '%s' PCI device type '%s':\n %x %x (%x %x %x)\n",
1208 name, type, vendor, product, class, subclass, iface);
1210 return NULL;