summaryrefslogtreecommitdiffstats
path: root/sys/pci
diff options
context:
space:
mode:
authorwollman <wollman@FreeBSD.org>1997-11-11 01:50:06 +0000
committerwollman <wollman@FreeBSD.org>1997-11-11 01:50:06 +0000
commit7a4162b11bc691cfe7e521ae01bfc71b884cf1fb (patch)
treefc6a726674fb3b18af1717c8eabf26391f5fc769 /sys/pci
parent60d28796bd1642a8f753b6bce8180ffadd3f4392 (diff)
downloadFreeBSD-src-7a4162b11bc691cfe7e521ae01bfc71b884cf1fb.zip
FreeBSD-src-7a4162b11bc691cfe7e521ae01bfc71b884cf1fb.tar.gz
Attempt to tell the user precisely what sort of VGA-like PCI device is
in their system. The list comes originally from XFree86's SuperProbe program.
Diffstat (limited to 'sys/pci')
-rw-r--r--sys/pci/pcisupport.c267
1 files changed, 255 insertions, 12 deletions
diff --git a/sys/pci/pcisupport.c b/sys/pci/pcisupport.c
index 224269f..90a3c82 100644
--- a/sys/pci/pcisupport.c
+++ b/sys/pci/pcisupport.c
@@ -1,6 +1,6 @@
/**************************************************************************
**
-** $Id: pcisupport.c,v 1.56 1997/10/17 16:15:43 wollman Exp $
+** $Id: pcisupport.c,v 1.57 1997/10/17 16:26:14 wollman Exp $
**
** Device driver for DEC/INTEL PCI chipsets.
**
@@ -811,11 +811,227 @@ static char* vga_probe (pcici_t tag, pcidi_t type)
{
int data = pci_conf_read(tag, PCI_CLASS_REG);
u_int id = pci_conf_read(tag, PCI_ID_REG);
+ const char *vendor, *chip, *type;
- switch (id) {
- /* NeoMagic -- vendor 0x10c8 */
- case 0x000410c8:
- return ("NeoMagic NM2160 Laptop SVGA controller");
+ vendor = chip = type = 0;
+
+ switch (id & 0xffff) {
+ case 0x10c8:
+ vendor = "NeoMagic";
+ switch (id >> 16) {
+ case 0x0004:
+ chip = "NM3160 laptop"; break;
+ }
+ break;
+ case 0x102b:
+ vendor = "Matrox";
+ type = "graphics accelerator";
+ switch (id >> 16) {
+ case 0x0518:
+ chip = "MGA 2085PX"; break;
+ case 0x0519:
+ chip = "MGA 2064W"; break;
+ case 0x051a:
+ chip = "MGA 1024SG"; break;
+ case 0x051b:
+ chip = "MGA 2164W"; break;
+ }
+ break;
+
+ case 0x1002:
+ vendor = "ATI";
+ type = "graphics accelerator";
+ switch (id >> 16) {
+ case 0x4158:
+ chip = "Mach32"; break;
+ case 0x4758:
+ chip = "Mach64-GX"; break;
+ case 0x4358:
+ chip = "Mach64-CX"; break;
+ case 0x4354:
+ chip = "Mach64-CT"; break;
+ case 0x4554:
+ chip = "Mach64-ET"; break;
+ case 0x5654:
+ chip = "Mach64-VT"; break;
+ case 0x4754:
+ chip = "Mach64-GT"; break;
+ }
+ break;
+ case 0x1005:
+ vendor = "Avance Logic";
+ switch (id >> 16) {
+ case 0x2301:
+ chip = "ALG2301"; break;
+ }
+ break;
+ case 0x100c:
+ vendor = "Tseng Labs";
+ type = "graphics accelerator";
+ switch (id >> 16) {
+ case 0x3202:
+ case 0x3205:
+ case 0x3206:
+ case 0x3207:
+ chip = "ET4000 W32P"; break;
+ case 0x3208:
+ chip = "ET6000"; break;
+ case 0x4702:
+ chip = "ET6300"; break;
+ }
+ break;
+ case 0x100e:
+ vendor = "Weitek";
+ type = "graphics accelerator";
+ switch (id >> 16) {
+ case 0x9001:
+ chip = "P9000"; break;
+ case 0x9100:
+ chip = "P9100"; break;
+ }
+ break;
+ case 0x1013:
+ vendor = "Cirrus Logic";
+ switch (id >> 16) {
+ case 0x0038:
+ chip = "GD7548"; break;
+ case 0x00a0:
+ chip = "GD5430"; break;
+ case 0x00a4:
+ case 0x00a8:
+ chip = "GD5434"; break;
+ case 0x00ac:
+ chip = "GD5436"; break;
+ case 0x00b8:
+ chip = "GD5446"; break;
+ case 0x00d0:
+ chip = "GD5462"; break;
+ case 0x00d4:
+ chip = "GD5464"; break;
+ case 0x1200:
+ chip = "GD7542"; break;
+ case 0x1202:
+ chip = "GD7543"; break;
+ case 0x1204:
+ chip = "GD7541"; break;
+ }
+ break;
+ case 0x1023:
+ vendor = "Trident";
+ break; /* let default deal with it */
+ case 0x102c:
+ vendor = "Chips & Technologies";
+ if ((id >> 16) == 0x00d8)
+ chip = "65545";
+ break;
+ case 0x1039:
+ vendor = "SiS";
+ switch (id >> 16) {
+ case 0x0001:
+ chip = "86c201"; break;
+ case 0x0002:
+ chip = "86c202"; break;
+ case 0x0205:
+ chip = "86c205"; break;
+ }
+ break;
+ case 0x105d:
+ vendor = "Number Nine";
+ type = "graphics accelerator";
+ switch (id >> 16) {
+ case 0x2309:
+ case 0x2339:
+ chip = "Imagine 128"; break;
+ }
+ break;
+ case 0x1142:
+ vendor = "Alliance";
+ switch (id >> 16) {
+ case 0x3210:
+ chip = "PM6410"; break;
+ case 0x6422:
+ chip = "PM6422"; break;
+ case 0x6424:
+ chip = "PMAT24"; break;
+ }
+ break;
+ case 0x1236:
+ vendor = "Sigma Designs";
+ if ((id >> 16) == 0x6401)
+ chip = "64GX";
+ break;
+ case 0x5333:
+ vendor = "S3";
+ type = "graphics accelerator";
+ switch (id >> 16) {
+ case 0x8811:
+ chip = "Trio"; break;
+ case 0x8812:
+ chip = "Aurora 64"; break;
+ case 0x8814:
+ case 0x8901:
+ chip = "Trio 64"; break;
+ case 0x8902:
+ chip = "Plato"; break;
+ case 0x8880:
+ chip = "868"; break;
+ case 0x88b0:
+ chip = "928"; break;
+ case 0x88c0:
+ case 0x88c1:
+ chip = "864"; break;
+ case 0x88d0:
+ case 0x88d1:
+ chip = "964"; break;
+ case 0x88f0:
+ chip = "968"; break;
+ case 0x5631:
+ chip = "ViRGE"; break;
+ case 0x883d:
+ chip = "ViRGE VX"; break;
+ case 0x8a01:
+ chip = "ViRGE DX/GX"; break;
+ }
+ break;
+ case 0xedd8:
+ vendor = "ARK Logic";
+ switch (id >> 16) {
+ case 0xa091:
+ chip = "1000PV"; break;
+ case 0xa099:
+ chip = "2000PV"; break;
+ case 0xa0a1:
+ chip = "2000MT"; break;
+ case 0xa0a9:
+ chip = "2000MI"; break;
+ }
+ break;
+ case 0x3d3d:
+ vendor = "3D Labs";
+ type = "graphics accelerator";
+ switch (id >> 16) {
+ case 0x0001:
+ chip = "300SX"; break;
+ case 0x0002:
+ chip = "500TX"; break;
+ case 0x0003:
+ chip = "Delta"; break;
+ case 0x0004:
+ chip = "PerMedia"; break;
+ }
+ break;
+ }
+
+ if (vendor && chip) {
+ char *buf;
+ int len;
+
+ if (type == 0)
+ type = "SVGA controller";
+ len = strlen(vendor) + strlen(chip) + strlen(type) + 4;
+ MALLOC(buf, char *, len, M_TEMP, M_NOWAIT);
+ sprintf(buf, "%s %s %s", vendor, chip, type);
+ return buf;
}
switch (data & PCI_CLASS_MASK) {
@@ -823,16 +1039,43 @@ static char* vga_probe (pcici_t tag, pcidi_t type)
case PCI_CLASS_PREHISTORIC:
if ((data & PCI_SUBCLASS_MASK)
!= PCI_SUBCLASS_PREHISTORIC_VGA)
- break;
+ return 0;
+ if (type == 0)
+ type = "VGA-compatible display device";
+ break;
case PCI_CLASS_DISPLAY:
- if ((data & PCI_SUBCLASS_MASK)
- == PCI_SUBCLASS_DISPLAY_VGA)
- return ("VGA-compatible display device");
- else
- return ("Display device");
+ if (type == 0) {
+ if ((data & PCI_SUBCLASS_MASK)
+ == PCI_SUBCLASS_DISPLAY_VGA)
+ type = "VGA-compatible display device";
+ else
+ type = "Display device";
+ }
+ break;
+
+ default:
+ return 0;
};
- return ((char*)0);
+ /*
+ * If we got here, we know for sure it's some sort of display
+ * device, but we weren't able to identify it specifically.
+ * At a minimum we can return the type, but we'd like to
+ * identify the vendor and chip ID if at all possible.
+ * (Some of the checks above intentionally don't bother for
+ * vendors where we know the chip ID is the same as the
+ * model number.)
+ */
+ if (vendor) {
+ char *buf;
+ int len;
+
+ len = strlen(vendor) + strlen(type) + 2 + 6 + 4 + 1;
+ MALLOC(buf, char *, len, M_TEMP, M_NOWAIT);
+ sprintf(buf, "%s model %04x %s", vendor, id >> 16, type);
+ return buf;
+ }
+ return type;
}
static void vga_attach (pcici_t tag, int unit)
OpenPOWER on IntegriCloud