Annotation of sys/arch/amd64/pci/aapic.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: aapic.c,v 1.3 2007/01/15 23:19:05 jsg Exp $ */
! 2: /* $NetBSD: aapic.c,v 1.3 2005/01/13 23:40:01 fvdl Exp $ */
! 3:
! 4: /*
! 5: * The AMD 8131 IO APIC can hang the box when an APIC IRQ is masked.
! 6: */
! 7:
! 8: #if 0
! 9: #include <sys/cdefs.h>
! 10: __KERNEL_RCSID(0, "$NetBSD: aapic.c,v 1.3 2005/01/13 23:40:01 fvdl Exp $");
! 11: #endif
! 12:
! 13: #include <sys/param.h>
! 14: #include <sys/systm.h>
! 15: #include <sys/kernel.h>
! 16: #include <sys/device.h>
! 17:
! 18: #include <dev/pci/pcireg.h>
! 19: #include <dev/pci/pcivar.h>
! 20: #include <dev/pci/pcidevs.h>
! 21:
! 22: #include <arch/amd64/pci/amd8131reg.h>
! 23:
! 24: #include "ioapic.h"
! 25:
! 26: #if NIOAPIC > 0
! 27: extern int nioapics;
! 28: #endif
! 29:
! 30: int aapic_match(struct device *, void *, void *);
! 31: void aapic_attach(struct device *, struct device *, void *);
! 32:
! 33: struct aapic_softc {
! 34: struct device sc_dev;
! 35: };
! 36:
! 37: struct cfattach aapic_ca = {
! 38: sizeof(struct aapic_softc), aapic_match, aapic_attach
! 39: };
! 40:
! 41: struct cfdriver aapic_cd = {
! 42: 0, "aapic", DV_DULL
! 43: };
! 44:
! 45: int
! 46: aapic_match(struct device *parent, void *match, void *aux)
! 47: {
! 48: struct pci_attach_args *pa = aux;
! 49:
! 50: if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_AMD &&
! 51: PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_AMD_8131_PCIX_IOAPIC)
! 52: return (1);
! 53:
! 54: return (0);
! 55: }
! 56:
! 57: void
! 58: aapic_attach(struct device *parent, struct device *self, void *aux)
! 59: {
! 60: struct pci_attach_args *pa = aux;
! 61: int bus, dev, func;
! 62: pcitag_t tag;
! 63: pcireg_t reg;
! 64:
! 65: printf("\n");
! 66:
! 67: #if NIOAPIC > 0
! 68: if (nioapics == 0)
! 69: return;
! 70: #else
! 71: return;
! 72: #endif
! 73:
! 74: reg = pci_conf_read(pa->pa_pc, pa->pa_tag, AMD8131_IOAPIC_CTL);
! 75: reg |= AMD8131_IOAEN;
! 76: pci_conf_write(pa->pa_pc, pa->pa_tag, AMD8131_IOAPIC_CTL, reg);
! 77:
! 78: pci_decompose_tag(pa->pa_pc, pa->pa_tag, &bus, &dev, &func);
! 79: func = 0;
! 80: tag = pci_make_tag(pa->pa_pc, bus, dev, func);
! 81: reg = pci_conf_read(pa->pa_pc, tag, AMD8131_PCIX_MISC);
! 82: reg &= ~AMD8131_NIOAMODE;
! 83: pci_conf_write(pa->pa_pc, tag, AMD8131_PCIX_MISC, reg);
! 84: }
CVSweb