diff options
-rw-r--r-- | Documentation/kernel-parameters.txt | 7 | ||||
-rw-r--r-- | drivers/pci/intr_remapping.c | 20 |
2 files changed, 27 insertions, 0 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 2b2407d9a6d0..0afdd284d656 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
@@ -1028,6 +1028,12 @@ and is between 256 and 4096 characters. It is defined in the file | |||
1028 | result in a hardware IOTLB flush operation as opposed | 1028 | result in a hardware IOTLB flush operation as opposed |
1029 | to batching them for performance. | 1029 | to batching them for performance. |
1030 | 1030 | ||
1031 | intremap= [X86-64, Intel-IOMMU] | ||
1032 | Format: { on (default) | off | nosid } | ||
1033 | on enable Interrupt Remapping (default) | ||
1034 | off disable Interrupt Remapping | ||
1035 | nosid disable Source ID checking | ||
1036 | |||
1031 | inttest= [IA64] | 1037 | inttest= [IA64] |
1032 | 1038 | ||
1033 | iomem= Disable strict checking of access to MMIO memory | 1039 | iomem= Disable strict checking of access to MMIO memory |
@@ -1755,6 +1761,7 @@ and is between 256 and 4096 characters. It is defined in the file | |||
1755 | 1761 | ||
1756 | nointremap [X86-64, Intel-IOMMU] Do not enable interrupt | 1762 | nointremap [X86-64, Intel-IOMMU] Do not enable interrupt |
1757 | remapping. | 1763 | remapping. |
1764 | [Deprecated - use intremap=off] | ||
1758 | 1765 | ||
1759 | nointroute [IA-64] | 1766 | nointroute [IA-64] |
1760 | 1767 | ||
diff --git a/drivers/pci/intr_remapping.c b/drivers/pci/intr_remapping.c index 1315ac688aa2..45478ef7dd74 100644 --- a/drivers/pci/intr_remapping.c +++ b/drivers/pci/intr_remapping.c | |||
@@ -21,6 +21,8 @@ static int ir_ioapic_num, ir_hpet_num; | |||
21 | int intr_remapping_enabled; | 21 | int intr_remapping_enabled; |
22 | 22 | ||
23 | static int disable_intremap; | 23 | static int disable_intremap; |
24 | static int disable_sourceid_checking; | ||
25 | |||
24 | static __init int setup_nointremap(char *str) | 26 | static __init int setup_nointremap(char *str) |
25 | { | 27 | { |
26 | disable_intremap = 1; | 28 | disable_intremap = 1; |
@@ -28,6 +30,22 @@ static __init int setup_nointremap(char *str) | |||
28 | } | 30 | } |
29 | early_param("nointremap", setup_nointremap); | 31 | early_param("nointremap", setup_nointremap); |
30 | 32 | ||
33 | static __init int setup_intremap(char *str) | ||
34 | { | ||
35 | if (!str) | ||
36 | return -EINVAL; | ||
37 | |||
38 | if (!strncmp(str, "on", 2)) | ||
39 | disable_intremap = 0; | ||
40 | else if (!strncmp(str, "off", 3)) | ||
41 | disable_intremap = 1; | ||
42 | else if (!strncmp(str, "nosid", 5)) | ||
43 | disable_sourceid_checking = 1; | ||
44 | |||
45 | return 0; | ||
46 | } | ||
47 | early_param("intremap", setup_intremap); | ||
48 | |||
31 | struct irq_2_iommu { | 49 | struct irq_2_iommu { |
32 | struct intel_iommu *iommu; | 50 | struct intel_iommu *iommu; |
33 | u16 irte_index; | 51 | u16 irte_index; |
@@ -453,6 +471,8 @@ int free_irte(int irq) | |||
453 | static void set_irte_sid(struct irte *irte, unsigned int svt, | 471 | static void set_irte_sid(struct irte *irte, unsigned int svt, |
454 | unsigned int sq, unsigned int sid) | 472 | unsigned int sq, unsigned int sid) |
455 | { | 473 | { |
474 | if (disable_sourceid_checking) | ||
475 | svt = SVT_NO_VERIFY; | ||
456 | irte->svt = svt; | 476 | irte->svt = svt; |
457 | irte->sq = sq; | 477 | irte->sq = sq; |
458 | irte->sid = sid; | 478 | irte->sid = sid; |