| 
									
										
										
										
											2008-07-10 11:16:54 -07:00
										 |  |  | #include <linux/threads.h>
 | 
					
						
							|  |  |  | #include <linux/cpumask.h>
 | 
					
						
							|  |  |  | #include <linux/string.h>
 | 
					
						
							|  |  |  | #include <linux/kernel.h>
 | 
					
						
							|  |  |  | #include <linux/ctype.h>
 | 
					
						
							|  |  |  | #include <linux/init.h>
 | 
					
						
							| 
									
										
										
										
											2008-07-21 22:08:21 -07:00
										 |  |  | #include <linux/dmar.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:54 -07:00
										 |  |  | #include <asm/smp.h>
 | 
					
						
							| 
									
										
										
										
											2009-02-17 13:58:15 +01:00
										 |  |  | #include <asm/apic.h>
 | 
					
						
							| 
									
										
										
										
											2009-02-16 23:02:14 -08:00
										 |  |  | #include <asm/ipi.h>
 | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:54 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-11 12:55:26 +05:30
										 |  |  | static DEFINE_PER_CPU(u32, x86_cpu_to_logical_apicid); | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:54 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-12 11:44:11 +02:00
										 |  |  | static int x2apic_acpi_madt_oem_check(char *oem_id, char *oem_table_id) | 
					
						
							| 
									
										
										
										
											2008-07-21 22:08:21 -07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-02-21 14:23:21 -08:00
										 |  |  | 	return x2apic_enabled(); | 
					
						
							| 
									
										
										
										
											2008-07-21 22:08:21 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-04 08:59:59 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * need to use more than cpu 0, because we need more vectors when | 
					
						
							|  |  |  |  * MSI-X are used. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2008-12-16 17:33:59 -08:00
										 |  |  | static const struct cpumask *x2apic_target_cpus(void) | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:54 -07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-08-04 08:59:59 -07:00
										 |  |  | 	return cpu_online_mask; | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:54 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * for now each logical cpu is in its own vector allocation domain. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2008-12-16 17:33:59 -08:00
										 |  |  | static void x2apic_vector_allocation_domain(int cpu, struct cpumask *retmask) | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:54 -07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2008-12-16 17:33:59 -08:00
										 |  |  | 	cpumask_clear(retmask); | 
					
						
							|  |  |  | 	cpumask_set_cpu(cpu, retmask); | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:54 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-28 15:42:24 +01:00
										 |  |  | static void | 
					
						
							|  |  |  |  __x2apic_send_IPI_dest(unsigned int apicid, int vector, unsigned int dest) | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:54 -07:00
										 |  |  | { | 
					
						
							|  |  |  | 	unsigned long cfg; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	cfg = __prepare_ICR(0, vector, dest); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/*
 | 
					
						
							|  |  |  | 	 * send the IPI. | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2009-02-16 23:02:14 -08:00
										 |  |  | 	native_x2apic_icr_write(cfg, apicid); | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:54 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * for now, we send the IPI's one by one in the cpumask. | 
					
						
							|  |  |  |  * TBD: Based on the cpu mask, we can send the IPI's to the cluster group | 
					
						
							|  |  |  |  * at once. We have 16 cpu's in a cluster. This will minimize IPI register | 
					
						
							|  |  |  |  * writes. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2008-12-16 17:33:59 -08:00
										 |  |  | static void x2apic_send_IPI_mask(const struct cpumask *mask, int vector) | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:54 -07:00
										 |  |  | { | 
					
						
							|  |  |  | 	unsigned long query_cpu; | 
					
						
							| 
									
										
										
										
											2009-01-28 15:42:24 +01:00
										 |  |  | 	unsigned long flags; | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:54 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-17 10:16:54 -08:00
										 |  |  | 	x2apic_wrmsr_fence(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:54 -07:00
										 |  |  | 	local_irq_save(flags); | 
					
						
							| 
									
										
										
										
											2009-01-28 15:42:24 +01:00
										 |  |  | 	for_each_cpu(query_cpu, mask) { | 
					
						
							| 
									
										
										
										
											2008-12-16 17:33:52 -08:00
										 |  |  | 		__x2apic_send_IPI_dest( | 
					
						
							|  |  |  | 			per_cpu(x86_cpu_to_logical_apicid, query_cpu), | 
					
						
							| 
									
										
										
										
											2009-01-28 05:29:25 +01:00
										 |  |  | 			vector, apic->dest_logical); | 
					
						
							| 
									
										
										
										
											2009-01-28 15:42:24 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:54 -07:00
										 |  |  | 	local_irq_restore(flags); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-28 15:42:24 +01:00
										 |  |  | static void | 
					
						
							|  |  |  |  x2apic_send_IPI_mask_allbutself(const struct cpumask *mask, int vector) | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:54 -07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2008-12-16 17:33:52 -08:00
										 |  |  | 	unsigned long this_cpu = smp_processor_id(); | 
					
						
							| 
									
										
										
										
											2009-01-28 15:42:24 +01:00
										 |  |  | 	unsigned long query_cpu; | 
					
						
							|  |  |  | 	unsigned long flags; | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:54 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-17 10:16:54 -08:00
										 |  |  | 	x2apic_wrmsr_fence(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-16 17:33:52 -08:00
										 |  |  | 	local_irq_save(flags); | 
					
						
							| 
									
										
										
										
											2009-01-28 15:42:24 +01:00
										 |  |  | 	for_each_cpu(query_cpu, mask) { | 
					
						
							|  |  |  | 		if (query_cpu == this_cpu) | 
					
						
							|  |  |  | 			continue; | 
					
						
							|  |  |  | 		__x2apic_send_IPI_dest( | 
					
						
							| 
									
										
										
										
											2008-12-16 17:33:52 -08:00
										 |  |  | 				per_cpu(x86_cpu_to_logical_apicid, query_cpu), | 
					
						
							| 
									
										
										
										
											2009-01-28 05:29:25 +01:00
										 |  |  | 				vector, apic->dest_logical); | 
					
						
							| 
									
										
										
										
											2009-01-28 15:42:24 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-12-16 17:33:52 -08:00
										 |  |  | 	local_irq_restore(flags); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:54 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-16 17:33:52 -08:00
										 |  |  | static void x2apic_send_IPI_allbutself(int vector) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	unsigned long this_cpu = smp_processor_id(); | 
					
						
							| 
									
										
										
										
											2009-01-28 15:42:24 +01:00
										 |  |  | 	unsigned long query_cpu; | 
					
						
							|  |  |  | 	unsigned long flags; | 
					
						
							| 
									
										
										
										
											2008-12-16 17:33:52 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-17 10:16:54 -08:00
										 |  |  | 	x2apic_wrmsr_fence(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-16 17:33:52 -08:00
										 |  |  | 	local_irq_save(flags); | 
					
						
							| 
									
										
										
										
											2009-01-28 15:42:24 +01:00
										 |  |  | 	for_each_online_cpu(query_cpu) { | 
					
						
							|  |  |  | 		if (query_cpu == this_cpu) | 
					
						
							|  |  |  | 			continue; | 
					
						
							|  |  |  | 		__x2apic_send_IPI_dest( | 
					
						
							| 
									
										
										
										
											2008-12-16 17:33:52 -08:00
										 |  |  | 				per_cpu(x86_cpu_to_logical_apicid, query_cpu), | 
					
						
							| 
									
										
										
										
											2009-01-28 05:29:25 +01:00
										 |  |  | 				vector, apic->dest_logical); | 
					
						
							| 
									
										
										
										
											2009-01-28 15:42:24 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-12-16 17:33:52 -08:00
										 |  |  | 	local_irq_restore(flags); | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:54 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void x2apic_send_IPI_all(int vector) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2008-12-16 17:33:59 -08:00
										 |  |  | 	x2apic_send_IPI_mask(cpu_online_mask, vector); | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:54 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int x2apic_apic_id_registered(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-16 17:33:59 -08:00
										 |  |  | static unsigned int x2apic_cpu_mask_to_apicid(const struct cpumask *cpumask) | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:54 -07:00
										 |  |  | { | 
					
						
							|  |  |  | 	/*
 | 
					
						
							| 
									
										
										
										
											2008-12-22 17:33:28 -08:00
										 |  |  | 	 * We're using fixed IRQ delivery, can only return one logical APIC ID. | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:54 -07:00
										 |  |  | 	 * May as well be the first. | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2009-01-28 15:20:18 +01:00
										 |  |  | 	int cpu = cpumask_first(cpumask); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-16 17:33:52 -08:00
										 |  |  | 	if ((unsigned)cpu < nr_cpu_ids) | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:54 -07:00
										 |  |  | 		return per_cpu(x86_cpu_to_logical_apicid, cpu); | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		return BAD_APICID; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-28 15:20:18 +01:00
										 |  |  | static unsigned int | 
					
						
							|  |  |  | x2apic_cpu_mask_to_apicid_and(const struct cpumask *cpumask, | 
					
						
							|  |  |  | 			      const struct cpumask *andmask) | 
					
						
							| 
									
										
										
										
											2008-12-16 17:33:54 -08:00
										 |  |  | { | 
					
						
							|  |  |  | 	int cpu; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/*
 | 
					
						
							| 
									
										
										
										
											2008-12-22 17:33:28 -08:00
										 |  |  | 	 * We're using fixed IRQ delivery, can only return one logical APIC ID. | 
					
						
							| 
									
										
										
										
											2008-12-16 17:33:54 -08:00
										 |  |  | 	 * May as well be the first. | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2009-01-28 15:20:18 +01:00
										 |  |  | 	for_each_cpu_and(cpu, cpumask, andmask) { | 
					
						
							| 
									
										
										
										
											2008-12-17 15:21:39 -08:00
										 |  |  | 		if (cpumask_test_cpu(cpu, cpu_online_mask)) | 
					
						
							|  |  |  | 			break; | 
					
						
							| 
									
										
										
										
											2009-01-28 15:20:18 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-17 18:29:46 -08:00
										 |  |  | 	return per_cpu(x86_cpu_to_logical_apicid, cpu); | 
					
						
							| 
									
										
										
										
											2008-12-16 17:33:54 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-28 14:08:38 +01:00
										 |  |  | static unsigned int x2apic_cluster_phys_get_apic_id(unsigned long x) | 
					
						
							| 
									
										
										
										
											2008-07-12 01:01:20 -07:00
										 |  |  | { | 
					
						
							|  |  |  | 	unsigned int id; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	id = x; | 
					
						
							|  |  |  | 	return id; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static unsigned long set_apic_id(unsigned int id) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	unsigned long x; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	x = id; | 
					
						
							|  |  |  | 	return x; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-28 13:31:22 +01:00
										 |  |  | static int x2apic_cluster_phys_pkg_id(int initial_apicid, int index_msb) | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:54 -07:00
										 |  |  | { | 
					
						
							| 
									
										
											  
											
												x86: Don't use current_cpu_data in x2apic phys_pkg_id
One system has socket 1 come up as BSP.
kexeced kernel reports BSP as:
[    1.524550] Initializing cgroup subsys cpuacct
[    1.536064] initial_apicid:20
[    1.537135] ht_mask_width:1
[    1.538128] core_select_mask:f
[    1.539126] core_plus_mask_width:5
[    1.558479] CPU: Physical Processor ID: 0
[    1.559501] CPU: Processor Core ID: 0
[    1.560539] CPU: L1 I cache: 32K, L1 D cache: 32K
[    1.579098] CPU: L2 cache: 256K
[    1.580085] CPU: L3 cache: 24576K
[    1.581108] CPU 0/0x20 -> Node 0
[    1.596193] CPU 0 microcode level: 0xffff0008
It doesn't have correct physical processor id and will get an
error:
[   38.840859] CPU0 attaching sched-domain:
[   38.848287]  domain 0: span 0,8,72 level SIBLING
[   38.851151]   groups: 0 8 72
[   38.858137]   domain 1: span 0,8-15,72-79 level MC
[   38.868944]    groups: 0,8,72 9,73 10,74 11,75 12,76 13,77 14,78 15,79
[   38.881383] ERROR: parent span is not a superset of domain->span
[   38.890724]    domain 2: span 0-7,64-71 level CPU
[   38.899237] ERROR: domain->groups does not contain CPU0
[   38.909229]     groups: 8-15,72-79
[   38.912547] ERROR: groups don't span domain->span
[   38.919665]     domain 3: span 0-127 level NODE
[   38.930739]      groups: 0-7,64-71 8-15,72-79 16-23,80-87 24-31,88-95 32-39,96-103 40-47,104-111 48-55,112-119 56-63,120-127
it turns out: we can not use current_cpu_data in phys_pgd_id
for x2apic.
identify_boot_cpu() is called by check_bugs() before
smp_prepare_cpus() and till smp_prepare_cpus() current_cpu_data
for bsp is assigned with boot_cpu_data.
Just make phys_pkg_id for x2apic is aligned to xapic.
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Acked-by: Suresh Siddha <suresh.b.siddha@intel.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
LKML-Reference: <4A6ADD0D.10002@kernel.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
											
										 
											2009-07-25 03:23:09 -07:00
										 |  |  | 	return initial_apicid >> index_msb; | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:54 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void x2apic_send_IPI_self(int vector) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	apic_write(APIC_SELF_IPI, vector); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void init_x2apic_ldr(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int cpu = smp_processor_id(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	per_cpu(x86_cpu_to_logical_apicid, cpu) = apic_read(APIC_LDR); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-17 16:28:46 +01:00
										 |  |  | struct apic apic_x2apic_cluster = { | 
					
						
							| 
									
										
										
										
											2009-01-28 02:37:01 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	.name				= "cluster x2apic", | 
					
						
							|  |  |  | 	.probe				= NULL, | 
					
						
							|  |  |  | 	.acpi_madt_oem_check		= x2apic_acpi_madt_oem_check, | 
					
						
							|  |  |  | 	.apic_id_registered		= x2apic_apic_id_registered, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-28 04:02:31 +01:00
										 |  |  | 	.irq_delivery_mode		= dest_LowestPrio, | 
					
						
							| 
									
										
										
										
											2009-01-28 05:13:04 +01:00
										 |  |  | 	.irq_dest_mode			= 1, /* logical */ | 
					
						
							| 
									
										
										
										
											2009-01-28 02:37:01 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	.target_cpus			= x2apic_target_cpus, | 
					
						
							| 
									
										
										
										
											2009-01-28 05:08:44 +01:00
										 |  |  | 	.disable_esr			= 0, | 
					
						
							| 
									
										
										
										
											2009-01-28 05:29:25 +01:00
										 |  |  | 	.dest_logical			= APIC_DEST_LOGICAL, | 
					
						
							| 
									
										
										
										
											2009-01-28 02:37:01 +01:00
										 |  |  | 	.check_apicid_used		= NULL, | 
					
						
							|  |  |  | 	.check_apicid_present		= NULL, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	.vector_allocation_domain	= x2apic_vector_allocation_domain, | 
					
						
							|  |  |  | 	.init_apic_ldr			= init_x2apic_ldr, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	.ioapic_phys_id_map		= NULL, | 
					
						
							|  |  |  | 	.setup_apic_routing		= NULL, | 
					
						
							|  |  |  | 	.multi_timer_check		= NULL, | 
					
						
							|  |  |  | 	.apicid_to_node			= NULL, | 
					
						
							|  |  |  | 	.cpu_to_logical_apicid		= NULL, | 
					
						
							| 
									
										
										
										
											2009-01-28 06:50:47 +01:00
										 |  |  | 	.cpu_present_to_apicid		= default_cpu_present_to_apicid, | 
					
						
							| 
									
										
										
										
											2009-01-28 02:37:01 +01:00
										 |  |  | 	.apicid_to_cpu_present		= NULL, | 
					
						
							|  |  |  | 	.setup_portio_remap		= NULL, | 
					
						
							| 
									
										
										
										
											2009-01-28 12:43:18 +01:00
										 |  |  | 	.check_phys_apicid_present	= default_check_phys_apicid_present, | 
					
						
							| 
									
										
										
										
											2009-01-28 02:37:01 +01:00
										 |  |  | 	.enable_apic_mode		= NULL, | 
					
						
							| 
									
										
										
										
											2009-01-28 13:31:22 +01:00
										 |  |  | 	.phys_pkg_id			= x2apic_cluster_phys_pkg_id, | 
					
						
							| 
									
										
										
										
											2009-01-28 02:37:01 +01:00
										 |  |  | 	.mps_oem_check			= NULL, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-28 14:08:38 +01:00
										 |  |  | 	.get_apic_id			= x2apic_cluster_phys_get_apic_id, | 
					
						
							| 
									
										
										
										
											2009-01-28 02:37:01 +01:00
										 |  |  | 	.set_apic_id			= set_apic_id, | 
					
						
							|  |  |  | 	.apic_id_mask			= 0xFFFFFFFFu, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	.cpu_mask_to_apicid		= x2apic_cpu_mask_to_apicid, | 
					
						
							|  |  |  | 	.cpu_mask_to_apicid_and		= x2apic_cpu_mask_to_apicid_and, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	.send_IPI_mask			= x2apic_send_IPI_mask, | 
					
						
							|  |  |  | 	.send_IPI_mask_allbutself	= x2apic_send_IPI_mask_allbutself, | 
					
						
							|  |  |  | 	.send_IPI_allbutself		= x2apic_send_IPI_allbutself, | 
					
						
							|  |  |  | 	.send_IPI_all			= x2apic_send_IPI_all, | 
					
						
							|  |  |  | 	.send_IPI_self			= x2apic_send_IPI_self, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-28 16:15:16 +01:00
										 |  |  | 	.trampoline_phys_low		= DEFAULT_TRAMPOLINE_PHYS_LOW, | 
					
						
							|  |  |  | 	.trampoline_phys_high		= DEFAULT_TRAMPOLINE_PHYS_HIGH, | 
					
						
							| 
									
										
										
										
											2009-01-28 02:37:01 +01:00
										 |  |  | 	.wait_for_init_deassert		= NULL, | 
					
						
							|  |  |  | 	.smp_callin_clear_local_apic	= NULL, | 
					
						
							|  |  |  | 	.inquire_remote_apic		= NULL, | 
					
						
							| 
									
										
										
										
											2009-02-16 23:02:14 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	.read				= native_apic_msr_read, | 
					
						
							|  |  |  | 	.write				= native_apic_msr_write, | 
					
						
							|  |  |  | 	.icr_read			= native_x2apic_icr_read, | 
					
						
							|  |  |  | 	.icr_write			= native_x2apic_icr_write, | 
					
						
							|  |  |  | 	.wait_icr_idle			= native_x2apic_wait_icr_idle, | 
					
						
							|  |  |  | 	.safe_wait_icr_idle		= native_safe_x2apic_wait_icr_idle, | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:54 -07:00
										 |  |  | }; |