diff options
author | Joerg Roedel <joerg.roedel@amd.com> | 2012-03-30 14:47:00 -0400 |
---|---|---|
committer | Joerg Roedel <joerg.roedel@amd.com> | 2012-05-07 08:34:59 -0400 |
commit | 736baef4472d00574089f295bc759ac002b9558c (patch) | |
tree | d4c9c69b1a0eecd6d87b3378a27396384e4b08f0 /drivers/iommu/intr_remapping.c | |
parent | eef93fdb7cd41ae36794db0e765059dc1039e940 (diff) |
iommu/vt-d: Make intr-remapping initialization generic
This patch introduces irq_remap_ops to hold implementation
specific function pointer to handle interrupt remapping. As
the first part the initialization functions for VT-d are
converted to these ops.
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>
Diffstat (limited to 'drivers/iommu/intr_remapping.c')
-rw-r--r-- | drivers/iommu/intr_remapping.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/drivers/iommu/intr_remapping.c b/drivers/iommu/intr_remapping.c new file mode 100644 index 000000000000..670c69a80afd --- /dev/null +++ b/drivers/iommu/intr_remapping.c | |||
@@ -0,0 +1,76 @@ | |||
1 | #include <linux/kernel.h> | ||
2 | #include <linux/string.h> | ||
3 | #include <linux/errno.h> | ||
4 | |||
5 | #include "intr_remapping.h" | ||
6 | |||
7 | int intr_remapping_enabled; | ||
8 | |||
9 | int disable_intremap; | ||
10 | int disable_sourceid_checking; | ||
11 | int no_x2apic_optout; | ||
12 | |||
13 | static struct irq_remap_ops *remap_ops; | ||
14 | |||
15 | static __init int setup_nointremap(char *str) | ||
16 | { | ||
17 | disable_intremap = 1; | ||
18 | return 0; | ||
19 | } | ||
20 | early_param("nointremap", setup_nointremap); | ||
21 | |||
22 | static __init int setup_intremap(char *str) | ||
23 | { | ||
24 | if (!str) | ||
25 | return -EINVAL; | ||
26 | |||
27 | while (*str) { | ||
28 | if (!strncmp(str, "on", 2)) | ||
29 | disable_intremap = 0; | ||
30 | else if (!strncmp(str, "off", 3)) | ||
31 | disable_intremap = 1; | ||
32 | else if (!strncmp(str, "nosid", 5)) | ||
33 | disable_sourceid_checking = 1; | ||
34 | else if (!strncmp(str, "no_x2apic_optout", 16)) | ||
35 | no_x2apic_optout = 1; | ||
36 | |||
37 | str += strcspn(str, ","); | ||
38 | while (*str == ',') | ||
39 | str++; | ||
40 | } | ||
41 | |||
42 | return 0; | ||
43 | } | ||
44 | early_param("intremap", setup_intremap); | ||
45 | |||
46 | void __init setup_intr_remapping(void) | ||
47 | { | ||
48 | remap_ops = &intel_irq_remap_ops; | ||
49 | } | ||
50 | |||
51 | int intr_remapping_supported(void) | ||
52 | { | ||
53 | if (disable_intremap) | ||
54 | return 0; | ||
55 | |||
56 | if (!remap_ops || !remap_ops->supported) | ||
57 | return 0; | ||
58 | |||
59 | return remap_ops->supported(); | ||
60 | } | ||
61 | |||
62 | int __init intr_hardware_init(void) | ||
63 | { | ||
64 | if (!remap_ops || !remap_ops->hardware_init) | ||
65 | return -ENODEV; | ||
66 | |||
67 | return remap_ops->hardware_init(); | ||
68 | } | ||
69 | |||
70 | int __init intr_hardware_enable(void) | ||
71 | { | ||
72 | if (!remap_ops || !remap_ops->hardware_enable) | ||
73 | return -ENODEV; | ||
74 | |||
75 | return remap_ops->hardware_enable(); | ||
76 | } | ||