summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@cvs.openbsd.org>2015-09-27 11:29:21 +0000
committerMark Kettenis <kettenis@cvs.openbsd.org>2015-09-27 11:29:21 +0000
commit19059cb0dd50a89416148c073d0d2ea6e8ca365a (patch)
tree028028e684aed87f3c41a446d4ee8a0ba7b8ab76
parentc2bd7cb5ca2e18a027e782e271ab53a456179132 (diff)
Store the target CPU in "struct intrhand" and use it in intr_barrier().
Also use it wherever we configure the hardware to direct interrupts to the right CPU.
-rw-r--r--sys/arch/sparc64/dev/cbus.c5
-rw-r--r--sys/arch/sparc64/dev/ebus_mainbus.c4
-rw-r--r--sys/arch/sparc64/dev/vbus.c4
-rw-r--r--sys/arch/sparc64/dev/vpci.c4
-rw-r--r--sys/arch/sparc64/include/intr.h3
-rw-r--r--sys/arch/sparc64/sparc64/intr.c9
6 files changed, 17 insertions, 12 deletions
diff --git a/sys/arch/sparc64/dev/cbus.c b/sys/arch/sparc64/dev/cbus.c
index 5ae55eb735b..b99e87f8e24 100644
--- a/sys/arch/sparc64/dev/cbus.c
+++ b/sys/arch/sparc64/dev/cbus.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cbus.c,v 1.14 2015/01/25 21:42:13 kettenis Exp $ */
+/* $OpenBSD: cbus.c,v 1.15 2015/09/27 11:29:20 kettenis Exp $ */
/*
* Copyright (c) 2008 Mark Kettenis
*
@@ -187,8 +187,9 @@ cbus_intr_establish(bus_space_tag_t t, bus_space_tag_t t0, int ihandle,
evcount_attach(&ih->ih_count, "unknown", NULL);
ih->ih_ack = cbus_intr_ack;
+ ih->ih_cpu = cpus;
- err = hv_vintr_settarget(devhandle, devino, cpus->ci_upaid);
+ err = hv_vintr_settarget(devhandle, devino, ih->ih_cpu->ci_upaid);
if (err != H_EOK) {
printf("hv_vintr_settarget: %d\n", err);
return (NULL);
diff --git a/sys/arch/sparc64/dev/ebus_mainbus.c b/sys/arch/sparc64/dev/ebus_mainbus.c
index 58e18357c1e..8eb2084241f 100644
--- a/sys/arch/sparc64/dev/ebus_mainbus.c
+++ b/sys/arch/sparc64/dev/ebus_mainbus.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ebus_mainbus.c,v 1.8 2012/08/17 20:41:27 kettenis Exp $ */
+/* $OpenBSD: ebus_mainbus.c,v 1.9 2015/09/27 11:29:20 kettenis Exp $ */
/*
* Copyright (c) 2007 Mark Kettenis
@@ -277,7 +277,7 @@ ebus_mainbus_intr_establish(bus_space_tag_t t, bus_space_tag_t t0, int ihandle,
intr_establish(ih->ih_pil, ih);
ih->ih_ack = ebus_mainbus_intr_ack;
- err = hv_intr_settarget(sysino, cpus->ci_upaid);
+ err = hv_intr_settarget(sysino, ih->ih_cpu->ci_upaid);
if (err != H_EOK)
return (NULL);
diff --git a/sys/arch/sparc64/dev/vbus.c b/sys/arch/sparc64/dev/vbus.c
index 72e8ff49f49..35f65a96b0a 100644
--- a/sys/arch/sparc64/dev/vbus.c
+++ b/sys/arch/sparc64/dev/vbus.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vbus.c,v 1.7 2014/07/12 18:44:43 tedu Exp $ */
+/* $OpenBSD: vbus.c,v 1.8 2015/09/27 11:29:20 kettenis Exp $ */
/*
* Copyright (c) 2008 Mark Kettenis
*
@@ -207,7 +207,7 @@ vbus_intr_establish(bus_space_tag_t t, bus_space_tag_t t0, int ihandle,
intr_establish(ih->ih_pil, ih);
ih->ih_ack = vbus_intr_ack;
- err = hv_intr_settarget(sysino, cpus->ci_upaid);
+ err = hv_intr_settarget(sysino, ih->ih_cpu->ci_upaid);
if (err != H_EOK)
return (NULL);
diff --git a/sys/arch/sparc64/dev/vpci.c b/sys/arch/sparc64/dev/vpci.c
index 0633a7cfded..354eb340572 100644
--- a/sys/arch/sparc64/dev/vpci.c
+++ b/sys/arch/sparc64/dev/vpci.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vpci.c,v 1.18 2014/12/09 06:58:29 doug Exp $ */
+/* $OpenBSD: vpci.c,v 1.19 2015/09/27 11:29:20 kettenis Exp $ */
/*
* Copyright (c) 2008 Mark Kettenis <kettenis@openbsd.org>
*
@@ -562,7 +562,7 @@ vpci_intr_establish(bus_space_tag_t t, bus_space_tag_t t0, int ihandle,
intr_establish(ih->ih_pil, ih);
ih->ih_ack = vpci_intr_ack;
- err = hv_intr_settarget(sysino, cpus->ci_upaid);
+ err = hv_intr_settarget(sysino, ih->ih_cpu->ci_upaid);
if (err != H_EOK)
return (NULL);
diff --git a/sys/arch/sparc64/include/intr.h b/sys/arch/sparc64/include/intr.h
index eecb162590e..16b3913506f 100644
--- a/sys/arch/sparc64/include/intr.h
+++ b/sys/arch/sparc64/include/intr.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: intr.h,v 1.17 2015/09/13 11:47:59 kettenis Exp $ */
+/* $OpenBSD: intr.h,v 1.18 2015/09/27 11:29:20 kettenis Exp $ */
/* $NetBSD: intr.h,v 1.8 2001/01/14 23:50:30 thorpej Exp $ */
/*-
@@ -57,6 +57,7 @@ struct intrhand {
void (*ih_ack)(struct intrhand *);
struct evcount ih_count; /* # of interrupts */
const void *ih_bus; /* parent bus */
+ struct cpu_info *ih_cpu; /* target */
char ih_name[32]; /* device name */
};
diff --git a/sys/arch/sparc64/sparc64/intr.c b/sys/arch/sparc64/sparc64/intr.c
index 9fd896bd523..ce0affe9906 100644
--- a/sys/arch/sparc64/sparc64/intr.c
+++ b/sys/arch/sparc64/sparc64/intr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: intr.c,v 1.53 2015/09/13 11:47:59 kettenis Exp $ */
+/* $OpenBSD: intr.c,v 1.54 2015/09/27 11:29:20 kettenis Exp $ */
/* $NetBSD: intr.c,v 1.39 2001/07/19 23:38:11 eeh Exp $ */
/*
@@ -200,6 +200,7 @@ intr_establish(int level, struct intrhand *ih)
ih->ih_pil = level; /* XXXX caller should have done this before */
ih->ih_pending = 0; /* XXXX caller should have done this before */
ih->ih_next = NULL;
+ ih->ih_cpu = cpus;
if (ih->ih_clr)
ih->ih_ack = intr_ack;
else
@@ -313,9 +314,11 @@ intr_establish(int level, struct intrhand *ih)
}
void
-intr_barrier(void *ih)
+intr_barrier(void *cookie)
{
- sched_barrier(NULL);
+ struct intrhand *ih = cookie;
+
+ sched_barrier(ih->ih_cpu);
}
void *