git: 700f7e793b37 - main - powerpc: Get rid of interrupt subterfuge for IPIs
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 27 Nov 2024 23:48:29 UTC
The branch main has been updated by jhibbits: URL: https://cgit.FreeBSD.org/src/commit/?id=700f7e793b3793606fbb9942eda03ac02991c126 commit 700f7e793b3793606fbb9942eda03ac02991c126 Author: Justin Hibbits <jhibbits@FreeBSD.org> AuthorDate: 2024-11-27 14:13:57 +0000 Commit: Justin Hibbits <jhibbits@FreeBSD.org> CommitDate: 2024-11-27 23:36:49 +0000 powerpc: Get rid of interrupt subterfuge for IPIs Instead of playing games with the interrupt event structure after the fact when setting up IPIs, do the work in the interrupt initializer. --- sys/powerpc/powerpc/intr_machdep.c | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/sys/powerpc/powerpc/intr_machdep.c b/sys/powerpc/powerpc/intr_machdep.c index 9d361c73a240..e0eb06129dd1 100644 --- a/sys/powerpc/powerpc/intr_machdep.c +++ b/sys/powerpc/powerpc/intr_machdep.c @@ -147,6 +147,10 @@ device_t root_pic; static void *ipi_cookie; #endif +static int powerpc_setup_intr_int(const char *name, u_int irq, driver_filter_t + filter, driver_intr_t handler, void *arg, enum intr_type flags, void + **cookiep, int domain, bool ipi); + static void intrcnt_setname(const char *name, int index) { @@ -464,24 +468,15 @@ powerpc_enable_intr(void) KASSERT(piclist[n].ipis != 0, ("%s: SMP root PIC does not supply any IPIs", __func__)); - error = powerpc_setup_intr("IPI", + error = powerpc_setup_intr_int("IPI", MAP_IRQ(piclist[n].node, piclist[n].irqs), powerpc_ipi_handler, NULL, NULL, INTR_TYPE_MISC | INTR_EXCL, &ipi_cookie, - 0 /* domain XXX */); + 0 /* domain XXX */, true); if (error) { printf("unable to setup IPI handler\n"); return (error); } - - /* - * Some subterfuge: disable late EOI and mark this - * as an IPI to the dispatch layer. - */ - i = intr_lookup(MAP_IRQ(piclist[n].node, - piclist[n].irqs)); - i->event->ie_post_filter = NULL; - i->ipi = 1; } } #endif @@ -514,6 +509,17 @@ powerpc_setup_intr(const char *name, u_int irq, driver_filter_t filter, driver_intr_t handler, void *arg, enum intr_type flags, void **cookiep, int domain) { + + return (powerpc_setup_intr_int(name, irq, filter, handler, arg, flags, + cookiep, domain, false)); +} + + +static int +powerpc_setup_intr_int(const char *name, u_int irq, driver_filter_t filter, + driver_intr_t handler, void *arg, enum intr_type flags, void **cookiep, + int domain, bool ipi) +{ struct powerpc_intr *i; int error, enable = 0; @@ -524,12 +530,14 @@ powerpc_setup_intr(const char *name, u_int irq, driver_filter_t filter, if (i->event == NULL) { error = intr_event_create(&i->event, (void *)i, 0, irq, powerpc_intr_pre_ithread, powerpc_intr_post_ithread, - powerpc_intr_eoi, powerpc_assign_intr_cpu, "irq%u:", irq); + (ipi ? NULL : powerpc_intr_eoi), powerpc_assign_intr_cpu, + "irq%u:", irq); if (error) return (error); enable = 1; } + i->ipi = ipi; error = intr_event_add_handler(i->event, name, filter, handler, arg, intr_priority(flags), flags, cookiep);