summaryrefslogtreecommitdiffstats
path: root/sys/powerpc
diff options
context:
space:
mode:
authornwhitehorn <nwhitehorn@FreeBSD.org>2010-06-18 14:16:24 +0000
committernwhitehorn <nwhitehorn@FreeBSD.org>2010-06-18 14:16:24 +0000
commit071d45eec91de314d45a687d0ecb097b0121c639 (patch)
tree6a2158044ad8ea22554f5e318d655415c705b08d /sys/powerpc
parentc757ee90aefd19aff23dfb5e938e8e1e8576dbd4 (diff)
downloadFreeBSD-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/powerpc')
-rw-r--r--sys/powerpc/ofw/ofw_pcibus.c32
-rw-r--r--sys/powerpc/powermac/uninorth.c2
-rw-r--r--sys/powerpc/powerpc/openpic.c2
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);
OpenPOWER on IntegriCloud