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 @@ -415,6 +415,18 @@ return (EINVAL); } +/* + * Lookup an interrupt source by number. + */ +interrupt_t * +intrtab_lookup(u_int irq) +{ + + if (irq >= intr_nirq) + return (NULL); + return (irq_sources[irq]); +} + /* * Alloc unique interrupt number (resource handle) for interrupt source. * 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 @@ -28,6 +28,17 @@ #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) __pure; + +extern struct intr_event *_intr2event(interrupt_t *intr); +#define intr2event(intr) ((intr) != NULL ? _intr2event(intr) : NULL) + +/* 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 @@ -291,6 +291,28 @@ 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) +{ + + 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 @@ -35,6 +35,17 @@ #include +/* FreeBSD standard interrupt controller interface */ + +typedef struct intr_irqsrc interrupt_t; + +extern interrupt_t *intrtab_lookup(u_int irq) __pure; + +#define _intr2event(intr) ((intr)->isrc_event) +#define intr2event(intr) ((intr) != NULL ? _intr2event(intr) : NULL) + +/* 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 @@ -30,6 +30,17 @@ #ifdef _KERNEL +/* FreeBSD standard interrupt controller interface */ + +typedef struct intsrc interrupt_t; + +extern interrupt_t *intrtab_lookup(u_int irq) __pure; + +#define _intr2event(intr) ((intr)->is_event) +#define intr2event(intr) ((intr) != NULL ? _intr2event(intr) : NULL) + +/* 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 @@ -146,7 +157,6 @@ int intr_describe(struct intsrc *isrc, 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 @@ -579,7 +579,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 @@ -245,11 +245,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]); } 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 @@ -1296,8 +1296,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); } @@ -1741,7 +1740,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 @@ -280,7 +280,7 @@ if (msi->msi_intsrc.is_handlers > 0) apic_enable_vector(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]); if (sib->msi_intsrc.is_handlers > 0) apic_enable_vector(apic_id, vector + i); } @@ -293,7 +293,7 @@ msi->msi_cpu, msi->msi_vector); } for (i = 1; i < msi->msi_count; i++) { - sib = (struct msi_intsrc *)intr_lookup_source( + sib = (struct msi_intsrc *)intrtab_lookup( msi->msi_irqs[i]); sib->msi_cpu = apic_id; sib->msi_vector = vector + i; @@ -321,7 +321,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]); @@ -420,7 +420,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) @@ -478,15 +478,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; @@ -514,7 +514,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); @@ -544,7 +544,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 @@ -586,7 +586,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); @@ -617,7 +617,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, @@ -670,7 +670,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) @@ -745,7 +745,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 @@ -221,7 +221,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"); @@ -579,7 +579,7 @@ if (bus_get_domain(child, &domain) != 0) domain = 0; - isrc = intr_lookup_source(rman_get_start(irq)); + isrc = intrtab_lookup(rman_get_start(irq)); if (isrc == NULL) return (EINVAL); error = intr_add_handler(device_get_nameunit(child), isrc, @@ -619,7 +619,7 @@ { struct intsrc *isrc; - isrc = intr_lookup_source(rman_get_start(irq)); + isrc = intrtab_lookup(rman_get_start(irq)); if (isrc == NULL) return (EINVAL); return (intr_event_bind(isrc->is_event, cpu)); @@ -632,7 +632,7 @@ { struct intsrc *isrc; - isrc = intr_lookup_source(irq); + isrc = intrtab_lookup(irq); if (isrc == NULL) return (EINVAL); return (intr_config_intr(isrc, trig, pol)); @@ -644,7 +644,7 @@ { struct intsrc *isrc; - isrc = intr_lookup_source(rman_get_start(irq)); + isrc = intrtab_lookup(rman_get_start(irq)); if (isrc == NULL) return (EINVAL); return (intr_describe(isrc, cookie, descr)); 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 @@ -349,7 +349,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);