Skip to content

Commit

Permalink
[PATCH] genirq: i386 irq: Dynamic irq support
Browse files Browse the repository at this point in the history
The current implementation of create_irq() is a hack but it is the current
hack that msi.c uses, and unfortunately the ``generic'' apic msi ops depend on
this hack.  Thus we are stuck this hack of assuming irq == vector until the
depencencies in the generic msi code are removed.

Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Rajesh Shah <rajesh.shah@intel.com>
Cc: Andi Kleen <ak@muc.de>
Cc: "Protasevich, Natalie" <Natalie.Protasevich@UNISYS.com>
Cc: "Luck, Tony" <tony.luck@intel.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Eric W. Biederman authored and Linus Torvalds committed Oct 4, 2006
1 parent b6cf258 commit 3fc471e
Showing 1 changed file with 48 additions and 0 deletions.
48 changes: 48 additions & 0 deletions arch/i386/kernel/io_apic.c
Original file line number Diff line number Diff line change
Expand Up @@ -2483,6 +2483,54 @@ static int __init ioapic_init_sysfs(void)

device_initcall(ioapic_init_sysfs);

#ifdef CONFIG_PCI_MSI
/*
* Dynamic irq allocate and deallocation for MSI
*/
int create_irq(void)
{
/* Hack of the day: irq == vector.
*
* Ultimately this will be be more general,
* and not depend on the irq to vector identity mapping.
* But this version is needed until msi.c can cope with
* the more general form.
*/
int irq, vector;
unsigned long flags;
vector = assign_irq_vector(AUTO_ASSIGN);
irq = vector;

if (vector >= 0) {
struct irq_desc *desc;

spin_lock_irqsave(&vector_lock, flags);
vector_irq[vector] = irq;
irq_vector[irq] = vector;
spin_unlock_irqrestore(&vector_lock, flags);

set_intr_gate(vector, interrupt[irq]);

dynamic_irq_init(irq);
}
return irq;
}

void destroy_irq(unsigned int irq)
{
unsigned long flags;
unsigned int vector;

dynamic_irq_cleanup(irq);

spin_lock_irqsave(&vector_lock, flags);
vector = irq_vector[irq];
vector_irq[vector] = -1;
irq_vector[irq] = 0;
spin_unlock_irqrestore(&vector_lock, flags);
}
#endif /* CONFIG_PCI_MSI */

/* --------------------------------------------------------------------------
ACPI-based IOAPIC Configuration
-------------------------------------------------------------------------- */
Expand Down

0 comments on commit 3fc471e

Please sign in to comment.