1 /**************************************************************************
3 ** $FreeBSD: src/sys/pci/pcisupport.c,v 1.154.2.15 2003/04/29 15:55:06 simokawa Exp $
4 ** $DragonFly: src/sys/bus/pci/pcisupport.c,v 1.17 2006/09/05 00:55:36 dillon Exp $
6 ** Device driver for DEC/INTEL PCI chipsets.
10 **-------------------------------------------------------------------------
12 ** Written for FreeBSD by
13 ** wolf@cologne.de Wolfgang Stanglmeier
14 ** se@mi.Uni-Koeln.de Stefan Esser
16 **-------------------------------------------------------------------------
18 ** Copyright (c) 1994,1995 Stefan Esser. All rights reserved.
20 ** Redistribution and use in source and binary forms, with or without
21 ** modification, are permitted provided that the following conditions
23 ** 1. Redistributions of source code must retain the above copyright
24 ** notice, this list of conditions and the following disclaimer.
25 ** 2. Redistributions in binary form must reproduce the above copyright
26 ** notice, this list of conditions and the following disclaimer in the
27 ** documentation and/or other materials provided with the distribution.
28 ** 3. The name of the author may not be used to endorse or promote products
29 ** derived from this software without specific prior written permission.
31 ** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
32 ** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
33 ** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
34 ** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
35 ** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
36 ** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
37 ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
38 ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
39 ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
40 ** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
42 ***************************************************************************
48 #include <sys/param.h>
49 #include <sys/systm.h>
50 #include <sys/malloc.h>
51 #include <sys/kernel.h>
55 #include <machine/resource.h>
61 #include <vm/vm_object.h>
65 #include "pcib_private.h"
67 /*---------------------------------------------------------
69 ** Intel chipsets for 486 / Pentium processor
71 **---------------------------------------------------------
75 fixbushigh_i1225(device_t dev)
79 sublementarybus = pci_read_config(dev, 0x41, 1);
80 if (sublementarybus != 0xff) {
81 pci_set_secondarybus(dev, sublementarybus + 1);
82 pci_set_subordinatebus(dev, sublementarybus + 1);
87 fixwsc_natoma(device_t dev)
91 pmccfg = pci_read_config(dev, 0x50, 2);
93 if (pmccfg & 0x8000) {
94 printf("Correcting Natoma config for SMP\n");
96 pci_write_config(dev, 0x50, pmccfg, 2);
99 if ((pmccfg & 0x8000) == 0) {
100 printf("Correcting Natoma config for non-SMP\n");
102 pci_write_config(dev, 0x50, pmccfg, 2);
108 pci_bridge_type(device_t dev)
110 char *descr, tmpbuf[120];
112 if (pci_get_class(dev) != PCIC_BRIDGE)
115 switch (pci_get_subclass(dev)) {
116 case PCIS_BRIDGE_HOST: strcpy(tmpbuf, "Host to PCI"); break;
117 case PCIS_BRIDGE_ISA: strcpy(tmpbuf, "PCI to ISA"); break;
118 case PCIS_BRIDGE_EISA: strcpy(tmpbuf, "PCI to EISA"); break;
119 case PCIS_BRIDGE_MCA: strcpy(tmpbuf, "PCI to MCA"); break;
120 case PCIS_BRIDGE_PCI: strcpy(tmpbuf, "PCI to PCI"); break;
121 case PCIS_BRIDGE_PCMCIA: strcpy(tmpbuf, "PCI to PCMCIA"); break;
122 case PCIS_BRIDGE_NUBUS: strcpy(tmpbuf, "PCI to NUBUS"); break;
123 case PCIS_BRIDGE_CARDBUS: strcpy(tmpbuf, "PCI to CardBus"); break;
124 case PCIS_BRIDGE_OTHER: strcpy(tmpbuf, "PCI to Other"); break;
126 snprintf(tmpbuf, sizeof(tmpbuf),
127 "PCI to 0x%x", pci_get_subclass(dev));
130 snprintf(tmpbuf+strlen(tmpbuf), sizeof(tmpbuf)-strlen(tmpbuf),
131 " bridge (vendor=%04x device=%04x)",
132 pci_get_vendor(dev), pci_get_device(dev));
133 descr = kmalloc (strlen(tmpbuf) +1, M_DEVBUF, M_WAITOK);
134 strcpy(descr, tmpbuf);
139 pci_usb_match(device_t dev)
141 switch (pci_get_devid(dev)) {
143 /* Intel -- vendor 0x8086 */
145 return ("Intel 82371SB (PIIX3) USB controller");
147 return ("Intel 82371AB/EB (PIIX4) USB controller");
149 return ("Intel 82801AA (ICH) USB controller");
151 return ("Intel 82801AB (ICH0) USB controller");
153 return ("Intel 82801BA/BAM (ICH2) USB controller USB-A");
155 return ("Intel 82801BA/BAM (ICH2) USB controller USB-B");
157 /* VIA Technologies -- vendor 0x1106 (0x1107 on the Apollo Master) */
159 return ("VIA 83C572 USB controller");
161 /* AcerLabs -- vendor 0x10b9 */
163 return ("AcerLabs M5237 (Aladdin-V) USB controller");
165 /* OPTi -- vendor 0x1045 */
167 return ("OPTi 82C861 (FireLink) USB controller");
169 /* NEC -- vendor 0x1033 */
171 return ("NEC uPD 9210 USB controller");
173 /* CMD Tech -- vendor 0x1095 */
175 return ("CMD Tech 670 (USB0670) USB controller");
177 return ("CMD Tech 673 (USB0673) USB controller");
180 if (pci_get_class(dev) == PCIC_SERIALBUS
181 && pci_get_subclass(dev) == PCIS_SERIALBUS_USB) {
182 if (pci_get_progif(dev) == 0x00 /* UHCI */ ) {
183 return ("UHCI USB controller");
184 } else if (pci_get_progif(dev) == 0x10 /* OHCI */ ) {
185 return ("OHCI USB controller");
187 return ("USB controller");
194 pci_ata_match(device_t dev)
197 switch (pci_get_devid(dev)) {
199 /* Intel -- vendor 0x8086 */
201 return ("Intel PIIX ATA controller");
203 return ("Intel PIIX3 ATA controller");
205 return ("Intel PIIX4 ATA controller");
207 return ("Intel 82371MX mobile PCI ATA accelerator (MPIIX)");
209 /* Promise -- vendor 0x105a */
211 return ("Promise Ultra/33 ATA controller");
213 return ("Promise Ultra/66 ATA controller");
215 /* AcerLabs -- vendor 0x10b9 */
217 return ("AcerLabs Aladdin ATA controller");
219 /* VIA Technologies -- vendor 0x1106 (0x1107 on the Apollo Master) */
221 switch (pci_read_config(dev, 0x08, 1)) {
223 return ("VIA 85C586 ATA controller");
225 return ("VIA 85C586 ATA controller");
229 return ("VIA Apollo ATA controller");
231 /* CMD Tech -- vendor 0x1095 */
233 return ("CMD 640 ATA controller");
235 return ("CMD 646 ATA controller");
237 /* Cypress -- vendor 0x1080 */
239 return ("Cypress 82C693 ATA controller");
241 /* Cyrix -- vendor 0x1078 */
243 return ("Cyrix 5530 ATA controller");
245 /* SiS -- vendor 0x1039 */
247 return ("SiS 5591 ATA controller");
249 /* Highpoint tech -- vendor 0x1103 */
251 return ("HighPoint HPT366 ATA controller");
254 if (pci_get_class(dev) == PCIC_STORAGE &&
255 pci_get_subclass(dev) == PCIS_STORAGE_IDE)
256 return ("Unknown PCI ATA controller");
263 pci_chip_match(device_t dev)
267 switch (pci_get_devid(dev)) {
268 /* Intel -- vendor 0x8086 */
270 /* Silently ignore this one! What is it, anyway ??? */
274 * On my laptop (Tecra 8000DVD), this device has a
275 * bogus subclass 0x80 so make sure that it doesn't
276 * match the generic 'chip' driver by accident.
280 fixbushigh_i1225(dev);
281 return ("Intel 824?? host to PCI bridge");
283 return ("Intel 82443LX (440 LX) host to PCI bridge");
285 return ("Intel 82443BX (440 BX) host to PCI bridge");
287 return ("Intel 82443BX host to PCI bridge (AGP disabled)");
289 return ("Intel 82443GX host to PCI bridge");
291 return ("Intel 82443GX host to AGP bridge");
293 return ("Intel 82443GX host to PCI bridge (AGP disabled)");
295 return ("Intel 82454KX/GX (Orion) host to PCI bridge");
297 return ("Intel 82451NX Memory and I/O controller");
299 return ("Intel 82425EX PCI system controller");
301 return ("Intel 82424ZX (Saturn) cache DRAM controller");
303 rev = pci_get_revid(dev);
304 if (rev == 16 || rev == 17)
305 return ("Intel 82434NX (Neptune) PCI cache memory controller");
306 return ("Intel 82434LX (Mercury) PCI cache memory controller");
308 return ("Intel 82437FX PCI cache memory controller");
310 return ("Intel 82437MX mobile PCI cache memory controller");
312 return ("Intel 82439HX PCI cache memory controller");
314 return ("Intel 82437VX PCI cache memory controller");
316 return ("Intel 82439TX System controller (MTXC)");
318 return ("Intel 82371AB Power management controller");
320 return ("Intel 82443MX Power management controller");
323 return ("Intel 82440FX (Natoma) PCI and memory controller");
325 return ("Intel 82453KX/GX (Orion) PCI memory controller");
327 return ("Intel 82810 (i810 GMCH) Host To Hub bridge");
329 return ("Intel 82810-DC100 (i810-DC100 GMCH) Host To Hub bridge");
331 return ("Intel 82810E (i810E GMCH) Host To Hub bridge");
333 return ("Intel 82801AA (ICH) AC'97 Audio Controller");
335 return ("Intel 82801AB (ICH0) AC'97 Audio Controller");
337 /* Sony -- vendor 0x104d */
339 return ("Sony CXD1947A FireWire Host Controller");
341 /* SiS -- vendor 0x1039 */
343 return ("SiS 85c496 PCI/VL Bridge");
345 return ("SiS 85c501");
347 return ("SiS 85c601");
349 return ("SiS 5591 host to PCI bridge");
351 return ("SiS 5591 host to AGP bridge");
353 /* VLSI -- vendor 0x1004 */
355 return ("VLSI 82C592 Host to PCI bridge");
357 return ("VLSI 82C532 Eagle II Peripheral controller");
359 return ("VLSI 82C535 Eagle II System controller");
361 return ("VLSI 82C147 IrDA controller");
363 /* VIA Technologies -- vendor 0x1106 (0x1107 on the Apollo Master) */
365 return ("VIA 82C570 (Apollo Master) system controller");
367 return ("VIA 82C585 (Apollo VP1/VPX) system controller");
370 return ("VIA 82C595 (Apollo VP2) system controller");
372 return ("VIA 82C597 (Apollo VP3) system controller");
373 /* XXX Here is MVP3, I got the datasheet but NO M/B to test it */
374 /* totally. Please let me know if anything wrong. -F */
375 /* XXX need info on the MVP3 -- any takers? */
377 return ("VIA 82C598MVP (Apollo MVP3) host bridge");
383 return ("VIA 82C686 AC97 Audio");
385 return ("VIA 82C686 AC97 Modem");
387 /* AMD -- vendor 0x1022 */
389 return ("AMD-751 host to PCI bridge");
391 return ("AMD-761 host to PCI bridge");
393 /* AcerLabs -- vendor 0x10b9 */
394 /* Funny : The datasheet told me vendor id is "10b8",sub-vendor */
395 /* id is '10b9" but the register always shows "10b9". -Foxfair */
397 return ("AcerLabs M1541 (Aladdin-V) PCI host bridge");
399 return ("AcerLabs M15x3 Power Management Unit");
401 /* OPTi -- vendor 0x1045 */
403 return ("Opti 82C557 (Viper-M) host to PCI bridge");
405 return ("Opti 82C558 (Viper-M) ISA+IDE");
407 return ("OPTi 82C822 host to PCI Bridge");
409 /* Texas Instruments -- vendor 0x104c */
411 return ("Texas Instruments PCI1225 CardBus controller");
413 return ("Texas Instruments PCI1410 CardBus controller");
415 return ("Texas Instruments PCI1420 CardBus controller");
417 return ("Texas Instruments PCI1450 CardBus controller");
419 return ("Texas Instruments PCI1451 CardBus controller");
421 /* NeoMagic -- vendor 0x10c8 */
423 return ("NeoMagic MagicMedia 256AX Audio controller");
425 return ("NeoMagic MagicMedia 256ZX Audio controller");
427 /* ESS Technology Inc -- vendor 0x125d */
429 return ("ESS Technology Maestro 2E Audio controller");
431 /* Toshiba -- vendor 0x1179 */
433 return ("Toshiba Fast Infra Red controller");
436 if (pci_get_class(dev) == PCIC_BRIDGE
437 && pci_get_subclass(dev) != PCIS_BRIDGE_PCI
438 && pci_get_subclass(dev) != PCIS_BRIDGE_ISA
439 && pci_get_subclass(dev) != PCIS_BRIDGE_EISA)
440 return pci_bridge_type(dev);
445 /*---------------------------------------------------------
447 ** Catchall driver for VGA devices
449 ** By Garrett Wollman
450 ** <wollman@halloran-eldar.lcs.mit.edu>
452 **---------------------------------------------------------
456 pci_vga_match(device_t dev)
458 u_int id = pci_get_devid(dev);
459 const char *vendor, *chip, *type;
461 vendor = chip = type = 0;
462 switch (id & 0xffff) {
467 chip = "i740"; break;
474 chip = "MagicGraph 128ZV"; break;
476 chip = "MagicGraph 128XD"; break;
478 chip = "MagicMedia 256AV"; break;
480 chip = "MagicMedia 256ZX"; break;
485 type = "graphics accelerator";
488 chip = "Voodoo"; break;
490 chip = "Voodoo 2"; break;
492 chip = "Voodoo Banshee"; break;
494 chip = "Voodoo 3"; break;
499 type = "graphics accelerator";
502 chip = "MGA 2085PX"; break;
504 chip = "MGA Millennium 2064W"; break;
506 chip = "MGA 1024SG/1064SG/1164SG"; break;
508 chip = "MGA Millennium II 2164W"; break;
510 chip = "MGA Millennium II 2164WA-B AG"; break;
512 chip = "MGA G200"; break;
514 chip = "MGA G200 AGP"; break;
516 chip = "MGA G400 AGP"; break;
518 chip = "MGA Impression"; break;
520 chip = "MGA G100"; break;
522 chip = "MGA G100 AGP"; break;
524 chip = "MGA G550 AGP"; break;
530 type = "graphics accelerator";
533 chip = "Mach32"; break;
535 chip = "Mach64-CT"; break;
537 chip = "Mach64-CX"; break;
539 chip = "Mach64-ET"; break;
542 chip = "Mach64-VT"; break;
544 chip = "Mach64-GB"; break;
546 chip = "Mach64-GD"; break;
548 chip = "Mach64-GI"; break;
550 chip = "Mach64-GM"; break;
552 chip = "Mach64-GN"; break;
554 chip = "Mach64-GO"; break;
556 chip = "Mach64-GP"; break;
558 chip = "Mach64-GQ"; break;
560 chip = "Mach64-GR"; break;
562 chip = "Mach64-GS"; break;
564 chip = "Mach64-GT"; break;
566 chip = "Mach64-GU"; break;
568 chip = "Mach64-GV"; break;
570 chip = "Mach64-GW"; break;
572 chip = "Mach64-GX"; break;
574 chip = "Mobility-1"; break;
576 chip = "RageMobility-P/M"; break;
578 chip = "Mach64-GZ"; break;
580 chip = "Rage128-RE"; break;
582 chip = "Rage128-RF"; break;
584 chip = "Rage128-RK"; break;
586 chip = "Rage128-RL"; break;
590 vendor = "Avance Logic";
593 chip = "ALG2301"; break;
595 chip = "ALG2302"; break;
599 vendor = "Tseng Labs";
600 type = "graphics accelerator";
606 chip = "ET4000 W32P"; break;
608 chip = "ET6000/ET6100"; break;
610 chip = "ET6300"; break;
615 type = "graphics accelerator";
618 chip = "P9000"; break;
620 chip = "P9100"; break;
624 vendor = "Cirrus Logic";
627 chip = "GD7548"; break;
629 chip = "GD7555"; break;
631 chip = "GD7556"; break;
633 chip = "GD5430"; break;
636 chip = "GD5434"; break;
638 chip = "GD5436"; break;
640 chip = "GD5446"; break;
642 chip = "GD5480"; break;
644 chip = "GD5462"; break;
647 chip = "GD5464"; break;
649 chip = "GD5465"; break;
651 chip = "GD7542"; break;
653 chip = "GD7543"; break;
655 chip = "GD7541"; break;
660 break; /* let default deal with it */
662 vendor = "Chips & Technologies";
665 chip = "64310"; break;
667 chip = "65545"; break;
669 chip = "65548"; break;
671 chip = "69000"; break;
673 chip = "65550"; break;
675 chip = "65554"; break;
677 chip = "65555"; break;
679 chip = "68554"; break;
686 chip = "86c201"; break;
688 chip = "86c202"; break;
690 chip = "86c205"; break;
692 chip = "86c215"; break;
694 chip = "86c225"; break;
696 chip = "5597/98"; break;
698 chip = "6326"; break;
700 chip = "530/620"; break;
704 vendor = "Number Nine";
705 type = "graphics accelerator";
708 chip = "Imagine 128"; break;
710 chip = "Imagine 128 II"; break;
717 chip = "PM6410"; break;
719 chip = "PM6422"; break;
721 chip = "PMAT24"; break;
725 vendor = "Rendition Verite";
728 chip = "V1000"; break;
730 chip = "V2000"; break;
734 vendor = "Sigma Designs";
735 if ((id >> 16) == 0x6401)
736 chip = "REALmagic64/GX";
740 type = "graphics accelerator";
743 chip = "Trio"; break;
745 chip = "Aurora 64"; break;
747 chip = "Trio 64UV+"; break;
749 chip = "Trio 64V2/DX/GX"; break;
751 chip = "Plato"; break;
753 chip = "Trio3D"; break;
767 chip = "ViRGE"; break;
769 chip = "ViRGE VX"; break;
771 chip = "ViRGE DX/GX"; break;
773 chip = "ViRGE GX2"; break;
775 chip = "Trio3D/2X"; break;
778 chip = "Savage3D"; break;
780 chip = "Savage 4"; break;
782 chip = "ViRGE MX"; break;
784 chip = "ViRGE MX+"; break;
788 vendor = "ARK Logic";
791 chip = "1000PV"; break;
793 chip = "2000PV"; break;
795 chip = "2000MT"; break;
797 chip = "2000MI"; break;
802 type = "graphics accelerator";
805 chip = "300SX"; break;
807 chip = "500TX"; break;
809 chip = "Delta"; break;
811 chip = "PerMedia"; break;
816 type = "graphics accelerator";
821 chip = "Riva TNT"; break;
823 chip = "Riva TNT2"; break;
825 chip = "Riva Ultra TNT2"; break;
827 chip = "Riva Vanta TNT2"; break;
829 chip = "Riva Ultra Vanta TNT2"; break;
831 chip = "Riva Integrated TNT2"; break;
833 chip = "GeForce 256"; break;
835 chip = "GeForce DDR"; break;
837 chip = "Quadro"; break;
841 chip = "GeForce2 GTS"; break;
843 chip = "Quadro2"; break;
847 vendor = "NVidia/SGS-Thomson";
848 type = "graphics accelerator";
851 chip = "Riva128"; break;
855 vendor = "SGS-Thomson";
858 chip = "STG2000"; break;
865 chip = "82810 (i810 GMCH)"; break;
867 chip = "82810-DC100 (i810-DC100 GMCH)"; break;
869 chip = "82810E (i810E GMCH)"; break;
871 chip = "i740 AGP"; break;
875 vendor = "Intergraphics";
878 chip = "IGA-1680"; break;
880 chip = "IGA-1682"; break;
885 if (vendor && chip) {
890 type = "SVGA controller";
892 len = strlen(vendor) + strlen(chip) + strlen(type) + 4;
893 MALLOC(buf, char *, len, M_TEMP, M_WAITOK);
894 sprintf(buf, "%s %s %s", vendor, chip, type);
898 switch (pci_get_class(dev)) {
901 if (pci_get_subclass(dev) != PCIS_OLD_VGA)
904 type = "VGA-compatible display device";
909 if (pci_get_subclass(dev) == PCIS_DISPLAY_VGA)
910 type = "VGA-compatible display device";
913 * If it isn't a vga display device,
914 * don't pretend we found one.
925 * If we got here, we know for sure it's some sort of display
926 * device, but we weren't able to identify it specifically.
927 * At a minimum we can return the type, but we'd like to
928 * identify the vendor and chip ID if at all possible.
929 * (Some of the checks above intentionally don't bother for
930 * vendors where we know the chip ID is the same as the
937 len = strlen(vendor) + 7 + 4 + 1 + strlen(type) + 1;
938 MALLOC(buf, char *, len, M_TEMP, M_WAITOK);
939 sprintf(buf, "%s model %04x %s", vendor, id >> 16, type);
945 /*---------------------------------------------------------
949 **---------------------------------------------------------
953 ign_match(device_t dev)
955 switch (pci_get_devid(dev)) {
957 case 0x10001042ul: /* wd */
958 return ("SMC FDC 37c665");
965 ign_probe(device_t dev)
971 device_set_desc(dev, s);
979 ign_attach(device_t dev)
984 static device_method_t ign_methods[] = {
985 /* Device interface */
986 DEVMETHOD(device_probe, ign_probe),
987 DEVMETHOD(device_attach, ign_attach),
992 static driver_t ign_driver = {
998 static devclass_t ign_devclass;
1000 DRIVER_MODULE(ign, pci, ign_driver, ign_devclass, 0, 0);