diff options
author | Brad Smith <brad@cvs.openbsd.org> | 2005-05-24 00:51:28 +0000 |
---|---|---|
committer | Brad Smith <brad@cvs.openbsd.org> | 2005-05-24 00:51:28 +0000 |
commit | d5889fcbb9b2f254788d1b213625ee2d579eb4b1 (patch) | |
tree | 861d5612a8bb8d5fee7c829e7d09f5adc4f6902a /sys/arch | |
parent | b14166ec6fbbc9aef9c12d9678493124dbe3656b (diff) |
add aapic driver which currently is used to workaround errata on
the AMD 8131 IO APIC.
From NetBSD
ok marco@
Diffstat (limited to 'sys/arch')
-rw-r--r-- | sys/arch/amd64/conf/GENERIC.MP | 4 | ||||
-rw-r--r-- | sys/arch/amd64/pci/aapic.c | 85 | ||||
-rw-r--r-- | sys/arch/amd64/pci/amd8131reg.h | 13 |
3 files changed, 101 insertions, 1 deletions
diff --git a/sys/arch/amd64/conf/GENERIC.MP b/sys/arch/amd64/conf/GENERIC.MP index e0c0994aa47..1ebf914fed2 100644 --- a/sys/arch/amd64/conf/GENERIC.MP +++ b/sys/arch/amd64/conf/GENERIC.MP @@ -1,4 +1,4 @@ -# $OpenBSD: GENERIC.MP,v 1.5 2004/10/22 22:10:32 grange Exp $ +# $OpenBSD: GENERIC.MP,v 1.6 2005/05/24 00:51:27 brad Exp $ include "arch/amd64/conf/GENERIC" @@ -7,3 +7,5 @@ option MPBIOS cpu* at mainbus? ioapic* at mainbus? + +aapic* at pci? # AMD 8131 IO apic diff --git a/sys/arch/amd64/pci/aapic.c b/sys/arch/amd64/pci/aapic.c new file mode 100644 index 00000000000..80c34c32efc --- /dev/null +++ b/sys/arch/amd64/pci/aapic.c @@ -0,0 +1,85 @@ +/* $OpenBSD: aapic.c,v 1.1 2005/05/24 00:51:27 brad Exp $ */ +/* $NetBSD: aapic.c,v 1.3 2005/01/13 23:40:01 fvdl Exp $ */ + +#if 0 +#include <sys/cdefs.h> +__KERNEL_RCSID(0, "$NetBSD: aapic.c,v 1.3 2005/01/13 23:40:01 fvdl Exp $"); +#endif + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/kernel.h> +#include <sys/device.h> + +#include <dev/pci/pcireg.h> +#include <dev/pci/pcivar.h> +#include <dev/pci/pcidevs.h> + +#include <arch/amd64/pci/amd8131reg.h> + +#include "ioapic.h" + +#if NIOAPIC > 0 +extern int nioapics; +#endif + +int aapic_match(struct device *, void *, void *); +void aapic_attach(struct device *, struct device *, void *); + +struct aapic_softc { + struct device sc_dev; +}; + +struct cfattach aapic_ca = { + sizeof(struct aapic_softc), aapic_match, aapic_attach +}; + +struct cfdriver aapic_cd = { + 0, "aapic", DV_DULL +}; + +int +aapic_match(parent, match, aux) + struct device *parent; + void *match; + void *aux; +{ + struct pci_attach_args *pa = aux; + + if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_AMD && + PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_AMD_8131_PCIX_IOAPIC) + return (1); + + return (0); +} + +void +aapic_attach(parent, self, aux) + struct device *parent, *self; + void *aux; +{ + struct pci_attach_args *pa = aux; + int bus, dev, func; + pcitag_t tag; + pcireg_t reg; + + printf("\n"); + +#if NIOAPIC > 0 + if (nioapics == 0) + return; +#else + return; +#endif + + reg = pci_conf_read(pa->pa_pc, pa->pa_tag, AMD8131_IOAPIC_CTL); + reg |= AMD8131_IOAEN; + pci_conf_write(pa->pa_pc, pa->pa_tag, AMD8131_IOAPIC_CTL, reg); + + pci_decompose_tag(pa->pa_pc, pa->pa_tag, &bus, &dev, &func); + func = 0; + tag = pci_make_tag(pa->pa_pc, bus, dev, func); + reg = pci_conf_read(pa->pa_pc, tag, AMD8131_PCIX_MISC); + reg &= ~AMD8131_NIOAMODE; + pci_conf_write(pa->pa_pc, tag, AMD8131_PCIX_MISC, reg); +} diff --git a/sys/arch/amd64/pci/amd8131reg.h b/sys/arch/amd64/pci/amd8131reg.h new file mode 100644 index 00000000000..e063b6571a4 --- /dev/null +++ b/sys/arch/amd64/pci/amd8131reg.h @@ -0,0 +1,13 @@ +/* $OpenBSD: amd8131reg.h,v 1.1 2005/05/24 00:51:27 brad Exp $ */ +/* $NetBSD: amd8131reg.h,v 1.1 2004/04/18 18:34:22 fvdl Exp $ */ + +/* + * Some register definitions for the AMD 8131 PCI-X Tunnel / IO apic. + * Only the registers/bits that are currently used are defined here. + */ + +#define AMD8131_PCIX_MISC 0x40 +# define AMD8131_NIOAMODE 0x00000001 + +#define AMD8131_IOAPIC_CTL 0x44 +# define AMD8131_IOAEN 0x00000002 |