diff --git a/sys/kern/subr_intr.c b/sys/kern/subr_intr.c --- a/sys/kern/subr_intr.c +++ b/sys/kern/subr_intr.c @@ -405,6 +405,18 @@ return (intr_event_destroy(isrc->isrc_event)); } +/* + * Lookup an interrupt source by number. + */ +interrupt_t * +intrtab_lookup(u_int irq) +{ + + if (irq >= intr_nirq) + return (NULL); + return (irq_sources[irq]); +} + #ifdef SMP /* * A support function for a PIC to decide if provided ISRC should be inited diff --git a/sys/powerpc/include/intr.h b/sys/powerpc/include/intr.h --- a/sys/powerpc/include/intr.h +++ b/sys/powerpc/include/intr.h @@ -30,6 +30,16 @@ #ifndef _MACHINE_INTR_MACHDEP_H_ #define _MACHINE_INTR_MACHDEP_H_ +/* FreeBSD standard interrupt controller interface */ + +typedef struct powerpc_intr interrupt_t; + +extern interrupt_t *intrtab_lookup(u_int intr); + +extern struct intr_event *intr2event(interrupt_t *intr); + +/* FreeBSD standard interrupt controller interface */ + #define INTR_VECTORS 256 #define MAX_PICS 32 diff --git a/sys/powerpc/powerpc/intr_machdep.c b/sys/powerpc/powerpc/intr_machdep.c --- a/sys/powerpc/powerpc/intr_machdep.c +++ b/sys/powerpc/powerpc/intr_machdep.c @@ -274,6 +274,30 @@ return (i); } +interrupt_t * +intrtab_lookup(u_int intr) +{ + struct powerpc_intr *i; + int vector; + + for (vector = 0; vector < nvectors; vector++) { + i = powerpc_intrs[vector]; + if (i != NULL && i->irq == intr) + return (i); + } + + return (NULL); +} + +struct intr_event * +intr2event(interrupt_t *intr) +{ + + if (intr == NULL) + return (NULL); + return (intr->event); +} + static int powerpc_map_irq(struct powerpc_intr *i) { diff --git a/sys/sys/intr.h b/sys/sys/intr.h --- a/sys/sys/intr.h +++ b/sys/sys/intr.h @@ -37,6 +37,16 @@ #include +/* FreeBSD standard interrupt controller interface */ + +typedef struct intr_irqsrc interrupt_t; + +extern interrupt_t *intrtab_lookup(u_int irq); + +#define intr2event(intr) ((intr) == NULL ? NULL : (intr)->isrc_event) + +/* FreeBSD standard interrupt controller interface */ + #define INTR_IRQ_INVALID 0xFFFFFFFF enum intr_map_data_type { diff --git a/sys/x86/include/intr.h b/sys/x86/include/intr.h --- a/sys/x86/include/intr.h +++ b/sys/x86/include/intr.h @@ -32,6 +32,16 @@ #ifdef _KERNEL +/* FreeBSD standard interrupt controller interface */ + +typedef struct intsrc interrupt_t; + +extern interrupt_t *intrtab_lookup(u_int irq); + +#define intr2event(intr) ((intr) == NULL ? NULL : (intr)->is_event) + +/* FreeBSD standard interrupt controller interface */ + /* * Values used in determining the allocation of IRQ values among * different types of I/O interrupts. These values are used as @@ -148,7 +158,6 @@ int intr_describe(u_int vector, void *ih, const char *descr); void intr_execute_handlers(struct intsrc *isrc, struct trapframe *frame); u_int intr_next_cpu(int domain); -struct intsrc *intr_lookup_source(int vector); int intr_register_pic(struct pic *pic); int intr_register_source(struct intsrc *isrc); int intr_remove_handler(void *cookie); diff --git a/sys/x86/isa/atpic.c b/sys/x86/isa/atpic.c --- a/sys/x86/isa/atpic.c +++ b/sys/x86/isa/atpic.c @@ -228,7 +228,7 @@ if (ap != &atpics[MASTER]) return; for (i = 0; i < NUM_ISA_IRQS; i++) - if (intr_lookup_source(i) != NULL) + if (intrtab_lookup(i) != NULL) return; /* Loop through all interrupt sources and add them. */ diff --git a/sys/x86/isa/clock.c b/sys/x86/isa/clock.c --- a/sys/x86/isa/clock.c +++ b/sys/x86/isa/clock.c @@ -581,7 +581,7 @@ if (!(sc->port_res = bus_alloc_resource(dev, SYS_RES_IOPORT, &sc->port_rid, IO_TIMER1, IO_TIMER1 + 3, 4, RF_ACTIVE))) device_printf(dev,"Warning: Couldn't map I/O.\n"); - i8254_intsrc = intr_lookup_source(0); + i8254_intsrc = intrtab_lookup(0); if (i8254_intsrc != NULL) i8254_pending = i8254_intsrc->is_pic->pic_source_pending; resource_int_value(device_get_name(dev), device_get_unit(dev), diff --git a/sys/x86/x86/intr_machdep.c b/sys/x86/x86/intr_machdep.c --- a/sys/x86/x86/intr_machdep.c +++ b/sys/x86/x86/intr_machdep.c @@ -234,11 +234,11 @@ return (0); } -struct intsrc * -intr_lookup_source(int vector) +interrupt_t * +intrtab_lookup(u_int vector) { - if (vector < 0 || vector >= num_io_irqs) + if (vector >= num_io_irqs) return (NULL); return (interrupt_sources[vector]); } @@ -251,7 +251,7 @@ struct intsrc *isrc; int error; - isrc = intr_lookup_source(vector); + isrc = intrtab_lookup(vector); if (isrc == NULL) return (EINVAL); error = intr_event_add_handler(isrc->is_event, name, filter, handler, @@ -294,7 +294,7 @@ { struct intsrc *isrc; - isrc = intr_lookup_source(vector); + isrc = intrtab_lookup(vector); if (isrc == NULL) return (EINVAL); return (isrc->is_pic->pic_config_intr(isrc, trig, pol)); @@ -485,7 +485,7 @@ { struct intsrc *isrc; - isrc = intr_lookup_source(vector); + isrc = intrtab_lookup(vector); if (isrc == NULL) return (EINVAL); return (intr_event_describe_handler(isrc->is_event, ih, descr)); @@ -588,7 +588,7 @@ { struct intsrc *isrc; - isrc = intr_lookup_source(vector); + isrc = intrtab_lookup(vector); if (isrc == NULL) return (EINVAL); return (intr_event_bind(isrc->is_event, cpu)); diff --git a/sys/x86/x86/local_apic.c b/sys/x86/x86/local_apic.c --- a/sys/x86/x86/local_apic.c +++ b/sys/x86/x86/local_apic.c @@ -1298,8 +1298,7 @@ kmsan_mark(frame, sizeof(*frame), KMSAN_STATE_INITED); trap_check_kstack(); - isrc = intr_lookup_source(apic_idt_to_irq(PCPU_GET(apic_id), - vector)); + isrc = intrtab_lookup(apic_idt_to_irq(PCPU_GET(apic_id), vector)); intr_execute_handlers(isrc, frame); } @@ -1743,7 +1742,7 @@ if (irq == IRQ_TIMER) db_printf("lapic timer\n"); else if (irq < num_io_irqs) { - isrc = intr_lookup_source(irq); + isrc = intrtab_lookup(irq); if (isrc == NULL || verbose == 0) db_printf("IRQ %u\n", irq); else diff --git a/sys/x86/x86/msi.c b/sys/x86/x86/msi.c --- a/sys/x86/x86/msi.c +++ b/sys/x86/x86/msi.c @@ -285,7 +285,7 @@ msi->msi_msix ? "MSI-X" : "MSI", msi->msi_irq, msi->msi_cpu, msi->msi_vector); for (i = 1; i < msi->msi_count; i++) { - sib = (struct msi_intsrc *)intr_lookup_source(msi->msi_irqs[i]); + sib = (struct msi_intsrc *)intrtab_lookup(msi->msi_irqs[i]); sib->msi_cpu = apic_id; sib->msi_vector = vector + i; if (sib->msi_intsrc.is_handlers > 0) @@ -306,7 +306,7 @@ apic_disable_vector(old_id, old_vector); apic_free_vector(old_id, old_vector, msi->msi_irq); for (i = 1; i < msi->msi_count; i++) { - sib = (struct msi_intsrc *)intr_lookup_source(msi->msi_irqs[i]); + sib = (struct msi_intsrc *)intrtab_lookup(msi->msi_irqs[i]); if (sib->msi_intsrc.is_handlers > 0) apic_disable_vector(old_id, old_vector + i); apic_free_vector(old_id, old_vector + i, msi->msi_irqs[i]); @@ -405,7 +405,7 @@ /* Try to find 'count' free IRQs. */ cnt = 0; for (i = first_msi_irq; i < first_msi_irq + num_msi_irqs; i++) { - msi = (struct msi_intsrc *)intr_lookup_source(i); + msi = (struct msi_intsrc *)intrtab_lookup(i); /* End of allocated sources, so break. */ if (msi == NULL) @@ -463,15 +463,15 @@ return (error); } for (i = 0; i < count; i++) { - msi = (struct msi_intsrc *)intr_lookup_source(irqs[i]); + msi = (struct msi_intsrc *)intrtab_lookup(irqs[i]); msi->msi_remap_cookie = cookies[i]; } #endif /* Assign IDT vectors and make these messages owned by 'dev'. */ - fsrc = (struct msi_intsrc *)intr_lookup_source(irqs[0]); + fsrc = (struct msi_intsrc *)intrtab_lookup(irqs[0]); for (i = 0; i < count; i++) { - msi = (struct msi_intsrc *)intr_lookup_source(irqs[i]); + msi = (struct msi_intsrc *)intrtab_lookup(irqs[i]); msi->msi_cpu = cpu; msi->msi_dev = dev; msi->msi_vector = vector + i; @@ -499,7 +499,7 @@ int i; mtx_lock(&msi_lock); - first = (struct msi_intsrc *)intr_lookup_source(irqs[0]); + first = (struct msi_intsrc *)intrtab_lookup(irqs[0]); if (first == NULL) { mtx_unlock(&msi_lock); return (ENOENT); @@ -529,7 +529,7 @@ /* Clear all the extra messages in the group. */ for (i = 1; i < count; i++) { - msi = (struct msi_intsrc *)intr_lookup_source(irqs[i]); + msi = (struct msi_intsrc *)intrtab_lookup(irqs[i]); KASSERT(msi->msi_first == first, ("message not in group")); KASSERT(msi->msi_dev == first->msi_dev, ("owner mismatch")); #ifdef IOMMU @@ -571,7 +571,7 @@ #endif mtx_lock(&msi_lock); - msi = (struct msi_intsrc *)intr_lookup_source(irq); + msi = (struct msi_intsrc *)intrtab_lookup(irq); if (msi == NULL) { mtx_unlock(&msi_lock); return (ENOENT); @@ -602,7 +602,7 @@ i < first_msi_irq + num_msi_irqs; i++) { if (i == msi->msi_irq) continue; - msi1 = (struct msi_intsrc *)intr_lookup_source(i); + msi1 = (struct msi_intsrc *)intrtab_lookup(i); if (!msi1->msi_msix && msi1->msi_first == msi) { mtx_unlock(&msi_lock); iommu_map_msi_intr(msi1->msi_dev, @@ -650,7 +650,7 @@ /* Find a free IRQ. */ for (i = first_msi_irq; i < first_msi_irq + num_msi_irqs; i++) { - msi = (struct msi_intsrc *)intr_lookup_source(i); + msi = (struct msi_intsrc *)intrtab_lookup(i); /* End of allocated sources, so break. */ if (msi == NULL) @@ -725,7 +725,7 @@ struct msi_intsrc *msi; mtx_lock(&msi_lock); - msi = (struct msi_intsrc *)intr_lookup_source(irq); + msi = (struct msi_intsrc *)intrtab_lookup(irq); if (msi == NULL) { mtx_unlock(&msi_lock); return (ENOENT); diff --git a/sys/x86/x86/nexus.c b/sys/x86/x86/nexus.c --- a/sys/x86/x86/nexus.c +++ b/sys/x86/x86/nexus.c @@ -238,7 +238,7 @@ * resource manager. */ for (irq = 0; irq < num_io_irqs; irq++) - if (intr_lookup_source(irq) != NULL) + if (intrtab_lookup(irq) != NULL) if (rman_manage_region(&irq_rman, irq, irq) != 0) panic("nexus_init_resources irq_rman add"); diff --git a/sys/x86/xen/xen_arch_intr.c b/sys/x86/xen/xen_arch_intr.c --- a/sys/x86/xen/xen_arch_intr.c +++ b/sys/x86/xen/xen_arch_intr.c @@ -345,7 +345,7 @@ vector = first_evtchn_irq + xen_intr_auto_vector_count; xen_intr_auto_vector_count++; - KASSERT((intr_lookup_source(vector) == NULL), + KASSERT((intrtab_lookup(vector) == NULL), ("Trying to use an already allocated vector")); mtx_unlock(&xen_intr_x86_lock);