2005-04-16 15:20:36 -07:00
/*
* Copyright 2004 James Cleverdon , IBM .
* Subject to the GNU Public License , v .2
*
* Generic APIC sub - arch probe layer .
*
* Hacked for x86 - 64 by James Cleverdon from i386 architecture code by
* Martin Bligh , Andi Kleen , James Bottomley , John Stultz , and
* James Cleverdon .
*/
# include <linux/threads.h>
# include <linux/cpumask.h>
# include <linux/string.h>
2007-05-02 19:27:04 +02:00
# include <linux/module.h>
2005-04-16 15:20:36 -07:00
# include <linux/kernel.h>
# include <linux/ctype.h>
# include <linux/init.h>
# include <asm/smp.h>
# include <asm/ipi.h>
2007-05-02 19:27:04 +02:00
# include <asm/genapic.h>
2005-04-16 15:20:36 -07:00
2007-05-02 19:27:04 +02:00
# ifdef CONFIG_ACPI
2005-04-16 15:24:53 -07:00
# include <acpi/acpi_bus.h>
# endif
2008-01-30 13:33:11 +01:00
/* which logical CPU number maps to which CPU (physical APIC ID) */
2008-01-30 13:33:10 +01:00
u16 x86_cpu_to_apicid_init [ NR_CPUS ] __initdata
2007-05-02 19:27:04 +02:00
= { [ 0 . . . NR_CPUS - 1 ] = BAD_APICID } ;
2008-01-30 13:33:11 +01:00
void * x86_cpu_to_apicid_early_ptr ;
2008-01-30 13:33:10 +01:00
DEFINE_PER_CPU ( u16 , x86_cpu_to_apicid ) = BAD_APICID ;
2007-10-19 20:35:03 +02:00
EXPORT_PER_CPU_SYMBOL ( x86_cpu_to_apicid ) ;
2005-04-16 15:20:36 -07:00
2007-05-02 19:27:04 +02:00
struct genapic __read_mostly * genapic = & apic_flat ;
2005-04-16 15:20:36 -07:00
/*
* Check the APIC IDs in bios_cpu_apicid and choose the APIC mode .
*/
2007-05-02 19:27:04 +02:00
void __init setup_apic_routing ( void )
2005-04-16 15:20:36 -07:00
{
2007-05-02 19:27:04 +02:00
# ifdef CONFIG_ACPI
2005-04-16 15:24:53 -07:00
/*
2007-05-02 19:27:04 +02:00
* Quirk : some x86_64 machines can only use physical APIC mode
* regardless of how many processors are present ( x86_64 ES7000
* is an example ) .
2005-04-16 15:24:53 -07:00
*/
2007-05-02 19:27:04 +02:00
if ( acpi_gbl_FADT . header . revision > FADT2_REVISION_ID & &
( acpi_gbl_FADT . flags & ACPI_FADT_APIC_PHYSICAL ) )
genapic = & apic_physflat ;
2007-05-02 19:27:04 +02:00
else
2005-04-16 15:24:53 -07:00
# endif
2007-05-02 19:27:04 +02:00
if ( cpus_weight ( cpu_possible_map ) < = 8 )
2005-04-16 15:20:36 -07:00
genapic = & apic_flat ;
2007-05-02 19:27:04 +02:00
else
2007-05-02 19:27:04 +02:00
genapic = & apic_physflat ;
2005-04-16 15:20:36 -07:00
printk ( KERN_INFO " Setting APIC routing to %s \n " , genapic - > name ) ;
}
2007-05-02 19:27:04 +02:00
/* Same for both flat and physical. */
2005-04-16 15:20:36 -07:00
void send_IPI_self ( int vector )
{
__send_IPI_shortcut ( APIC_DEST_SELF , vector , APIC_DEST_PHYSICAL ) ;
}