diff options
author | 2020-07-17 08:07:33 +0000 | |
---|---|---|
committer | 2020-07-17 08:07:33 +0000 | |
commit | 452daaedc6a44247dc76c56f4c33bc4131b7c50c (patch) | |
tree | 482245802e7d6304dfe90d749f5b8e7edac4f384 | |
parent | Add powerpc64 support; straight copy from octeon. (diff) | |
download | wireguard-openbsd-452daaedc6a44247dc76c56f4c33bc4131b7c50c.tar.xz wireguard-openbsd-452daaedc6a44247dc76c56f4c33bc4131b7c50c.zip |
Re-work intr_barrier(9) on arm64 to remove layer violation. So far we
have stored the struct cpu_info * in the wrapper around the interrupt
handler cookie, but since we can have a few layers inbetween, this does
not seem very nice. Instead have each and every interrupt controller
provide a barrier function. This means that intr_barrier(9) will in the
end be executed by the interrupt controller that actually wired the pin
to a core. And that's the only place where the information is stored.
ok kettenis@
-rw-r--r-- | sys/arch/arm64/arm64/acpi_machdep.c | 3 | ||||
-rw-r--r-- | sys/arch/arm64/arm64/intr.c | 22 | ||||
-rw-r--r-- | sys/arch/arm64/dev/acpipci.c | 3 | ||||
-rw-r--r-- | sys/arch/arm64/dev/agintc.c | 22 | ||||
-rw-r--r-- | sys/arch/arm64/dev/ampintc.c | 22 | ||||
-rw-r--r-- | sys/arch/arm64/include/intr.h | 4 | ||||
-rw-r--r-- | sys/arch/armv7/include/intr.h | 3 | ||||
-rw-r--r-- | sys/dev/fdt/bcm2835_aux.c | 3 | ||||
-rw-r--r-- | sys/dev/fdt/imxgpc.c | 3 | ||||
-rw-r--r-- | sys/dev/fdt/imxgpio.c | 16 | ||||
-rw-r--r-- | sys/dev/fdt/mvgicp.c | 26 | ||||
-rw-r--r-- | sys/dev/fdt/mvicu.c | 20 | ||||
-rw-r--r-- | sys/dev/fdt/mvkpcie.c | 13 | ||||
-rw-r--r-- | sys/dev/fdt/rkgpio.c | 13 |
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); +} |