svn commit: r304627 - projects/powernv/powerpc/powernv

Nathan Whitehorn nwhitehorn at FreeBSD.org
Mon Aug 22 19:27:31 UTC 2016


Author: nwhitehorn
Date: Mon Aug 22 19:27:30 2016
New Revision: 304627
URL: https://svnweb.freebsd.org/changeset/base/304627

Log:
  Set up OPAL IRQs properly.

Modified:
  projects/powernv/powerpc/powernv/opal_dev.c

Modified: projects/powernv/powerpc/powernv/opal_dev.c
==============================================================================
--- projects/powernv/powerpc/powernv/opal_dev.c	Mon Aug 22 19:27:20 2016	(r304626)
+++ projects/powernv/powerpc/powernv/opal_dev.c	Mon Aug 22 19:27:30 2016	(r304627)
@@ -94,6 +94,7 @@ DRIVER_MODULE(opaldev, ofwbus, opaldev_d
 static int
 opaldev_probe(device_t dev)
 {
+	phandle_t iparent;
 	pcell_t *irqs;
 	int i, n_irqs;
 
@@ -106,13 +107,18 @@ opaldev_probe(device_t dev)
 
 	/* Manually add IRQs before attaching */
 	if (OF_hasprop(ofw_bus_get_node(dev), "opal-interrupts")) {
+		iparent = OF_finddevice("/interrupt-controller at 0");
+		iparent = OF_xref_from_node(iparent);
+printf("IPARENT: %#x\n", iparent);
+
 		n_irqs = OF_getproplen(ofw_bus_get_node(dev),
                     "opal-interrupts") / sizeof(*irqs);
 		irqs = malloc(n_irqs * sizeof(*irqs), M_DEVBUF, M_WAITOK);
 		OF_getencprop(ofw_bus_get_node(dev), "opal-interrupts", irqs,
 		    n_irqs * sizeof(*irqs));
 		for (i = 0; i < n_irqs; i++)
-			bus_set_resource(dev, SYS_RES_IRQ, i, irqs[i], 1);
+			bus_set_resource(dev, SYS_RES_IRQ, i,
+			    ofw_bus_map_intr(dev, iparent, 1, &irqs[i]), 1);
 		free(irqs, M_DEVBUF);
 	}
 
@@ -240,6 +246,8 @@ opal_shutdown(void *arg, int howto)
 		opal_call(OPAL_CEC_POWER_DOWN, 0 /* Normal power off */);
 	else
 		opal_call(OPAL_CEC_REBOOT);
+
+	opal_call(OPAL_RETURN_CPU);
 }
 
 static void


More information about the svn-src-projects mailing list