| 
									
										
										
										
											2008-07-10 11:16:59 -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:59 -07:00
										 |  |  | #include <asm/smp.h>
 | 
					
						
							| 
									
										
										
										
											2011-05-19 16:45:50 -07:00
										 |  |  | #include <asm/x2apic.h>
 | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:59 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-21 14:23:21 -08:00
										 |  |  | int x2apic_phys; | 
					
						
							| 
									
										
										
										
											2008-07-21 22:08:21 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-20 17:51:20 -07:00
										 |  |  | static struct apic apic_x2apic_phys; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-21 22:08:21 -07:00
										 |  |  | static int set_x2apic_phys_mode(char *arg) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	x2apic_phys = 1; | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | early_param("x2apic_phys", set_x2apic_phys_mode); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												x86/apic: Work around boot failure on HP ProLiant DL980 G7 Server systems
When a HP ProLiant DL980 G7 Server boots a regular kernel,
there will be intermittent lost interrupts which could
result in a hang or (in extreme cases) data loss.
The reason is that this system only supports x2apic physical
mode, while the kernel boots with a logical-cluster default
setting.
This bug can be worked around by specifying the "x2apic_phys" or
"nox2apic" boot option, but we want to handle this system
without requiring manual workarounds.
The BIOS sets ACPI_FADT_APIC_PHYSICAL in FADT table.
As all apicids are smaller than 255, BIOS need to pass the
control to the OS with xapic mode, according to x2apic-spec,
chapter 2.9.
Current code handle x2apic when BIOS pass with xapic mode
enabled:
When user specifies x2apic_phys, or FADT indicates PHYSICAL:
1. During madt oem check, apic driver is set with xapic logical
   or xapic phys driver at first.
2. enable_IR_x2apic() will enable x2apic_mode.
3. if user specifies x2apic_phys on the boot line, x2apic_phys_probe()
   will install the correct x2apic phys driver and use x2apic phys mode.
   Otherwise it will skip the driver will let x2apic_cluster_probe to
   take over to install x2apic cluster driver (wrong one) even though FADT
   indicates PHYSICAL, because x2apic_phys_probe does not check
   FADT PHYSICAL.
Add checking x2apic_fadt_phys in x2apic_phys_probe() to fix the
problem.
Signed-off-by: Stoney Wang <song-bo.wang@hp.com>
[ updated the changelog and simplified the code ]
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Cc: stable@kernel.org
Link: http://lkml.kernel.org/r/1360263182-16226-1-git-send-email-yinghai@kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
											
										 
											2013-02-07 10:53:02 -08:00
										 |  |  | static bool x2apic_fadt_phys(void) | 
					
						
							| 
									
										
										
										
											2008-07-21 22:08:21 -07:00
										 |  |  | { | 
					
						
							| 
									
										
											  
											
												x86/apic: Work around boot failure on HP ProLiant DL980 G7 Server systems
When a HP ProLiant DL980 G7 Server boots a regular kernel,
there will be intermittent lost interrupts which could
result in a hang or (in extreme cases) data loss.
The reason is that this system only supports x2apic physical
mode, while the kernel boots with a logical-cluster default
setting.
This bug can be worked around by specifying the "x2apic_phys" or
"nox2apic" boot option, but we want to handle this system
without requiring manual workarounds.
The BIOS sets ACPI_FADT_APIC_PHYSICAL in FADT table.
As all apicids are smaller than 255, BIOS need to pass the
control to the OS with xapic mode, according to x2apic-spec,
chapter 2.9.
Current code handle x2apic when BIOS pass with xapic mode
enabled:
When user specifies x2apic_phys, or FADT indicates PHYSICAL:
1. During madt oem check, apic driver is set with xapic logical
   or xapic phys driver at first.
2. enable_IR_x2apic() will enable x2apic_mode.
3. if user specifies x2apic_phys on the boot line, x2apic_phys_probe()
   will install the correct x2apic phys driver and use x2apic phys mode.
   Otherwise it will skip the driver will let x2apic_cluster_probe to
   take over to install x2apic cluster driver (wrong one) even though FADT
   indicates PHYSICAL, because x2apic_phys_probe does not check
   FADT PHYSICAL.
Add checking x2apic_fadt_phys in x2apic_phys_probe() to fix the
problem.
Signed-off-by: Stoney Wang <song-bo.wang@hp.com>
[ updated the changelog and simplified the code ]
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Cc: stable@kernel.org
Link: http://lkml.kernel.org/r/1360263182-16226-1-git-send-email-yinghai@kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
											
										 
											2013-02-07 10:53:02 -08:00
										 |  |  | 	if ((acpi_gbl_FADT.header.revision >= FADT2_REVISION_ID) && | 
					
						
							|  |  |  | 		(acpi_gbl_FADT.flags & ACPI_FADT_APIC_PHYSICAL)) { | 
					
						
							| 
									
										
										
										
											2012-04-24 18:23:56 -06:00
										 |  |  | 		printk(KERN_DEBUG "System requires x2apic physical mode\n"); | 
					
						
							| 
									
										
											  
											
												x86/apic: Work around boot failure on HP ProLiant DL980 G7 Server systems
When a HP ProLiant DL980 G7 Server boots a regular kernel,
there will be intermittent lost interrupts which could
result in a hang or (in extreme cases) data loss.
The reason is that this system only supports x2apic physical
mode, while the kernel boots with a logical-cluster default
setting.
This bug can be worked around by specifying the "x2apic_phys" or
"nox2apic" boot option, but we want to handle this system
without requiring manual workarounds.
The BIOS sets ACPI_FADT_APIC_PHYSICAL in FADT table.
As all apicids are smaller than 255, BIOS need to pass the
control to the OS with xapic mode, according to x2apic-spec,
chapter 2.9.
Current code handle x2apic when BIOS pass with xapic mode
enabled:
When user specifies x2apic_phys, or FADT indicates PHYSICAL:
1. During madt oem check, apic driver is set with xapic logical
   or xapic phys driver at first.
2. enable_IR_x2apic() will enable x2apic_mode.
3. if user specifies x2apic_phys on the boot line, x2apic_phys_probe()
   will install the correct x2apic phys driver and use x2apic phys mode.
   Otherwise it will skip the driver will let x2apic_cluster_probe to
   take over to install x2apic cluster driver (wrong one) even though FADT
   indicates PHYSICAL, because x2apic_phys_probe does not check
   FADT PHYSICAL.
Add checking x2apic_fadt_phys in x2apic_phys_probe() to fix the
problem.
Signed-off-by: Stoney Wang <song-bo.wang@hp.com>
[ updated the changelog and simplified the code ]
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Cc: stable@kernel.org
Link: http://lkml.kernel.org/r/1360263182-16226-1-git-send-email-yinghai@kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
											
										 
											2013-02-07 10:53:02 -08:00
										 |  |  | 		return true; | 
					
						
							| 
									
										
										
										
											2012-04-24 18:23:56 -06:00
										 |  |  | 	} | 
					
						
							| 
									
										
											  
											
												x86/apic: Work around boot failure on HP ProLiant DL980 G7 Server systems
When a HP ProLiant DL980 G7 Server boots a regular kernel,
there will be intermittent lost interrupts which could
result in a hang or (in extreme cases) data loss.
The reason is that this system only supports x2apic physical
mode, while the kernel boots with a logical-cluster default
setting.
This bug can be worked around by specifying the "x2apic_phys" or
"nox2apic" boot option, but we want to handle this system
without requiring manual workarounds.
The BIOS sets ACPI_FADT_APIC_PHYSICAL in FADT table.
As all apicids are smaller than 255, BIOS need to pass the
control to the OS with xapic mode, according to x2apic-spec,
chapter 2.9.
Current code handle x2apic when BIOS pass with xapic mode
enabled:
When user specifies x2apic_phys, or FADT indicates PHYSICAL:
1. During madt oem check, apic driver is set with xapic logical
   or xapic phys driver at first.
2. enable_IR_x2apic() will enable x2apic_mode.
3. if user specifies x2apic_phys on the boot line, x2apic_phys_probe()
   will install the correct x2apic phys driver and use x2apic phys mode.
   Otherwise it will skip the driver will let x2apic_cluster_probe to
   take over to install x2apic cluster driver (wrong one) even though FADT
   indicates PHYSICAL, because x2apic_phys_probe does not check
   FADT PHYSICAL.
Add checking x2apic_fadt_phys in x2apic_phys_probe() to fix the
problem.
Signed-off-by: Stoney Wang <song-bo.wang@hp.com>
[ updated the changelog and simplified the code ]
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Cc: stable@kernel.org
Link: http://lkml.kernel.org/r/1360263182-16226-1-git-send-email-yinghai@kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
											
										 
											2013-02-07 10:53:02 -08:00
										 |  |  | 	return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int x2apic_acpi_madt_oem_check(char *oem_id, char *oem_table_id) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return x2apic_enabled() && (x2apic_phys || x2apic_fadt_phys()); | 
					
						
							| 
									
										
										
										
											2008-07-21 22:08:21 -07:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:59 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-19 16:45:47 -07:00
										 |  |  | static void | 
					
						
							|  |  |  | __x2apic_send_IPI_mask(const struct cpumask *mask, int vector, int apic_dest) | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:59 -07:00
										 |  |  | { | 
					
						
							|  |  |  | 	unsigned long query_cpu; | 
					
						
							| 
									
										
										
										
											2011-05-19 16:45:47 -07:00
										 |  |  | 	unsigned long this_cpu; | 
					
						
							| 
									
										
										
										
											2009-01-28 15:42:24 +01:00
										 |  |  | 	unsigned long flags; | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:59 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-17 10:16:54 -08:00
										 |  |  | 	x2apic_wrmsr_fence(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:59 -07:00
										 |  |  | 	local_irq_save(flags); | 
					
						
							| 
									
										
										
										
											2011-05-19 16:45:47 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	this_cpu = smp_processor_id(); | 
					
						
							| 
									
										
										
										
											2008-12-16 17:33:59 -08:00
										 |  |  | 	for_each_cpu(query_cpu, mask) { | 
					
						
							| 
									
										
										
										
											2011-05-19 16:45:47 -07:00
										 |  |  | 		if (apic_dest == APIC_DEST_ALLBUT && this_cpu == query_cpu) | 
					
						
							|  |  |  | 			continue; | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:59 -07:00
										 |  |  | 		__x2apic_send_IPI_dest(per_cpu(x86_cpu_to_apicid, query_cpu), | 
					
						
							|  |  |  | 				       vector, APIC_DEST_PHYSICAL); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	local_irq_restore(flags); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-19 16:45:47 -07:00
										 |  |  | static void x2apic_send_IPI_mask(const struct cpumask *mask, int vector) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	__x2apic_send_IPI_mask(mask, vector, APIC_DEST_ALLINC); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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:59 -07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-05-19 16:45:47 -07:00
										 |  |  | 	__x2apic_send_IPI_mask(mask, vector, APIC_DEST_ALLBUT); | 
					
						
							| 
									
										
										
										
											2008-12-16 17:33:52 -08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:59 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-16 17:33:52 -08:00
										 |  |  | static void x2apic_send_IPI_allbutself(int vector) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-05-19 16:45:47 -07:00
										 |  |  | 	__x2apic_send_IPI_mask(cpu_online_mask, vector, APIC_DEST_ALLBUT); | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:59 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void x2apic_send_IPI_all(int vector) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-05-19 16:45:47 -07:00
										 |  |  | 	__x2apic_send_IPI_mask(cpu_online_mask, vector, APIC_DEST_ALLINC); | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:59 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-29 22:11:40 +05:30
										 |  |  | static void init_x2apic_ldr(void) | 
					
						
							| 
									
										
										
										
											2008-07-10 11:16:59 -07:00
										 |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-19 16:45:46 -07:00
										 |  |  | static int x2apic_phys_probe(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
											  
											
												x86/apic: Work around boot failure on HP ProLiant DL980 G7 Server systems
When a HP ProLiant DL980 G7 Server boots a regular kernel,
there will be intermittent lost interrupts which could
result in a hang or (in extreme cases) data loss.
The reason is that this system only supports x2apic physical
mode, while the kernel boots with a logical-cluster default
setting.
This bug can be worked around by specifying the "x2apic_phys" or
"nox2apic" boot option, but we want to handle this system
without requiring manual workarounds.
The BIOS sets ACPI_FADT_APIC_PHYSICAL in FADT table.
As all apicids are smaller than 255, BIOS need to pass the
control to the OS with xapic mode, according to x2apic-spec,
chapter 2.9.
Current code handle x2apic when BIOS pass with xapic mode
enabled:
When user specifies x2apic_phys, or FADT indicates PHYSICAL:
1. During madt oem check, apic driver is set with xapic logical
   or xapic phys driver at first.
2. enable_IR_x2apic() will enable x2apic_mode.
3. if user specifies x2apic_phys on the boot line, x2apic_phys_probe()
   will install the correct x2apic phys driver and use x2apic phys mode.
   Otherwise it will skip the driver will let x2apic_cluster_probe to
   take over to install x2apic cluster driver (wrong one) even though FADT
   indicates PHYSICAL, because x2apic_phys_probe does not check
   FADT PHYSICAL.
Add checking x2apic_fadt_phys in x2apic_phys_probe() to fix the
problem.
Signed-off-by: Stoney Wang <song-bo.wang@hp.com>
[ updated the changelog and simplified the code ]
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Cc: stable@kernel.org
Link: http://lkml.kernel.org/r/1360263182-16226-1-git-send-email-yinghai@kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
											
										 
											2013-02-07 10:53:02 -08:00
										 |  |  | 	if (x2apic_mode && (x2apic_phys || x2apic_fadt_phys())) | 
					
						
							| 
									
										
										
										
											2011-05-19 16:45:46 -07:00
										 |  |  | 		return 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return apic == &apic_x2apic_phys; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-20 17:51:20 -07:00
										 |  |  | static struct apic apic_x2apic_phys = { | 
					
						
							| 
									
										
										
										
											2009-01-28 02:37:01 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	.name				= "physical x2apic", | 
					
						
							| 
									
										
										
										
											2011-05-19 16:45:46 -07:00
										 |  |  | 	.probe				= x2apic_phys_probe, | 
					
						
							| 
									
										
										
										
											2009-01-28 02:37:01 +01:00
										 |  |  | 	.acpi_madt_oem_check		= x2apic_acpi_madt_oem_check, | 
					
						
							| 
									
										
										
										
											2012-03-16 20:25:35 +01:00
										 |  |  | 	.apic_id_valid			= x2apic_apic_id_valid, | 
					
						
							| 
									
										
										
										
											2009-01-28 02:37:01 +01:00
										 |  |  | 	.apic_id_registered		= x2apic_apic_id_registered, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-28 04:02:31 +01:00
										 |  |  | 	.irq_delivery_mode		= dest_Fixed, | 
					
						
							| 
									
										
										
										
											2009-01-28 05:13:04 +01:00
										 |  |  | 	.irq_dest_mode			= 0, /* physical */ | 
					
						
							| 
									
										
										
										
											2009-01-28 02:37:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-05 13:23:29 +02:00
										 |  |  | 	.target_cpus			= online_target_cpus, | 
					
						
							| 
									
										
										
										
											2009-01-28 05:08:44 +01:00
										 |  |  | 	.disable_esr			= 0, | 
					
						
							| 
									
										
										
										
											2009-01-28 05:29:25 +01:00
										 |  |  | 	.dest_logical			= 0, | 
					
						
							| 
									
										
										
										
											2009-01-28 02:37:01 +01:00
										 |  |  | 	.check_apicid_used		= NULL, | 
					
						
							|  |  |  | 	.check_apicid_present		= NULL, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-07 15:14:49 +02:00
										 |  |  | 	.vector_allocation_domain	= default_vector_allocation_domain, | 
					
						
							| 
									
										
										
										
											2009-01-28 02:37:01 +01:00
										 |  |  | 	.init_apic_ldr			= init_x2apic_ldr, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	.ioapic_phys_id_map		= NULL, | 
					
						
							|  |  |  | 	.setup_apic_routing		= NULL, | 
					
						
							|  |  |  | 	.multi_timer_check		= 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_phys_pkg_id, | 
					
						
							| 
									
										
										
										
											2009-01-28 02:37:01 +01:00
										 |  |  | 	.mps_oem_check			= NULL, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-19 16:45:50 -07:00
										 |  |  | 	.get_apic_id			= x2apic_get_apic_id, | 
					
						
							|  |  |  | 	.set_apic_id			= x2apic_set_apic_id, | 
					
						
							| 
									
										
										
										
											2009-01-28 02:37:01 +01:00
										 |  |  | 	.apic_id_mask			= 0xFFFFFFFFu, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-05 13:23:44 +02:00
										 |  |  | 	.cpu_mask_to_apicid_and		= default_cpu_mask_to_apicid_and, | 
					
						
							| 
									
										
										
										
											2009-01-28 02:37:01 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	.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, | 
					
						
							| 
									
										
										
										
											2012-05-16 19:03:58 +03:00
										 |  |  | 	.eoi_write			= native_apic_msr_eoi_write, | 
					
						
							| 
									
										
										
										
											2009-02-16 23:02:14 -08:00
										 |  |  | 	.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:59 -07:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2011-05-20 17:51:17 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | apic_driver(apic_x2apic_phys); |