iommu.h 24.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/*
 * Copyright (C) 2007-2008 Advanced Micro Devices, Inc.
 * Author: Joerg Roedel <joerg.roedel@amd.com>
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 as published
 * by the Free Software Foundation.
 *
 * This program is distributed in the hope that 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
 */

#ifndef __LINUX_IOMMU_H
#define __LINUX_IOMMU_H

22 23 24
#include <linux/scatterlist.h>
#include <linux/device.h>
#include <linux/types.h>
25
#include <linux/errno.h>
W
Wang YanQing 已提交
26
#include <linux/err.h>
27
#include <linux/of.h>
28

29 30 31
#define IOMMU_READ	(1 << 0)
#define IOMMU_WRITE	(1 << 1)
#define IOMMU_CACHE	(1 << 2) /* DMA cache coherency */
32
#define IOMMU_NOEXEC	(1 << 3)
R
Robin Murphy 已提交
33
#define IOMMU_MMIO	(1 << 4) /* e.g. things like MSI doorbells */
34
/*
35 36 37 38 39 40 41
 * Where the bus hardware includes a privilege level as part of its access type
 * markings, and certain devices are capable of issuing transactions marked as
 * either 'supervisor' or 'user', the IOMMU_PRIV flag requests that the other
 * given permission flags only apply to accesses at the higher privilege level,
 * and that unprivileged transactions should have as little access as possible.
 * This would usually imply the same permissions as kernel mappings on the CPU,
 * if the IOMMU page table format is equivalent.
42 43
 */
#define IOMMU_PRIV	(1 << 5)
44

45
struct iommu_ops;
A
Alex Williamson 已提交
46
struct iommu_group;
47
struct bus_type;
48
struct device;
49
struct iommu_domain;
50
struct notifier_block;
51 52 53 54 55 56

/* iommu fault flags */
#define IOMMU_FAULT_READ	0x0
#define IOMMU_FAULT_WRITE	0x1

typedef int (*iommu_fault_handler_t)(struct iommu_domain *,
57
			struct device *, unsigned long, int, void *);
58

59 60 61 62 63 64
struct iommu_domain_geometry {
	dma_addr_t aperture_start; /* First address that can be mapped    */
	dma_addr_t aperture_end;   /* Last address that can be mapped     */
	bool force_aperture;       /* DMA only allowed in mappable range? */
};

65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
/* Domain feature flags */
#define __IOMMU_DOMAIN_PAGING	(1U << 0)  /* Support for iommu_map/unmap */
#define __IOMMU_DOMAIN_DMA_API	(1U << 1)  /* Domain for use in DMA-API
					      implementation              */
#define __IOMMU_DOMAIN_PT	(1U << 2)  /* Domain is identity mapped   */

/*
 * This are the possible domain-types
 *
 *	IOMMU_DOMAIN_BLOCKED	- All DMA is blocked, can be used to isolate
 *				  devices
 *	IOMMU_DOMAIN_IDENTITY	- DMA addresses are system physical addresses
 *	IOMMU_DOMAIN_UNMANAGED	- DMA mappings managed by IOMMU-API user, used
 *				  for VMs
 *	IOMMU_DOMAIN_DMA	- Internally used for DMA-API implementations.
 *				  This flag allows IOMMU drivers to implement
 *				  certain optimizations for these domains
 */
#define IOMMU_DOMAIN_BLOCKED	(0U)
#define IOMMU_DOMAIN_IDENTITY	(__IOMMU_DOMAIN_PT)
#define IOMMU_DOMAIN_UNMANAGED	(__IOMMU_DOMAIN_PAGING)
#define IOMMU_DOMAIN_DMA	(__IOMMU_DOMAIN_PAGING |	\
				 __IOMMU_DOMAIN_DMA_API)

89
struct iommu_domain {
90
	unsigned type;
91
	const struct iommu_ops *ops;
92
	unsigned long pgsize_bitmap;	/* Bitmap of page sizes in use */
93
	iommu_fault_handler_t handler;
94
	void *handler_token;
95
	struct iommu_domain_geometry geometry;
96
	void *iova_cookie;
97 98
};

99 100 101 102
enum iommu_cap {
	IOMMU_CAP_CACHE_COHERENCY,	/* IOMMU can enforce cache coherent DMA
					   transactions */
	IOMMU_CAP_INTR_REMAP,		/* IOMMU supports interrupt isolation */
103
	IOMMU_CAP_NOEXEC,		/* IOMMU_NOEXEC flag */
104
};
S
Sheng Yang 已提交
105

106 107 108 109 110 111 112 113 114 115 116 117 118
/*
 * Following constraints are specifc to FSL_PAMUV1:
 *  -aperture must be power of 2, and naturally aligned
 *  -number of windows must be power of 2, and address space size
 *   of each window is determined by aperture size / # of windows
 *  -the actual size of the mapped region of a window must be power
 *   of 2 starting with 4KB and physical address must be naturally
 *   aligned.
 * DOMAIN_ATTR_FSL_PAMUV1 corresponds to the above mentioned contraints.
 * The caller can invoke iommu_domain_get_attr to check if the underlying
 * iommu implementation supports these constraints.
 */

119
enum iommu_attr {
120
	DOMAIN_ATTR_GEOMETRY,
121
	DOMAIN_ATTR_PAGING,
122
	DOMAIN_ATTR_WINDOWS,
123 124 125
	DOMAIN_ATTR_FSL_PAMU_STASH,
	DOMAIN_ATTR_FSL_PAMU_ENABLE,
	DOMAIN_ATTR_FSL_PAMUV1,
126
	DOMAIN_ATTR_NESTING,	/* two stages of translation */
127
	DOMAIN_ATTR_DMA_USE_FLUSH_QUEUE,
128
	DOMAIN_ATTR_MAX,
129 130
};

131
/* These are the possible reserved region types */
132 133 134 135 136 137 138 139 140 141
enum iommu_resv_type {
	/* Memory regions which must be mapped 1:1 at all times */
	IOMMU_RESV_DIRECT,
	/* Arbitrary "never map this or give it to a device" address ranges */
	IOMMU_RESV_RESERVED,
	/* Hardware MSI region (untranslated) */
	IOMMU_RESV_MSI,
	/* Software-managed MSI translation window */
	IOMMU_RESV_SW_MSI,
};
142

143
/**
144
 * struct iommu_resv_region - descriptor for a reserved memory region
145 146 147 148
 * @list: Linked list pointers
 * @start: System physical start address of the region
 * @length: Length of the region in bytes
 * @prot: IOMMU Protection flags (READ/WRITE/...)
149
 * @type: Type of the reserved region
150
 */
151
struct iommu_resv_region {
152 153 154 155
	struct list_head	list;
	phys_addr_t		start;
	size_t			length;
	int			prot;
156
	enum iommu_resv_type	type;
157 158
};

159 160 161 162 163
/* Per device IOMMU features */
enum iommu_dev_features {
	IOMMU_DEV_FEAT_AUX,	/* Aux-domain feature */
};

164 165
#ifdef CONFIG_IOMMU_API

166 167
/**
 * struct iommu_ops - iommu ops and capabilities
168 169 170
 * @capable: check capability
 * @domain_alloc: allocate iommu domain
 * @domain_free: free iommu domain
171 172 173 174
 * @attach_dev: attach device to an iommu domain
 * @detach_dev: detach device from an iommu domain
 * @map: map a physically contiguous memory region to an iommu domain
 * @unmap: unmap a physically contiguous memory region from an iommu domain
T
Tom Murphy 已提交
175
 * @flush_iotlb_all: Synchronously flush all hardware TLBs for this domain
176
 * @iotlb_range_add: Add a given iova range to the flush queue for this domain
177
 * @iotlb_sync_map: Sync mappings created recently using @map to the hardware
178
 * @iotlb_sync: Flush all queued ranges from the hardware TLBs and empty flush
179
 *            queue
180
 * @iova_to_phys: translate iova to physical address
A
Alex Williamson 已提交
181 182
 * @add_device: add device to iommu grouping
 * @remove_device: remove device from iommu grouping
183
 * @device_group: find iommu group for a particular device
184 185
 * @domain_get_attr: Query domain attributes
 * @domain_set_attr: Change domain attributes
186 187 188
 * @get_resv_regions: Request list of reserved regions for a device
 * @put_resv_regions: Free list of reserved regions for a device
 * @apply_resv_region: Temporary helper call-back for iova reserved ranges
189 190
 * @domain_window_enable: Configure and enable a particular window for a domain
 * @domain_window_disable: Disable a particular window for a domain
191
 * @of_xlate: add OF master IDs to iommu grouping
192 193
 * @is_attach_deferred: Check if domain attach should be deferred from iommu
 *                      driver init to device driver init (default no)
194 195 196 197 198
 * @dev_has/enable/disable_feat: per device entries to check/enable/disable
 *                               iommu specific features.
 * @dev_feat_enabled: check enabled feature
 * @aux_attach/detach_dev: aux-domain specific attach/detach entries.
 * @aux_get_pasid: get the pasid given an aux-domain
199
 * @pgsize_bitmap: bitmap of all possible supported page sizes
200
 */
201
struct iommu_ops {
202
	bool (*capable)(enum iommu_cap);
203 204

	/* Domain allocation and freeing by the iommu driver */
205
	struct iommu_domain *(*domain_alloc)(unsigned iommu_domain_type);
206 207
	void (*domain_free)(struct iommu_domain *);

208 209
	int (*attach_dev)(struct iommu_domain *domain, struct device *dev);
	void (*detach_dev)(struct iommu_domain *domain, struct device *dev);
210
	int (*map)(struct iommu_domain *domain, unsigned long iova,
211 212 213
		   phys_addr_t paddr, size_t size, int prot);
	size_t (*unmap)(struct iommu_domain *domain, unsigned long iova,
		     size_t size);
214 215 216
	void (*flush_iotlb_all)(struct iommu_domain *domain);
	void (*iotlb_range_add)(struct iommu_domain *domain,
				unsigned long iova, size_t size);
217
	void (*iotlb_sync_map)(struct iommu_domain *domain);
218
	void (*iotlb_sync)(struct iommu_domain *domain);
219
	phys_addr_t (*iova_to_phys)(struct iommu_domain *domain, dma_addr_t iova);
A
Alex Williamson 已提交
220 221
	int (*add_device)(struct device *dev);
	void (*remove_device)(struct device *dev);
222
	struct iommu_group *(*device_group)(struct device *dev);
223 224 225 226
	int (*domain_get_attr)(struct iommu_domain *domain,
			       enum iommu_attr attr, void *data);
	int (*domain_set_attr)(struct iommu_domain *domain,
			       enum iommu_attr attr, void *data);
227

228 229 230 231 232 233
	/* Request/Free a list of reserved regions for a device */
	void (*get_resv_regions)(struct device *dev, struct list_head *list);
	void (*put_resv_regions)(struct device *dev, struct list_head *list);
	void (*apply_resv_region)(struct device *dev,
				  struct iommu_domain *domain,
				  struct iommu_resv_region *region);
234

235 236
	/* Window handling functions */
	int (*domain_window_enable)(struct iommu_domain *domain, u32 wnd_nr,
237
				    phys_addr_t paddr, u64 size, int prot);
238 239
	void (*domain_window_disable)(struct iommu_domain *domain, u32 wnd_nr);

240
	int (*of_xlate)(struct device *dev, struct of_phandle_args *args);
241
	bool (*is_attach_deferred)(struct iommu_domain *domain, struct device *dev);
242

243 244 245 246 247 248 249 250 251 252 253
	/* Per device IOMMU features */
	bool (*dev_has_feat)(struct device *dev, enum iommu_dev_features f);
	bool (*dev_feat_enabled)(struct device *dev, enum iommu_dev_features f);
	int (*dev_enable_feat)(struct device *dev, enum iommu_dev_features f);
	int (*dev_disable_feat)(struct device *dev, enum iommu_dev_features f);

	/* Aux-domain specific attach/detach entries */
	int (*aux_attach_dev)(struct iommu_domain *domain, struct device *dev);
	void (*aux_detach_dev)(struct iommu_domain *domain, struct device *dev);
	int (*aux_get_pasid)(struct iommu_domain *domain, struct device *dev);

254
	unsigned long pgsize_bitmap;
255 256
};

257 258 259 260 261
/**
 * struct iommu_device - IOMMU core representation of one IOMMU hardware
 *			 instance
 * @list: Used by the iommu-core to keep a list of registered iommus
 * @ops: iommu-ops for talking to this iommu
262
 * @dev: struct device for sysfs handling
263 264 265 266
 */
struct iommu_device {
	struct list_head list;
	const struct iommu_ops *ops;
267
	struct fwnode_handle *fwnode;
268
	struct device *dev;
269 270 271 272
};

int  iommu_device_register(struct iommu_device *iommu);
void iommu_device_unregister(struct iommu_device *iommu);
273 274 275 276 277
int  iommu_device_sysfs_add(struct iommu_device *iommu,
			    struct device *parent,
			    const struct attribute_group **groups,
			    const char *fmt, ...) __printf(4, 5);
void iommu_device_sysfs_remove(struct iommu_device *iommu);
278 279
int  iommu_device_link(struct iommu_device   *iommu, struct device *link);
void iommu_device_unlink(struct iommu_device *iommu, struct device *link);
280 281 282 283 284 285 286

static inline void iommu_device_set_ops(struct iommu_device *iommu,
					const struct iommu_ops *ops)
{
	iommu->ops = ops;
}

287 288 289 290 291 292
static inline void iommu_device_set_fwnode(struct iommu_device *iommu,
					   struct fwnode_handle *fwnode)
{
	iommu->fwnode = fwnode;
}

293 294 295 296 297
static inline struct iommu_device *dev_to_iommu_device(struct device *dev)
{
	return (struct iommu_device *)dev_get_drvdata(dev);
}

A
Alex Williamson 已提交
298 299 300 301 302 303 304
#define IOMMU_GROUP_NOTIFY_ADD_DEVICE		1 /* Device added */
#define IOMMU_GROUP_NOTIFY_DEL_DEVICE		2 /* Pre Device removed */
#define IOMMU_GROUP_NOTIFY_BIND_DRIVER		3 /* Pre Driver bind */
#define IOMMU_GROUP_NOTIFY_BOUND_DRIVER		4 /* Post Driver bind */
#define IOMMU_GROUP_NOTIFY_UNBIND_DRIVER	5 /* Pre Driver unbind */
#define IOMMU_GROUP_NOTIFY_UNBOUND_DRIVER	6 /* Post Driver unbind */

305
extern int bus_set_iommu(struct bus_type *bus, const struct iommu_ops *ops);
306
extern bool iommu_present(struct bus_type *bus);
307
extern bool iommu_capable(struct bus_type *bus, enum iommu_cap cap);
308
extern struct iommu_domain *iommu_domain_alloc(struct bus_type *bus);
309
extern struct iommu_group *iommu_group_get_by_id(int id);
310 311 312 313 314
extern void iommu_domain_free(struct iommu_domain *domain);
extern int iommu_attach_device(struct iommu_domain *domain,
			       struct device *dev);
extern void iommu_detach_device(struct iommu_domain *domain,
				struct device *dev);
315
extern struct iommu_domain *iommu_get_domain_for_dev(struct device *dev);
316
extern struct iommu_domain *iommu_get_dma_domain(struct device *dev);
317
extern int iommu_map(struct iommu_domain *domain, unsigned long iova,
318 319
		     phys_addr_t paddr, size_t size, int prot);
extern size_t iommu_unmap(struct iommu_domain *domain, unsigned long iova,
320 321 322
			  size_t size);
extern size_t iommu_unmap_fast(struct iommu_domain *domain,
			       unsigned long iova, size_t size);
323 324
extern size_t iommu_map_sg(struct iommu_domain *domain, unsigned long iova,
			   struct scatterlist *sg,unsigned int nents, int prot);
325
extern phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, dma_addr_t iova);
326
extern void iommu_set_fault_handler(struct iommu_domain *domain,
327
			iommu_fault_handler_t handler, void *token);
A
Alex Williamson 已提交
328

329 330
extern void iommu_get_resv_regions(struct device *dev, struct list_head *list);
extern void iommu_put_resv_regions(struct device *dev, struct list_head *list);
331
extern int iommu_request_dm_for_dev(struct device *dev);
E
Eric Auger 已提交
332
extern struct iommu_resv_region *
333 334
iommu_alloc_resv_region(phys_addr_t start, size_t length, int prot,
			enum iommu_resv_type type);
E
Eric Auger 已提交
335 336
extern int iommu_get_group_resv_regions(struct iommu_group *group,
					struct list_head *head);
337

A
Alex Williamson 已提交
338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353
extern int iommu_attach_group(struct iommu_domain *domain,
			      struct iommu_group *group);
extern void iommu_detach_group(struct iommu_domain *domain,
			       struct iommu_group *group);
extern struct iommu_group *iommu_group_alloc(void);
extern void *iommu_group_get_iommudata(struct iommu_group *group);
extern void iommu_group_set_iommudata(struct iommu_group *group,
				      void *iommu_data,
				      void (*release)(void *iommu_data));
extern int iommu_group_set_name(struct iommu_group *group, const char *name);
extern int iommu_group_add_device(struct iommu_group *group,
				  struct device *dev);
extern void iommu_group_remove_device(struct device *dev);
extern int iommu_group_for_each_dev(struct iommu_group *group, void *data,
				    int (*fn)(struct device *, void *));
extern struct iommu_group *iommu_group_get(struct device *dev);
354
extern struct iommu_group *iommu_group_ref_get(struct iommu_group *group);
A
Alex Williamson 已提交
355 356 357 358 359 360
extern void iommu_group_put(struct iommu_group *group);
extern int iommu_group_register_notifier(struct iommu_group *group,
					 struct notifier_block *nb);
extern int iommu_group_unregister_notifier(struct iommu_group *group,
					   struct notifier_block *nb);
extern int iommu_group_id(struct iommu_group *group);
361
extern struct iommu_group *iommu_group_get_for_dev(struct device *dev);
362
extern struct iommu_domain *iommu_group_default_domain(struct iommu_group *);
363

364 365 366 367
extern int iommu_domain_get_attr(struct iommu_domain *domain, enum iommu_attr,
				 void *data);
extern int iommu_domain_set_attr(struct iommu_domain *domain, enum iommu_attr,
				 void *data);
368

369 370
/* Window handling function prototypes */
extern int iommu_domain_window_enable(struct iommu_domain *domain, u32 wnd_nr,
371 372
				      phys_addr_t offset, u64 size,
				      int prot);
373
extern void iommu_domain_window_disable(struct iommu_domain *domain, u32 wnd_nr);
374 375 376

extern int report_iommu_fault(struct iommu_domain *domain, struct device *dev,
			      unsigned long iova, int flags);
377

378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396
static inline void iommu_flush_tlb_all(struct iommu_domain *domain)
{
	if (domain->ops->flush_iotlb_all)
		domain->ops->flush_iotlb_all(domain);
}

static inline void iommu_tlb_range_add(struct iommu_domain *domain,
				       unsigned long iova, size_t size)
{
	if (domain->ops->iotlb_range_add)
		domain->ops->iotlb_range_add(domain, iova, size);
}

static inline void iommu_tlb_sync(struct iommu_domain *domain)
{
	if (domain->ops->iotlb_sync)
		domain->ops->iotlb_sync(domain);
}

397 398
/* PCI device grouping function */
extern struct iommu_group *pci_device_group(struct device *dev);
399 400
/* Generic device grouping function */
extern struct iommu_group *generic_device_group(struct device *dev);
401 402
/* FSL-MC device grouping function */
struct iommu_group *fsl_mc_device_group(struct device *dev);
403

R
Robin Murphy 已提交
404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423
/**
 * struct iommu_fwspec - per-device IOMMU instance data
 * @ops: ops for this device's IOMMU
 * @iommu_fwnode: firmware handle for this device's IOMMU
 * @iommu_priv: IOMMU driver private data for this device
 * @num_ids: number of associated device IDs
 * @ids: IDs which this device may present to the IOMMU
 */
struct iommu_fwspec {
	const struct iommu_ops	*ops;
	struct fwnode_handle	*iommu_fwnode;
	void			*iommu_priv;
	unsigned int		num_ids;
	u32			ids[1];
};

int iommu_fwspec_init(struct device *dev, struct fwnode_handle *iommu_fwnode,
		      const struct iommu_ops *ops);
void iommu_fwspec_free(struct device *dev);
int iommu_fwspec_add_ids(struct device *dev, u32 *ids, int num_ids);
424
const struct iommu_ops *iommu_ops_from_fwnode(struct fwnode_handle *fwnode);
R
Robin Murphy 已提交
425

426 427 428 429 430 431 432 433 434 435 436
static inline struct iommu_fwspec *dev_iommu_fwspec_get(struct device *dev)
{
	return dev->iommu_fwspec;
}

static inline void dev_iommu_fwspec_set(struct device *dev,
					struct iommu_fwspec *fwspec)
{
	dev->iommu_fwspec = fwspec;
}

437 438 439
int iommu_probe_device(struct device *dev);
void iommu_release_device(struct device *dev);

440 441 442 443 444 445 446 447
bool iommu_dev_has_feature(struct device *dev, enum iommu_dev_features f);
int iommu_dev_enable_feature(struct device *dev, enum iommu_dev_features f);
int iommu_dev_disable_feature(struct device *dev, enum iommu_dev_features f);
bool iommu_dev_feature_enabled(struct device *dev, enum iommu_dev_features f);
int iommu_aux_attach_device(struct iommu_domain *domain, struct device *dev);
void iommu_aux_detach_device(struct iommu_domain *domain, struct device *dev);
int iommu_aux_get_pasid(struct iommu_domain *domain, struct device *dev);

448 449
#else /* CONFIG_IOMMU_API */

450
struct iommu_ops {};
A
Alex Williamson 已提交
451
struct iommu_group {};
R
Robin Murphy 已提交
452
struct iommu_fwspec {};
453
struct iommu_device {};
454

455
static inline bool iommu_present(struct bus_type *bus)
456 457 458 459
{
	return false;
}

460 461 462 463 464
static inline bool iommu_capable(struct bus_type *bus, enum iommu_cap cap)
{
	return false;
}

465
static inline struct iommu_domain *iommu_domain_alloc(struct bus_type *bus)
466 467 468 469
{
	return NULL;
}

470 471 472 473 474
static inline struct iommu_group *iommu_group_get_by_id(int id)
{
	return NULL;
}

475 476 477 478 479 480 481 482 483 484 485 486 487 488 489
static inline void iommu_domain_free(struct iommu_domain *domain)
{
}

static inline int iommu_attach_device(struct iommu_domain *domain,
				      struct device *dev)
{
	return -ENODEV;
}

static inline void iommu_detach_device(struct iommu_domain *domain,
				       struct device *dev)
{
}

490 491 492 493 494
static inline struct iommu_domain *iommu_get_domain_for_dev(struct device *dev)
{
	return NULL;
}

495
static inline int iommu_map(struct iommu_domain *domain, unsigned long iova,
496
			    phys_addr_t paddr, size_t size, int prot)
497 498 499 500
{
	return -ENODEV;
}

501 502
static inline size_t iommu_unmap(struct iommu_domain *domain,
				 unsigned long iova, size_t size)
503
{
504
	return 0;
505 506
}

507 508
static inline size_t iommu_unmap_fast(struct iommu_domain *domain,
				      unsigned long iova, int gfp_order)
509
{
510
	return 0;
511 512
}

O
Olav Haugan 已提交
513 514 515 516
static inline size_t iommu_map_sg(struct iommu_domain *domain,
				  unsigned long iova, struct scatterlist *sg,
				  unsigned int nents, int prot)
{
517
	return 0;
O
Olav Haugan 已提交
518 519
}

520 521 522 523 524 525 526 527 528 529 530 531 532
static inline void iommu_flush_tlb_all(struct iommu_domain *domain)
{
}

static inline void iommu_tlb_range_add(struct iommu_domain *domain,
				       unsigned long iova, size_t size)
{
}

static inline void iommu_tlb_sync(struct iommu_domain *domain)
{
}

533 534
static inline int iommu_domain_window_enable(struct iommu_domain *domain,
					     u32 wnd_nr, phys_addr_t paddr,
535
					     u64 size, int prot)
536 537 538 539 540 541 542 543 544
{
	return -ENODEV;
}

static inline void iommu_domain_window_disable(struct iommu_domain *domain,
					       u32 wnd_nr)
{
}

545
static inline phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, dma_addr_t iova)
546 547 548 549
{
	return 0;
}

550
static inline void iommu_set_fault_handler(struct iommu_domain *domain,
551
				iommu_fault_handler_t handler, void *token)
552 553 554
{
}

555
static inline void iommu_get_resv_regions(struct device *dev,
556 557 558 559
					struct list_head *list)
{
}

560
static inline void iommu_put_resv_regions(struct device *dev,
561 562 563 564
					struct list_head *list)
{
}

E
Eric Auger 已提交
565 566 567 568 569 570
static inline int iommu_get_group_resv_regions(struct iommu_group *group,
					       struct list_head *head)
{
	return -ENODEV;
}

571 572 573 574 575
static inline int iommu_request_dm_for_dev(struct device *dev)
{
	return -ENODEV;
}

576 577
static inline int iommu_attach_group(struct iommu_domain *domain,
				     struct iommu_group *group)
A
Alex Williamson 已提交
578 579 580 581
{
	return -ENODEV;
}

582 583
static inline void iommu_detach_group(struct iommu_domain *domain,
				      struct iommu_group *group)
A
Alex Williamson 已提交
584 585 586
{
}

587
static inline struct iommu_group *iommu_group_alloc(void)
A
Alex Williamson 已提交
588 589 590 591
{
	return ERR_PTR(-ENODEV);
}

592
static inline void *iommu_group_get_iommudata(struct iommu_group *group)
A
Alex Williamson 已提交
593 594 595 596
{
	return NULL;
}

597 598 599
static inline void iommu_group_set_iommudata(struct iommu_group *group,
					     void *iommu_data,
					     void (*release)(void *iommu_data))
A
Alex Williamson 已提交
600 601 602
{
}

603 604
static inline int iommu_group_set_name(struct iommu_group *group,
				       const char *name)
A
Alex Williamson 已提交
605 606 607 608
{
	return -ENODEV;
}

609 610
static inline int iommu_group_add_device(struct iommu_group *group,
					 struct device *dev)
A
Alex Williamson 已提交
611 612 613 614
{
	return -ENODEV;
}

615
static inline void iommu_group_remove_device(struct device *dev)
A
Alex Williamson 已提交
616 617 618
{
}

619 620 621
static inline int iommu_group_for_each_dev(struct iommu_group *group,
					   void *data,
					   int (*fn)(struct device *, void *))
A
Alex Williamson 已提交
622 623 624 625
{
	return -ENODEV;
}

626
static inline struct iommu_group *iommu_group_get(struct device *dev)
A
Alex Williamson 已提交
627 628 629 630
{
	return NULL;
}

631
static inline void iommu_group_put(struct iommu_group *group)
A
Alex Williamson 已提交
632 633 634
{
}

635 636
static inline int iommu_group_register_notifier(struct iommu_group *group,
						struct notifier_block *nb)
637 638 639 640
{
	return -ENODEV;
}

641 642
static inline int iommu_group_unregister_notifier(struct iommu_group *group,
						  struct notifier_block *nb)
A
Alex Williamson 已提交
643 644 645 646
{
	return 0;
}

647
static inline int iommu_group_id(struct iommu_group *group)
A
Alex Williamson 已提交
648 649 650
{
	return -ENODEV;
}
651

652 653 654 655 656 657 658 659 660 661 662 663
static inline int iommu_domain_get_attr(struct iommu_domain *domain,
					enum iommu_attr attr, void *data)
{
	return -EINVAL;
}

static inline int iommu_domain_set_attr(struct iommu_domain *domain,
					enum iommu_attr attr, void *data)
{
	return -EINVAL;
}

664
static inline int  iommu_device_register(struct iommu_device *iommu)
665
{
666
	return -ENODEV;
667 668
}

669 670
static inline void iommu_device_set_ops(struct iommu_device *iommu,
					const struct iommu_ops *ops)
671 672 673
{
}

674 675
static inline void iommu_device_set_fwnode(struct iommu_device *iommu,
					   struct fwnode_handle *fwnode)
676 677 678
{
}

679 680 681 682 683
static inline struct iommu_device *dev_to_iommu_device(struct device *dev)
{
	return NULL;
}

684
static inline void iommu_device_unregister(struct iommu_device *iommu)
685 686 687
{
}

688 689 690 691
static inline int  iommu_device_sysfs_add(struct iommu_device *iommu,
					  struct device *parent,
					  const struct attribute_group **groups,
					  const char *fmt, ...)
692
{
693
	return -ENODEV;
694 695
}

696
static inline void iommu_device_sysfs_remove(struct iommu_device *iommu)
697 698 699
{
}

A
Alex Williamson 已提交
700
static inline int iommu_device_link(struct device *dev, struct device *link)
701 702 703 704
{
	return -EINVAL;
}

A
Alex Williamson 已提交
705
static inline void iommu_device_unlink(struct device *dev, struct device *link)
706 707 708
{
}

R
Robin Murphy 已提交
709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725
static inline int iommu_fwspec_init(struct device *dev,
				    struct fwnode_handle *iommu_fwnode,
				    const struct iommu_ops *ops)
{
	return -ENODEV;
}

static inline void iommu_fwspec_free(struct device *dev)
{
}

static inline int iommu_fwspec_add_ids(struct device *dev, u32 *ids,
				       int num_ids)
{
	return -ENODEV;
}

726
static inline
727
const struct iommu_ops *iommu_ops_from_fwnode(struct fwnode_handle *fwnode)
728 729 730 731
{
	return NULL;
}

732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772
static inline bool
iommu_dev_has_feature(struct device *dev, enum iommu_dev_features feat)
{
	return false;
}

static inline bool
iommu_dev_feature_enabled(struct device *dev, enum iommu_dev_features feat)
{
	return false;
}

static inline int
iommu_dev_enable_feature(struct device *dev, enum iommu_dev_features feat)
{
	return -ENODEV;
}

static inline int
iommu_dev_disable_feature(struct device *dev, enum iommu_dev_features feat)
{
	return -ENODEV;
}

static inline int
iommu_aux_attach_device(struct iommu_domain *domain, struct device *dev)
{
	return -ENODEV;
}

static inline void
iommu_aux_detach_device(struct iommu_domain *domain, struct device *dev)
{
}

static inline int
iommu_aux_get_pasid(struct iommu_domain *domain, struct device *dev)
{
	return -ENODEV;
}

773 774
#endif /* CONFIG_IOMMU_API */

775 776 777 778 779 780 781
#ifdef CONFIG_IOMMU_DEBUGFS
extern	struct dentry *iommu_debugfs_dir;
void iommu_debugfs_setup(void);
#else
static inline void iommu_debugfs_setup(void) {}
#endif

782
#endif /* __LINUX_IOMMU_H */