2005-04-16 15:20:36 -07:00
# ifndef _ASM_GENAPIC_H
# define _ASM_GENAPIC_H 1
2006-09-26 10:52:26 +02:00
# include <asm/mpspec.h>
2005-04-16 15:20:36 -07:00
/*
* Generic APIC driver interface .
*
* An straight forward mapping of the APIC related parts of the
* x86 subarchitecture interface to a dynamic object .
*
* This is used by the " generic " x86 subarchitecture .
*
* Copyright 2003 Andi Kleen , SuSE Labs .
*/
struct mpc_config_bus ;
struct mp_config_table ;
struct mpc_config_processor ;
2008-03-23 01:02:13 -07:00
struct genapic {
char * name ;
int ( * probe ) ( void ) ;
2005-04-16 15:20:36 -07:00
int ( * apic_id_registered ) ( void ) ;
cpumask_t ( * target_cpus ) ( void ) ;
int int_delivery_mode ;
2008-03-23 01:02:13 -07:00
int int_dest_mode ;
2005-04-16 15:20:36 -07:00
int ESR_DISABLE ;
int apic_destination_logical ;
unsigned long ( * check_apicid_used ) ( physid_mask_t bitmap , int apicid ) ;
2008-03-23 01:02:13 -07:00
unsigned long ( * check_apicid_present ) ( int apicid ) ;
2005-04-16 15:20:36 -07:00
int no_balance_irq ;
int no_ioapic_check ;
void ( * init_apic_ldr ) ( void ) ;
physid_mask_t ( * ioapic_phys_id_map ) ( physid_mask_t map ) ;
2007-05-02 19:27:04 +02:00
void ( * setup_apic_routing ) ( void ) ;
2005-04-16 15:20:36 -07:00
int ( * multi_timer_check ) ( int apic , int irq ) ;
2008-03-23 01:02:13 -07:00
int ( * apicid_to_node ) ( int logical_apicid ) ;
2005-04-16 15:20:36 -07:00
int ( * cpu_to_logical_apicid ) ( int cpu ) ;
int ( * cpu_present_to_apicid ) ( int mps_cpu ) ;
physid_mask_t ( * apicid_to_cpu_present ) ( int phys_apicid ) ;
2008-03-23 01:02:13 -07:00
void ( * setup_portio_remap ) ( void ) ;
2005-04-16 15:20:36 -07:00
int ( * check_phys_apicid_present ) ( int boot_cpu_physical_apicid ) ;
void ( * enable_apic_mode ) ( void ) ;
u32 ( * phys_pkg_id ) ( u32 cpuid_apic , int index_msb ) ;
/* mpparse */
/* When one of the next two hooks returns 1 the genapic
2008-03-23 01:02:13 -07:00
is switched to this . Essentially they are additional probe
2005-04-16 15:20:36 -07:00
functions . */
2008-03-23 01:02:13 -07:00
int ( * mps_oem_check ) ( struct mp_config_table * mpc , char * oem ,
char * productid ) ;
2005-04-16 15:20:36 -07:00
int ( * acpi_madt_oem_check ) ( char * oem_id , char * oem_table_id ) ;
unsigned ( * get_apic_id ) ( unsigned long x ) ;
unsigned long apic_id_mask ;
unsigned int ( * cpu_mask_to_apicid ) ( cpumask_t cpumask ) ;
2006-09-26 10:52:26 +02:00
# ifdef CONFIG_SMP
2005-04-16 15:20:36 -07:00
/* ipi */
void ( * send_IPI_mask ) ( cpumask_t mask , int vector ) ;
void ( * send_IPI_allbutself ) ( int vector ) ;
void ( * send_IPI_all ) ( int vector ) ;
2006-09-26 10:52:26 +02:00
# endif
2008-03-23 01:02:13 -07:00
} ;
2005-04-16 15:20:36 -07:00
2006-09-26 10:52:26 +02:00
# define APICFUNC(x) .x = x,
/* More functions could be probably marked IPIFUNC and save some space
in UP GENERICARCH kernels , but I don ' t have the nerve right now
to untangle this mess . - AK */
# ifdef CONFIG_SMP
# define IPIFUNC(x) APICFUNC(x)
# else
# define IPIFUNC(x)
# endif
2005-04-16 15:20:36 -07:00
2008-03-23 01:02:13 -07:00
# define APIC_INIT(aname, aprobe) \
{ \
. name = aname , \
. probe = aprobe , \
. int_delivery_mode = INT_DELIVERY_MODE , \
. int_dest_mode = INT_DEST_MODE , \
. no_balance_irq = NO_BALANCE_IRQ , \
. ESR_DISABLE = esr_disable , \
. apic_destination_logical = APIC_DEST_LOGICAL , \
APICFUNC ( apic_id_registered ) \
APICFUNC ( target_cpus ) \
APICFUNC ( check_apicid_used ) \
APICFUNC ( check_apicid_present ) \
APICFUNC ( init_apic_ldr ) \
APICFUNC ( ioapic_phys_id_map ) \
APICFUNC ( setup_apic_routing ) \
APICFUNC ( multi_timer_check ) \
APICFUNC ( apicid_to_node ) \
APICFUNC ( cpu_to_logical_apicid ) \
APICFUNC ( cpu_present_to_apicid ) \
APICFUNC ( apicid_to_cpu_present ) \
APICFUNC ( setup_portio_remap ) \
APICFUNC ( check_phys_apicid_present ) \
APICFUNC ( mps_oem_check ) \
APICFUNC ( get_apic_id ) \
. apic_id_mask = APIC_ID_MASK , \
APICFUNC ( cpu_mask_to_apicid ) \
APICFUNC ( acpi_madt_oem_check ) \
IPIFUNC ( send_IPI_mask ) \
IPIFUNC ( send_IPI_allbutself ) \
IPIFUNC ( send_IPI_all ) \
APICFUNC ( enable_apic_mode ) \
APICFUNC ( phys_pkg_id ) \
}
2005-04-16 15:20:36 -07:00
2007-05-02 19:27:04 +02:00
extern struct genapic * genapic ;
2005-04-16 15:20:36 -07:00
2008-03-28 14:12:06 -05:00
enum uv_system_type { UV_NONE , UV_LEGACY_APIC , UV_X2APIC , UV_NON_UNIQUE_APIC } ;
# define get_uv_system_type() UV_NONE
# define is_uv_system() 0
2008-04-16 11:45:15 -05:00
# define uv_wakeup_secondary(a, b) 1
2008-03-28 14:12:06 -05:00
2005-04-16 15:20:36 -07:00
# endif