diff options
Diffstat (limited to 'sys/pci/pcisupport.c')
-rw-r--r-- | sys/pci/pcisupport.c | 169 |
1 files changed, 69 insertions, 100 deletions
diff --git a/sys/pci/pcisupport.c b/sys/pci/pcisupport.c index eee424a..c88b86a 100644 --- a/sys/pci/pcisupport.c +++ b/sys/pci/pcisupport.c @@ -1,20 +1,20 @@ /************************************************************************** ** -** $Id: pcisupport.c,v 1.11 1995/03/02 23:29:44 se Exp $ +** $Id: pcisupport.c,v 1.12 1995/03/17 04:27:20 davidg Exp $ ** -** Device driver for INTEL PCI chipsets. +** Device driver for DEC/INTEL PCI chipsets. ** -** 386bsd / FreeBSD +** FreeBSD ** **------------------------------------------------------------------------- ** -** Written for 386bsd and FreeBSD by -** wolf@dentaro.gun.de Wolfgang Stanglmeier +** Written for FreeBSD by +** wolf@cologne.de Wolfgang Stanglmeier ** se@mi.Uni-Koeln.de Stefan Esser ** **------------------------------------------------------------------------- ** -** Copyright (c) 1994 Stefan Esser. All rights reserved. +** Copyright (c) 1994,1995 Stefan Esser. All rights reserved. ** ** Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions @@ -41,28 +41,19 @@ *************************************************************************** */ -#define __PCISUPPORT_C_PATCHLEVEL__ "pl2 95/02/27" - -/*========================================================== -** -** Include files -** -**========================================================== -*/ +#define __PCISUPPORT_C__ "pl4 95/03/21" #include <sys/types.h> #include <sys/param.h> +#include <sys/systm.h> #include <sys/kernel.h> #include <sys/devconf.h> +#include <machine/cpu.h> + #include <pci/pcivar.h> #include <pci/pcireg.h> -extern void printf(); - -extern int bootverbose; - - /*--------------------------------------------------------- ** ** Intel chipsets for 486 / Pentium processor @@ -74,7 +65,7 @@ static char* chipset_probe (pcici_t tag, pcidi_t type); static void chipset_attach(pcici_t tag, int unit); static u_long chipset_count; -struct pci_device chipset_device = { +struct pci_device chipset_device = { "chip", chipset_probe, chipset_attach, @@ -84,8 +75,6 @@ struct pci_device chipset_device = { DATA_SET (pcidevice_set, chipset_device); -static char confread(pcici_t config_id, int port); - struct condmsg { unsigned char port; unsigned char mask; @@ -94,12 +83,11 @@ struct condmsg { char *text; }; -#define M_EQ 0 /* mask and return true if equal */ -#define M_NE 1 /* mask and return true if not equal */ -#define TRUE 2 /* don't read config, always true */ - -static char* chipset_probe (pcici_t tag, pcidi_t type) +static char* +chipset_probe (pcici_t tag, pcidi_t type) { + u_long data; + switch (type) { case 0x04848086: return ("Intel 82378IB PCI-ISA bridge"); @@ -109,11 +97,28 @@ static char* chipset_probe (pcici_t tag, pcidi_t type) return ("Intel 82375EB PCI-EISA bridge"); case 0x04a38086: return ("Intel 82434LX PCI cache memory controller"); + case 0x00011011: + return ("DEC 21050 PCI-PCI bridge"); + }; + + /* + ** check classes + */ + + data = pci_conf_read(tag, PCI_CLASS_REG); + switch (data & (PCI_CLASS_MASK|PCI_SUBCLASS_MASK)) { + + case PCI_CLASS_BRIDGE|PCI_SUBCLASS_BRIDGE_PCI: + return ("PCI-PCI bridge"); }; return ((char*)0); } -struct condmsg conf82424zx[] = +#define M_EQ 0 /* mask and return true if equal */ +#define M_NE 1 /* mask and return true if not equal */ +#define TRUE 2 /* don't read config, always true */ + +static const struct condmsg conf82424zx[] = { { 0x00, 0x00, 0x00, TRUE, "\tCPU: " }, { 0x50, 0xe0, 0x00, M_EQ, "486DX" }, @@ -177,7 +182,7 @@ struct condmsg conf82424zx[] = { 0 } }; -struct condmsg conf82434lx[] = +static const struct condmsg conf82434lx[] = { { 0x00, 0x00, 0x00, TRUE, "\tCPU: " }, { 0x50, 0xe3, 0x82, M_EQ, "Pentium, 60MHz" }, @@ -246,7 +251,8 @@ static char confread (pcici_t config_id, int port) return (l >> ports); } -static void writeconfig(pcici_t config_id, struct condmsg *tbl) +static void +writeconfig (pcici_t config_id, const struct condmsg *tbl) { while (tbl->text) { int cond = 0; @@ -268,10 +274,13 @@ static void writeconfig(pcici_t config_id, struct condmsg *tbl) } } -void chipset_attach(pcici_t config_id, int unit) +static void +chipset_attach (pcici_t config_id, int unit) { - if (bootverbose) { - switch (pci_conf_read (config_id, 0)) { + if (!bootverbose) + return; + + switch (pci_conf_read (config_id, PCI_ID_REG)) { case 0x04838086: writeconfig (config_id, conf82424zx); @@ -287,64 +296,23 @@ void chipset_attach(pcici_t config_id, int unit) pci_conf_read (config_id, 0x54)); break; }; - } -} - -/*--------------------------------------------------------- -** -** Catchall driver for pci-pci bridges. -** -**--------------------------------------------------------- -*/ - -static char* ppb_probe (pcici_t tag, pcidi_t type); -static void ppb_attach(pcici_t tag, int unit); -static u_long ppb_count; - -struct pci_device ppb_device = { - "ppb", - ppb_probe, - ppb_attach, - &ppb_count, - NULL -}; - -DATA_SET (pcidevice_set, ppb_device); - -static char* ppb_probe (pcici_t tag, pcidi_t type) -{ - int data = pci_conf_read(tag, PCI_CLASS_REG); - - if ((data & (PCI_CLASS_MASK|PCI_SUBCLASS_MASK)) == - (PCI_CLASS_BRIDGE|PCI_SUBCLASS_BRIDGE_PCI)) - return ("PCI-PCI bridge"); - return ((char*)0); } -static void ppb_attach(pcici_t tag, int unit) -{ - /* - ** XXX should read bus number from device - */ - (void) pci_map_bus (tag, 1); -} - /*--------------------------------------------------------- ** ** Catchall driver for VGA devices ** -** ** By Garrett Wollman ** <wollman@halloran-eldar.lcs.mit.edu> ** **--------------------------------------------------------- */ -static char* vga_probe (pcici_t tag, pcidi_t type); -static void vga_attach(pcici_t tag, int unit); +static char* vga_probe (pcici_t tag, pcidi_t type); +static void vga_attach (pcici_t tag, int unit); static u_long vga_count; -struct pci_device vga_device = { +struct pci_device vga_device = { "vga", vga_probe, vga_attach, @@ -354,7 +322,7 @@ struct pci_device vga_device = { DATA_SET (pcidevice_set, vga_device); -static char* vga_probe (pcici_t tag, pcidi_t type) +static char* vga_probe (pcici_t tag, pcidi_t type) { int data = pci_conf_read(tag, PCI_CLASS_REG); @@ -375,11 +343,11 @@ static char* vga_probe (pcici_t tag, pcidi_t type) return ((char*)0); } -static void vga_attach(pcici_t tag, int unit) +static void vga_attach (pcici_t tag, int unit) { /* -** The assigned adresses may not be remapped, -** because certain values are assumed by the console driver. +** If the assigned addresses are remapped, +** the console driver has to be informed about the new address. */ #if 0 vm_offset_t va; @@ -389,7 +357,7 @@ static void vga_attach(pcici_t tag, int unit) (void) pci_map_mem (tag, reg, &va, &pa); #endif } - + /*--------------------------------------------------------- ** ** Hook for loadable pci drivers @@ -397,11 +365,11 @@ static void vga_attach(pcici_t tag, int unit) **--------------------------------------------------------- */ -static char* lkm_probe (pcici_t tag, pcidi_t type); -static void lkm_attach(pcici_t tag, int unit); +static char* lkm_probe (pcici_t tag, pcidi_t type); +static void lkm_attach (pcici_t tag, int unit); static u_long lkm_count; -struct pci_device lkm_device = { +struct pci_device lkm_device = { "lkm", lkm_probe, lkm_attach, @@ -411,19 +379,20 @@ struct pci_device lkm_device = { DATA_SET (pcidevice_set, lkm_device); -static char* lkm_probe (pcici_t tag, pcidi_t type) +static char* +lkm_probe (pcici_t tag, pcidi_t type) { /* - ** Should try to load a matching driver. - ** XXX Not yet! + ** Not yet! + ** (Should try to load a matching driver) */ return ((char*)0); } -static void lkm_attach(pcici_t tag, int unit) -{ -} - +static void +lkm_attach (pcici_t tag, int unit) +{} + /*--------------------------------------------------------- ** ** Devices to ignore @@ -431,11 +400,11 @@ static void lkm_attach(pcici_t tag, int unit) **--------------------------------------------------------- */ -static char* ign_probe (pcici_t tag, pcidi_t type); -static void ign_attach(pcici_t tag, int unit); +static char* ign_probe (pcici_t tag, pcidi_t type); +static void ign_attach (pcici_t tag, int unit); static u_long ign_count; -struct pci_device ign_device = { +struct pci_device ign_device = { NULL, ign_probe, ign_attach, @@ -445,17 +414,17 @@ struct pci_device ign_device = { DATA_SET (pcidevice_set, ign_device); -static char* ign_probe (pcici_t tag, pcidi_t type) +static char* +ign_probe (pcici_t tag, pcidi_t type) { switch (type) { case 0x10001042ul: /* wd */ return (""); - }; return ((char*)0); } -static void ign_attach(pcici_t tag, int unit) -{ -} +static void +ign_attach (pcici_t tag, int unit) +{} |