svn commit: r209299 - in head/sys/powerpc: ofw powermac powerpc
Nathan Whitehorn
nwhitehorn at FreeBSD.org
Fri Jun 18 14:16:25 UTC 2010
Author: nwhitehorn
Date: Fri Jun 18 14:16:24 2010
New Revision: 209299
URL: http://svn.freebsd.org/changeset/base/209299
Log:
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.
Modified:
head/sys/powerpc/ofw/ofw_pcibus.c
head/sys/powerpc/powermac/uninorth.c
head/sys/powerpc/powerpc/openpic.c
Modified: head/sys/powerpc/ofw/ofw_pcibus.c
==============================================================================
--- head/sys/powerpc/ofw/ofw_pcibus.c Fri Jun 18 14:06:27 2010 (r209298)
+++ head/sys/powerpc/ofw/ofw_pcibus.c Fri Jun 18 14:16:24 2010 (r209299)
@@ -219,7 +219,7 @@ ofw_pcibus_enum_devtree(device_t dev, u_
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
dinfo = (struct ofw_pcibus_devinfo *)pci_read_device(
pcib, domain, busno, s, f, sizeof(*dinfo));
- if (dinfo != NULL) {
- dinfo->opd_obdinfo.obd_node = -1;
+ 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;
- pci_add_child(dev, (struct pci_devinfo *)dinfo);
+ 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
* spec will need to be studied.
*/
- return (0);
+ return (PCI_INVALID_IRQ);
#ifdef NOTYET
intr = pci_get_intpin(child);
Modified: head/sys/powerpc/powermac/uninorth.c
==============================================================================
--- head/sys/powerpc/powermac/uninorth.c Fri Jun 18 14:06:27 2010 (r209298)
+++ head/sys/powerpc/powermac/uninorth.c Fri Jun 18 14:16:24 2010 (r209299)
@@ -182,7 +182,7 @@ unin_chip_add_intr(phandle_t devnode, st
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] =
Modified: head/sys/powerpc/powerpc/openpic.c
==============================================================================
--- head/sys/powerpc/powerpc/openpic.c Fri Jun 18 14:06:27 2010 (r209298)
+++ head/sys/powerpc/powerpc/openpic.c Fri Jun 18 14:16:24 2010 (r209299)
@@ -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);
More information about the svn-src-head
mailing list