@ -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 ( ) ;