diff options
author | Yu Zhao <yu.zhao@intel.com> | 2009-01-04 16:28:52 +0800 |
---|---|---|
committer | David Woodhouse <David.Woodhouse@intel.com> | 2009-02-09 11:03:17 +0000 |
commit | 704126ad81b8cb7d3d70adb9ecb143f4d3fb38af (patch) | |
tree | e73c4d595799661757b7505cd67833addef0635e /include | |
parent | 43f7392ba9e2585bf34f21399b1ed78692b5d437 (diff) | |
download | kernel_samsung_smdk4412-704126ad81b8cb7d3d70adb9ecb143f4d3fb38af.zip kernel_samsung_smdk4412-704126ad81b8cb7d3d70adb9ecb143f4d3fb38af.tar.gz kernel_samsung_smdk4412-704126ad81b8cb7d3d70adb9ecb143f4d3fb38af.tar.bz2 |
VT-d: handle Invalidation Queue Error to avoid system hang
When hardware detects any error with a descriptor from the invalidation
queue, it stops fetching new descriptors from the queue until software
clears the Invalidation Queue Error bit in the Fault Status register.
Following fix handles the IQE so the kernel won't be trapped in an
infinite loop.
Signed-off-by: Yu Zhao <yu.zhao@intel.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/intel-iommu.h | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/include/linux/intel-iommu.h b/include/linux/intel-iommu.h index c4f6c10..d2e3cbf 100644 --- a/include/linux/intel-iommu.h +++ b/include/linux/intel-iommu.h @@ -194,6 +194,7 @@ static inline void dmar_writeq(void __iomem *addr, u64 val) /* FSTS_REG */ #define DMA_FSTS_PPF ((u32)2) #define DMA_FSTS_PFO ((u32)1) +#define DMA_FSTS_IQE (1 << 4) #define dma_fsts_fault_record_index(s) (((s) >> 8) & 0xff) /* FRCD_REG, 32 bits access */ @@ -328,7 +329,7 @@ extern int qi_flush_iotlb(struct intel_iommu *iommu, u16 did, u64 addr, unsigned int size_order, u64 type, int non_present_entry_flush); -extern void qi_submit_sync(struct qi_desc *desc, struct intel_iommu *iommu); +extern int qi_submit_sync(struct qi_desc *desc, struct intel_iommu *iommu); extern void *intel_alloc_coherent(struct device *, size_t, dma_addr_t *, gfp_t); extern void intel_free_coherent(struct device *, size_t, void *, dma_addr_t); |