diff options
-rw-r--r-- | arch/x86/include/asm/intr_remapping.h | 6 | ||||
-rw-r--r-- | arch/x86/kernel/apic/apic.c | 6 | ||||
-rw-r--r-- | drivers/iommu/intel_intr_remapping.c | 7 | ||||
-rw-r--r-- | drivers/iommu/intr_remapping.c | 24 | ||||
-rw-r--r-- | drivers/iommu/intr_remapping.h | 9 | ||||
-rw-r--r-- | include/linux/dmar.h | 18 |
6 files changed, 47 insertions, 23 deletions
diff --git a/arch/x86/include/asm/intr_remapping.h b/arch/x86/include/asm/intr_remapping.h index 207c605dbdf5..55aa892a53e3 100644 --- a/arch/x86/include/asm/intr_remapping.h +++ b/arch/x86/include/asm/intr_remapping.h | |||
@@ -30,6 +30,9 @@ extern void setup_intr_remapping(void); | |||
30 | extern int intr_remapping_supported(void); | 30 | extern int intr_remapping_supported(void); |
31 | extern int intr_hardware_init(void); | 31 | extern int intr_hardware_init(void); |
32 | extern int intr_hardware_enable(void); | 32 | extern int intr_hardware_enable(void); |
33 | extern void intr_hardware_disable(void); | ||
34 | extern int intr_hardware_reenable(int); | ||
35 | extern int intr_enable_fault_handling(void); | ||
33 | 36 | ||
34 | #else /* CONFIG_IRQ_REMAP */ | 37 | #else /* CONFIG_IRQ_REMAP */ |
35 | 38 | ||
@@ -39,6 +42,9 @@ static inline void setup_intr_remapping(void) { } | |||
39 | static inline int intr_remapping_supported(void) { return 0; } | 42 | static inline int intr_remapping_supported(void) { return 0; } |
40 | static inline int intr_hardware_init(void) { return -ENODEV; } | 43 | static inline int intr_hardware_init(void) { return -ENODEV; } |
41 | static inline int intr_hardware_enable(void) { return -ENODEV; } | 44 | static inline int intr_hardware_enable(void) { return -ENODEV; } |
45 | static inline void intr_hardware_disable(void) { } | ||
46 | static inline int intr_hardware_reenable(int eim) { return -ENODEV; } | ||
47 | static inline int intr_enable_fault_handling(void) { return -ENODEV; } | ||
42 | 48 | ||
43 | #endif /* CONFIG_IRQ_REMAP */ | 49 | #endif /* CONFIG_IRQ_REMAP */ |
44 | 50 | ||
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c index 1db6f63a22ff..a2762687e2ee 100644 --- a/arch/x86/kernel/apic/apic.c +++ b/arch/x86/kernel/apic/apic.c | |||
@@ -1443,7 +1443,7 @@ void __init bsp_end_local_APIC_setup(void) | |||
1443 | * handling for interrupt remapping. | 1443 | * handling for interrupt remapping. |
1444 | */ | 1444 | */ |
1445 | if (intr_remapping_enabled) | 1445 | if (intr_remapping_enabled) |
1446 | enable_drhd_fault_handling(); | 1446 | intr_enable_fault_handling(); |
1447 | 1447 | ||
1448 | } | 1448 | } |
1449 | 1449 | ||
@@ -2181,7 +2181,7 @@ static int lapic_suspend(void) | |||
2181 | disable_local_APIC(); | 2181 | disable_local_APIC(); |
2182 | 2182 | ||
2183 | if (intr_remapping_enabled) | 2183 | if (intr_remapping_enabled) |
2184 | disable_intr_remapping(); | 2184 | intr_hardware_disable(); |
2185 | 2185 | ||
2186 | local_irq_restore(flags); | 2186 | local_irq_restore(flags); |
2187 | return 0; | 2187 | return 0; |
@@ -2250,7 +2250,7 @@ static void lapic_resume(void) | |||
2250 | apic_read(APIC_ESR); | 2250 | apic_read(APIC_ESR); |
2251 | 2251 | ||
2252 | if (intr_remapping_enabled) | 2252 | if (intr_remapping_enabled) |
2253 | reenable_intr_remapping(x2apic_mode); | 2253 | intr_hardware_reenable(x2apic_mode); |
2254 | 2254 | ||
2255 | local_irq_restore(flags); | 2255 | local_irq_restore(flags); |
2256 | } | 2256 | } |
diff --git a/drivers/iommu/intel_intr_remapping.c b/drivers/iommu/intel_intr_remapping.c index 9c742fb111b6..610b75b66c07 100644 --- a/drivers/iommu/intel_intr_remapping.c +++ b/drivers/iommu/intel_intr_remapping.c | |||
@@ -764,7 +764,7 @@ int __init ir_dev_scope_init(void) | |||
764 | } | 764 | } |
765 | rootfs_initcall(ir_dev_scope_init); | 765 | rootfs_initcall(ir_dev_scope_init); |
766 | 766 | ||
767 | void disable_intr_remapping(void) | 767 | static void disable_intr_remapping(void) |
768 | { | 768 | { |
769 | struct dmar_drhd_unit *drhd; | 769 | struct dmar_drhd_unit *drhd; |
770 | struct intel_iommu *iommu = NULL; | 770 | struct intel_iommu *iommu = NULL; |
@@ -780,7 +780,7 @@ void disable_intr_remapping(void) | |||
780 | } | 780 | } |
781 | } | 781 | } |
782 | 782 | ||
783 | int reenable_intr_remapping(int eim) | 783 | static int reenable_intr_remapping(int eim) |
784 | { | 784 | { |
785 | struct dmar_drhd_unit *drhd; | 785 | struct dmar_drhd_unit *drhd; |
786 | int setup = 0; | 786 | int setup = 0; |
@@ -818,4 +818,7 @@ struct irq_remap_ops intel_irq_remap_ops = { | |||
818 | .supported = intel_intr_remapping_supported, | 818 | .supported = intel_intr_remapping_supported, |
819 | .hardware_init = dmar_table_init, | 819 | .hardware_init = dmar_table_init, |
820 | .hardware_enable = intel_enable_intr_remapping, | 820 | .hardware_enable = intel_enable_intr_remapping, |
821 | .hardware_disable = disable_intr_remapping, | ||
822 | .hardware_reenable = reenable_intr_remapping, | ||
823 | .enable_faulting = enable_drhd_fault_handling, | ||
821 | }; | 824 | }; |
diff --git a/drivers/iommu/intr_remapping.c b/drivers/iommu/intr_remapping.c index 670c69a80afd..9aabed7c0320 100644 --- a/drivers/iommu/intr_remapping.c +++ b/drivers/iommu/intr_remapping.c | |||
@@ -74,3 +74,27 @@ int __init intr_hardware_enable(void) | |||
74 | 74 | ||
75 | return remap_ops->hardware_enable(); | 75 | return remap_ops->hardware_enable(); |
76 | } | 76 | } |
77 | |||
78 | void intr_hardware_disable(void) | ||
79 | { | ||
80 | if (!remap_ops || !remap_ops->hardware_disable) | ||
81 | return; | ||
82 | |||
83 | remap_ops->hardware_disable(); | ||
84 | } | ||
85 | |||
86 | int intr_hardware_reenable(int mode) | ||
87 | { | ||
88 | if (!remap_ops || !remap_ops->hardware_reenable) | ||
89 | return 0; | ||
90 | |||
91 | return remap_ops->hardware_reenable(mode); | ||
92 | } | ||
93 | |||
94 | int __init intr_enable_fault_handling(void) | ||
95 | { | ||
96 | if (!remap_ops || !remap_ops->enable_faulting) | ||
97 | return -ENODEV; | ||
98 | |||
99 | return remap_ops->enable_faulting(); | ||
100 | } | ||
diff --git a/drivers/iommu/intr_remapping.h b/drivers/iommu/intr_remapping.h index d6df732e001f..2744c9ae4aec 100644 --- a/drivers/iommu/intr_remapping.h +++ b/drivers/iommu/intr_remapping.h | |||
@@ -37,6 +37,15 @@ struct irq_remap_ops { | |||
37 | 37 | ||
38 | /* Enables the remapping hardware */ | 38 | /* Enables the remapping hardware */ |
39 | int (*hardware_enable)(void); | 39 | int (*hardware_enable)(void); |
40 | |||
41 | /* Disables the remapping hardware */ | ||
42 | void (*hardware_disable)(void); | ||
43 | |||
44 | /* Reenables the remapping hardware */ | ||
45 | int (*hardware_reenable)(int); | ||
46 | |||
47 | /* Enable fault handling */ | ||
48 | int (*enable_faulting)(void); | ||
40 | }; | 49 | }; |
41 | 50 | ||
42 | extern struct irq_remap_ops intel_irq_remap_ops; | 51 | extern struct irq_remap_ops intel_irq_remap_ops; |
diff --git a/include/linux/dmar.h b/include/linux/dmar.h index 6d66c9c76e0a..f2bd87f52a8d 100644 --- a/include/linux/dmar.h +++ b/include/linux/dmar.h | |||
@@ -115,9 +115,6 @@ struct irte { | |||
115 | }; | 115 | }; |
116 | 116 | ||
117 | #ifdef CONFIG_IRQ_REMAP | 117 | #ifdef CONFIG_IRQ_REMAP |
118 | extern void disable_intr_remapping(void); | ||
119 | extern int reenable_intr_remapping(int); | ||
120 | |||
121 | extern int get_irte(int irq, struct irte *entry); | 118 | extern int get_irte(int irq, struct irte *entry); |
122 | extern int modify_irte(int irq, struct irte *irte_modified); | 119 | extern int modify_irte(int irq, struct irte *irte_modified); |
123 | extern int alloc_irte(struct intel_iommu *iommu, int irq, u16 count); | 120 | extern int alloc_irte(struct intel_iommu *iommu, int irq, u16 count); |
@@ -179,21 +176,6 @@ static inline int set_msi_sid(struct irte *irte, struct pci_dev *dev) | |||
179 | return 0; | 176 | return 0; |
180 | } | 177 | } |
181 | 178 | ||
182 | #define intr_remapping_enabled (0) | ||
183 | |||
184 | static inline int enable_intr_remapping(void) | ||
185 | { | ||
186 | return -1; | ||
187 | } | ||
188 | |||
189 | static inline void disable_intr_remapping(void) | ||
190 | { | ||
191 | } | ||
192 | |||
193 | static inline int reenable_intr_remapping(int eim) | ||
194 | { | ||
195 | return 0; | ||
196 | } | ||
197 | #endif | 179 | #endif |
198 | 180 | ||
199 | enum { | 181 | enum { |