xen: identity map gsi->irqs
Impact: preserve compat with native Reserve the lower irq range for use for hardware interrupts so we can identity-map them. [v2: Rebased on top tip/irq/core] Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
This commit is contained in:
parent
7b586d7185
commit
0794bfc743
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue