| From 7f7fbf45c6b748074546f7f16b9488ca71de99c1 Mon Sep 17 00:00:00 2001 |
| From: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> |
| Date: Tue, 30 Nov 2010 22:22:28 -0800 |
| Subject: x86: Enable the intr-remap fault handling after local APIC setup |
| |
| From: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> |
| |
| commit 7f7fbf45c6b748074546f7f16b9488ca71de99c1 upstream. |
| |
| Interrupt-remapping gets enabled very early in the boot, as it determines the |
| apic mode that the processor can use. And the current code enables the vt-d |
| fault handling before the setup_local_APIC(). And hence the APIC LDR registers |
| and data structure in the memory may not be initialized. So the vt-d fault |
| handling in logical xapic/x2apic modes were broken. |
| |
| Fix this by enabling the vt-d fault handling in the end_local_APIC_setup() |
| |
| A cleaner fix of enabling fault handling while enabling intr-remapping |
| will be addressed for v2.6.38. [ Enabling intr-remapping determines the |
| usage of x2apic mode and the apic mode determines the fault-handling |
| configuration. ] |
| |
| Signed-off-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> |
| LKML-Reference: <20101201062244.541996375@intel.com> |
| Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com> |
| Acked-by: Chris Wright <chrisw@sous-sol.org> |
| Signed-off-by: H. Peter Anvin <hpa@linux.intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| arch/x86/kernel/apic/apic.c | 8 ++++++++ |
| arch/x86/kernel/apic/probe_64.c | 7 ------- |
| 2 files changed, 8 insertions(+), 7 deletions(-) |
| |
| --- a/arch/x86/kernel/apic/apic.c |
| +++ b/arch/x86/kernel/apic/apic.c |
| @@ -1340,6 +1340,14 @@ void __cpuinit end_local_APIC_setup(void |
| |
| setup_apic_nmi_watchdog(NULL); |
| apic_pm_activate(); |
| + |
| + /* |
| + * Now that local APIC setup is completed for BP, configure the fault |
| + * handling for interrupt remapping. |
| + */ |
| + if (!smp_processor_id() && intr_remapping_enabled) |
| + enable_drhd_fault_handling(); |
| + |
| } |
| |
| #ifdef CONFIG_X86_X2APIC |
| --- a/arch/x86/kernel/apic/probe_64.c |
| +++ b/arch/x86/kernel/apic/probe_64.c |
| @@ -76,13 +76,6 @@ void __init default_setup_apic_routing(v |
| /* need to update phys_pkg_id */ |
| apic->phys_pkg_id = apicid_phys_pkg_id; |
| } |
| - |
| - /* |
| - * Now that apic routing model is selected, configure the |
| - * fault handling for intr remapping. |
| - */ |
| - if (intr_remapping_enabled) |
| - enable_drhd_fault_handling(); |
| } |
| |
| /* Same for both flat and physical. */ |