svn commit: r259513 - in head/sys: dev/ofw powerpc/ofw

Nathan Whitehorn nwhitehorn at FreeBSD.org
Tue Dec 17 14:50:36 UTC 2013


Author: nwhitehorn
Date: Tue Dec 17 14:50:35 2013
New Revision: 259513
URL: http://svnweb.freebsd.org/changeset/base/259513

Log:
  Configure interrupt sense based on device tree information. This extends
  the OF interrupt map API to return sense information to the caller and
  the PowerPC Open Firmware PCI base driver to use it to program the PIC.

Modified:
  head/sys/dev/ofw/ofw_bus_subr.c
  head/sys/powerpc/ofw/ofw_pci.c

Modified: head/sys/dev/ofw/ofw_bus_subr.c
==============================================================================
--- head/sys/dev/ofw/ofw_bus_subr.c	Tue Dec 17 13:49:35 2013	(r259512)
+++ head/sys/dev/ofw/ofw_bus_subr.c	Tue Dec 17 14:50:35 2013	(r259513)
@@ -285,7 +285,7 @@ ofw_bus_lookup_imap(phandle_t node, stru
  * maskbuf must point to a buffer of length physsz + intrsz.
  * The interrupt is returned in result, which must point to a buffer of length
  * rintrsz (which gives the expected size of the mapped interrupt).
- * Returns 1 if a mapping was found, 0 otherwise.
+ * Returns number of cells in the interrupt if a mapping was found, 0 otherwise.
  */
 int
 ofw_bus_search_intrmap(void *intr, int intrsz, void *regs, int physsz,
@@ -325,19 +325,13 @@ ofw_bus_search_intrmap(void *intr, int i
 		tsz = physsz + intrsz + sizeof(phandle_t) + pintrsz;
 		KASSERT(i >= tsz, ("ofw_bus_search_intrmap: truncated map"));
 
-		/*
-		 * XXX: Apple hardware uses a second cell to set information
-		 * on the interrupt trigger type.  This information should
-		 * be used somewhere to program the PIC.
-		 */
-
 		if (bcmp(ref, mptr, physsz + intrsz) == 0) {
 			bcopy(mptr + physsz + intrsz + sizeof(parent),
-			    result, rintrsz);
+			    result, MIN(rintrsz, pintrsz));
 
 			if (iparent != NULL)
 				*iparent = parent;
-			return (1);
+			return (pintrsz/sizeof(pcell_t));
 		}
 		mptr += tsz;
 		i -= tsz;

Modified: head/sys/powerpc/ofw/ofw_pci.c
==============================================================================
--- head/sys/powerpc/ofw/ofw_pci.c	Tue Dec 17 13:49:35 2013	(r259512)
+++ head/sys/powerpc/ofw/ofw_pci.c	Tue Dec 17 14:50:35 2013	(r259513)
@@ -256,7 +256,8 @@ ofw_pci_route_interrupt(device_t bus, de
 {
 	struct ofw_pci_softc *sc;
 	struct ofw_pci_register reg;
-	uint32_t pintr, mintr;
+	uint32_t pintr, mintr[2];
+	int intrcells;
 	phandle_t iparent;
 	uint8_t maskbuf[sizeof(reg) + sizeof(pintr)];
 
@@ -269,10 +270,15 @@ ofw_pci_route_interrupt(device_t bus, de
 	    (pci_get_slot(dev) << OFW_PCI_PHYS_HI_DEVICESHIFT) |
 	    (pci_get_function(dev) << OFW_PCI_PHYS_HI_FUNCTIONSHIFT);
 
-	if (ofw_bus_lookup_imap(ofw_bus_get_node(dev), &sc->sc_pci_iinfo, &reg,
-	    sizeof(reg), &pintr, sizeof(pintr), &mintr, sizeof(mintr),
-	    &iparent, maskbuf))
-		return (ofw_bus_map_intr(dev, iparent, mintr));
+	intrcells = ofw_bus_lookup_imap(ofw_bus_get_node(dev),
+	    &sc->sc_pci_iinfo, &reg, sizeof(reg), &pintr, sizeof(pintr),
+	    mintr, sizeof(mintr), &iparent, maskbuf);
+	if (intrcells) {
+		pintr = ofw_bus_map_intr(dev, iparent, mintr[0]);
+		if (intrcells == 2)
+			ofw_bus_config_intr(dev, pintr, mintr[1]);
+		return (pintr);
+	}
 
 	/* Maybe it's a real interrupt, not an intpin */
 	if (pin > 4)


More information about the svn-src-head mailing list