Blame view

include/linux/intel-iommu.h 16.7 KB
ba3959276   Keshavamurthy, Anil S   Intel IOMMU: Inte...
1
  /*
2f26e0a9c   David Woodhouse   iommu/vt-d: Add b...
2
3
4
5
6
   * Copyright © 2006-2015, Intel Corporation.
   *
   * Authors: Ashok Raj <ashok.raj@intel.com>
   *          Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
   *          David Woodhouse <David.Woodhouse@intel.com>
ba3959276   Keshavamurthy, Anil S   Intel IOMMU: Inte...
7
8
9
10
11
12
13
14
15
16
17
18
19
   *
   * This program is free software; you can redistribute it and/or modify it
   * under the terms and conditions of the GNU General Public License,
   * version 2, as published by the Free Software Foundation.
   *
   * This program is distributed in the hope it will be useful, but WITHOUT
   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
   * more details.
   *
   * You should have received a copy of the GNU General Public License along with
   * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
   * Place - Suite 330, Boston, MA 02111-1307 USA.
ba3959276   Keshavamurthy, Anil S   Intel IOMMU: Inte...
20
21
22
23
24
25
   */
  
  #ifndef _INTEL_IOMMU_H_
  #define _INTEL_IOMMU_H_
  
  #include <linux/types.h>
387179464   Kay, Allen M   VT-d: Changes to ...
26
  #include <linux/iova.h>
ba3959276   Keshavamurthy, Anil S   Intel IOMMU: Inte...
27
  #include <linux/io.h>
2f26e0a9c   David Woodhouse   iommu/vt-d: Add b...
28
  #include <linux/idr.h>
387179464   Kay, Allen M   VT-d: Changes to ...
29
  #include <linux/dma_remapping.h>
2f26e0a9c   David Woodhouse   iommu/vt-d: Add b...
30
31
  #include <linux/mmu_notifier.h>
  #include <linux/list.h>
b0119e870   Joerg Roedel   iommu: Introduce ...
32
  #include <linux/iommu.h>
61012985e   Andy Shevchenko   iommu/vt-d: Use l...
33
  #include <linux/io-64-nonatomic-lo-hi.h>
fe962e90c   Suresh Siddha   x64, x2apic/intr-...
34
  #include <asm/cacheflush.h>
5b6985ce8   Fenghua Yu   intel-iommu: IA64...
35
  #include <asm/iommu.h>
f661197e0   David Miller   Genericizing iova...
36
37
  
  /*
ba3959276   Keshavamurthy, Anil S   Intel IOMMU: Inte...
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
   * Intel IOMMU register specification per version 1.0 public spec.
   */
  
  #define	DMAR_VER_REG	0x0	/* Arch version supported by this IOMMU */
  #define	DMAR_CAP_REG	0x8	/* Hardware supported capabilities */
  #define	DMAR_ECAP_REG	0x10	/* Extended capabilities supported */
  #define	DMAR_GCMD_REG	0x18	/* Global command register */
  #define	DMAR_GSTS_REG	0x1c	/* Global status register */
  #define	DMAR_RTADDR_REG	0x20	/* Root entry table */
  #define	DMAR_CCMD_REG	0x28	/* Context command reg */
  #define	DMAR_FSTS_REG	0x34	/* Fault Status register */
  #define	DMAR_FECTL_REG	0x38	/* Fault control register */
  #define	DMAR_FEDATA_REG	0x3c	/* Fault event interrupt data register */
  #define	DMAR_FEADDR_REG	0x40	/* Fault event interrupt addr register */
  #define	DMAR_FEUADDR_REG 0x44	/* Upper address register */
  #define	DMAR_AFLOG_REG	0x58	/* Advanced Fault control */
  #define	DMAR_PMEN_REG	0x64	/* Enable Protected Memory Region */
  #define	DMAR_PLMBASE_REG 0x68	/* PMRR Low addr */
  #define	DMAR_PLMLIMIT_REG 0x6c	/* PMRR low limit */
  #define	DMAR_PHMBASE_REG 0x70	/* pmrr high base addr */
  #define	DMAR_PHMLIMIT_REG 0x78	/* pmrr high limit */
fe962e90c   Suresh Siddha   x64, x2apic/intr-...
59
60
  #define DMAR_IQH_REG	0x80	/* Invalidation queue head register */
  #define DMAR_IQT_REG	0x88	/* Invalidation queue tail register */
6ba6c3a4c   Yu Zhao   VT-d: add device ...
61
  #define DMAR_IQ_SHIFT	4	/* Invalidation queue head/tail shift */
fe962e90c   Suresh Siddha   x64, x2apic/intr-...
62
  #define DMAR_IQA_REG	0x90	/* Invalidation queue addr register */
82aeef0bf   Li, Zhen-Hua   x86/iommu: correc...
63
  #define DMAR_ICS_REG	0x9c	/* Invalidation complete status register */
2ae210106   Suresh Siddha   x64, x2apic/intr-...
64
  #define DMAR_IRTA_REG	0xb8    /* Interrupt remapping table addr register */
1208225cf   David Woodhouse   iommu/vt-d: Gener...
65
66
67
68
69
70
71
72
  #define DMAR_PQH_REG	0xc0	/* Page request queue head register */
  #define DMAR_PQT_REG	0xc8	/* Page request queue tail register */
  #define DMAR_PQA_REG	0xd0	/* Page request queue address register */
  #define DMAR_PRS_REG	0xdc	/* Page request status register */
  #define DMAR_PECTL_REG	0xe0	/* Page request event control register */
  #define	DMAR_PEDATA_REG	0xe4	/* Page request event interrupt data register */
  #define	DMAR_PEADDR_REG	0xe8	/* Page request event interrupt addr register */
  #define	DMAR_PEUADDR_REG 0xec	/* Page request event Upper address register */
ba3959276   Keshavamurthy, Anil S   Intel IOMMU: Inte...
73
74
  
  #define OFFSET_STRIDE		(9)
50d3fb562   David Woodhouse   iommu/vt-d: Use p...
75

50d3fb562   David Woodhouse   iommu/vt-d: Use p...
76
77
  #define dmar_readq(a) readq(a)
  #define dmar_writeq(a,v) writeq(v,a)
ba3959276   Keshavamurthy, Anil S   Intel IOMMU: Inte...
78
79
80
81
82
83
84
  
  #define DMAR_VER_MAJOR(v)		(((v) & 0xf0) >> 4)
  #define DMAR_VER_MINOR(v)		((v) & 0x0f)
  
  /*
   * Decoding Capability Register
   */
07c09787b   Feng Wu   iommu, x86: Add c...
85
  #define cap_pi_support(c)	(((c) >> 59) & 1)
ba3959276   Keshavamurthy, Anil S   Intel IOMMU: Inte...
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
  #define cap_read_drain(c)	(((c) >> 55) & 1)
  #define cap_write_drain(c)	(((c) >> 54) & 1)
  #define cap_max_amask_val(c)	(((c) >> 48) & 0x3f)
  #define cap_num_fault_regs(c)	((((c) >> 40) & 0xff) + 1)
  #define cap_pgsel_inv(c)	(((c) >> 39) & 1)
  
  #define cap_super_page_val(c)	(((c) >> 34) & 0xf)
  #define cap_super_offset(c)	(((find_first_bit(&cap_super_page_val(c), 4)) \
  					* OFFSET_STRIDE) + 21)
  
  #define cap_fault_reg_offset(c)	((((c) >> 24) & 0x3ff) * 16)
  #define cap_max_fault_reg_offset(c) \
  	(cap_fault_reg_offset(c) + cap_num_fault_regs(c) * 16)
  
  #define cap_zlr(c)		(((c) >> 22) & 1)
  #define cap_isoch(c)		(((c) >> 23) & 1)
  #define cap_mgaw(c)		((((c) >> 16) & 0x3f) + 1)
  #define cap_sagaw(c)		(((c) >> 8) & 0x1f)
  #define cap_caching_mode(c)	(((c) >> 7) & 1)
  #define cap_phmr(c)		(((c) >> 6) & 1)
  #define cap_plmr(c)		(((c) >> 5) & 1)
  #define cap_rwbf(c)		(((c) >> 4) & 1)
  #define cap_afl(c)		(((c) >> 3) & 1)
  #define cap_ndoms(c)		(((unsigned long)1) << (4 + 2 * ((c) & 0x7)))
  /*
   * Extended Capability Register
   */
eb58c4046   Jacob Pan   iommu/vt-d: Add d...
113
  #define ecap_dit(e)		((e >> 41) & 0x1)
bd00c606a   David Woodhouse   iommu/vt-d: Chang...
114
  #define ecap_pasid(e)		((e >> 40) & 0x1)
4423f5e7d   David Woodhouse   iommu/vt-d: Add n...
115
116
117
118
119
120
  #define ecap_pss(e)		((e >> 35) & 0x1f)
  #define ecap_eafs(e)		((e >> 34) & 0x1)
  #define ecap_nwfs(e)		((e >> 33) & 0x1)
  #define ecap_srs(e)		((e >> 31) & 0x1)
  #define ecap_ers(e)		((e >> 30) & 0x1)
  #define ecap_prs(e)		((e >> 29) & 0x1)
ae853ddb9   David Woodhouse   iommu/vt-d: Intro...
121
  #define ecap_broken_pasid(e)	((e >> 28) & 0x1)
4423f5e7d   David Woodhouse   iommu/vt-d: Add n...
122
123
124
125
  #define ecap_dis(e)		((e >> 27) & 0x1)
  #define ecap_nest(e)		((e >> 26) & 0x1)
  #define ecap_mts(e)		((e >> 25) & 0x1)
  #define ecap_ecs(e)		((e >> 24) & 0x1)
ba3959276   Keshavamurthy, Anil S   Intel IOMMU: Inte...
126
  #define ecap_iotlb_offset(e) 	((((e) >> 8) & 0x3ff) * 16)
44caf2f37   David Woodhouse   iommu/vt-d: kill ...
127
  #define ecap_max_iotlb_offset(e) (ecap_iotlb_offset(e) + 16)
ba3959276   Keshavamurthy, Anil S   Intel IOMMU: Inte...
128
  #define ecap_coherent(e)	((e) & 0x1)
fe962e90c   Suresh Siddha   x64, x2apic/intr-...
129
  #define ecap_qis(e)		((e) & 0x2)
4ed0d3e6c   Fenghua Yu   Intel IOMMU Pass ...
130
  #define ecap_pass_through(e)	((e >> 6) & 0x1)
ad3ad3f6a   Suresh Siddha   x64, x2apic/intr-...
131
132
  #define ecap_eim_support(e)	((e >> 4) & 0x1)
  #define ecap_ir_support(e)	((e >> 3) & 0x1)
93a23a727   Yu Zhao   VT-d: support the...
133
  #define ecap_dev_iotlb_support(e)	(((e) >> 2) & 0x1)
b6fcb33ad   Suresh Siddha   x64, x2apic/intr-...
134
  #define ecap_max_handle_mask(e) ((e >> 20) & 0xf)
58c610bd1   Sheng Yang   intel-iommu: Snoo...
135
  #define ecap_sc_support(e)	((e >> 7) & 0x1) /* Snooping Control */
ba3959276   Keshavamurthy, Anil S   Intel IOMMU: Inte...
136
137
  
  /* IOTLB_REG */
3481f2109   Youquan Song   dmar: context cac...
138
  #define DMA_TLB_FLUSH_GRANU_OFFSET  60
ba3959276   Keshavamurthy, Anil S   Intel IOMMU: Inte...
139
140
141
  #define DMA_TLB_GLOBAL_FLUSH (((u64)1) << 60)
  #define DMA_TLB_DSI_FLUSH (((u64)2) << 60)
  #define DMA_TLB_PSI_FLUSH (((u64)3) << 60)
aaa59306b   CQ Tang   iommu/vt-d: Fix s...
142
143
  #define DMA_TLB_IIRG(type) ((type >> 60) & 3)
  #define DMA_TLB_IAIG(val) (((val) >> 57) & 3)
ba3959276   Keshavamurthy, Anil S   Intel IOMMU: Inte...
144
145
146
147
148
149
  #define DMA_TLB_READ_DRAIN (((u64)1) << 49)
  #define DMA_TLB_WRITE_DRAIN (((u64)1) << 48)
  #define DMA_TLB_DID(id)	(((u64)((id) & 0xffff)) << 32)
  #define DMA_TLB_IVT (((u64)1) << 63)
  #define DMA_TLB_IH_NONLEAF (((u64)1) << 6)
  #define DMA_TLB_MAX_SIZE (0x3f)
fe962e90c   Suresh Siddha   x64, x2apic/intr-...
150
  /* INVALID_DESC */
3481f2109   Youquan Song   dmar: context cac...
151
  #define DMA_CCMD_INVL_GRANU_OFFSET  61
aaa59306b   CQ Tang   iommu/vt-d: Fix s...
152
153
154
  #define DMA_ID_TLB_GLOBAL_FLUSH	(((u64)1) << 4)
  #define DMA_ID_TLB_DSI_FLUSH	(((u64)2) << 4)
  #define DMA_ID_TLB_PSI_FLUSH	(((u64)3) << 4)
fe962e90c   Suresh Siddha   x64, x2apic/intr-...
155
156
157
158
159
160
  #define DMA_ID_TLB_READ_DRAIN	(((u64)1) << 7)
  #define DMA_ID_TLB_WRITE_DRAIN	(((u64)1) << 6)
  #define DMA_ID_TLB_DID(id)	(((u64)((id & 0xffff) << 16)))
  #define DMA_ID_TLB_IH_NONLEAF	(((u64)1) << 6)
  #define DMA_ID_TLB_ADDR(addr)	(addr)
  #define DMA_ID_TLB_ADDR_MASK(mask)	(mask)
f8bab7351   mark gross   intel-iommu: PMEN...
161
162
163
  /* PMEN_REG */
  #define DMA_PMEN_EPM (((u32)1)<<31)
  #define DMA_PMEN_PRS (((u32)1)<<0)
ba3959276   Keshavamurthy, Anil S   Intel IOMMU: Inte...
164
165
166
167
168
169
  /* GCMD_REG */
  #define DMA_GCMD_TE (((u32)1) << 31)
  #define DMA_GCMD_SRTP (((u32)1) << 30)
  #define DMA_GCMD_SFL (((u32)1) << 29)
  #define DMA_GCMD_EAFL (((u32)1) << 28)
  #define DMA_GCMD_WBF (((u32)1) << 27)
2ae210106   Suresh Siddha   x64, x2apic/intr-...
170
171
172
  #define DMA_GCMD_QIE (((u32)1) << 26)
  #define DMA_GCMD_SIRTP (((u32)1) << 24)
  #define DMA_GCMD_IRE (((u32) 1) << 25)
161fde083   Han, Weidong   intel-iommu: set ...
173
  #define DMA_GCMD_CFI (((u32) 1) << 23)
ba3959276   Keshavamurthy, Anil S   Intel IOMMU: Inte...
174
175
176
177
178
179
180
  
  /* GSTS_REG */
  #define DMA_GSTS_TES (((u32)1) << 31)
  #define DMA_GSTS_RTPS (((u32)1) << 30)
  #define DMA_GSTS_FLS (((u32)1) << 29)
  #define DMA_GSTS_AFLS (((u32)1) << 28)
  #define DMA_GSTS_WBFS (((u32)1) << 27)
2ae210106   Suresh Siddha   x64, x2apic/intr-...
181
182
183
  #define DMA_GSTS_QIES (((u32)1) << 26)
  #define DMA_GSTS_IRTPS (((u32)1) << 24)
  #define DMA_GSTS_IRES (((u32)1) << 25)
161fde083   Han, Weidong   intel-iommu: set ...
184
  #define DMA_GSTS_CFIS (((u32)1) << 23)
ba3959276   Keshavamurthy, Anil S   Intel IOMMU: Inte...
185

4423f5e7d   David Woodhouse   iommu/vt-d: Add n...
186
187
  /* DMA_RTADDR_REG */
  #define DMA_RTADDR_RTT (((u64)1) << 11)
ba3959276   Keshavamurthy, Anil S   Intel IOMMU: Inte...
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
  /* CCMD_REG */
  #define DMA_CCMD_ICC (((u64)1) << 63)
  #define DMA_CCMD_GLOBAL_INVL (((u64)1) << 61)
  #define DMA_CCMD_DOMAIN_INVL (((u64)2) << 61)
  #define DMA_CCMD_DEVICE_INVL (((u64)3) << 61)
  #define DMA_CCMD_FM(m) (((u64)((m) & 0x3)) << 32)
  #define DMA_CCMD_MASK_NOBIT 0
  #define DMA_CCMD_MASK_1BIT 1
  #define DMA_CCMD_MASK_2BIT 2
  #define DMA_CCMD_MASK_3BIT 3
  #define DMA_CCMD_SID(s) (((u64)((s) & 0xffff)) << 16)
  #define DMA_CCMD_DID(d) ((u64)((d) & 0xffff))
  
  /* FECTL_REG */
  #define DMA_FECTL_IM (((u32)1) << 31)
  
  /* FSTS_REG */
  #define DMA_FSTS_PPF ((u32)2)
  #define DMA_FSTS_PFO ((u32)1)
704126ad8   Yu Zhao   VT-d: handle Inva...
207
  #define DMA_FSTS_IQE (1 << 4)
6ba6c3a4c   Yu Zhao   VT-d: add device ...
208
209
  #define DMA_FSTS_ICE (1 << 5)
  #define DMA_FSTS_ITE (1 << 6)
ba3959276   Keshavamurthy, Anil S   Intel IOMMU: Inte...
210
211
212
213
214
215
216
  #define dma_fsts_fault_record_index(s) (((s) >> 8) & 0xff)
  
  /* FRCD_REG, 32 bits access */
  #define DMA_FRCD_F (((u32)1) << 31)
  #define dma_frcd_type(d) ((d >> 30) & 1)
  #define dma_frcd_fault_reason(c) (c & 0xff)
  #define dma_frcd_source_id(c) (c & 0xffff)
5b6985ce8   Fenghua Yu   intel-iommu: IA64...
217
218
  /* low 64 bit */
  #define dma_frcd_page_addr(d) (d & (((u64)-1) << PAGE_SHIFT))
469240082   David Woodhouse   iommu/vt-d: Clear...
219
220
  /* PRS_REG */
  #define DMA_PRS_PPR	((u32)1)
5b6985ce8   Fenghua Yu   intel-iommu: IA64...
221
222
223
224
225
226
227
  #define IOMMU_WAIT_OP(iommu, offset, op, cond, sts)			\
  do {									\
  	cycles_t start_time = get_cycles();				\
  	while (1) {							\
  		sts = op(iommu->reg + offset);				\
  		if (cond)						\
  			break;						\
cf1337f04   Suresh Siddha   x64, x2apic/intr-...
228
  		if (DMAR_OPERATION_TIMEOUT < (get_cycles() - start_time))\
5b6985ce8   Fenghua Yu   intel-iommu: IA64...
229
230
231
232
233
  			panic("DMAR hardware is malfunctioning
  ");	\
  		cpu_relax();						\
  	}								\
  } while (0)
cf1337f04   Suresh Siddha   x64, x2apic/intr-...
234

fe962e90c   Suresh Siddha   x64, x2apic/intr-...
235
236
237
238
239
  #define QI_LENGTH	256	/* queue length */
  
  enum {
  	QI_FREE,
  	QI_IN_USE,
6ba6c3a4c   Yu Zhao   VT-d: add device ...
240
241
  	QI_DONE,
  	QI_ABORT
fe962e90c   Suresh Siddha   x64, x2apic/intr-...
242
243
244
245
246
247
248
  };
  
  #define QI_CC_TYPE		0x1
  #define QI_IOTLB_TYPE		0x2
  #define QI_DIOTLB_TYPE		0x3
  #define QI_IEC_TYPE		0x4
  #define QI_IWD_TYPE		0x5
2f26e0a9c   David Woodhouse   iommu/vt-d: Add b...
249
250
251
  #define QI_EIOTLB_TYPE		0x6
  #define QI_PC_TYPE		0x7
  #define QI_DEIOTLB_TYPE		0x8
a222a7f0b   David Woodhouse   iommu/vt-d: Imple...
252
253
  #define QI_PGRP_RESP_TYPE	0x9
  #define QI_PSTRM_RESP_TYPE	0xa
fe962e90c   Suresh Siddha   x64, x2apic/intr-...
254
255
256
257
258
259
260
  
  #define QI_IEC_SELECTIVE	(((u64)1) << 4)
  #define QI_IEC_IIDEX(idx)	(((u64)(idx & 0xffff) << 32))
  #define QI_IEC_IM(m)		(((u64)(m & 0x1f) << 27))
  
  #define QI_IWD_STATUS_DATA(d)	(((u64)d) << 32)
  #define QI_IWD_STATUS_WRITE	(((u64)1) << 5)
3481f2109   Youquan Song   dmar: context cac...
261
262
263
264
  #define QI_IOTLB_DID(did) 	(((u64)did) << 16)
  #define QI_IOTLB_DR(dr) 	(((u64)dr) << 7)
  #define QI_IOTLB_DW(dw) 	(((u64)dw) << 6)
  #define QI_IOTLB_GRAN(gran) 	(((u64)gran) >> (DMA_TLB_FLUSH_GRANU_OFFSET-4))
5b6985ce8   Fenghua Yu   intel-iommu: IA64...
265
  #define QI_IOTLB_ADDR(addr)	(((u64)addr) & VTD_PAGE_MASK)
3481f2109   Youquan Song   dmar: context cac...
266
267
268
269
270
271
272
  #define QI_IOTLB_IH(ih)		(((u64)ih) << 6)
  #define QI_IOTLB_AM(am)		(((u8)am))
  
  #define QI_CC_FM(fm)		(((u64)fm) << 48)
  #define QI_CC_SID(sid)		(((u64)sid) << 32)
  #define QI_CC_DID(did)		(((u64)did) << 16)
  #define QI_CC_GRAN(gran)	(((u64)gran) >> (DMA_CCMD_INVL_GRANU_OFFSET-4))
6ba6c3a4c   Yu Zhao   VT-d: add device ...
273
274
275
  #define QI_DEV_IOTLB_SID(sid)	((u64)((sid) & 0xffff) << 32)
  #define QI_DEV_IOTLB_QDEP(qdep)	(((qdep) & 0x1f) << 16)
  #define QI_DEV_IOTLB_ADDR(addr)	((u64)(addr) & VTD_PAGE_MASK)
eb58c4046   Jacob Pan   iommu/vt-d: Add d...
276
  #define QI_DEV_IOTLB_PFSID(pfsid) (((u64)(pfsid & 0xf) << 12) | ((u64)(pfsid & 0xfff) << 52))
6ba6c3a4c   Yu Zhao   VT-d: add device ...
277
278
  #define QI_DEV_IOTLB_SIZE	1
  #define QI_DEV_IOTLB_MAX_INVS	32
2f26e0a9c   David Woodhouse   iommu/vt-d: Add b...
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
  #define QI_PC_PASID(pasid)	(((u64)pasid) << 32)
  #define QI_PC_DID(did)		(((u64)did) << 16)
  #define QI_PC_GRAN(gran)	(((u64)gran) << 4)
  
  #define QI_PC_ALL_PASIDS	(QI_PC_TYPE | QI_PC_GRAN(0))
  #define QI_PC_PASID_SEL		(QI_PC_TYPE | QI_PC_GRAN(1))
  
  #define QI_EIOTLB_ADDR(addr)	((u64)(addr) & VTD_PAGE_MASK)
  #define QI_EIOTLB_GL(gl)	(((u64)gl) << 7)
  #define QI_EIOTLB_IH(ih)	(((u64)ih) << 6)
  #define QI_EIOTLB_AM(am)	(((u64)am))
  #define QI_EIOTLB_PASID(pasid) 	(((u64)pasid) << 32)
  #define QI_EIOTLB_DID(did)	(((u64)did) << 16)
  #define QI_EIOTLB_GRAN(gran) 	(((u64)gran) << 4)
  
  #define QI_DEV_EIOTLB_ADDR(a)	((u64)(a) & VTD_PAGE_MASK)
  #define QI_DEV_EIOTLB_SIZE	(((u64)1) << 11)
  #define QI_DEV_EIOTLB_GLOB(g)	((u64)g)
  #define QI_DEV_EIOTLB_PASID(p)	(((u64)p) << 32)
aaa59306b   CQ Tang   iommu/vt-d: Fix s...
298
299
  #define QI_DEV_EIOTLB_SID(sid)	((u64)((sid) & 0xffff) << 16)
  #define QI_DEV_EIOTLB_QDEP(qd)	((u64)((qd) & 0x1f) << 4)
eb58c4046   Jacob Pan   iommu/vt-d: Add d...
300
  #define QI_DEV_EIOTLB_PFSID(pfsid) (((u64)(pfsid & 0xf) << 12) | ((u64)(pfsid & 0xfff) << 52))
2f26e0a9c   David Woodhouse   iommu/vt-d: Add b...
301
  #define QI_DEV_EIOTLB_MAX_INVS	32
a222a7f0b   David Woodhouse   iommu/vt-d: Imple...
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
  #define QI_PGRP_IDX(idx)	(((u64)(idx)) << 55)
  #define QI_PGRP_PRIV(priv)	(((u64)(priv)) << 32)
  #define QI_PGRP_RESP_CODE(res)	((u64)(res))
  #define QI_PGRP_PASID(pasid)	(((u64)(pasid)) << 32)
  #define QI_PGRP_DID(did)	(((u64)(did)) << 16)
  #define QI_PGRP_PASID_P(p)	(((u64)(p)) << 4)
  
  #define QI_PSTRM_ADDR(addr)	(((u64)(addr)) & VTD_PAGE_MASK)
  #define QI_PSTRM_DEVFN(devfn)	(((u64)(devfn)) << 4)
  #define QI_PSTRM_RESP_CODE(res)	((u64)(res))
  #define QI_PSTRM_IDX(idx)	(((u64)(idx)) << 55)
  #define QI_PSTRM_PRIV(priv)	(((u64)(priv)) << 32)
  #define QI_PSTRM_BUS(bus)	(((u64)(bus)) << 24)
  #define QI_PSTRM_PASID(pasid)	(((u64)(pasid)) << 4)
  
  #define QI_RESP_SUCCESS		0x0
  #define QI_RESP_INVALID		0x1
  #define QI_RESP_FAILURE		0xf
2f26e0a9c   David Woodhouse   iommu/vt-d: Add b...
320
321
322
323
  #define QI_GRAN_ALL_ALL			0
  #define QI_GRAN_NONG_ALL		1
  #define QI_GRAN_NONG_PASID		2
  #define QI_GRAN_PSI_PASID		3
fe962e90c   Suresh Siddha   x64, x2apic/intr-...
324
325
326
327
328
  struct qi_desc {
  	u64 low, high;
  };
  
  struct q_inval {
3b8f40481   Thomas Gleixner   locking, x86, iom...
329
  	raw_spinlock_t  q_lock;
fe962e90c   Suresh Siddha   x64, x2apic/intr-...
330
331
332
333
334
335
  	struct qi_desc  *desc;          /* invalidation queue */
  	int             *desc_status;   /* desc status */
  	int             free_head;      /* first free entry */
  	int             free_tail;      /* last free entry */
  	int             free_cnt;
  };
d3f138106   Suresh Siddha   iommu: Rename the...
336
  #ifdef CONFIG_IRQ_REMAP
2ae210106   Suresh Siddha   x64, x2apic/intr-...
337
338
339
  /* 1MB - maximum possible interrupt remapping table size */
  #define INTR_REMAP_PAGE_ORDER	8
  #define INTR_REMAP_TABLE_REG_SIZE	0xf
af3b358e4   Joerg Roedel   iommu/vt-d: Copy ...
340
  #define INTR_REMAP_TABLE_REG_SIZE_MASK  0xf
2ae210106   Suresh Siddha   x64, x2apic/intr-...
341

b6fcb33ad   Suresh Siddha   x64, x2apic/intr-...
342
  #define INTR_REMAP_TABLE_ENTRIES	65536
b106ee63a   Jiang Liu   irq_remapping/vt-...
343
  struct irq_domain;
2ae210106   Suresh Siddha   x64, x2apic/intr-...
344
345
  struct ir_table {
  	struct irte *base;
360eb3c56   Jiang Liu   iommu/vt-d: use d...
346
  	unsigned long *bitmap;
2ae210106   Suresh Siddha   x64, x2apic/intr-...
347
348
  };
  #endif
a77b67d40   Youquan Song   dmar: Use queued ...
349
  struct iommu_flush {
4c25a2c1b   David Woodhouse   intel-iommu: Clea...
350
351
  	void (*flush_context)(struct intel_iommu *iommu, u16 did, u16 sid,
  			      u8 fm, u64 type);
1f0ef2aa1   David Woodhouse   intel-iommu: Clea...
352
353
  	void (*flush_iotlb)(struct intel_iommu *iommu, u16 did, u64 addr,
  			    unsigned int size_order, u64 type);
a77b67d40   Youquan Song   dmar: Use queued ...
354
  };
f59c7b69b   Fenghua Yu   Intel IOMMU Suspe...
355
356
357
358
359
360
361
  enum {
  	SR_DMAR_FECTL_REG,
  	SR_DMAR_FEDATA_REG,
  	SR_DMAR_FEADDR_REG,
  	SR_DMAR_FEUADDR_REG,
  	MAX_SR_DMAR_REGS
  };
4158c2eca   Joerg Roedel   iommu/vt-d: Detec...
362
363
  #define VTD_FLAG_TRANS_PRE_ENABLED	(1 << 0)
  #define VTD_FLAG_IRQ_REMAP_PRE_ENABLED	(1 << 1)
8a94ade4c   David Woodhouse   iommu/vt-d: Add i...
364
365
  struct pasid_entry;
  struct pasid_state_entry;
a222a7f0b   David Woodhouse   iommu/vt-d: Imple...
366
  struct page_req_dsc;
8a94ade4c   David Woodhouse   iommu/vt-d: Add i...
367

ba3959276   Keshavamurthy, Anil S   Intel IOMMU: Inte...
368
369
  struct intel_iommu {
  	void __iomem	*reg; /* Pointer to hardware regs, virtual addr */
6f5cf5211   Donald Dutile   iommu/dmar: Reser...
370
371
  	u64 		reg_phys; /* physical address of hw register set */
  	u64		reg_size; /* size of hw register set */
ba3959276   Keshavamurthy, Anil S   Intel IOMMU: Inte...
372
373
  	u64		cap;
  	u64		ecap;
ba3959276   Keshavamurthy, Anil S   Intel IOMMU: Inte...
374
  	u32		gcmd; /* Holds TE, EAFL. Don't need SRTP, SFL, WBF */
1f5b3c3fd   Thomas Gleixner   locking, x86, iom...
375
  	raw_spinlock_t	register_lock; /* protect register handling */
c42d9f324   Suresh Siddha   x64, x2apic/intr-...
376
  	int		seq_id;	/* sequence id of the iommu */
1b5736839   Weidong Han   calculate agaw fo...
377
  	int		agaw; /* agaw of this iommu */
4ed0d3e6c   Fenghua Yu   Intel IOMMU Pass ...
378
  	int		msagaw; /* max sagaw of this iommu */
1208225cf   David Woodhouse   iommu/vt-d: Gener...
379
  	unsigned int 	irq, pr_irq;
67ccac41f   David Woodhouse   iommu/vt-d: Store...
380
  	u16		segment;     /* PCI segment# */
9d783ba04   Suresh Siddha   x86, x2apic: enab...
381
  	unsigned char 	name[13];    /* Device Name */
e61d98d8d   Suresh Siddha   x64, x2apic/intr-...
382

d3f138106   Suresh Siddha   iommu: Rename the...
383
  #ifdef CONFIG_INTEL_IOMMU
e61d98d8d   Suresh Siddha   x64, x2apic/intr-...
384
  	unsigned long 	*domain_ids; /* bitmap of domains */
8bf478163   Joerg Roedel   iommu/vt-d: Split...
385
  	struct dmar_domain ***domains; /* ptr to domains */
e61d98d8d   Suresh Siddha   x64, x2apic/intr-...
386
  	spinlock_t	lock; /* protect context, domain ids */
ba3959276   Keshavamurthy, Anil S   Intel IOMMU: Inte...
387
  	struct root_entry *root_entry; /* virtual address */
a77b67d40   Youquan Song   dmar: Use queued ...
388
  	struct iommu_flush flush;
e61d98d8d   Suresh Siddha   x64, x2apic/intr-...
389
  #endif
8a94ade4c   David Woodhouse   iommu/vt-d: Add i...
390
391
392
393
394
395
396
397
  #ifdef CONFIG_INTEL_IOMMU_SVM
  	/* These are large and need to be contiguous, so we allocate just
  	 * one for now. We'll maybe want to rethink that if we truly give
  	 * devices away to userspace processes (e.g. for DPDK) and don't
  	 * want to trust that userspace will use *only* the PASID it was
  	 * told to. But while it's all driver-arbitrated, we're fine. */
  	struct pasid_entry *pasid_table;
  	struct pasid_state_entry *pasid_state_table;
a222a7f0b   David Woodhouse   iommu/vt-d: Imple...
398
399
  	struct page_req_dsc *prq;
  	unsigned char prq_name[16];    /* Name for PRQ interrupt */
2f26e0a9c   David Woodhouse   iommu/vt-d: Add b...
400
  	struct idr pasid_idr;
910170442   David Woodhouse   iommu/vt-d: Fix P...
401
  	u32 pasid_max;
8a94ade4c   David Woodhouse   iommu/vt-d: Add i...
402
  #endif
fe962e90c   Suresh Siddha   x64, x2apic/intr-...
403
  	struct q_inval  *qi;            /* Queued invalidation info */
f59c7b69b   Fenghua Yu   Intel IOMMU Suspe...
404
  	u32 *iommu_state; /* Store iommu states between suspend and resume.*/
d3f138106   Suresh Siddha   iommu: Rename the...
405
  #ifdef CONFIG_IRQ_REMAP
2ae210106   Suresh Siddha   x64, x2apic/intr-...
406
  	struct ir_table *ir_table;	/* Interrupt remapping info */
b106ee63a   Jiang Liu   irq_remapping/vt-...
407
408
  	struct irq_domain *ir_domain;
  	struct irq_domain *ir_msi_domain;
2ae210106   Suresh Siddha   x64, x2apic/intr-...
409
  #endif
b0119e870   Joerg Roedel   iommu: Introduce ...
410
  	struct iommu_device iommu;  /* IOMMU core code handle */
ee34b32d8   Suresh Siddha   dmar: support for...
411
  	int		node;
4158c2eca   Joerg Roedel   iommu/vt-d: Detec...
412
  	u32		flags;      /* Software defined flags */
ba3959276   Keshavamurthy, Anil S   Intel IOMMU: Inte...
413
  };
fe962e90c   Suresh Siddha   x64, x2apic/intr-...
414
415
416
417
418
419
  static inline void __iommu_flush_cache(
  	struct intel_iommu *iommu, void *addr, int size)
  {
  	if (!ecap_coherent(iommu->ecap))
  		clflush_cache_range(addr, size);
  }
e61d98d8d   Suresh Siddha   x64, x2apic/intr-...
420
  extern struct dmar_drhd_unit * dmar_find_matched_drhd_unit(struct pci_dev *dev);
aa5d2b515   Yu Zhao   VT-d: parse ATSR ...
421
  extern int dmar_find_matched_atsr_unit(struct pci_dev *dev);
e61d98d8d   Suresh Siddha   x64, x2apic/intr-...
422

2ae210106   Suresh Siddha   x64, x2apic/intr-...
423
  extern int dmar_enable_qi(struct intel_iommu *iommu);
eba67e5da   Suresh Siddha   x86, dmar: routin...
424
  extern void dmar_disable_qi(struct intel_iommu *iommu);
f59c7b69b   Fenghua Yu   Intel IOMMU Suspe...
425
  extern int dmar_reenable_qi(struct intel_iommu *iommu);
2ae210106   Suresh Siddha   x64, x2apic/intr-...
426
  extern void qi_global_iec(struct intel_iommu *iommu);
e820482cd   Keshavamurthy, Anil S   Intel IOMMU: Iomm...
427

4c25a2c1b   David Woodhouse   intel-iommu: Clea...
428
429
  extern void qi_flush_context(struct intel_iommu *iommu, u16 did, u16 sid,
  			     u8 fm, u64 type);
1f0ef2aa1   David Woodhouse   intel-iommu: Clea...
430
431
  extern void qi_flush_iotlb(struct intel_iommu *iommu, u16 did, u64 addr,
  			  unsigned int size_order, u64 type);
c2ea292b1   Jacob Pan   iommu/vt-d: Fix d...
432
433
  extern void qi_flush_dev_iotlb(struct intel_iommu *iommu, u16 sid, u16 pfsid,
  			u16 qdep, u64 addr, unsigned mask);
704126ad8   Yu Zhao   VT-d: handle Inva...
434
  extern int qi_submit_sync(struct qi_desc *desc, struct intel_iommu *iommu);
387179464   Kay, Allen M   VT-d: Changes to ...
435

074835f01   Youquan Song   intel-iommu: Fix ...
436
  extern int dmar_ir_support(void);
2f26e0a9c   David Woodhouse   iommu/vt-d: Add b...
437
  #ifdef CONFIG_INTEL_IOMMU_SVM
8a94ade4c   David Woodhouse   iommu/vt-d: Add i...
438
439
  extern int intel_svm_alloc_pasid_tables(struct intel_iommu *iommu);
  extern int intel_svm_free_pasid_tables(struct intel_iommu *iommu);
a222a7f0b   David Woodhouse   iommu/vt-d: Imple...
440
441
  extern int intel_svm_enable_prq(struct intel_iommu *iommu);
  extern int intel_svm_finish_prq(struct intel_iommu *iommu);
8a94ade4c   David Woodhouse   iommu/vt-d: Add i...
442

0204a4960   David Woodhouse   iommu/vt-d: Add c...
443
  struct svm_dev_ops;
2f26e0a9c   David Woodhouse   iommu/vt-d: Add b...
444
445
446
447
  struct intel_svm_dev {
  	struct list_head list;
  	struct rcu_head rcu;
  	struct device *dev;
0204a4960   David Woodhouse   iommu/vt-d: Add c...
448
  	struct svm_dev_ops *ops;
2f26e0a9c   David Woodhouse   iommu/vt-d: Add b...
449
450
451
452
453
454
455
456
457
458
  	int users;
  	u16 did;
  	u16 dev_iotlb:1;
  	u16 sid, qdep;
  };
  
  struct intel_svm {
  	struct mmu_notifier notifier;
  	struct mm_struct *mm;
  	struct intel_iommu *iommu;
569e4f778   David Woodhouse   iommu/vt-d: Imple...
459
  	int flags;
2f26e0a9c   David Woodhouse   iommu/vt-d: Add b...
460
461
462
463
464
465
466
  	int pasid;
  	struct list_head devs;
  };
  
  extern int intel_iommu_enable_pasid(struct intel_iommu *iommu, struct intel_svm_dev *sdev);
  extern struct intel_iommu *intel_svm_device_to_iommu(struct device *dev);
  #endif
a5459cfec   Alex Williamson   iommu/vt-d: Make ...
467
  extern const struct attribute_group *intel_iommu_groups[];
ba3959276   Keshavamurthy, Anil S   Intel IOMMU: Inte...
468
  #endif