Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
include
linux
iommu.h
Go to the documentation of this file.
1
/*
2
* Copyright (C) 2007-2008 Advanced Micro Devices, Inc.
3
* Author: Joerg Roedel <
[email protected]
>
4
*
5
* This program is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 as published
7
* by the Free Software Foundation.
8
*
9
* This program is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU General Public License for more details.
13
*
14
* You should have received a copy of the GNU General Public License
15
* along with this program; if not, write to the Free Software
16
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
*/
18
19
#ifndef __LINUX_IOMMU_H
20
#define __LINUX_IOMMU_H
21
22
#include <linux/errno.h>
23
#include <linux/types.h>
24
25
#define IOMMU_READ (1)
26
#define IOMMU_WRITE (2)
27
#define IOMMU_CACHE (4)
/* DMA cache coherency */
28
29
struct
iommu_ops
;
30
struct
iommu_group
;
31
struct
bus_type
;
32
struct
device
;
33
struct
iommu_domain
;
34
struct
notifier_block
;
35
36
/* iommu fault flags */
37
#define IOMMU_FAULT_READ 0x0
38
#define IOMMU_FAULT_WRITE 0x1
39
40
typedef
int
(*
iommu_fault_handler_t
)(
struct
iommu_domain
*,
41
struct
device
*,
unsigned
long
,
int
,
void
*);
42
43
struct
iommu_domain_geometry
{
44
dma_addr_t
aperture_start
;
/* First address that can be mapped */
45
dma_addr_t
aperture_end
;
/* Last address that can be mapped */
46
bool
force_aperture
;
/* DMA only allowed in mappable range? */
47
};
48
49
struct
iommu_domain
{
50
struct
iommu_ops
*
ops
;
51
void
*
priv
;
52
iommu_fault_handler_t
handler
;
53
void
*
handler_token
;
54
struct
iommu_domain_geometry
geometry
;
55
};
56
57
#define IOMMU_CAP_CACHE_COHERENCY 0x1
58
#define IOMMU_CAP_INTR_REMAP 0x2
/* isolates device intrs */
59
60
enum
iommu_attr
{
61
DOMAIN_ATTR_MAX
,
62
DOMAIN_ATTR_GEOMETRY
,
63
};
64
65
#ifdef CONFIG_IOMMU_API
66
83
struct
iommu_ops
{
84
int
(*domain_init)(
struct
iommu_domain
*
domain
);
85
void
(*domain_destroy)(
struct
iommu_domain
*
domain
);
86
int
(*attach_dev)(
struct
iommu_domain
*
domain
,
struct
device
*
dev
);
87
void
(*detach_dev)(
struct
iommu_domain
*
domain
,
struct
device
*
dev
);
88
int
(*
map
)(
struct
iommu_domain
*
domain
,
unsigned
long
iova
,
89
phys_addr_t
paddr
,
size_t
size
,
int
prot);
90
size_t
(*
unmap
)(
struct
iommu_domain
*
domain
,
unsigned
long
iova
,
91
size_t
size
);
92
phys_addr_t
(*iova_to_phys)(
struct
iommu_domain
*
domain
,
93
unsigned
long
iova
);
94
int
(*domain_has_cap)(
struct
iommu_domain
*
domain
,
95
unsigned
long
cap
);
96
int
(*add_device)(
struct
device
*
dev
);
97
void
(*remove_device)(
struct
device
*
dev
);
98
int
(*device_group)(
struct
device
*
dev
,
unsigned
int
*groupid);
99
int
(*domain_get_attr)(
struct
iommu_domain
*
domain
,
100
enum
iommu_attr
attr
,
void
*
data
);
101
int
(*domain_set_attr)(
struct
iommu_domain
*
domain
,
102
enum
iommu_attr
attr
,
void
*
data
);
103
unsigned
long
pgsize_bitmap;
104
};
105
106
#define IOMMU_GROUP_NOTIFY_ADD_DEVICE 1
/* Device added */
107
#define IOMMU_GROUP_NOTIFY_DEL_DEVICE 2
/* Pre Device removed */
108
#define IOMMU_GROUP_NOTIFY_BIND_DRIVER 3
/* Pre Driver bind */
109
#define IOMMU_GROUP_NOTIFY_BOUND_DRIVER 4
/* Post Driver bind */
110
#define IOMMU_GROUP_NOTIFY_UNBIND_DRIVER 5
/* Pre Driver unbind */
111
#define IOMMU_GROUP_NOTIFY_UNBOUND_DRIVER 6
/* Post Driver unbind */
112
113
extern
int
bus_set_iommu
(
struct
bus_type
*
bus
,
struct
iommu_ops
*
ops
);
114
extern
bool
iommu_present
(
struct
bus_type
*
bus
);
115
extern
struct
iommu_domain
*
iommu_domain_alloc
(
struct
bus_type
*
bus
);
116
extern
void
iommu_domain_free
(
struct
iommu_domain
*domain);
117
extern
int
iommu_attach_device
(
struct
iommu_domain
*domain,
118
struct
device
*
dev
);
119
extern
void
iommu_detach_device
(
struct
iommu_domain
*domain,
120
struct
device
*
dev
);
121
extern
int
iommu_map
(
struct
iommu_domain
*domain,
unsigned
long
iova
,
122
phys_addr_t
paddr
,
size_t
size
,
int
prot);
123
extern
size_t
iommu_unmap
(
struct
iommu_domain
*domain,
unsigned
long
iova
,
124
size_t
size
);
125
extern
phys_addr_t
iommu_iova_to_phys
(
struct
iommu_domain
*domain,
126
unsigned
long
iova
);
127
extern
int
iommu_domain_has_cap
(
struct
iommu_domain
*domain,
128
unsigned
long
cap
);
129
extern
void
iommu_set_fault_handler
(
struct
iommu_domain
*domain,
130
iommu_fault_handler_t
handler
,
void
*
token
);
131
132
extern
int
iommu_attach_group
(
struct
iommu_domain
*domain,
133
struct
iommu_group
*
group
);
134
extern
void
iommu_detach_group
(
struct
iommu_domain
*domain,
135
struct
iommu_group
*
group
);
136
extern
struct
iommu_group
*
iommu_group_alloc
(
void
);
137
extern
void
*
iommu_group_get_iommudata
(
struct
iommu_group
*
group
);
138
extern
void
iommu_group_set_iommudata
(
struct
iommu_group
*
group
,
139
void
*
iommu_data
,
140
void
(*
release
)(
void
*iommu_data));
141
extern
int
iommu_group_set_name
(
struct
iommu_group
*group,
const
char
*
name
);
142
extern
int
iommu_group_add_device
(
struct
iommu_group
*group,
143
struct
device
*
dev
);
144
extern
void
iommu_group_remove_device
(
struct
device
*
dev
);
145
extern
int
iommu_group_for_each_dev
(
struct
iommu_group
*group,
void
*
data
,
146
int
(*
fn
)(
struct
device
*,
void
*));
147
extern
struct
iommu_group
*
iommu_group_get
(
struct
device
*
dev
);
148
extern
void
iommu_group_put
(
struct
iommu_group
*group);
149
extern
int
iommu_group_register_notifier
(
struct
iommu_group
*group,
150
struct
notifier_block
*nb);
151
extern
int
iommu_group_unregister_notifier
(
struct
iommu_group
*group,
152
struct
notifier_block
*nb);
153
extern
int
iommu_group_id
(
struct
iommu_group
*group);
154
155
extern
int
iommu_domain_get_attr
(
struct
iommu_domain
*domain,
enum
iommu_attr
,
156
void
*data);
157
extern
int
iommu_domain_set_attr
(
struct
iommu_domain
*domain,
enum
iommu_attr
,
158
void
*data);
159
184
static
inline
int
report_iommu_fault(
struct
iommu_domain
*domain,
185
struct
device
*
dev
,
unsigned
long
iova
,
int
flags
)
186
{
187
int
ret
= -
ENOSYS
;
188
189
/*
190
* if upper layers showed interest and installed a fault handler,
191
* invoke it.
192
*/
193
if
(domain->
handler
)
194
ret = domain->
handler
(domain, dev, iova, flags,
195
domain->
handler_token
);
196
197
return
ret
;
198
}
199
200
#else
/* CONFIG_IOMMU_API */
201
202
struct
iommu_ops
{};
203
struct
iommu_group
{};
204
205
static
inline
bool
iommu_present
(
struct
bus_type
*
bus
)
206
{
207
return
false
;
208
}
209
210
static
inline
struct
iommu_domain
*
iommu_domain_alloc
(
struct
bus_type
*
bus
)
211
{
212
return
NULL
;
213
}
214
215
static
inline
void
iommu_domain_free
(
struct
iommu_domain
*domain)
216
{
217
}
218
219
static
inline
int
iommu_attach_device
(
struct
iommu_domain
*domain,
220
struct
device
*dev)
221
{
222
return
-
ENODEV
;
223
}
224
225
static
inline
void
iommu_detach_device
(
struct
iommu_domain
*domain,
226
struct
device
*dev)
227
{
228
}
229
230
static
inline
int
iommu_map
(
struct
iommu_domain
*domain,
unsigned
long
iova,
231
phys_addr_t
paddr
,
int
gfp_order,
int
prot)
232
{
233
return
-
ENODEV
;
234
}
235
236
static
inline
int
iommu_unmap
(
struct
iommu_domain
*domain,
unsigned
long
iova,
237
int
gfp_order)
238
{
239
return
-
ENODEV
;
240
}
241
242
static
inline
phys_addr_t
iommu_iova_to_phys
(
struct
iommu_domain
*domain,
243
unsigned
long
iova)
244
{
245
return
0;
246
}
247
248
static
inline
int
domain_has_cap(
struct
iommu_domain
*domain,
249
unsigned
long
cap
)
250
{
251
return
0;
252
}
253
254
static
inline
void
iommu_set_fault_handler
(
struct
iommu_domain
*domain,
255
iommu_fault_handler_t
handler
,
void
*
token
)
256
{
257
}
258
259
static
inline
int
iommu_attach_group
(
struct
iommu_domain
*domain,
260
struct
iommu_group
*group)
261
{
262
return
-
ENODEV
;
263
}
264
265
static
inline
void
iommu_detach_group
(
struct
iommu_domain
*domain,
266
struct
iommu_group
*group)
267
{
268
}
269
270
static
inline
struct
iommu_group
*
iommu_group_alloc
(
void
)
271
{
272
return
ERR_PTR(-
ENODEV
);
273
}
274
275
static
inline
void
*
iommu_group_get_iommudata
(
struct
iommu_group
*group)
276
{
277
return
NULL
;
278
}
279
280
static
inline
void
iommu_group_set_iommudata
(
struct
iommu_group
*group,
281
void
*iommu_data,
282
void
(*
release
)(
void
*iommu_data))
283
{
284
}
285
286
static
inline
int
iommu_group_set_name
(
struct
iommu_group
*group,
287
const
char
*
name
)
288
{
289
return
-
ENODEV
;
290
}
291
292
static
inline
int
iommu_group_add_device
(
struct
iommu_group
*group,
293
struct
device
*dev)
294
{
295
return
-
ENODEV
;
296
}
297
298
static
inline
void
iommu_group_remove_device
(
struct
device
*dev)
299
{
300
}
301
302
static
inline
int
iommu_group_for_each_dev
(
struct
iommu_group
*group,
303
void
*data,
304
int
(*
fn
)(
struct
device
*,
void
*))
305
{
306
return
-
ENODEV
;
307
}
308
309
static
inline
struct
iommu_group
*
iommu_group_get
(
struct
device
*dev)
310
{
311
return
NULL
;
312
}
313
314
static
inline
void
iommu_group_put
(
struct
iommu_group
*group)
315
{
316
}
317
318
static
inline
int
iommu_group_register_notifier
(
struct
iommu_group
*group,
319
struct
notifier_block
*nb)
320
{
321
return
-
ENODEV
;
322
}
323
324
static
inline
int
iommu_group_unregister_notifier
(
struct
iommu_group
*group,
325
struct
notifier_block
*nb)
326
{
327
return
0;
328
}
329
330
static
inline
int
iommu_group_id
(
struct
iommu_group
*group)
331
{
332
return
-
ENODEV
;
333
}
334
335
static
inline
int
iommu_domain_get_attr
(
struct
iommu_domain
*domain,
336
enum
iommu_attr
attr
,
void
*data)
337
{
338
return
-
EINVAL
;
339
}
340
341
static
inline
int
iommu_domain_set_attr
(
struct
iommu_domain
*domain,
342
enum
iommu_attr
attr
,
void
*data)
343
{
344
return
-
EINVAL
;
345
}
346
347
#endif
/* CONFIG_IOMMU_API */
348
349
#endif
/* __LINUX_IOMMU_H */
Generated on Thu Jan 10 2013 12:59:51 for Linux Kernel by
1.8.2