svn commit: r230222 - projects/pseries/powerpc/pseries
Nathan Whitehorn
nwhitehorn at FreeBSD.org
Mon Jan 16 17:08:09 UTC 2012
Author: nwhitehorn
Date: Mon Jan 16 17:08:08 2012
New Revision: 230222
URL: http://svn.freebsd.org/changeset/base/230222
Log:
Fix calling convention for RTAS calls in this driver as well as a
misunderstanding of the cpu server argument to ibm,set-xive. As a result,
devices interrupts now work as well as IPIs.
Modified:
projects/pseries/powerpc/pseries/xics.c
Modified: projects/pseries/powerpc/pseries/xics.c
==============================================================================
--- projects/pseries/powerpc/pseries/xics.c Mon Jan 16 15:47:42 2012 (r230221)
+++ projects/pseries/powerpc/pseries/xics.c Mon Jan 16 17:08:08 2012 (r230222)
@@ -146,14 +146,17 @@ static void
xics_bind(device_t dev, u_int irq, cpuset_t cpumask)
{
struct xics_softc *sc = device_get_softc(dev);
- uint64_t status;
+ cell_t status, cpu;
/*
- * XXX: This is very special and just needs a mask.
- * For the moment, just play dirty and get the first word.
+ * This doesn't appear to actually support affinity groups, so just
+ * use the first CPU.
*/
- rtas_call_method(sc->ibm_set_xive, 3, 1, (uint64_t)irq,
- cpumask.__bits[0], XICS_PRIORITY, &status);
+ CPU_FOREACH(cpu)
+ if (CPU_ISSET(cpu, &cpumask)) break;
+
+ rtas_call_method(sc->ibm_set_xive, 3, 1, irq, cpu, XICS_PRIORITY,
+ &status);
}
static void
@@ -194,8 +197,7 @@ static void
xics_enable(device_t dev, u_int irq, u_int vector)
{
struct xics_softc *sc;
- uint64_t status, cpumask;
- int i;
+ cell_t status, cpu;
sc = device_get_softc(dev);
@@ -213,13 +215,10 @@ xics_enable(device_t dev, u_int irq, u_i
if (irq == MAX_XICS_IRQS)
return;
- /* Bind to all CPUs to start */
- cpumask = 0;
- CPU_FOREACH(i)
- cpumask |= (1ULL << i);
-
- rtas_call_method(sc->ibm_set_xive, 3, 1, (uint64_t)irq, cpumask,
- XICS_PRIORITY, &status);
+ /* Bind to this CPU to start: distrib. ID is last entry in gserver# */
+ cpu = PCPU_GET(cpuid);
+ rtas_call_method(sc->ibm_set_xive, 3, 1, irq, cpu, XICS_PRIORITY,
+ &status);
xics_unmask(dev, irq);
}
@@ -246,22 +245,22 @@ static void
xics_mask(device_t dev, u_int irq)
{
struct xics_softc *sc = device_get_softc(dev);
- uint64_t status;
+ cell_t status;
if (irq == MAX_XICS_IRQS)
return;
- rtas_call_method(sc->ibm_int_off, 1, 1, (uint64_t)irq, &status);
+ rtas_call_method(sc->ibm_int_off, 1, 1, irq, &status);
}
static void
xics_unmask(device_t dev, u_int irq)
{
struct xics_softc *sc = device_get_softc(dev);
- uint64_t status;
+ cell_t status;
if (irq == MAX_XICS_IRQS)
return;
- rtas_call_method(sc->ibm_int_on, 1, 1, (uint64_t)irq, &status);
+ rtas_call_method(sc->ibm_int_on, 1, 1, irq, &status);
}
More information about the svn-src-projects
mailing list