Annotation of qemu/roms/openbios/drivers/pci_database.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.