Page MenuHomeFreeBSD

D39178.id.diff
No OneTemporary

D39178.id.diff

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 <sys/systm.h>
+/* 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);

File Metadata

Mime Type
text/plain
Expires
Sun, Feb 22, 12:10 PM (10 h, 38 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28937146
Default Alt Text
D39178.id.diff (10 KB)

Event Timeline