aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/kernel-parameters.txt7
-rw-r--r--drivers/pci/intr_remapping.c20
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;
21int intr_remapping_enabled; 21int intr_remapping_enabled;
22 22
23static int disable_intremap; 23static int disable_intremap;
24static int disable_sourceid_checking;
25
24static __init int setup_nointremap(char *str) 26static __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}
29early_param("nointremap", setup_nointremap); 31early_param("nointremap", setup_nointremap);
30 32
33static __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}
47early_param("intremap", setup_intremap);
48
31struct irq_2_iommu { 49struct 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)
453static void set_irte_sid(struct irte *irte, unsigned int svt, 471static 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;