Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 26 Jan 2015 23:45:10 +0000 (UTC)
From:      Nathan Whitehorn <nwhitehorn@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r277781 - in projects/powernv/powerpc: powerpc pseries
Message-ID:  <201501262345.t0QNjAAO044173@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: nwhitehorn
Date: Mon Jan 26 23:45:10 2015
New Revision: 277781
URL: https://svnweb.freebsd.org/changeset/base/277781

Log:
  Unbreak XICP driver when running under a hypervisor. Now it works (tested)
  both ways.

Modified:
  projects/powernv/powerpc/powerpc/intr_machdep.c
  projects/powernv/powerpc/pseries/xics.c

Modified: projects/powernv/powerpc/powerpc/intr_machdep.c
==============================================================================
--- projects/powernv/powerpc/powerpc/intr_machdep.c	Mon Jan 26 22:27:17 2015	(r277780)
+++ projects/powernv/powerpc/powerpc/intr_machdep.c	Mon Jan 26 23:45:10 2015	(r277781)
@@ -155,7 +155,7 @@ smp_intr_init(void *dummy __unused)
 
 	for (vector = 0; vector < nvectors; vector++) {
 		i = powerpc_intrs[vector];
-		if (i != NULL && i->pic == root_pic)
+		if (i != NULL && i->event != NULL && i->pic == root_pic)
 			PIC_BIND(i->pic, i->intline, i->cpu);
 	}
 }

Modified: projects/powernv/powerpc/pseries/xics.c
==============================================================================
--- projects/powernv/powerpc/pseries/xics.c	Mon Jan 26 22:27:17 2015	(r277780)
+++ projects/powernv/powerpc/pseries/xics.c	Mon Jan 26 23:45:10 2015	(r277781)
@@ -286,11 +286,11 @@ xicp_dispatch(device_t dev, struct trapf
 	uint64_t xirr, junk;
 	int i;
 
-	if (sc->mem[0])
+	if (mfmsr() & PSL_HV) {
 		regs = xicp_mem_for_cpu(PCPU_GET(cpuid));
-
-	KASSERT(sc->mem[0] == NULL || regs != NULL,
-	    ("Can't find regs for CPU %d", PCPU_GET(cpuid)));
+		KASSERT(regs != NULL,
+		    ("Can't find regs for CPU %d", PCPU_GET(cpuid)));
+	}
 
 	sc = device_get_softc(dev);
 	for (;;) {
@@ -371,13 +371,12 @@ static void
 xicp_eoi(device_t dev, u_int irq)
 {
 	uint64_t xirr;
-	struct xicp_softc *sc = device_get_softc(dev);
 
 	if (irq == MAX_XICP_IRQS) /* Remap IPI interrupt to internal value */
 		irq = XICP_IPI;
 	xirr = irq | (XICP_PRIORITY << 24);
 
-	if (sc->mem[0])
+	if (mfmsr() & PSL_HV)
 		bus_write_4(xicp_mem_for_cpu(PCPU_GET(cpuid)), 4, xirr);
 	else
 		phyp_hcall(H_EOI, xirr);
@@ -386,9 +385,8 @@ xicp_eoi(device_t dev, u_int irq)
 static void
 xicp_ipi(device_t dev, u_int cpu)
 {
-	struct xicp_softc *sc = device_get_softc(dev);
 
-	if (sc->mem[0])
+	if (mfmsr() & PSL_HV)
 		bus_write_1(xicp_mem_for_cpu(cpu), 12, XICP_PRIORITY);
 	else
 		phyp_hcall(H_IPI, (uint64_t)cpu, XICP_PRIORITY);



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