1/* 2 * Copyright 2004 James Cleverdon, IBM. 3 * Subject to the GNU Public License, v.2 4 * 5 * Generic APIC sub-arch probe layer. 6 * 7 * Hacked for x86-64 by James Cleverdon from i386 architecture code by 8 * Martin Bligh, Andi Kleen, James Bottomley, John Stultz, and 9 * James Cleverdon. 10 */ 11#include <linux/threads.h> 12#include <linux/cpumask.h> 13#include <linux/string.h> 14#include <linux/module.h> 15#include <linux/kernel.h> 16#include <linux/ctype.h> 17#include <linux/init.h> 18 19#include <asm/smp.h> 20#include <asm/ipi.h> 21#include <asm/genapic.h> 22 23#ifdef CONFIG_ACPI 24#include <acpi/acpi_bus.h> 25#endif 26 27/* which logical CPU number maps to which CPU (physical APIC ID) */ 28u8 x86_cpu_to_apicid[NR_CPUS] __read_mostly 29 = { [0 ... NR_CPUS-1] = BAD_APICID }; 30EXPORT_SYMBOL(x86_cpu_to_apicid); 31 32u8 x86_cpu_to_log_apicid[NR_CPUS] = { [0 ... NR_CPUS-1] = BAD_APICID }; 33 34struct genapic __read_mostly *genapic = &apic_flat; 35 36/* 37 * Check the APIC IDs in bios_cpu_apicid and choose the APIC mode. 38 */ 39void __init setup_apic_routing(void) 40{ 41#ifdef CONFIG_ACPI 42 /* 43 * Quirk: some x86_64 machines can only use physical APIC mode 44 * regardless of how many processors are present (x86_64 ES7000 45 * is an example). 46 */ 47 if (acpi_gbl_FADT.header.revision > FADT2_REVISION_ID && 48 (acpi_gbl_FADT.flags & ACPI_FADT_APIC_PHYSICAL)) 49 genapic = &apic_physflat; 50 else 51#endif 52 53 if (cpus_weight(cpu_possible_map) <= 8) 54 genapic = &apic_flat; 55 else 56 genapic = &apic_physflat; 57 58 printk(KERN_INFO "Setting APIC routing to %s\n", genapic->name); 59} 60 61/* Same for both flat and physical. */ 62 63void send_IPI_self(int vector) 64{ 65 __send_IPI_shortcut(APIC_DEST_SELF, vector, APIC_DEST_PHYSICAL); 66} 67