Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 17 Dec 2013 14:50:36 +0000 (UTC)
From:      Nathan Whitehorn <nwhitehorn@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r259513 - in head/sys: dev/ofw powerpc/ofw
Message-ID:  <201312171450.rBHEoaeB009878@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201312171450.rBHEoaeB009878>