aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoerg Roedel <joerg.roedel@amd.com>2012-03-30 14:47:01 -0400
committerJoerg Roedel <joerg.roedel@amd.com>2012-05-07 08:34:59 -0400
commit4f3d8b67ad3090f9fb72f8235d21cde53cd24b79 (patch)
treec6408bbae796a1aec8c0d8ef735ee2f159358e2c
parent736baef4472d00574089f295bc759ac002b9558c (diff)
iommu/vt-d: Convert missing apic.c intr-remapping call to remap_ops
Convert these calls too: * Disable of remapping hardware * Reenable of remapping hardware * Enable fault handling With that all of arch/x86/kernel/apic/apic.c is converted to use the generic intr-remapping interface. Signed-off-by: Joerg Roedel <joerg.roedel@amd.com> Acked-by: Yinghai Lu <yinghai@kernel.org> Cc: David Woodhouse <dwmw2@infradead.org> Cc: Alex Williamson <alex.williamson@redhat.com> Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com> Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
-rw-r--r--arch/x86/include/asm/intr_remapping.h6
-rw-r--r--arch/x86/kernel/apic/apic.c6
-rw-r--r--drivers/iommu/intel_intr_remapping.c7
-rw-r--r--drivers/iommu/intr_remapping.c24
-rw-r--r--drivers/iommu/intr_remapping.h9
-rw-r--r--include/linux/dmar.h18
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 207c605dbdf..55aa892a53e 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);
30extern int intr_remapping_supported(void); 30extern int intr_remapping_supported(void);
31extern int intr_hardware_init(void); 31extern int intr_hardware_init(void);
32extern int intr_hardware_enable(void); 32extern int intr_hardware_enable(void);
33extern void intr_hardware_disable(void);
34extern int intr_hardware_reenable(int);
35extern 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) { }
39static inline int intr_remapping_supported(void) { return 0; } 42static inline int intr_remapping_supported(void) { return 0; }
40static inline int intr_hardware_init(void) { return -ENODEV; } 43static inline int intr_hardware_init(void) { return -ENODEV; }
41static inline int intr_hardware_enable(void) { return -ENODEV; } 44static inline int intr_hardware_enable(void) { return -ENODEV; }
45static inline void intr_hardware_disable(void) { }
46static inline int intr_hardware_reenable(int eim) { return -ENODEV; }
47static 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 1db6f63a22f..a2762687e2e 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 9c742fb111b..610b75b66c0 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}
765rootfs_initcall(ir_dev_scope_init); 765rootfs_initcall(ir_dev_scope_init);
766 766
767void disable_intr_remapping(void) 767static 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
783int reenable_intr_remapping(int eim) 783static 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 670c69a80af..9aabed7c032 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
78void intr_hardware_disable(void)
79{
80 if (!remap_ops || !remap_ops->hardware_disable)
81 return;
82
83 remap_ops->hardware_disable();
84}
85
86int 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
94int __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 d6df732e001..2744c9ae4ae 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
42extern struct irq_remap_ops intel_irq_remap_ops; 51extern struct irq_remap_ops intel_irq_remap_ops;
diff --git a/include/linux/dmar.h b/include/linux/dmar.h
index 6d66c9c76e0..f2bd87f52a8 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
118extern void disable_intr_remapping(void);
119extern int reenable_intr_remapping(int);
120
121extern int get_irte(int irq, struct irte *entry); 118extern int get_irte(int irq, struct irte *entry);
122extern int modify_irte(int irq, struct irte *irte_modified); 119extern int modify_irte(int irq, struct irte *irte_modified);
123extern int alloc_irte(struct intel_iommu *iommu, int irq, u16 count); 120extern 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
184static inline int enable_intr_remapping(void)
185{
186 return -1;
187}
188
189static inline void disable_intr_remapping(void)
190{
191}
192
193static inline int reenable_intr_remapping(int eim)
194{
195 return 0;
196}
197#endif 179#endif
198 180
199enum { 181enum {