2005-04-16 15:20:36 -07:00
# ifndef __ASM_MACH_APIC_H
# define __ASM_MACH_APIC_H
2006-01-06 00:12:08 -08:00
extern u8 bios_cpu_apicid [ ] ;
# define xapic_phys_to_log_apicid(cpu) (bios_cpu_apicid[cpu])
2005-04-16 15:20:36 -07:00
# define esr_disable (1)
static inline int apic_id_registered ( void )
{
return ( 1 ) ;
}
/* Round robin the irqs amoung the online cpus */
static inline cpumask_t target_cpus ( void )
{
static unsigned long cpu = NR_CPUS ;
do {
if ( cpu > = NR_CPUS )
cpu = first_cpu ( cpu_online_map ) ;
else
cpu = next_cpu ( cpu , cpu_online_map ) ;
} while ( cpu > = NR_CPUS ) ;
return cpumask_of_cpu ( cpu ) ;
}
2006-01-06 00:12:08 -08:00
# undef APIC_DEST_LOGICAL
# define APIC_DEST_LOGICAL 0
# define TARGET_CPUS (target_cpus())
# define APIC_DFR_VALUE (APIC_DFR_FLAT)
# define INT_DELIVERY_MODE (dest_Fixed)
# define INT_DEST_MODE (0) /* phys delivery to target proc */
# define NO_BALANCE_IRQ (0)
# define WAKE_SECONDARY_VIA_INIT
2005-04-16 15:20:36 -07:00
static inline unsigned long check_apicid_used ( physid_mask_t bitmap , int apicid )
{
2006-01-06 00:12:08 -08:00
return ( 0 ) ;
2005-04-16 15:20:36 -07:00
}
2006-01-06 00:12:08 -08:00
static inline unsigned long check_apicid_present ( int bit )
2005-04-16 15:20:36 -07:00
{
2006-01-06 00:12:08 -08:00
return ( 1 ) ;
2005-04-16 15:20:36 -07:00
}
2006-01-06 00:12:08 -08:00
static inline unsigned long calculate_ldr ( int cpu )
2005-04-16 15:20:36 -07:00
{
2006-01-06 00:12:08 -08:00
unsigned long val , id ;
val = apic_read ( APIC_LDR ) & ~ APIC_LDR_MASK ;
id = xapic_phys_to_log_apicid ( cpu ) ;
val | = SET_APIC_LOGICAL_ID ( id ) ;
return val ;
2005-04-16 15:20:36 -07:00
}
/*
* Set up the logical destination ID .
*
* Intel recommends to set DFR , LDR and TPR before enabling
* an APIC . See e . g . " AP-388 82489DX User's Manual " ( Intel
* document number 292116 ) . So here it goes . . .
*/
static inline void init_apic_ldr ( void )
{
unsigned long val ;
2006-01-06 00:12:08 -08:00
int cpu = smp_processor_id ( ) ;
2005-04-16 15:20:36 -07:00
apic_write_around ( APIC_DFR , APIC_DFR_VALUE ) ;
2006-01-06 00:12:08 -08:00
val = calculate_ldr ( cpu ) ;
2005-04-16 15:20:36 -07:00
apic_write_around ( APIC_LDR , val ) ;
}
2007-05-02 19:27:04 +02:00
static inline void setup_apic_routing ( void )
2005-04-16 15:20:36 -07:00
{
printk ( " Enabling APIC mode: %s. Using %d I/O APICs \n " ,
2006-01-06 00:12:08 -08:00
" Physflat " , nr_ioapics ) ;
2005-04-16 15:20:36 -07:00
}
static inline int multi_timer_check ( int apic , int irq )
{
2006-01-06 00:12:08 -08:00
return ( 0 ) ;
2005-04-16 15:20:36 -07:00
}
static inline int apicid_to_node ( int logical_apicid )
{
2006-01-06 00:12:08 -08:00
return ( 0 ) ;
2005-04-16 15:20:36 -07:00
}
static inline int cpu_present_to_apicid ( int mps_cpu )
{
if ( mps_cpu < NR_CPUS )
2006-01-06 00:12:08 -08:00
return ( int ) bios_cpu_apicid [ mps_cpu ] ;
return BAD_APICID ;
2005-04-16 15:20:36 -07:00
}
static inline physid_mask_t apicid_to_cpu_present ( int phys_apicid )
{
return physid_mask_of_physid ( phys_apicid ) ;
}
extern u8 cpu_2_logical_apicid [ ] ;
/* Mapping from cpu number to logical apicid */
static inline int cpu_to_logical_apicid ( int cpu )
{
2006-01-06 00:12:08 -08:00
if ( cpu > = NR_CPUS )
return BAD_APICID ;
return cpu_physical_id ( cpu ) ;
}
2005-04-16 15:20:36 -07:00
static inline int mpc_apic_id ( struct mpc_config_processor * m ,
2008-01-30 13:30:35 +01:00
struct mpc_config_translation * translation_record )
2005-04-16 15:20:36 -07:00
{
2008-01-30 13:30:35 +01:00
printk ( " Processor #%d %u:%u APIC version %d \n " ,
m - > mpc_apicid ,
( m - > mpc_cpufeature & CPU_FAMILY_MASK ) > > 8 ,
( m - > mpc_cpufeature & CPU_MODEL_MASK ) > > 4 ,
m - > mpc_apicver ) ;
2005-04-16 15:20:36 -07:00
return m - > mpc_apicid ;
}
static inline physid_mask_t ioapic_phys_id_map ( physid_mask_t phys_map )
{
/* For clustered we don't have a good way to do this yet - hack */
2006-01-06 00:12:08 -08:00
return physids_promote ( 0xFFL ) ;
2005-04-16 15:20:36 -07:00
}
static inline void setup_portio_remap ( void )
{
}
static inline void enable_apic_mode ( void )
{
}
static inline int check_phys_apicid_present ( int boot_cpu_physical_apicid )
{
return ( 1 ) ;
}
/* As we are using single CPU as destination, pick only one CPU here */
static inline unsigned int cpu_mask_to_apicid ( cpumask_t cpumask )
{
int cpu ;
int apicid ;
cpu = first_cpu ( cpumask ) ;
apicid = cpu_to_logical_apicid ( cpu ) ;
return apicid ;
}
static inline u32 phys_pkg_id ( u32 cpuid_apic , int index_msb )
{
return cpuid_apic > > index_msb ;
}
# endif /* __ASM_MACH_APIC_H */