Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d1423d56 authored by Chris Wright's avatar Chris Wright Committed by David Woodhouse
Browse files

intr-remap: allow disabling source id checking



Allow disabling the source id checking while programming the interrupt
remap table entry. Useful for debugging or working around the broken
source id checks on some platforms.

Signed-off-by: default avatarChris Wright <chrisw@redhat.com>
Acked-by: default avatarSuresh Siddha <suresh.b.siddha@intel.com>
Acked-by: default avatarWeidong Han <weidong.han@intel.com>
Signed-off-by: default avatarDavid Woodhouse <David.Woodhouse@intel.com>
parent 9fe6206f
Loading
Loading
Loading
Loading
+7 −0
Original line number Original line Diff line number Diff line
@@ -1028,6 +1028,12 @@ and is between 256 and 4096 characters. It is defined in the file
			result in a hardware IOTLB flush operation as opposed
			result in a hardware IOTLB flush operation as opposed
			to batching them for performance.
			to batching them for performance.


	intremap=	[X86-64, Intel-IOMMU]
			Format: { on (default) | off | nosid }
			on	enable Interrupt Remapping (default)
			off	disable Interrupt Remapping
			nosid	disable Source ID checking

	inttest=	[IA64]
	inttest=	[IA64]


	iomem=		Disable strict checking of access to MMIO memory
	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


	nointremap	[X86-64, Intel-IOMMU] Do not enable interrupt
	nointremap	[X86-64, Intel-IOMMU] Do not enable interrupt
			remapping.
			remapping.
			[Deprecated - use intremap=off]


	nointroute	[IA-64]
	nointroute	[IA-64]


+20 −0
Original line number Original line Diff line number Diff line
@@ -21,6 +21,8 @@ static int ir_ioapic_num, ir_hpet_num;
int intr_remapping_enabled;
int intr_remapping_enabled;


static int disable_intremap;
static int disable_intremap;
static int disable_sourceid_checking;

static __init int setup_nointremap(char *str)
static __init int setup_nointremap(char *str)
{
{
	disable_intremap = 1;
	disable_intremap = 1;
@@ -28,6 +30,22 @@ static __init int setup_nointremap(char *str)
}
}
early_param("nointremap", setup_nointremap);
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 irq_2_iommu {
	struct intel_iommu *iommu;
	struct intel_iommu *iommu;
	u16 irte_index;
	u16 irte_index;
@@ -453,6 +471,8 @@ int free_irte(int irq)
static void set_irte_sid(struct irte *irte, unsigned int svt,
static void set_irte_sid(struct irte *irte, unsigned int svt,
			 unsigned int sq, unsigned int sid)
			 unsigned int sq, unsigned int sid)
{
{
	if (disable_sourceid_checking)
		svt = SVT_NO_VERIFY;
	irte->svt = svt;
	irte->svt = svt;
	irte->sq = sq;
	irte->sq = sq;
	irte->sid = sid;
	irte->sid = sid;