[PATCH] genirq: x86_64 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 this hack of assuming irq == vector until the depencencies in the generic irq 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
3fc471ede9
commit
c4fa0bbf38
1 changed files with 46 additions and 5 deletions
|
@ -1254,11 +1254,6 @@ static int ioapic_retrigger_vector(unsigned int vector)
|
|||
* races.
|
||||
*/
|
||||
|
||||
static void ack_apic(unsigned int irq)
|
||||
{
|
||||
ack_APIC_irq();
|
||||
}
|
||||
|
||||
static void ack_apic_edge(unsigned int irq)
|
||||
{
|
||||
move_native_irq(irq);
|
||||
|
@ -1698,6 +1693,52 @@ 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) {
|
||||
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
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
ACPI-based IOAPIC Configuration
|
||||
-------------------------------------------------------------------------- */
|
||||
|
|
Loading…
Reference in a new issue