|
|
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.