Merge git://git.infradead.org/iommu-2.6

* git://git.infradead.org/iommu-2.6:
  intel-iommu: Fix 32-bit build warning with __cmpxchg()
  intr-remap: allow disabling source id checking
This commit is contained in:
Linus Torvalds 2010-08-15 17:34:20 -07:00
Родитель 7355a5a654 1a8bd481bf
Коммит e2e96c6636
3 изменённых файлов: 28 добавлений и 1 удалений

Просмотреть файл

@ -981,6 +981,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
@ -1681,6 +1687,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]

Просмотреть файл

@ -236,7 +236,7 @@ static inline u64 dma_pte_addr(struct dma_pte *pte)
return pte->val & VTD_PAGE_MASK; return pte->val & VTD_PAGE_MASK;
#else #else
/* Must have a full atomic 64-bit read */ /* Must have a full atomic 64-bit read */
return __cmpxchg64(pte, 0ULL, 0ULL) & VTD_PAGE_MASK; return __cmpxchg64(&pte->val, 0ULL, 0ULL) & VTD_PAGE_MASK;
#endif #endif
} }

Просмотреть файл

@ -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;