|
@@ -21,6 +21,8 @@ static int ir_ioapic_num, ir_hpet_num;
|
|
|
int intr_remapping_enabled;
|
|
|
|
|
|
static int disable_intremap;
|
|
|
+static int disable_sourceid_checking;
|
|
|
+
|
|
|
static __init int setup_nointremap(char *str)
|
|
|
{
|
|
|
disable_intremap = 1;
|
|
@@ -28,6 +30,22 @@ static __init int setup_nointremap(char *str)
|
|
|
}
|
|
|
early_param("nointremap", setup_nointremap);
|
|
|
|
|
|
+static __init int setup_intremap(char *str)
|
|
|
+{
|
|
|
+ if (!str)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ if (!strncmp(str, "on", 2))
|
|
|
+ disable_intremap = 0;
|
|
|
+ else if (!strncmp(str, "off", 3))
|
|
|
+ disable_intremap = 1;
|
|
|
+ else if (!strncmp(str, "nosid", 5))
|
|
|
+ disable_sourceid_checking = 1;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+early_param("intremap", setup_intremap);
|
|
|
+
|
|
|
struct irq_2_iommu {
|
|
|
struct intel_iommu *iommu;
|
|
|
u16 irte_index;
|
|
@@ -453,6 +471,8 @@ int free_irte(int irq)
|
|
|
static void set_irte_sid(struct irte *irte, unsigned int svt,
|
|
|
unsigned int sq, unsigned int sid)
|
|
|
{
|
|
|
+ if (disable_sourceid_checking)
|
|
|
+ svt = SVT_NO_VERIFY;
|
|
|
irte->svt = svt;
|
|
|
irte->sq = sq;
|
|
|
irte->sid = sid;
|