|
@@ -33,6 +33,7 @@
|
|
|
#include <asm/ptrace.h>
|
|
|
#include <asm/irq.h>
|
|
|
#include <asm/idle.h>
|
|
|
+#include <asm/io_apic.h>
|
|
|
#include <asm/sync_bitops.h>
|
|
|
#include <asm/xen/hypercall.h>
|
|
|
#include <asm/xen/hypervisor.h>
|
|
@@ -46,9 +47,6 @@
|
|
|
#include <xen/interface/hvm/hvm_op.h>
|
|
|
#include <xen/interface/hvm/params.h>
|
|
|
|
|
|
-/* Leave low irqs free for identity mapping */
|
|
|
-#define LEGACY_IRQS 16
|
|
|
-
|
|
|
/*
|
|
|
* This lock protects updates to the following mapping and reference-count
|
|
|
* arrays. The lock does not need to be acquired to read the mapping tables.
|
|
@@ -351,6 +349,17 @@ static void unmask_evtchn(int port)
|
|
|
put_cpu();
|
|
|
}
|
|
|
|
|
|
+static int get_nr_hw_irqs(void)
|
|
|
+{
|
|
|
+ int ret = 1;
|
|
|
+
|
|
|
+#ifdef CONFIG_X86_IO_APIC
|
|
|
+ ret = get_nr_irqs_gsi();
|
|
|
+#endif
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
static int find_unbound_irq(void)
|
|
|
{
|
|
|
struct irq_data *data;
|
|
@@ -382,8 +391,8 @@ static int find_unbound_irq(void)
|
|
|
|
|
|
static bool identity_mapped_irq(unsigned irq)
|
|
|
{
|
|
|
- /* only identity map legacy irqs */
|
|
|
- return irq < LEGACY_IRQS;
|
|
|
+ /* identity map all the hardware irqs */
|
|
|
+ return irq < get_nr_hw_irqs();
|
|
|
}
|
|
|
|
|
|
static void pirq_unmask_notify(int irq)
|
|
@@ -552,6 +561,7 @@ int xen_allocate_pirq(unsigned gsi)
|
|
|
|
|
|
if (identity_mapped_irq(gsi)) {
|
|
|
irq = gsi;
|
|
|
+ irq_to_desc_alloc_node(irq, 0);
|
|
|
dynamic_irq_init(irq);
|
|
|
} else
|
|
|
irq = find_unbound_irq();
|