diff options
author | nwhitehorn <nwhitehorn@FreeBSD.org> | 2010-06-18 14:16:24 +0000 |
---|---|---|
committer | nwhitehorn <nwhitehorn@FreeBSD.org> | 2010-06-18 14:16:24 +0000 |
commit | 071d45eec91de314d45a687d0ecb097b0121c639 (patch) | |
tree | 6a2158044ad8ea22554f5e318d655415c705b08d /sys | |
parent | c757ee90aefd19aff23dfb5e938e8e1e8576dbd4 (diff) | |
download | FreeBSD-src-071d45eec91de314d45a687d0ecb097b0121c639.zip FreeBSD-src-071d45eec91de314d45a687d0ecb097b0121c639.tar.gz |
Change the default interrupt polarity on PowerPC systems from high to low.
On Apple systems at least, all the level interrupts are wired active low.
Before this change, our PIC programming only worked because Apple hardware
ignores the interrupt polarity bit on all interrupts except IRQ 0.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/powerpc/ofw/ofw_pcibus.c | 32 | ||||
-rw-r--r-- | sys/powerpc/powermac/uninorth.c | 2 | ||||
-rw-r--r-- | sys/powerpc/powerpc/openpic.c | 2 |
3 files changed, 24 insertions, 12 deletions
diff --git a/sys/powerpc/ofw/ofw_pcibus.c b/sys/powerpc/ofw/ofw_pcibus.c index 3a7564b..d4ef78f 100644 --- a/sys/powerpc/ofw/ofw_pcibus.c +++ b/sys/powerpc/ofw/ofw_pcibus.c @@ -219,7 +219,7 @@ ofw_pcibus_enum_devtree(device_t dev, u_int domain, u_int busno) powerpc_config_intr(intr[0], (intr[1] & 1) ? INTR_TRIGGER_LEVEL : INTR_TRIGGER_EDGE, - INTR_POLARITY_HIGH); + INTR_POLARITY_LOW); } resource_list_add(&dinfo->opd_dinfo.resources, @@ -265,15 +265,27 @@ ofw_pcibus_enum_bus(device_t dev, u_int domain, u_int busno) dinfo = (struct ofw_pcibus_devinfo *)pci_read_device( pcib, domain, busno, s, f, sizeof(*dinfo)); - if (dinfo != NULL) { - dinfo->opd_obdinfo.obd_node = -1; - - dinfo->opd_obdinfo.obd_name = NULL; - dinfo->opd_obdinfo.obd_compat = NULL; - dinfo->opd_obdinfo.obd_type = NULL; - dinfo->opd_obdinfo.obd_model = NULL; - pci_add_child(dev, (struct pci_devinfo *)dinfo); + if (dinfo == NULL) + continue; + + dinfo->opd_obdinfo.obd_node = -1; + + dinfo->opd_obdinfo.obd_name = NULL; + dinfo->opd_obdinfo.obd_compat = NULL; + dinfo->opd_obdinfo.obd_type = NULL; + dinfo->opd_obdinfo.obd_model = NULL; + + /* + * For non OFW-devices, don't believe 0 + * for an interrupt. + */ + if (dinfo->opd_dinfo.cfg.intline == 0) { + dinfo->opd_dinfo.cfg.intline = PCI_INVALID_IRQ; + PCIB_WRITE_CONFIG(pcib, busno, s, f, + PCIR_INTLINE, PCI_INVALID_IRQ, 1); } + + pci_add_child(dev, (struct pci_devinfo *)dinfo); } } } @@ -311,7 +323,7 @@ ofw_pcibus_assign_interrupt(device_t dev, device_t child) * spec will need to be studied. */ - return (0); + return (PCI_INVALID_IRQ); #ifdef NOTYET intr = pci_get_intpin(child); diff --git a/sys/powerpc/powermac/uninorth.c b/sys/powerpc/powermac/uninorth.c index c0d228b..dba91ca 100644 --- a/sys/powerpc/powermac/uninorth.c +++ b/sys/powerpc/powermac/uninorth.c @@ -182,7 +182,7 @@ unin_chip_add_intr(phandle_t devnode, struct unin_chip_devinfo *dinfo) if (icells > 1) { powerpc_config_intr(INTR_VEC(iparent, intr[i]), (intr[i+1] & 1) ? INTR_TRIGGER_LEVEL : - INTR_TRIGGER_EDGE, INTR_POLARITY_HIGH); + INTR_TRIGGER_EDGE, INTR_POLARITY_LOW); } dinfo->udi_interrupts[dinfo->udi_ninterrupts] = diff --git a/sys/powerpc/powerpc/openpic.c b/sys/powerpc/powerpc/openpic.c index 3a13235..0b98964 100644 --- a/sys/powerpc/powerpc/openpic.c +++ b/sys/powerpc/powerpc/openpic.c @@ -175,7 +175,7 @@ openpic_attach(device_t dev) for (irq = 0; irq < sc->sc_nirq; irq++) { x = irq; /* irq == vector. */ x |= OPENPIC_IMASK; - x |= OPENPIC_POLARITY_POSITIVE; + x |= OPENPIC_POLARITY_NEGATIVE; x |= OPENPIC_SENSE_LEVEL; x |= 8 << OPENPIC_PRIORITY_SHIFT; openpic_write(sc, OPENPIC_SRC_VECTOR(irq), x); |