summaryrefslogtreecommitdiff
path: root/sys/arch/amd64
diff options
context:
space:
mode:
authorBrad Smith <brad@cvs.openbsd.org>2005-05-24 00:51:28 +0000
committerBrad Smith <brad@cvs.openbsd.org>2005-05-24 00:51:28 +0000
commitd5889fcbb9b2f254788d1b213625ee2d579eb4b1 (patch)
tree861d5612a8bb8d5fee7c829e7d09f5adc4f6902a /sys/arch/amd64
parentb14166ec6fbbc9aef9c12d9678493124dbe3656b (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/amd64')
-rw-r--r--sys/arch/amd64/conf/GENERIC.MP4
-rw-r--r--sys/arch/amd64/pci/aapic.c85
-rw-r--r--sys/arch/amd64/pci/amd8131reg.h13
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