X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdevices%2Fpci_lookup.h;fp=src%2Fdevices%2Fpci_lookup.h;h=355f24b66871b595e49c0e7061b2bffb33b96031;hb=b4e9c266d656c6b595cc57920a34937776acc300;hp=0000000000000000000000000000000000000000;hpb=6ffbc2b68c34c2d1e42d5f6bcd8f2b94b82d05d7;p=pintos-anon diff --git a/src/devices/pci_lookup.h b/src/devices/pci_lookup.h new file mode 100644 index 0000000..355f24b --- /dev/null +++ b/src/devices/pci_lookup.h @@ -0,0 +1,138 @@ +#ifndef PCILOOKUP_H +#define PCILOOKUP_H + +#ifdef PCI_TRANSLATION_ENABLE + +struct pci_vendor +{ + uint16_t vendor_id; + char *vendor; +}; + +struct pci_vendor pci_vendor_table[] = { + {0x1013, "Cirrus Logic"}, + {0x10de, "nVidia"}, + {0x10EC, "Realtek"}, + {0x11c1, "Agere Systems"}, + {0x8086, "Intel"} +}; + +struct pci_device +{ + uint16_t vendor_id; + uint16_t device_id; + char *device; +}; + +struct pci_device pci_device_table[] = { + {0x1013, 0x00b8, "CL-GD5446"}, + {0x10ec, 0x8029, "RTL8029 - NE2K Compatible"}, + {0x10ec, 0x8139, "RTL8139"}, + {0x8086, 0x1237, "82441FX"}, + {0x8086, 0x7000, "82371SB_ISA"}, + {0x8086, 0x7010, "82371SB_IDE"}, + {0x8086, 0x7020, "82371SB_USB"}, + {0x8086, 0x7113, "82371AB/EB/MB_ACPI"} +}; + + +#define PCI_DEVICE_TABLE_SZ (sizeof (pci_device_table) / sizeof (struct pci_device )) +#define PCI_VENDOR_TABLE_SZ (sizeof (pci_vendor_table) / sizeof (struct pci_vendor)) + +/** Too lazy to to a binary search... */ + +const char *pci_lookup_vendor (uint16_t vendor); +const char *pci_lookup_device (uint16_t vendor, uint16_t device); + +const char * +pci_lookup_vendor (uint16_t vendor) +{ + unsigned int i; + for (i = 0; i < PCI_VENDOR_TABLE_SZ; i++) + { + if (pci_vendor_table[i].vendor_id > vendor) + break; + if (pci_vendor_table[i].vendor_id == vendor) + return pci_vendor_table[i].vendor; + } + + return "Unknown Vendor"; +} + +const char * +pci_lookup_device (uint16_t vendor, uint16_t device) +{ + unsigned int i; + for (i = 0; i < PCI_DEVICE_TABLE_SZ; i++) + { + if (pci_device_table[i].vendor_id > vendor) + break; + if (pci_device_table[i].vendor_id == vendor && + pci_device_table[i].device_id == device) + return pci_device_table[i].device; + } + + return "Unknown Device"; +} + +#else + +#define pci_lookup_vendor(x) "Unknown Vendor" +#define pci_lookup_device(x,y) "Unknown Device" + +#endif + +struct pci_class +{ + uint8_t major; + uint8_t minor; + uint8_t iface; + char *name; +}; + +struct pci_class pci_class_table[] = { + {0, 0, 0, "Pre-PCI 2.0 Non-VGA Device"}, + {0, 1, 0, "Pre-PCI 2.0 VGA Device"}, + {1, 0, 0, "SCSI Controller"}, + {1, 1, 0, "IDE Controller"}, + {1, 2, 0, "Floppy Disk Controller"}, + {2, 0, 0, "Ethernet"}, + {3, 0, 0, "VGA Controller"}, + {3, 1, 0, "XGA Controller"}, + {5, 0, 0, "Memory Controller - RAM"}, + {5, 1, 0, "Memory Controller - Flash"}, + {6, 0, 0, "PCI Host"}, + {6, 1, 0, "PCI-ISA Bridge"}, + {6, 2, 0, "PCI-EISA Bridge"}, + {6, 4, 0, "PCI-PCI Bridge"}, + {6, 5, 0, "PCI-PCMCIA Bridge"}, + {12, 0, 0, "Firewire Adapter"}, + {12, 3, 0, "USB 1.1 Controller (UHCI)"}, + {12, 3, 0x10, "USB 1.1 Controller (OHCI)"}, + {12, 3, 0x20, "USB 2.0 Controller (EHCI)"} +}; + +#define PCI_CLASS_TABLE_SZ (sizeof(pci_class_table) / sizeof(struct pci_class)) + +const char *pci_lookup_class (uint8_t major, uint8_t minor, uint8_t iface); +const char * +pci_lookup_class (uint8_t major, uint8_t minor, uint8_t iface) +{ + unsigned int i; + for (i = 0; i < PCI_CLASS_TABLE_SZ; i++) + { + if (pci_class_table[i].major > major) + break; + if (pci_class_table[i].major != major) + continue; + if (pci_class_table[i].minor != minor) + continue; + if (pci_class_table[i].iface != iface) + continue; + return pci_class_table[i].name; + } + + return "Unknown Type"; +} + +#endif