summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/arch/arm64/arm64/acpi_machdep.c3
-rw-r--r--sys/arch/arm64/arm64/intr.c22
-rw-r--r--sys/arch/arm64/dev/acpipci.c3
-rw-r--r--sys/arch/arm64/dev/agintc.c22
-rw-r--r--sys/arch/arm64/dev/ampintc.c22
-rw-r--r--sys/arch/arm64/include/intr.h4
-rw-r--r--sys/arch/armv7/include/intr.h3
-rw-r--r--sys/dev/fdt/bcm2835_aux.c3
-rw-r--r--sys/dev/fdt/imxgpc.c3
-rw-r--r--sys/dev/fdt/imxgpio.c16
-rw-r--r--sys/dev/fdt/mvgicp.c26
-rw-r--r--sys/dev/fdt/mvicu.c20
-rw-r--r--sys/dev/fdt/mvkpcie.c13
-rw-r--r--sys/dev/fdt/rkgpio.c13
14 files changed, 148 insertions, 25 deletions
diff --git a/sys/arch/arm64/arm64/acpi_machdep.c b/sys/arch/arm64/arm64/acpi_machdep.c
index 4e6f7223438..920f0bde318 100644
--- a/sys/arch/arm64/arm64/acpi_machdep.c
+++ b/sys/arch/arm64/arm64/acpi_machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: acpi_machdep.c,v 1.7 2020/07/16 13:03:39 patrick Exp $ */
+/* $OpenBSD: acpi_machdep.c,v 1.8 2020/07/17 08:07:33 patrick Exp $ */
/*
* Copyright (c) 2018 Mark Kettenis
*
@@ -162,7 +162,6 @@ acpi_intr_establish(int irq, int flags, int level,
aih = malloc(sizeof(*aih), M_DEVBUF, M_WAITOK);
aih->ih_ic = ic;
aih->ih_ih = cookie;
- aih->ih_cpu = NULL;
return aih;
}
diff --git a/sys/arch/arm64/arm64/intr.c b/sys/arch/arm64/arm64/intr.c
index 6a793594345..9d5514878c9 100644
--- a/sys/arch/arm64/arm64/intr.c
+++ b/sys/arch/arm64/arm64/intr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: intr.c,v 1.18 2020/07/16 13:03:39 patrick Exp $ */
+/* $OpenBSD: intr.c,v 1.19 2020/07/17 08:07:33 patrick Exp $ */
/*
* Copyright (c) 2011 Dale Rahn <drahn@openbsd.org>
*
@@ -32,6 +32,7 @@ uint32_t arm_intr_map_msi(int, uint64_t *);
void *arm_intr_prereg_establish_fdt(void *, int *, int, struct cpu_info *,
int (*)(void *), void *, char *);
void arm_intr_prereg_disestablish_fdt(void *);
+void arm_intr_prereg_barrier_fdt(void *);
int arm_dflt_splraise(int);
int arm_dflt_spllower(int);
@@ -220,6 +221,16 @@ arm_intr_prereg_disestablish_fdt(void *cookie)
}
void
+arm_intr_prereg_barrier_fdt(void *cookie)
+{
+ struct intr_prereg *ip = cookie;
+ struct interrupt_controller *ic = ip->ip_ic;
+
+ if (ip->ip_ic != NULL && ip->ip_ih != NULL)
+ ic->ic_barrier(ip->ip_ih);
+}
+
+void
arm_intr_init_fdt_recurse(int node)
{
struct interrupt_controller *ic;
@@ -231,6 +242,7 @@ arm_intr_init_fdt_recurse(int node)
ic->ic_cookie = ic;
ic->ic_establish = arm_intr_prereg_establish_fdt;
ic->ic_disestablish = arm_intr_prereg_disestablish_fdt;
+ ic->ic_barrier = arm_intr_prereg_barrier_fdt;
arm_intr_register_fdt(ic);
}
@@ -373,7 +385,6 @@ arm_intr_establish_fdt_idx_cpu(int node, int idx, int level, struct cpu_info *ci
ih = malloc(sizeof(*ih), M_DEVBUF, M_WAITOK);
ih->ih_ic = ic;
ih->ih_ih = val;
- ih->ih_cpu = ci;
return ih;
}
@@ -446,7 +457,6 @@ arm_intr_establish_fdt_imap_cpu(int node, int *reg, int nreg, int level,
ih = malloc(sizeof(*ih), M_DEVBUF, M_WAITOK);
ih->ih_ic = ic;
ih->ih_ih = val;
- ih->ih_cpu = ci;
free(map, M_DEVBUF, len);
return ih;
@@ -485,7 +495,6 @@ arm_intr_establish_fdt_msi_cpu(int node, uint64_t *addr, uint64_t *data,
ih = malloc(sizeof(*ih), M_DEVBUF, M_WAITOK);
ih->ih_ic = ic;
ih->ih_ih = val;
- ih->ih_cpu = ci;
return ih;
}
@@ -549,7 +558,6 @@ arm_intr_parent_establish_fdt(void *cookie, int *cell, int level,
ih = malloc(sizeof(*ih), M_DEVBUF, M_WAITOK);
ih->ih_ic = ic;
ih->ih_ih = val;
- ih->ih_cpu = ci;
return ih;
}
@@ -823,7 +831,9 @@ void
intr_barrier(void *cookie)
{
struct arm_intr_handle *ih = cookie;
- sched_barrier(ih->ih_cpu);
+ struct interrupt_controller *ic = ih->ih_ic;
+
+ ic->ic_barrier(ih->ih_ih);
}
/*
diff --git a/sys/arch/arm64/dev/acpipci.c b/sys/arch/arm64/dev/acpipci.c
index f6c76c7aafb..4652cade90e 100644
--- a/sys/arch/arm64/dev/acpipci.c
+++ b/sys/arch/arm64/dev/acpipci.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: acpipci.c,v 1.19 2020/07/16 13:03:39 patrick Exp $ */
+/* $OpenBSD: acpipci.c,v 1.20 2020/07/17 08:07:33 patrick Exp $ */
/*
* Copyright (c) 2018 Mark Kettenis
*
@@ -470,7 +470,6 @@ acpipci_intr_establish(void *v, pci_intr_handle_t ih, int level,
aih = malloc(sizeof(*aih), M_DEVBUF, M_WAITOK);
aih->ih_ic = ic;
aih->ih_ih = cookie;
- aih->ih_cpu = ci;
cookie = aih;
} else {
if (ci != NULL && !CPU_IS_PRIMARY(ci))
diff --git a/sys/arch/arm64/dev/agintc.c b/sys/arch/arm64/dev/agintc.c
index bde190a4ed4..11d73e05111 100644
--- a/sys/arch/arm64/dev/agintc.c
+++ b/sys/arch/arm64/dev/agintc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: agintc.c,v 1.25 2020/07/15 12:36:01 patrick Exp $ */
+/* $OpenBSD: agintc.c,v 1.26 2020/07/17 08:07:33 patrick Exp $ */
/*
* Copyright (c) 2007, 2009, 2011, 2017 Dale Rahn <drahn@dalerahn.com>
* Copyright (c) 2018 Mark Kettenis <kettenis@openbsd.org>
@@ -170,6 +170,7 @@ struct intrhand {
int ih_irq; /* IRQ number */
struct evcount ih_count;
char *ih_name;
+ struct cpu_info *ih_ci; /* CPU the IRQ runs on */
};
struct intrq {
@@ -220,6 +221,7 @@ void agintc_intr_disable(struct agintc_softc *, int);
void agintc_route(struct agintc_softc *, int, int,
struct cpu_info *);
void agintc_route_irq(void *, int, struct cpu_info *);
+void agintc_intr_barrier(void *);
void agintc_wait_rwp(struct agintc_softc *sc);
void agintc_r_wait_rwp(struct agintc_softc *sc);
uint32_t agintc_r_ictlr(void);
@@ -597,6 +599,7 @@ agintc_attach(struct device *parent, struct device *self, void *aux)
sc->sc_ic.ic_disestablish = agintc_intr_disestablish;
sc->sc_ic.ic_route = agintc_route_irq;
sc->sc_ic.ic_cpu_enable = agintc_cpuinit;
+ sc->sc_ic.ic_barrier = agintc_intr_barrier;
arm_intr_register_fdt(&sc->sc_ic);
restore_interrupts(psw);
@@ -872,6 +875,14 @@ agintc_route(struct agintc_softc *sc, int irq, int enable, struct cpu_info *ci)
}
void
+agintc_intr_barrier(void *cookie)
+{
+ struct intrhand *ih = cookie;
+
+ sched_barrier(ih->ih_ci);
+}
+
+void
agintc_run_handler(struct intrhand *ih, void *frame, int s)
{
void *arg;
@@ -1006,6 +1017,7 @@ agintc_intr_establish(int irqno, int level, struct cpu_info *ci,
ih->ih_flags = level & IPL_FLAGMASK;
ih->ih_irq = irqno;
ih->ih_name = name;
+ ih->ih_ci = ci;
psw = disable_interrupts();
@@ -1224,6 +1236,7 @@ void agintc_msi_attach(struct device *, struct device *, void *);
void *agintc_intr_establish_msi(void *, uint64_t *, uint64_t *,
int , struct cpu_info *, int (*)(void *), void *, char *);
void agintc_intr_disestablish_msi(void *);
+void agintc_intr_barrier_msi(void *);
struct agintc_msi_softc {
struct device sc_dev;
@@ -1409,6 +1422,7 @@ agintc_msi_attach(struct device *parent, struct device *self, void *aux)
sc->sc_ic.ic_cookie = sc;
sc->sc_ic.ic_establish_msi = agintc_intr_establish_msi;
sc->sc_ic.ic_disestablish = agintc_intr_disestablish_msi;
+ sc->sc_ic.ic_barrier = agintc_intr_barrier_msi;
arm_intr_register_fdt(&sc->sc_ic);
return;
@@ -1556,6 +1570,12 @@ agintc_intr_disestablish_msi(void *cookie)
*(void **)cookie = NULL;
}
+void
+agintc_intr_barrier_msi(void *cookie)
+{
+ agintc_intr_barrier(*(void **)cookie);
+}
+
struct agintc_dmamem *
agintc_dmamem_alloc(bus_dma_tag_t dmat, bus_size_t size, bus_size_t align)
{
diff --git a/sys/arch/arm64/dev/ampintc.c b/sys/arch/arm64/dev/ampintc.c
index eaaa35589f4..ae501973ce3 100644
--- a/sys/arch/arm64/dev/ampintc.c
+++ b/sys/arch/arm64/dev/ampintc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ampintc.c,v 1.18 2020/07/14 15:52:20 patrick Exp $ */
+/* $OpenBSD: ampintc.c,v 1.19 2020/07/17 08:07:33 patrick Exp $ */
/*
* Copyright (c) 2007,2009,2011 Dale Rahn <drahn@openbsd.org>
*
@@ -156,6 +156,7 @@ struct intrhand {
int ih_irq; /* IRQ number */
struct evcount ih_count;
char *ih_name;
+ struct cpu_info *ih_ci; /* CPU the IRQ runs on */
};
struct intrq {
@@ -191,6 +192,7 @@ void ampintc_intr_disable(int);
void ampintc_intr_config(int, int);
void ampintc_route(int, int, struct cpu_info *);
void ampintc_route_irq(void *, int, struct cpu_info *);
+void ampintc_intr_barrier(void *);
int ampintc_ipi_combined(void *);
int ampintc_ipi_nop(void *);
@@ -373,6 +375,7 @@ ampintc_attach(struct device *parent, struct device *self, void *aux)
sc->sc_ic.ic_disestablish = ampintc_intr_disestablish;
sc->sc_ic.ic_route = ampintc_route_irq;
sc->sc_ic.ic_cpu_enable = ampintc_cpuinit;
+ sc->sc_ic.ic_barrier = ampintc_intr_barrier;
arm_intr_register_fdt(&sc->sc_ic);
/* attach GICv2M frame controller */
@@ -630,6 +633,14 @@ ampintc_route_irq(void *v, int enable, struct cpu_info *ci)
}
void
+ampintc_intr_barrier(void *cookie)
+{
+ struct intrhand *ih = cookie;
+
+ sched_barrier(ih->ih_ci);
+}
+
+void
ampintc_irq_handler(void *frame)
{
struct ampintc_softc *sc = ampintc;
@@ -758,6 +769,7 @@ ampintc_intr_establish(int irqno, int type, int level, struct cpu_info *ci,
ih->ih_flags = level & IPL_FLAGMASK;
ih->ih_irq = irqno;
ih->ih_name = name;
+ ih->ih_ci = ci;
psw = disable_interrupts();
@@ -833,6 +845,7 @@ void ampintc_msi_attach(struct device *, struct device *, void *);
void *ampintc_intr_establish_msi(void *, uint64_t *, uint64_t *,
int , struct cpu_info *, int (*)(void *), void *, char *);
void ampintc_intr_disestablish_msi(void *);
+void ampintc_intr_barrier_msi(void *);
struct ampintc_msi_softc {
struct device sc_dev;
@@ -897,6 +910,7 @@ ampintc_msi_attach(struct device *parent, struct device *self, void *aux)
sc->sc_ic.ic_cookie = sc;
sc->sc_ic.ic_establish_msi = ampintc_intr_establish_msi;
sc->sc_ic.ic_disestablish = ampintc_intr_disestablish_msi;
+ sc->sc_ic.ic_barrier = ampintc_intr_barrier_msi;
arm_intr_register_fdt(&sc->sc_ic);
}
@@ -933,6 +947,12 @@ ampintc_intr_disestablish_msi(void *cookie)
*(void **)cookie = NULL;
}
+void
+ampintc_intr_barrier_msi(void *cookie)
+{
+ ampintc_intr_barrier(*(void **)cookie);
+}
+
#ifdef MULTIPROCESSOR
int
ampintc_ipi_ddb(void *v)
diff --git a/sys/arch/arm64/include/intr.h b/sys/arch/arm64/include/intr.h
index e4bf1545112..7d299072ef7 100644
--- a/sys/arch/arm64/include/intr.h
+++ b/sys/arch/arm64/include/intr.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: intr.h,v 1.15 2020/07/16 13:03:39 patrick Exp $ */
+/* $OpenBSD: intr.h,v 1.16 2020/07/17 08:07:33 patrick Exp $ */
/*
* Copyright (c) 2001-2004 Opsycon AB (www.opsycon.se / www.opsycon.com)
@@ -93,7 +93,6 @@ void arm_set_intr_handler(int (*raise)(int), int (*lower)(int),
struct arm_intr_handle {
struct interrupt_controller *ih_ic;
void *ih_ih;
- struct cpu_info *ih_cpu;
};
struct arm_intr_func {
@@ -151,6 +150,7 @@ struct interrupt_controller {
void (*ic_disable)(void *);
void (*ic_route)(void *, int, struct cpu_info *);
void (*ic_cpu_enable)(void);
+ void (*ic_barrier)(void *);
LIST_ENTRY(interrupt_controller) ic_list;
uint32_t ic_phandle;
diff --git a/sys/arch/armv7/include/intr.h b/sys/arch/armv7/include/intr.h
index f61eff62f66..25f957a0dae 100644
--- a/sys/arch/armv7/include/intr.h
+++ b/sys/arch/armv7/include/intr.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: intr.h,v 1.13 2020/07/14 15:34:15 patrick Exp $ */
+/* $OpenBSD: intr.h,v 1.14 2020/07/17 08:07:34 patrick Exp $ */
/* $NetBSD: intr.h,v 1.12 2003/06/16 20:00:59 thorpej Exp $ */
/*
@@ -161,6 +161,7 @@ struct interrupt_controller {
void (*ic_disable)(void *);
void (*ic_route)(void *, int, struct cpu_info *);
void (*ic_cpu_enable)(void);
+ void (*ic_barrier)(void *);
LIST_ENTRY(interrupt_controller) ic_list;
uint32_t ic_phandle;
diff --git a/sys/dev/fdt/bcm2835_aux.c b/sys/dev/fdt/bcm2835_aux.c
index 47bc8e492dd..23f7e92e827 100644
--- a/sys/dev/fdt/bcm2835_aux.c
+++ b/sys/dev/fdt/bcm2835_aux.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: bcm2835_aux.c,v 1.5 2020/07/14 15:34:15 patrick Exp $ */
+/* $OpenBSD: bcm2835_aux.c,v 1.6 2020/07/17 08:07:34 patrick Exp $ */
/*
* Copyright (c) 2017 Mark Kettenis <kettenis@openbsd.org>
*
@@ -97,6 +97,7 @@ bcmaux_attach(struct device *parent, struct device *self, void *aux)
sc->sc_ic.ic_cookie = &sc->sc_ic;
sc->sc_ic.ic_establish = bcm_aux_intr_establish_fdt;
sc->sc_ic.ic_disestablish = fdt_intr_disestablish;
+ sc->sc_ic.ic_barrier = intr_barrier;
fdt_intr_register(&sc->sc_ic);
}
diff --git a/sys/dev/fdt/imxgpc.c b/sys/dev/fdt/imxgpc.c
index d2b367aabfb..87b2f6ae2f0 100644
--- a/sys/dev/fdt/imxgpc.c
+++ b/sys/dev/fdt/imxgpc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: imxgpc.c,v 1.7 2020/04/26 13:20:41 patrick Exp $ */
+/* $OpenBSD: imxgpc.c,v 1.8 2020/07/17 08:07:34 patrick Exp $ */
/*
* Copyright (c) 2016 Mark Kettenis
*
@@ -73,6 +73,7 @@ imxgpc_attach(struct device *parent, struct device *self, void *aux)
sc->sc_ic.ic_cookie = &sc->sc_ic;
sc->sc_ic.ic_establish = fdt_intr_parent_establish;
sc->sc_ic.ic_disestablish = fdt_intr_parent_disestablish;
+ sc->sc_ic.ic_barrier = intr_barrier;
fdt_intr_register(&sc->sc_ic);
printf("\n");
diff --git a/sys/dev/fdt/imxgpio.c b/sys/dev/fdt/imxgpio.c
index a1dab03217a..4da86aad524 100644
--- a/sys/dev/fdt/imxgpio.c
+++ b/sys/dev/fdt/imxgpio.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: imxgpio.c,v 1.4 2020/07/14 15:34:15 patrick Exp $ */
+/* $OpenBSD: imxgpio.c,v 1.5 2020/07/17 08:07:34 patrick Exp $ */
/*
* Copyright (c) 2007,2009 Dale Rahn <drahn@openbsd.org>
* Copyright (c) 2012-2013 Patrick Wildt <patrick@blueri.se>
@@ -84,6 +84,7 @@ void imxgpio_intr_disestablish(void *);
void imxgpio_recalc_ipl(struct imxgpio_softc *);
void imxgpio_intr_enable(void *);
void imxgpio_intr_disable(void *);
+void imxgpio_intr_barrier(void *);
struct cfattach imxgpio_ca = {
@@ -135,6 +136,7 @@ imxgpio_attach(struct device *parent, struct device *self, void *aux)
sc->sc_ic.ic_disestablish = imxgpio_intr_disestablish;
sc->sc_ic.ic_enable = imxgpio_intr_enable;
sc->sc_ic.ic_disable = imxgpio_intr_disable;
+ sc->sc_ic.ic_barrier = imxgpio_intr_barrier;
fdt_intr_register(&sc->sc_ic);
printf("\n");
@@ -409,3 +411,15 @@ imxgpio_intr_disable(void *cookie)
bus_space_write_4(sc->sc_iot, sc->sc_ioh, GPIO_IMR, mask);
splx(s);
}
+
+void
+imxgpio_intr_barrier(void *cookie)
+{
+ struct intrhand *ih = cookie;
+ struct imxgpio_softc *sc = ih->ih_sc;
+
+ if (sc->sc_ih_h && ih->ih_irq >= 16)
+ intr_barrier(sc->sc_ih_h);
+ else if (sc->sc_ih_l)
+ intr_barrier(sc->sc_ih_l);
+}
diff --git a/sys/dev/fdt/mvgicp.c b/sys/dev/fdt/mvgicp.c
index e333dad97c0..8ce3eec2e3c 100644
--- a/sys/dev/fdt/mvgicp.c
+++ b/sys/dev/fdt/mvgicp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mvgicp.c,v 1.2 2020/07/14 15:34:15 patrick Exp $ */
+/* $OpenBSD: mvgicp.c,v 1.3 2020/07/17 08:07:34 patrick Exp $ */
/*
* Copyright (c) 2019 Patrick Wildt <patrick@blueri.se>
*
@@ -50,6 +50,7 @@ void mvgicp_attach(struct device *, struct device *, void *);
void * mvgicp_intr_establish(void *, uint64_t *, uint64_t *,
int, struct cpu_info *, int (*)(void *), void *, char *);
void mvgicp_intr_disestablish(void *);
+void mvgicp_intr_barrier(void *);
struct cfattach mvgicp_ca = {
sizeof(struct mvgicp_softc), mvgicp_match, mvgicp_attach
@@ -112,6 +113,7 @@ mvgicp_attach(struct device *parent, struct device *self, void *aux)
sc->sc_ic.ic_cookie = sc;
sc->sc_ic.ic_establish_msi = mvgicp_intr_establish;
sc->sc_ic.ic_disestablish = mvgicp_intr_disestablish;
+ sc->sc_ic.ic_barrier = mvgicp_intr_barrier;
fdt_intr_register(&sc->sc_ic);
printf("\n");
@@ -123,6 +125,7 @@ mvgicp_intr_establish(void *self, uint64_t *addr, uint64_t *data,
{
struct mvgicp_softc *sc = (struct mvgicp_softc *)self;
struct interrupt_controller *ic = sc->sc_parent_ic;
+ struct arm_intr_handle *ih;
uint32_t interrupt[3];
uint32_t flags;
void *cookie;
@@ -164,13 +167,30 @@ mvgicp_intr_establish(void *self, uint64_t *addr, uint64_t *data,
if (cookie == NULL)
return NULL;
- sc->sc_spi[*data] = cookie;
+ ih = malloc(sizeof(*ih), M_DEVBUF, M_WAITOK);
+ ih->ih_ic = ic;
+ ih->ih_ih = cookie;
+
+ sc->sc_spi[*data] = ih;
return &sc->sc_spi[*data];
}
void
mvgicp_intr_disestablish(void *cookie)
{
- fdt_intr_disestablish(*(void **)cookie);
+ struct arm_intr_handle *ih = *(void **)cookie;
+ struct interrupt_controller *ic = ih->ih_ic;
+
+ ic->ic_disestablish(ih->ih_ih);
+ free(ih, M_DEVBUF, sizeof(*ih));
*(void **)cookie = NULL;
}
+
+void
+mvgicp_intr_barrier(void *cookie)
+{
+ struct arm_intr_handle *ih = *(void **)cookie;
+ struct interrupt_controller *ic = ih->ih_ic;
+
+ ic->ic_barrier(ih->ih_ih);
+}
diff --git a/sys/dev/fdt/mvicu.c b/sys/dev/fdt/mvicu.c
index 0659c81a158..805aac01c82 100644
--- a/sys/dev/fdt/mvicu.c
+++ b/sys/dev/fdt/mvicu.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mvicu.c,v 1.5 2020/07/14 15:34:15 patrick Exp $ */
+/* $OpenBSD: mvicu.c,v 1.6 2020/07/17 08:07:34 patrick Exp $ */
/*
* Copyright (c) 2018 Mark Kettenis <kettenis@openbsd.org>
*
@@ -96,6 +96,7 @@ void mvicu_register(struct mvicu_softc *, int, int);
void *mvicu_intr_establish(void *, int *, int, struct cpu_info *,
int (*)(void *), void *, char *);
void mvicu_intr_disestablish(void *);
+void mvicu_intr_barrier(void *);
int
mvicu_match(struct device *parent, void *match, void *aux)
@@ -171,6 +172,7 @@ mvicu_register(struct mvicu_softc *sc, int node, int idx)
sn->sn_ic.ic_cookie = sn;
sn->sn_ic.ic_establish = mvicu_intr_establish;
sn->sn_ic.ic_disestablish = mvicu_intr_disestablish;
+ sn->sn_ic.ic_barrier = mvicu_intr_barrier;
while (node && !phandle) {
phandle = OF_getpropint(node, "msi-parent", 0);
@@ -198,6 +200,7 @@ mvicu_intr_establish(void *cookie, int *cell, int level,
struct mvicu_subnode *sn = cookie;
struct mvicu_softc *sc = sn->sn_sc;
struct interrupt_controller *ic = sn->sn_parent_ic;
+ struct arm_intr_handle *ih;
uint32_t idx, flags;
uint64_t addr, data;
int edge = 0;
@@ -258,7 +261,11 @@ mvicu_intr_establish(void *cookie, int *cell, int level,
(edge ? ICU_INT_EDGE : 0));
}
- return cookie;
+ ih = malloc(sizeof(*ih), M_DEVBUF, M_WAITOK);
+ ih->ih_ic = ic;
+ ih->ih_ih = cookie;
+
+ return ih;
}
void
@@ -266,3 +273,12 @@ mvicu_intr_disestablish(void *cookie)
{
panic("%s", __func__);
}
+
+void
+mvicu_intr_barrier(void *cookie)
+{
+ struct arm_intr_handle *ih = cookie;
+ struct interrupt_controller *ic = ih->ih_ic;
+
+ ic->ic_barrier(ih->ih_ih);
+}
diff --git a/sys/dev/fdt/mvkpcie.c b/sys/dev/fdt/mvkpcie.c
index 1e3c96b5ae4..511f403bb8e 100644
--- a/sys/dev/fdt/mvkpcie.c
+++ b/sys/dev/fdt/mvkpcie.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mvkpcie.c,v 1.6 2020/07/14 15:42:19 patrick Exp $ */
+/* $OpenBSD: mvkpcie.c,v 1.7 2020/07/17 08:07:34 patrick Exp $ */
/*
* Copyright (c) 2018 Mark Kettenis <kettenis@openbsd.org>
* Copyright (c) 2020 Patrick Wildt <patrick@blueri.se>
@@ -245,6 +245,7 @@ int mvkpcie_intc_intr(void *);
void *mvkpcie_intc_intr_establish_msi(void *, uint64_t *, uint64_t *,
int , struct cpu_info *, int (*)(void *), void *, char *);
void mvkpcie_intc_intr_disestablish_msi(void *);
+void mvkpcie_intc_intr_barrier(void *);
void mvkpcie_intc_recalc_ipl(struct mvkpcie_softc *);
struct mvkpcie_dmamem *mvkpcie_dmamem_alloc(struct mvkpcie_softc *, bus_size_t,
@@ -532,6 +533,7 @@ mvkpcie_attach(struct device *parent, struct device *self, void *aux)
sc->sc_msi_ic.ic_cookie = self;
sc->sc_msi_ic.ic_establish_msi = mvkpcie_intc_intr_establish_msi;
sc->sc_msi_ic.ic_disestablish = mvkpcie_intc_intr_disestablish_msi;
+ sc->sc_msi_ic.ic_barrier = mvkpcie_intc_intr_barrier;
arm_intr_register_fdt(&sc->sc_msi_ic);
config_found(self, &pba, NULL);
@@ -919,6 +921,15 @@ mvkpcie_intc_intr_disestablish_msi(void *cookie)
}
void
+mvkpcie_intc_intr_barrier(void *cookie)
+{
+ struct intrhand *ih = cookie;
+ struct mvkpcie_softc *sc = ih->ih_sc;
+
+ intr_barrier(sc->sc_ih);
+}
+
+void
mvkpcie_intc_recalc_ipl(struct mvkpcie_softc *sc)
{
struct intrhand *ih;
diff --git a/sys/dev/fdt/rkgpio.c b/sys/dev/fdt/rkgpio.c
index e45d533f1c2..4b31efd13e7 100644
--- a/sys/dev/fdt/rkgpio.c
+++ b/sys/dev/fdt/rkgpio.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: rkgpio.c,v 1.5 2020/07/14 15:34:15 patrick Exp $ */
+/* $OpenBSD: rkgpio.c,v 1.6 2020/07/17 08:07:34 patrick Exp $ */
/*
* Copyright (c) 2017 Mark Kettenis <kettenis@openbsd.org>
* Copyright (c) 2019 Patrick Wildt <patrick@blueri.se>
@@ -102,6 +102,7 @@ void rkgpio_intr_disestablish(void *);
void rkgpio_recalc_ipl(struct rkgpio_softc *);
void rkgpio_intr_enable(void *);
void rkgpio_intr_disable(void *);
+void rkgpio_intr_barrier(void *);
int
rkgpio_match(struct device *parent, void *match, void *aux)
@@ -148,6 +149,7 @@ rkgpio_attach(struct device *parent, struct device *self, void *aux)
sc->sc_ic.ic_disestablish = rkgpio_intr_disestablish;
sc->sc_ic.ic_enable = rkgpio_intr_enable;
sc->sc_ic.ic_disable = rkgpio_intr_disable;
+ sc->sc_ic.ic_barrier = rkgpio_intr_barrier;
fdt_intr_register(&sc->sc_ic);
printf("\n");
@@ -390,3 +392,12 @@ rkgpio_intr_disable(void *cookie)
HSET4(sc, GPIO_INTMASK, 1 << ih->ih_irq);
splx(s);
}
+
+void
+rkgpio_intr_barrier(void *cookie)
+{
+ struct intrhand *ih = cookie;
+ struct rkgpio_softc *sc = ih->ih_sc;
+
+ intr_barrier(sc->sc_ih);
+}