[PATCH] genirq: i386 irq: Dynamic irq support
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>
This commit is contained in:
parent
b6cf2583ba
commit
3fc471ede9
1 changed files with 48 additions and 0 deletions
|
@ -2483,6 +2483,54 @@ static int __init ioapic_init_sysfs(void)
|
||||||
|
|
||||||
device_initcall(ioapic_init_sysfs);
|
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
|
ACPI-based IOAPIC Configuration
|
||||||
-------------------------------------------------------------------------- */
|
-------------------------------------------------------------------------- */
|
||||||
|
|
Loading…
Add table
Reference in a new issue