|
|
1.1 root 1: #include "config.h"
2: #include "libopenbios/bindings.h"
3: #include "drivers/pci.h"
4: #include "libc/vsprintf.h"
5:
6: #include "pci_database.h"
7:
8: /* PCI devices database */
9:
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;
13:
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;
21: };
22:
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;
31: };
32:
33: struct pci_class_t {
34: const char *name;
35: const char *type;
36: const pci_subclass_t *subc;
37: };
38:
39: /* Current machine description */
40:
41: static const pci_subclass_t undef_subclass[] = {
42: {
43: 0xFF, NULL, NULL, NULL, NULL,
44: NULL, NULL,
45: },
46: };
47:
48: static const pci_dev_t ide_devices[] = {
49: {
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,
55: },
56: {
57: 0xFFFF, 0xFFFF,
58: NULL, NULL, NULL, NULL,
59: -1, -1, -1,
60: NULL, NULL,
61: },
62: };
63:
64: static const pci_subclass_t mass_subclass[] = {
65: {
66: PCI_SUBCLASS_STORAGE_SCSI, "SCSI bus controller",
67: NULL, NULL, NULL,
68: NULL, NULL,
69: },
70: {
71: PCI_SUBCLASS_STORAGE_IDE, "IDE controller",
72: "ide", ide_devices, NULL,
73: NULL, NULL,
74: },
75: {
76: PCI_SUBCLASS_STORAGE_FLOPPY, "Floppy disk controller",
77: NULL, NULL, NULL,
78: NULL, NULL,
79: },
80: {
81: PCI_SUBCLASS_STORAGE_IPI, "IPI bus controller",
82: NULL, NULL, NULL,
83: NULL, NULL,
84: },
85: {
86: PCI_SUBCLASS_STORAGE_RAID, "RAID controller",
87: NULL, NULL, NULL,
88: NULL, NULL,
89: },
90: {
91: PCI_SUBCLASS_STORAGE_ATA, "ATA controller",
92: "ata", NULL, NULL,
93: NULL, NULL,
94: },
95: {
96: PCI_SUBCLASS_STORAGE_OTHER, "misc mass-storage controller",
97: NULL, NULL, NULL,
98: NULL, NULL,
99: },
100: {
101: 0xFF, NULL,
102: NULL, NULL, NULL,
103: NULL, NULL,
104: },
105: };
106:
107: static const pci_dev_t eth_devices[] = {
108: {
109: PCI_VENDOR_ID_REALTEK, PCI_DEVICE_ID_REALTEK_RTL8029,
110: NULL, "NE2000", "NE2000 PCI", NULL,
111: 0, 0, 0,
112: NULL, "ethernet",
113: },
114: {
115: 0xFFFF, 0xFFFF,
116: NULL, NULL, NULL, NULL,
117: -1, -1, -1,
118: NULL, NULL,
119: },
120: };
121:
122: static const pci_subclass_t net_subclass[] = {
123: {
124: PCI_SUBCLASS_NETWORK_ETHERNET, "ethernet controller",
125: NULL, eth_devices, NULL,
126: eth_config_cb, "ethernet",
127: },
128: {
129: PCI_SUBCLASS_NETWORK_TOKEN_RING, "token ring controller",
130: NULL, NULL, NULL,
131: NULL, NULL,
132: },
133: {
134: PCI_SUBCLASS_NETWORK_FDDI, "FDDI controller",
135: NULL, NULL, NULL,
136: NULL, NULL,
137: },
138: {
139: PCI_SUBCLASS_NETWORK_ATM, "ATM controller",
140: NULL, NULL, NULL,
141: NULL, NULL,
142: },
143: {
144: PCI_SUBCLASS_NETWORK_ISDN, "ISDN controller",
145: NULL, NULL, NULL,
146: NULL, NULL,
147: },
148: {
149: PCI_SUBCLASS_NETWORK_WORDFIP, "WordFip controller",
150: NULL, NULL, NULL,
151: NULL, NULL,
152: },
153: {
154: PCI_SUBCLASS_NETWORK_PICMG214, "PICMG 2.14 controller",
155: NULL, NULL, NULL,
156: NULL, NULL,
157: },
158: {
159: PCI_SUBCLASS_NETWORK_OTHER, "misc network controller",
160: NULL, NULL, NULL,
161: NULL, NULL,
162: },
163: {
164: 0xFF, NULL,
165: NULL, NULL, NULL,
166: NULL, NULL,
167: },
168: };
169:
170: static const pci_dev_t vga_devices[] = {
171: {
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,
176: },
177: {
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,
182: },
183: {
184: 0xFFFF, 0xFFFF,
185: NULL, NULL, NULL, NULL,
186: -1, -1, -1,
187: NULL, NULL,
188: },
189: };
190:
191: static const struct pci_iface_t vga_iface[] = {
192: {
193: 0x00, "VGA controller", NULL,
194: vga_devices, &vga_config_cb, NULL,
195: },
196: {
197: 0x01, "8514 compatible controller", NULL,
198: NULL, NULL, NULL,
199: },
200: {
201: 0xFF, NULL, NULL,
202: NULL, NULL, NULL,
203: },
204: };
205:
206: static const pci_subclass_t displ_subclass[] = {
207: {
208: PCI_SUBCLASS_DISPLAY_VGA, "display controller",
209: NULL, NULL, vga_iface,
210: NULL, NULL,
211: },
212: {
213: PCI_SUBCLASS_DISPLAY_XGA, "XGA display controller",
214: NULL, NULL, NULL,
215: NULL, NULL,
216: },
217: {
218: PCI_SUBCLASS_DISPLAY_3D, "3D display controller",
219: NULL, NULL, NULL,
220: NULL, NULL,
221: },
222: {
223: PCI_SUBCLASS_DISPLAY_OTHER, "misc display controller",
224: NULL, NULL, NULL,
225: NULL, NULL,
226: },
227: {
228: 0xFF, NULL,
229: NULL, NULL, NULL,
230: NULL, NULL,
231: },
232: };
233:
234: static const pci_subclass_t media_subclass[] = {
235: {
236: PCI_SUBCLASS_MULTIMEDIA_VIDEO, "video device",
237: NULL, NULL, NULL,
238: NULL, NULL,
239: },
240: {
241: PCI_SUBCLASS_MULTIMEDIA_AUDIO, "audio device",
242: NULL, NULL, NULL,
243: NULL, NULL,
244: },
245: {
246: PCI_SUBCLASS_MULTIMEDIA_PHONE, "computer telephony device",
247: NULL, NULL, NULL,
248: NULL, NULL,
249: },
250: {
251: PCI_SUBCLASS_MULTIMEDIA_OTHER, "misc multimedia device",
252: NULL, NULL, NULL,
253: NULL, NULL,
254: },
255: {
256: 0xFF, NULL,
257: NULL, NULL, NULL,
258: NULL, NULL,
259: },
260: };
261:
262: static const pci_subclass_t mem_subclass[] = {
263: {
264: PCI_SUBCLASS_MEMORY_RAM, "RAM controller",
265: NULL, NULL, NULL,
266: NULL, NULL,
267: },
268: {
269: PCI_SUBCLASS_MEMORY_FLASH, "flash controller",
270: NULL, NULL, NULL,
271: NULL, NULL,
272: },
273: {
274: 0xFF, NULL,
275: NULL, NULL, NULL,
276: NULL, NULL,
277: },
278: };
279:
280:
281: static const pci_dev_t hbrg_devices[] = {
282: {
283: PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_U3_AGP, NULL,
284: "pci", "AAPL,UniNorth", "u3-agp\0",
285: 3, 2, 1,
286: host_config_cb, NULL,
287: },
288: {
289: PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_UNI_N_AGP, NULL,
290: "pci", "AAPL,UniNorth", "uni-north\0",
291: 3, 2, 1,
292: host_config_cb, NULL,
293: },
294: {
295: PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_UNI_N_PCI, NULL,
296: "pci", "AAPL,UniNorth", "uni-north\0",
297: 3, 2, 1,
298: host_config_cb, NULL,
299: },
300: {
301: PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_UNI_N_I_PCI, NULL,
302: "pci", "AAPL,UniNorth", "uni-north\0",
303: 3, 2, 1,
304: NULL, NULL
305: },
306: {
307: PCI_VENDOR_ID_MOTOROLA, PCI_DEVICE_ID_MOTOROLA_MPC106, "pci",
308: "pci", "MOT,MPC106", "grackle\0",
309: 3, 2, 1,
310: host_config_cb, NULL
311: },
312: {
313: PCI_VENDOR_ID_MOTOROLA, PCI_DEVICE_ID_MOTOROLA_RAVEN, NULL,
314: "pci-bridge", "PREP Host PCI Bridge - Motorola Raven", NULL,
315: 3, 2, 1,
316: NULL, NULL,
317: },
318: {
319: PCI_VENDOR_ID_SUN, PCI_DEVICE_ID_SUN_SABRE, NULL,
320: "pci", "SUNW,sabre", "pci108e,a000\0pciclass,0\0",
321: 3, 2, 1,
322: sabre_config_cb, NULL,
323: },
324: {
325: 0xFFFF, 0xFFFF,
326: NULL, NULL, NULL, NULL,
327: -1, -1, -1,
328: NULL, NULL,
329: },
330: };
331:
332: static const pci_dev_t PCIbrg_devices[] = {
333: {
334: PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_21154, NULL,
335: "pci-bridge", "DEV,21154", "DEV,21154\0pci-bridge\0",
336: 3, 2, 1,
337: bridge_config_cb, NULL,
338: },
339: {
340: PCI_VENDOR_ID_SUN, PCI_DEVICE_ID_SUN_SIMBA, NULL,
341: "pci", "SUNW,simba", "pci108e,5000\0pciclass,060400\0",
342: 3, 2, 1,
343: bridge_config_cb, NULL,
344: },
345: {
346: 0xFFFF, 0xFFFF,
347: NULL, NULL, NULL, NULL,
348: -1, -1, -1,
349: NULL, NULL,
350: },
351: };
352:
353: static const pci_dev_t miscbrg_devices[] = {
354: {
355: PCI_VENDOR_ID_SUN, PCI_DEVICE_ID_SUN_EBUS, NULL,
356: "ebus", "ebus", "pci108e,1000\0pciclass,068000\0",
357: 2, 1, 1,
358: ebus_config_cb, NULL,
359: },
360: {
361: 0xFFFF, 0xFFFF,
362: NULL, NULL, NULL, NULL,
363: -1, -1, -1,
364: NULL, NULL,
365: },
366: };
367:
368: static const pci_subclass_t bridg_subclass[] = {
369: {
370: PCI_SUBCLASS_BRIDGE_HOST, "PCI host bridge",
371: "pci", hbrg_devices, NULL,
372: NULL, NULL,
373: },
374: {
375: PCI_SUBCLASS_BRIDGE_ISA, "ISA bridge",
376: NULL, NULL, NULL,
377: NULL, NULL,
378: },
379: {
380: PCI_SUBCLASS_BRIDGE_EISA, "EISA bridge",
381: NULL, NULL, NULL,
382: NULL, NULL,
383: },
384: {
385: PCI_SUBCLASS_BRIDGE_MC, "MCA bridge",
386: NULL, NULL, NULL,
387: NULL, NULL,
388: },
389: {
390: PCI_SUBCLASS_BRIDGE_PCI, "PCI-to-PCI bridge",
391: "pci", PCIbrg_devices, NULL,
392: NULL, NULL,
393: },
394: {
395: PCI_SUBCLASS_BRIDGE_PCMCIA, "PCMCIA bridge",
396: NULL, NULL, NULL,
397: NULL, NULL,
398: },
399: {
400: PCI_SUBCLASS_BRIDGE_NUBUS, "NUBUS bridge",
401: NULL, NULL, NULL,
402: NULL, NULL,
403: },
404: {
405: PCI_SUBCLASS_BRIDGE_CARDBUS, "cardbus bridge",
406: NULL, NULL, NULL,
407: NULL, NULL,
408: },
409: {
410: PCI_SUBCLASS_BRIDGE_RACEWAY, "raceway bridge",
411: NULL, NULL, NULL,
412: NULL, NULL,
413: },
414: {
415: PCI_SUBCLASS_BRIDGE_PCI_SEMITP, "semi-transparent PCI-to-PCI bridge",
416: NULL, NULL, NULL,
417: NULL, NULL,
418: },
419: {
420: PCI_SUBCLASS_BRIDGE_IB_PCI, "infiniband-to-PCI bridge",
421: NULL, NULL, NULL,
422: NULL, NULL,
423: },
424: {
425: PCI_SUBCLASS_BRIDGE_OTHER, "misc PCI bridge",
426: NULL, miscbrg_devices, NULL,
427: NULL, NULL,
428: },
429: {
430: 0xFF, NULL,
431: NULL, NULL, NULL,
432: NULL, NULL,
433: },
434: };
435:
436: static const pci_iface_t serial_iface[] = {
437: {
438: 0x00, "XT serial controller", NULL,
439: NULL, NULL, NULL,
440: },
441: {
442: 0x01, "16450 serial controller", NULL,
443: NULL, NULL, NULL,
444: },
445: {
446: 0x02, "16550 serial controller", NULL,
447: NULL, NULL, NULL,
448: },
449: {
450: 0x03, "16650 serial controller", NULL,
451: NULL, NULL, NULL,
452: },
453: {
454: 0x04, "16750 serial controller", NULL,
455: NULL, NULL, NULL,
456: },
457: {
458: 0x05, "16850 serial controller", NULL,
459: NULL, NULL, NULL,
460: },
461: {
462: 0x06, "16950 serial controller", NULL,
463: NULL, NULL, NULL,
464: },
465: {
466: 0xFF, NULL, NULL,
467: NULL, NULL, NULL,
468: },
469: };
470:
471: static const pci_iface_t par_iface[] = {
472: {
473: 0x00, "parallel port", NULL,
474: NULL, NULL, NULL,
475: },
476: {
477: 0x01, "bi-directional parallel port", NULL,
478: NULL, NULL, NULL,
479: },
480: {
481: 0x02, "ECP 1.x parallel port", NULL,
482: NULL, NULL, NULL,
483: },
484: {
485: 0x03, "IEEE 1284 controller", NULL,
486: NULL, NULL, NULL,
487: },
488: {
489: 0xFE, "IEEE 1284 device", NULL,
490: NULL, NULL, NULL,
491: },
492: {
493: 0xFF, NULL, NULL,
494: NULL, NULL, NULL,
495: },
496: };
497:
498: static const pci_iface_t modem_iface[] = {
499: {
500: 0x00, "generic modem", NULL,
501: NULL, NULL, NULL,
502: },
503: {
504: 0x01, "Hayes 16450 modem", NULL,
505: NULL, NULL, NULL,
506: },
507: {
508: 0x02, "Hayes 16550 modem", NULL,
509: NULL, NULL, NULL,
510: },
511: {
512: 0x03, "Hayes 16650 modem", NULL,
513: NULL, NULL, NULL,
514: },
515: {
516: 0x04, "Hayes 16750 modem", NULL,
517: NULL, NULL, NULL,
518: },
519: {
520: 0xFF, NULL, NULL,
521: NULL, NULL, NULL,
522: },
523: };
524:
525: static const pci_subclass_t comm_subclass[] = {
526: {
527: PCI_SUBCLASS_COMMUNICATION_SERIAL, "serial controller",
528: NULL, NULL, serial_iface,
529: NULL, NULL,
530: },
531: {
532: PCI_SUBCLASS_COMMUNICATION_PARALLEL, "parallel port",
533: NULL, NULL, par_iface,
534: NULL, NULL,
535: },
536: {
537: PCI_SUBCLASS_COMMUNICATION_MULTISERIAL, "multiport serial controller",
538: NULL, NULL, NULL,
539: NULL, NULL,
540: },
541: {
542: PCI_SUBCLASS_COMMUNICATION_MODEM, "modem",
543: NULL, NULL, modem_iface,
544: NULL, NULL,
545: },
546: {
547: PCI_SUBCLASS_COMMUNICATION_GPIB, "GPIB controller",
548: NULL, NULL, NULL,
549: NULL, NULL,
550: },
551: {
552: PCI_SUBCLASS_COMMUNICATION_SC, "smart card",
553: NULL, NULL, NULL,
554: NULL, NULL,
555: },
556: {
557: PCI_SUBCLASS_COMMUNICATION_OTHER, "misc communication device",
558: NULL, NULL, NULL,
559: NULL, NULL,
560: },
561: {
562: 0xFF, NULL,
563: NULL, NULL, NULL,
564: NULL, NULL,
565: },
566: };
567:
568: static const pci_iface_t pic_iface[] = {
569: {
570: 0x00, "8259 PIC", NULL,
571: NULL, NULL, NULL,
572: },
573: {
574: 0x01, "ISA PIC", NULL,
575: NULL, NULL, NULL,
576: },
577: {
578: 0x02, "EISA PIC", NULL,
579: NULL, NULL, NULL,
580: },
581: {
582: 0x10, "I/O APIC", NULL,
583: NULL, NULL, NULL,
584: },
585: {
586: 0x20, "I/O APIC", NULL,
587: NULL, NULL, NULL,
588: },
589: {
590: 0xFF, NULL, NULL,
591: NULL, NULL, NULL,
592: },
593: };
594:
595: static const pci_iface_t dma_iface[] = {
596: {
597: 0x00, "8237 DMA controller", NULL,
598: NULL, NULL, NULL,
599: },
600: {
601: 0x01, "ISA DMA controller", NULL,
602: NULL, NULL, NULL,
603: },
604: {
605: 0x02, "EISA DMA controller", NULL,
606: NULL, NULL, NULL,
607: },
608: {
609: 0xFF, NULL, NULL,
610: NULL, NULL, NULL,
611: },
612: };
613:
614: static const pci_iface_t tmr_iface[] = {
615: {
616: 0x00, "8254 system timer", NULL,
617: NULL, NULL, NULL,
618: },
619: {
620: 0x01, "ISA system timer", NULL,
621: NULL, NULL, NULL,
622: },
623: {
624: 0x02, "EISA system timer", NULL,
625: NULL, NULL, NULL,
626: },
627: {
628: 0xFF, NULL, NULL,
629: NULL, NULL, NULL,
630: },
631: };
632:
633: static const pci_iface_t rtc_iface[] = {
634: {
635: 0x00, "generic RTC controller", NULL,
636: NULL, NULL, NULL,
637: },
638: {
639: 0x01, "ISA RTC controller", NULL,
640: NULL, NULL, NULL,
641: },
642: {
643: 0xFF, NULL, NULL,
644: NULL, NULL, NULL,
645: },
646: };
647:
648: static const pci_dev_t sys_devices[] = {
649: /* IBM MPIC controller */
650: {
651: PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OPENPIC,
652: "open-pic", "MPIC", NULL, "chrp,open-pic\0",
653: 0, 0, 2,
654: NULL, NULL,
655: },
656: /* IBM MPIC2 controller */
657: {
658: PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OPENPIC2,
659: "open-pic", "MPIC2", NULL, "chrp,open-pic\0",
660: 0, 0, 2,
661: NULL, NULL,
662: },
663: {
664: 0xFFFF, 0xFFFF,
665: NULL, NULL, NULL, NULL,
666: -1, -1, -1,
667: NULL, NULL,
668: },
669: };
670:
671: static const pci_subclass_t sys_subclass[] = {
672: {
673: PCI_SUBCLASS_SYSTEM_PIC, "PIC",
674: NULL, NULL, pic_iface,
675: NULL, NULL,
676: },
677: {
678: PCI_SUBCLASS_SYSTEM_DMA, "DMA controller",
679: NULL, NULL, dma_iface,
680: NULL, NULL,
681: },
682: {
683: PCI_SUBCLASS_SYSTEM_TIMER, "system timer",
684: NULL, NULL, tmr_iface,
685: NULL, NULL,
686: },
687: {
688: PCI_SUBCLASS_SYSTEM_RTC, "RTC controller",
689: NULL, NULL, rtc_iface,
690: NULL, NULL,
691: },
692: {
693: PCI_SUBCLASS_SYSTEM_PCI_HOTPLUG, "PCI hotplug controller",
694: NULL, NULL, NULL,
695: NULL, NULL,
696: },
697: {
698: PCI_SUBCLASS_SYSTEM_OTHER, "misc system peripheral",
699: NULL, sys_devices, NULL,
700: NULL, NULL,
701: },
702: {
703: 0xFF, NULL,
704: NULL, NULL, NULL,
705: NULL, NULL,
706: },
707: };
708:
709: static const pci_subclass_t inp_subclass[] = {
710: {
711: PCI_SUBCLASS_INPUT_KEYBOARD, "keyboard controller",
712: NULL, NULL, NULL,
713: NULL, NULL,
714: },
715: {
716: PCI_SUBCLASS_INPUT_PEN, "digitizer",
717: NULL, NULL, NULL,
718: NULL, NULL,
719: },
720: {
721: PCI_SUBCLASS_INPUT_MOUSE, "mouse controller",
722: NULL, NULL, NULL,
723: NULL, NULL,
724: },
725: {
726: PCI_SUBCLASS_INPUT_SCANNER, "scanner controller",
727: NULL, NULL, NULL,
728: NULL, NULL,
729: },
730: {
731: PCI_SUBCLASS_INPUT_GAMEPORT, "gameport controller",
732: NULL, NULL, NULL,
733: NULL, NULL,
734: },
735: {
736: PCI_SUBCLASS_INPUT_OTHER, "misc input device",
737: NULL, NULL, NULL,
738: NULL, NULL,
739: },
740: {
741: 0xFF, NULL,
742: NULL, NULL, NULL,
743: NULL, NULL,
744: },
745: };
746:
747: static const pci_subclass_t dock_subclass[] = {
748: {
749: PCI_SUBCLASS_DOCKING_GENERIC, "generic docking station",
750: NULL, NULL, NULL,
751: NULL, NULL,
752: },
753: {
754: PCI_SUBCLASS_DOCKING_OTHER, "misc docking station",
755: NULL, NULL, NULL,
756: NULL, NULL,
757: },
758: {
759: 0xFF, NULL,
760: NULL, NULL, NULL,
761: NULL, NULL,
762: },
763: };
764:
765: static const pci_subclass_t cpu_subclass[] = {
766: {
767: PCI_SUBCLASS_PROCESSOR_386, "i386 processor",
768: NULL, NULL, NULL,
769: NULL, NULL,
770: },
771: {
772: PCI_SUBCLASS_PROCESSOR_486, "i486 processor",
773: NULL, NULL, NULL,
774: NULL, NULL,
775: },
776: {
777: PCI_SUBCLASS_PROCESSOR_PENTIUM, "pentium processor",
778: NULL, NULL, NULL,
779: NULL, NULL,
780: },
781: {
782: PCI_SUBCLASS_PROCESSOR_ALPHA, "alpha processor",
783: NULL, NULL, NULL,
784: NULL, NULL,
785: },
786: {
787: PCI_SUBCLASS_PROCESSOR_POWERPC, "PowerPC processor",
788: NULL, NULL, NULL,
789: NULL, NULL,
790: },
791: {
792: PCI_SUBCLASS_PROCESSOR_MIPS, "MIPS processor",
793: NULL, NULL, NULL,
794: NULL, NULL,
795: },
796: {
797: PCI_SUBCLASS_PROCESSOR_CO, "co-processor",
798: NULL, NULL, NULL,
799: NULL, NULL,
800: },
801: {
802: 0xFF, NULL,
803: NULL, NULL, NULL,
804: NULL, NULL,
805: },
806: };
807:
808: static const pci_iface_t usb_iface[] = {
809: {
810: 0x00, "UHCI USB controller", NULL,
811: NULL, NULL, NULL,
812: },
813: {
814: 0x10, "OHCI USB controller", NULL,
815: NULL, NULL, NULL,
816: },
817: {
818: 0x20, "EHCI USB controller", NULL,
819: NULL, NULL, NULL,
820: },
821: {
822: 0x80, "misc USB controller", NULL,
823: NULL, NULL, NULL,
824: },
825: {
826: 0xFE, "USB device", NULL,
827: NULL, NULL, NULL,
828: },
829: {
830: 0xFF, NULL, NULL,
831: NULL, NULL, NULL,
832: },
833: };
834:
835: static const pci_iface_t ipmi_iface[] = {
836: {
837: 0x00, "IPMI SMIC interface", NULL,
838: NULL, NULL, NULL,
839: },
840: {
841: 0x01, "IPMI keyboard interface", NULL,
842: NULL, NULL, NULL,
843: },
844: {
845: 0x02, "IPMI block transfer interface", NULL,
846: NULL, NULL, NULL,
847: },
848: {
849: 0xFF, NULL, NULL,
850: NULL, NULL, NULL,
851: },
852: };
853:
854: static const pci_subclass_t ser_subclass[] = {
855: {
856: PCI_SUBCLASS_SERIAL_FIREWIRE, "Firewire bus controller",
857: "ieee1394", NULL, NULL,
858: NULL, NULL,
859: },
860: {
861: PCI_SUBCLASS_SERIAL_ACCESS, "ACCESS bus controller",
862: NULL, NULL, NULL,
863: NULL, NULL,
864: },
865: {
866: PCI_SUBCLASS_SERIAL_SSA, "SSA controller",
867: NULL, NULL, NULL,
868: NULL, NULL,
869: },
870: {
871: PCI_SUBCLASS_SERIAL_USB, "USB controller",
872: "usb", NULL, usb_iface,
873: NULL, NULL,
874: },
875: {
876: PCI_SUBCLASS_SERIAL_FIBER, "fibre channel controller",
877: NULL, NULL, NULL,
878: NULL, NULL,
879: },
880: {
881: PCI_SUBCLASS_SERIAL_SMBUS, "SMBus controller",
882: NULL, NULL, NULL,
883: NULL, NULL,
884: },
885: {
886: PCI_SUBCLASS_SERIAL_IB, "InfiniBand controller",
887: NULL, NULL, NULL,
888: NULL, NULL,
889: },
890: {
891: PCI_SUBCLASS_SERIAL_IPMI, "IPMI interface",
892: NULL, NULL, ipmi_iface,
893: NULL, NULL,
894: },
895: {
896: PCI_SUBCLASS_SERIAL_SERCOS, "SERCOS controller",
897: NULL, NULL, ipmi_iface,
898: NULL, NULL,
899: },
900: {
901: PCI_SUBCLASS_SERIAL_CANBUS, "CANbus controller",
902: NULL, NULL, ipmi_iface,
903: NULL, NULL,
904: },
905: {
906: 0xFF, NULL,
907: NULL, NULL, NULL,
908: NULL, NULL,
909: },
910: };
911:
912: static const pci_subclass_t wrl_subclass[] = {
913: {
914: PCI_SUBCLASS_WIRELESS_IRDA, "IRDA controller",
915: NULL, NULL, NULL,
916: NULL, NULL,
917: },
918: {
919: PCI_SUBCLASS_WIRELESS_CIR, "consumer IR controller",
920: NULL, NULL, NULL,
921: NULL, NULL,
922: },
923: {
924: PCI_SUBCLASS_WIRELESS_RF_CONTROLLER, "RF controller",
925: NULL, NULL, NULL,
926: NULL, NULL,
927: },
928: {
929: PCI_SUBCLASS_WIRELESS_BLUETOOTH, "bluetooth controller",
930: NULL, NULL, NULL,
931: NULL, NULL,
932: },
933: {
934: PCI_SUBCLASS_WIRELESS_BROADBAND, "broadband controller",
935: NULL, NULL, NULL,
936: NULL, NULL,
937: },
938: {
939: PCI_SUBCLASS_WIRELESS_OTHER, "misc wireless controller",
940: NULL, NULL, NULL,
941: NULL, NULL,
942: },
943: {
944: 0xFF, NULL,
945: NULL, NULL, NULL,
946: NULL, NULL,
947: },
948: };
949:
950: static const pci_subclass_t sat_subclass[] = {
951: {
952: PCI_SUBCLASS_SATELLITE_TV, "satellite TV controller",
953: NULL, NULL, NULL,
954: NULL, NULL,
955: },
956: {
957: PCI_SUBCLASS_SATELLITE_AUDIO, "satellite audio controller",
958: NULL, NULL, NULL,
959: NULL, NULL,
960: },
961: {
962: PCI_SUBCLASS_SATELLITE_VOICE, "satellite voice controller",
963: NULL, NULL, NULL,
964: NULL, NULL,
965: },
966: {
967: PCI_SUBCLASS_SATELLITE_DATA, "satellite data controller",
968: NULL, NULL, NULL,
969: NULL, NULL,
970: },
971: {
972: 0xFF, NULL,
973: NULL, NULL, NULL,
974: NULL, NULL,
975: },
976: };
977:
978: static const pci_subclass_t crypt_subclass[] = {
979: {
980: PCI_SUBCLASS_CRYPT_NETWORK, "cryptographic network controller",
981: NULL, NULL, NULL,
982: NULL, NULL,
983: },
984: {
985: PCI_SUBCLASS_CRYPT_ENTERTAINMENT,
986: "cryptographic entertainment controller",
987: NULL, NULL, NULL,
988: NULL, NULL,
989: },
990: {
991: PCI_SUBCLASS_CRYPT_OTHER, "misc cryptographic controller",
992: NULL, NULL, NULL,
993: NULL, NULL,
994: },
995: {
996: 0xFF, NULL,
997: NULL, NULL, NULL,
998: NULL, NULL,
999: },
1000: };
1001:
1002: static const pci_subclass_t spc_subclass[] = {
1003: {
1004: PCI_SUBCLASS_SP_DPIO, "DPIO module",
1005: NULL, NULL, NULL,
1006: NULL, NULL,
1007: },
1008: {
1009: PCI_SUBCLASS_SP_PERF, "performances counters",
1010: NULL, NULL, NULL,
1011: NULL, NULL,
1012: },
1013: {
1014: PCI_SUBCLASS_SP_SYNCH, "communication synchronisation",
1015: NULL, NULL, NULL,
1016: NULL, NULL,
1017: },
1018: {
1019: PCI_SUBCLASS_SP_MANAGEMENT, "management card",
1020: NULL, NULL, NULL,
1021: NULL, NULL,
1022: },
1023: {
1024: PCI_SUBCLASS_SP_OTHER, "misc signal processing controller",
1025: NULL, NULL, NULL,
1026: NULL, NULL,
1027: },
1028: {
1029: 0xFF, NULL,
1030: NULL, NULL, NULL,
1031: NULL, NULL,
1032: },
1033: };
1034:
1035: static const pci_class_t pci_classes[] = {
1036: /* 0x00 */
1037: { "undefined", NULL, undef_subclass, },
1038: /* 0x01 */
1039: { "mass-storage controller", NULL, mass_subclass, },
1040: /* 0x02 */
1041: { "network controller", "network", net_subclass, },
1042: /* 0x03 */
1043: { "display controller", "display", displ_subclass, },
1044: /* 0x04 */
1045: { "multimedia device", NULL, media_subclass, },
1046: /* 0x05 */
1047: { "memory controller", "memory-controller", mem_subclass, },
1048: /* 0x06 */
1049: { "PCI bridge", NULL, bridg_subclass, },
1050: /* 0x07 */
1051: { "communication device", NULL, comm_subclass,},
1052: /* 0x08 */
1053: { "system peripheral", NULL, sys_subclass, },
1054: /* 0x09 */
1055: { "input device", NULL, inp_subclass, },
1056: /* 0x0A */
1057: { "docking station", NULL, dock_subclass, },
1058: /* 0x0B */
1059: { "processor", NULL, cpu_subclass, },
1060: /* 0x0C */
1061: { "serial bus controller", NULL, ser_subclass, },
1062: /* 0x0D */
1063: { "wireless controller", NULL, wrl_subclass, },
1064: /* 0x0E */
1065: { "intelligent I/O controller", NULL, NULL, },
1066: /* 0x0F */
1067: { "satellite communication controller", NULL, sat_subclass, },
1068: /* 0x10 */
1069: { "cryptographic controller", NULL, crypt_subclass, },
1070: /* 0x11 */
1071: { "signal processing controller", NULL, spc_subclass, },
1072: };
1073:
1074: static const pci_dev_t misc_pci[] = {
1075: /* Heathrow Mac I/O */
1076: {
1077: PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_343S1201,
1078: "mac-io", "mac-io", "AAPL,343S1201", "heathrow\0",
1079: 1, 1, 1,
1080: &macio_heathrow_config_cb, NULL,
1081: },
1082: /* Paddington Mac I/O */
1083: {
1084: PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_343S1211,
1085: "mac-io", "mac-io", "AAPL,343S1211", "paddington\0heathrow\0",
1086: 1, 1, 1,
1087: &macio_heathrow_config_cb, NULL,
1088: },
1089: /* KeyLargo Mac I/O */
1090: {
1091: PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_UNI_N_KEYL,
1092: "mac-io", "mac-io", "AAPL,Keylargo", "Keylargo\0",
1093: 1, 1, 1,
1094: &macio_keylargo_config_cb, NULL,
1095: },
1096: {
1097: 0xFFFF, 0xFFFF,
1098: NULL, NULL, NULL, NULL,
1099: -1, -1, -1,
1100: NULL, NULL,
1101: },
1102: };
1103:
1104: const pci_dev_t *pci_find_device (uint8_t class, uint8_t subclass,
1105: uint8_t iface, uint16_t vendor,
1106: uint16_t product)
1107: {
1108: int (*config_cb)(const pci_config_t *config);
1109: const pci_class_t *pclass;
1110: const pci_subclass_t *psubclass;
1111: const pci_iface_t *piface;
1112: const pci_dev_t *dev;
1113: const void *private;
1114: pci_dev_t *new;
1115: const char *name, *type;
1116:
1117: name = "unknown";
1118: type = "unknown";
1119: config_cb = NULL;
1120: private = NULL;
1121:
1122: if (class == 0x00 && subclass == 0x01) {
1123: /* Special hack for old style VGA devices */
1124: class = 0x03;
1125: subclass = 0x00;
1126: } else if (class == 0xFF) {
1127: /* Special case for misc devices */
1128: dev = misc_pci;
1129: goto find_device;
1130: }
1131: if (class > (sizeof(pci_classes) / sizeof(pci_class_t))) {
1132: name = "invalid PCI device";
1133: type = "invalid";
1134: goto bad_device;
1135: }
1136: pclass = &pci_classes[class];
1137: name = pclass->name;
1138: type = pclass->type;
1139: for (psubclass = pclass->subc; ; psubclass++) {
1140: if (psubclass->subclass == 0xFF)
1141: goto bad_device;
1142: if (psubclass->subclass == subclass) {
1143: if (psubclass->name != NULL)
1144: name = psubclass->name;
1145: if (psubclass->type != NULL)
1146: type = psubclass->type;
1147: if (psubclass->config_cb != NULL) {
1148: config_cb = psubclass->config_cb;
1149: }
1150: if (psubclass->private != NULL)
1151: private = psubclass->private;
1152: if (psubclass->iface != NULL)
1153: break;
1154: dev = psubclass->devices;
1155: goto find_device;
1156: }
1157: }
1158: for (piface = psubclass->iface; ; piface++) {
1159: if (piface->iface == 0xFF) {
1160: dev = psubclass->devices;
1161: break;
1162: }
1163: if (piface->iface == iface) {
1164: if (piface->name != NULL)
1165: name = piface->name;
1166: if (piface->type != NULL)
1167: type = piface->type;
1168: if (piface->config_cb != NULL) {
1169: config_cb = piface->config_cb;
1170: }
1171: if (piface->private != NULL)
1172: private = piface->private;
1173: dev = piface->devices;
1174: break;
1175: }
1176: }
1177: find_device:
1178: if (dev == NULL)
1179: goto bad_device;
1180: for (;; dev++) {
1181: if (dev->vendor == 0xFFFF && dev->product == 0xFFFF) {
1182: goto bad_device;
1183: }
1184: if (dev->vendor == vendor && dev->product == product) {
1185: if (dev->name != NULL)
1186: name = dev->name;
1187: if (dev->type != NULL)
1188: type = dev->type;
1189: if (dev->config_cb != NULL) {
1190: config_cb = dev->config_cb;
1191: }
1192: if (dev->private != NULL)
1193: private = dev->private;
1194: new = malloc(sizeof(pci_dev_t));
1195: if (new == NULL)
1196: return NULL;
1197: new->vendor = vendor;
1198: new->product = product;
1199: new->type = type;
1200: new->name = name;
1201: new->model = dev->model;
1202: new->compat = dev->compat;
1203: new->acells = dev->acells;
1204: new->scells = dev->scells;
1205: new->icells = dev->icells;
1206: new->config_cb = config_cb;
1207: new->private = private;
1208:
1209: return new;
1210: }
1211: }
1212: bad_device:
1213: printk("Cannot manage '%s' PCI device type '%s':\n %x %x (%x %x %x)\n",
1214: name, type, vendor, product, class, subclass, iface);
1215:
1216: return NULL;
1217: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.