aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/intel-iommu.h
diff options
context:
space:
mode:
authorYu Zhao <yu.zhao@intel.com>2009-05-18 01:51:35 -0400
committerDavid Woodhouse <David.Woodhouse@intel.com>2009-05-18 09:45:13 -0400
commit6ba6c3a4cacfd68bf970e3e04e2ff0d66fa0f695 (patch)
tree02afc5c010ec841f7e6ad9fc68e8a76f7f18909a /include/linux/intel-iommu.h
parentaa5d2b515b6fca5f8a56eac84f7fa0a68c1ce9b7 (diff)
VT-d: add device IOTLB invalidation support
Support device IOTLB invalidation to flush the translation cached in the Endpoint. Signed-off-by: Yu Zhao <yu.zhao@intel.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'include/linux/intel-iommu.h')
-rw-r--r--include/linux/intel-iommu.h14
1 files changed, 13 insertions, 1 deletions
diff --git a/include/linux/intel-iommu.h b/include/linux/intel-iommu.h
index 0a1939f200fc..40561b224a17 100644
--- a/include/linux/intel-iommu.h
+++ b/include/linux/intel-iommu.h
@@ -53,6 +53,7 @@
53#define DMAR_PHMLIMIT_REG 0x78 /* pmrr high limit */ 53#define DMAR_PHMLIMIT_REG 0x78 /* pmrr high limit */
54#define DMAR_IQH_REG 0x80 /* Invalidation queue head register */ 54#define DMAR_IQH_REG 0x80 /* Invalidation queue head register */
55#define DMAR_IQT_REG 0x88 /* Invalidation queue tail register */ 55#define DMAR_IQT_REG 0x88 /* Invalidation queue tail register */
56#define DMAR_IQ_SHIFT 4 /* Invalidation queue head/tail shift */
56#define DMAR_IQA_REG 0x90 /* Invalidation queue addr register */ 57#define DMAR_IQA_REG 0x90 /* Invalidation queue addr register */
57#define DMAR_ICS_REG 0x98 /* Invalidation complete status register */ 58#define DMAR_ICS_REG 0x98 /* Invalidation complete status register */
58#define DMAR_IRTA_REG 0xb8 /* Interrupt remapping table addr register */ 59#define DMAR_IRTA_REG 0xb8 /* Interrupt remapping table addr register */
@@ -198,6 +199,8 @@ static inline void dmar_writeq(void __iomem *addr, u64 val)
198#define DMA_FSTS_PPF ((u32)2) 199#define DMA_FSTS_PPF ((u32)2)
199#define DMA_FSTS_PFO ((u32)1) 200#define DMA_FSTS_PFO ((u32)1)
200#define DMA_FSTS_IQE (1 << 4) 201#define DMA_FSTS_IQE (1 << 4)
202#define DMA_FSTS_ICE (1 << 5)
203#define DMA_FSTS_ITE (1 << 6)
201#define dma_fsts_fault_record_index(s) (((s) >> 8) & 0xff) 204#define dma_fsts_fault_record_index(s) (((s) >> 8) & 0xff)
202 205
203/* FRCD_REG, 32 bits access */ 206/* FRCD_REG, 32 bits access */
@@ -226,7 +229,8 @@ do { \
226enum { 229enum {
227 QI_FREE, 230 QI_FREE,
228 QI_IN_USE, 231 QI_IN_USE,
229 QI_DONE 232 QI_DONE,
233 QI_ABORT
230}; 234};
231 235
232#define QI_CC_TYPE 0x1 236#define QI_CC_TYPE 0x1
@@ -255,6 +259,12 @@ enum {
255#define QI_CC_DID(did) (((u64)did) << 16) 259#define QI_CC_DID(did) (((u64)did) << 16)
256#define QI_CC_GRAN(gran) (((u64)gran) >> (DMA_CCMD_INVL_GRANU_OFFSET-4)) 260#define QI_CC_GRAN(gran) (((u64)gran) >> (DMA_CCMD_INVL_GRANU_OFFSET-4))
257 261
262#define QI_DEV_IOTLB_SID(sid) ((u64)((sid) & 0xffff) << 32)
263#define QI_DEV_IOTLB_QDEP(qdep) (((qdep) & 0x1f) << 16)
264#define QI_DEV_IOTLB_ADDR(addr) ((u64)(addr) & VTD_PAGE_MASK)
265#define QI_DEV_IOTLB_SIZE 1
266#define QI_DEV_IOTLB_MAX_INVS 32
267
258struct qi_desc { 268struct qi_desc {
259 u64 low, high; 269 u64 low, high;
260}; 270};
@@ -344,6 +354,8 @@ extern void qi_flush_context(struct intel_iommu *iommu, u16 did, u16 sid,
344 u8 fm, u64 type); 354 u8 fm, u64 type);
345extern void qi_flush_iotlb(struct intel_iommu *iommu, u16 did, u64 addr, 355extern void qi_flush_iotlb(struct intel_iommu *iommu, u16 did, u64 addr,
346 unsigned int size_order, u64 type); 356 unsigned int size_order, u64 type);
357extern void qi_flush_dev_iotlb(struct intel_iommu *iommu, u16 sid, u16 qdep,
358 u64 addr, unsigned mask);
347 359
348extern int qi_submit_sync(struct qi_desc *desc, struct intel_iommu *iommu); 360extern int qi_submit_sync(struct qi_desc *desc, struct intel_iommu *iommu);
349 361