at v3.10 12 kB view raw
1/* 2 * Copyright (C) 2007-2008 Advanced Micro Devices, Inc. 3 * Author: Joerg Roedel <joerg.roedel@amd.com> 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/err.h> 24#include <linux/types.h> 25 26#define IOMMU_READ (1) 27#define IOMMU_WRITE (2) 28#define IOMMU_CACHE (4) /* DMA cache coherency */ 29 30struct iommu_ops; 31struct iommu_group; 32struct bus_type; 33struct device; 34struct iommu_domain; 35struct notifier_block; 36 37/* iommu fault flags */ 38#define IOMMU_FAULT_READ 0x0 39#define IOMMU_FAULT_WRITE 0x1 40 41typedef int (*iommu_fault_handler_t)(struct iommu_domain *, 42 struct device *, unsigned long, int, void *); 43 44struct iommu_domain_geometry { 45 dma_addr_t aperture_start; /* First address that can be mapped */ 46 dma_addr_t aperture_end; /* Last address that can be mapped */ 47 bool force_aperture; /* DMA only allowed in mappable range? */ 48}; 49 50struct iommu_domain { 51 struct iommu_ops *ops; 52 void *priv; 53 iommu_fault_handler_t handler; 54 void *handler_token; 55 struct iommu_domain_geometry geometry; 56}; 57 58#define IOMMU_CAP_CACHE_COHERENCY 0x1 59#define IOMMU_CAP_INTR_REMAP 0x2 /* isolates device intrs */ 60 61enum iommu_attr { 62 DOMAIN_ATTR_GEOMETRY, 63 DOMAIN_ATTR_PAGING, 64 DOMAIN_ATTR_WINDOWS, 65 DOMAIN_ATTR_MAX, 66}; 67 68#ifdef CONFIG_IOMMU_API 69 70/** 71 * struct iommu_ops - iommu ops and capabilities 72 * @domain_init: init iommu domain 73 * @domain_destroy: destroy iommu domain 74 * @attach_dev: attach device to an iommu domain 75 * @detach_dev: detach device from an iommu domain 76 * @map: map a physically contiguous memory region to an iommu domain 77 * @unmap: unmap a physically contiguous memory region from an iommu domain 78 * @iova_to_phys: translate iova to physical address 79 * @domain_has_cap: domain capabilities query 80 * @add_device: add device to iommu grouping 81 * @remove_device: remove device from iommu grouping 82 * @domain_get_attr: Query domain attributes 83 * @domain_set_attr: Change domain attributes 84 * @pgsize_bitmap: bitmap of supported page sizes 85 */ 86struct iommu_ops { 87 int (*domain_init)(struct iommu_domain *domain); 88 void (*domain_destroy)(struct iommu_domain *domain); 89 int (*attach_dev)(struct iommu_domain *domain, struct device *dev); 90 void (*detach_dev)(struct iommu_domain *domain, struct device *dev); 91 int (*map)(struct iommu_domain *domain, unsigned long iova, 92 phys_addr_t paddr, size_t size, int prot); 93 size_t (*unmap)(struct iommu_domain *domain, unsigned long iova, 94 size_t size); 95 phys_addr_t (*iova_to_phys)(struct iommu_domain *domain, dma_addr_t iova); 96 int (*domain_has_cap)(struct iommu_domain *domain, 97 unsigned long cap); 98 int (*add_device)(struct device *dev); 99 void (*remove_device)(struct device *dev); 100 int (*device_group)(struct device *dev, unsigned int *groupid); 101 int (*domain_get_attr)(struct iommu_domain *domain, 102 enum iommu_attr attr, void *data); 103 int (*domain_set_attr)(struct iommu_domain *domain, 104 enum iommu_attr attr, void *data); 105 106 /* Window handling functions */ 107 int (*domain_window_enable)(struct iommu_domain *domain, u32 wnd_nr, 108 phys_addr_t paddr, u64 size, int prot); 109 void (*domain_window_disable)(struct iommu_domain *domain, u32 wnd_nr); 110 /* Set the numer of window per domain */ 111 int (*domain_set_windows)(struct iommu_domain *domain, u32 w_count); 112 /* Get the numer of window per domain */ 113 u32 (*domain_get_windows)(struct iommu_domain *domain); 114 115 unsigned long pgsize_bitmap; 116}; 117 118#define IOMMU_GROUP_NOTIFY_ADD_DEVICE 1 /* Device added */ 119#define IOMMU_GROUP_NOTIFY_DEL_DEVICE 2 /* Pre Device removed */ 120#define IOMMU_GROUP_NOTIFY_BIND_DRIVER 3 /* Pre Driver bind */ 121#define IOMMU_GROUP_NOTIFY_BOUND_DRIVER 4 /* Post Driver bind */ 122#define IOMMU_GROUP_NOTIFY_UNBIND_DRIVER 5 /* Pre Driver unbind */ 123#define IOMMU_GROUP_NOTIFY_UNBOUND_DRIVER 6 /* Post Driver unbind */ 124 125extern int bus_set_iommu(struct bus_type *bus, struct iommu_ops *ops); 126extern bool iommu_present(struct bus_type *bus); 127extern struct iommu_domain *iommu_domain_alloc(struct bus_type *bus); 128extern struct iommu_group *iommu_group_get_by_id(int id); 129extern void iommu_domain_free(struct iommu_domain *domain); 130extern int iommu_attach_device(struct iommu_domain *domain, 131 struct device *dev); 132extern void iommu_detach_device(struct iommu_domain *domain, 133 struct device *dev); 134extern int iommu_map(struct iommu_domain *domain, unsigned long iova, 135 phys_addr_t paddr, size_t size, int prot); 136extern size_t iommu_unmap(struct iommu_domain *domain, unsigned long iova, 137 size_t size); 138extern phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, dma_addr_t iova); 139extern int iommu_domain_has_cap(struct iommu_domain *domain, 140 unsigned long cap); 141extern void iommu_set_fault_handler(struct iommu_domain *domain, 142 iommu_fault_handler_t handler, void *token); 143 144extern int iommu_attach_group(struct iommu_domain *domain, 145 struct iommu_group *group); 146extern void iommu_detach_group(struct iommu_domain *domain, 147 struct iommu_group *group); 148extern struct iommu_group *iommu_group_alloc(void); 149extern void *iommu_group_get_iommudata(struct iommu_group *group); 150extern void iommu_group_set_iommudata(struct iommu_group *group, 151 void *iommu_data, 152 void (*release)(void *iommu_data)); 153extern int iommu_group_set_name(struct iommu_group *group, const char *name); 154extern int iommu_group_add_device(struct iommu_group *group, 155 struct device *dev); 156extern void iommu_group_remove_device(struct device *dev); 157extern int iommu_group_for_each_dev(struct iommu_group *group, void *data, 158 int (*fn)(struct device *, void *)); 159extern struct iommu_group *iommu_group_get(struct device *dev); 160extern void iommu_group_put(struct iommu_group *group); 161extern int iommu_group_register_notifier(struct iommu_group *group, 162 struct notifier_block *nb); 163extern int iommu_group_unregister_notifier(struct iommu_group *group, 164 struct notifier_block *nb); 165extern int iommu_group_id(struct iommu_group *group); 166 167extern int iommu_domain_get_attr(struct iommu_domain *domain, enum iommu_attr, 168 void *data); 169extern int iommu_domain_set_attr(struct iommu_domain *domain, enum iommu_attr, 170 void *data); 171 172/* Window handling function prototypes */ 173extern int iommu_domain_window_enable(struct iommu_domain *domain, u32 wnd_nr, 174 phys_addr_t offset, u64 size, 175 int prot); 176extern void iommu_domain_window_disable(struct iommu_domain *domain, u32 wnd_nr); 177/** 178 * report_iommu_fault() - report about an IOMMU fault to the IOMMU framework 179 * @domain: the iommu domain where the fault has happened 180 * @dev: the device where the fault has happened 181 * @iova: the faulting address 182 * @flags: mmu fault flags (e.g. IOMMU_FAULT_READ/IOMMU_FAULT_WRITE/...) 183 * 184 * This function should be called by the low-level IOMMU implementations 185 * whenever IOMMU faults happen, to allow high-level users, that are 186 * interested in such events, to know about them. 187 * 188 * This event may be useful for several possible use cases: 189 * - mere logging of the event 190 * - dynamic TLB/PTE loading 191 * - if restarting of the faulting device is required 192 * 193 * Returns 0 on success and an appropriate error code otherwise (if dynamic 194 * PTE/TLB loading will one day be supported, implementations will be able 195 * to tell whether it succeeded or not according to this return value). 196 * 197 * Specifically, -ENOSYS is returned if a fault handler isn't installed 198 * (though fault handlers can also return -ENOSYS, in case they want to 199 * elicit the default behavior of the IOMMU drivers). 200 */ 201static inline int report_iommu_fault(struct iommu_domain *domain, 202 struct device *dev, unsigned long iova, int flags) 203{ 204 int ret = -ENOSYS; 205 206 /* 207 * if upper layers showed interest and installed a fault handler, 208 * invoke it. 209 */ 210 if (domain->handler) 211 ret = domain->handler(domain, dev, iova, flags, 212 domain->handler_token); 213 214 return ret; 215} 216 217#else /* CONFIG_IOMMU_API */ 218 219struct iommu_ops {}; 220struct iommu_group {}; 221 222static inline bool iommu_present(struct bus_type *bus) 223{ 224 return false; 225} 226 227static inline struct iommu_domain *iommu_domain_alloc(struct bus_type *bus) 228{ 229 return NULL; 230} 231 232static inline void iommu_domain_free(struct iommu_domain *domain) 233{ 234} 235 236static inline int iommu_attach_device(struct iommu_domain *domain, 237 struct device *dev) 238{ 239 return -ENODEV; 240} 241 242static inline void iommu_detach_device(struct iommu_domain *domain, 243 struct device *dev) 244{ 245} 246 247static inline int iommu_map(struct iommu_domain *domain, unsigned long iova, 248 phys_addr_t paddr, int gfp_order, int prot) 249{ 250 return -ENODEV; 251} 252 253static inline int iommu_unmap(struct iommu_domain *domain, unsigned long iova, 254 int gfp_order) 255{ 256 return -ENODEV; 257} 258 259static inline int iommu_domain_window_enable(struct iommu_domain *domain, 260 u32 wnd_nr, phys_addr_t paddr, 261 u64 size, int prot) 262{ 263 return -ENODEV; 264} 265 266static inline void iommu_domain_window_disable(struct iommu_domain *domain, 267 u32 wnd_nr) 268{ 269} 270 271static inline phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, dma_addr_t iova) 272{ 273 return 0; 274} 275 276static inline int domain_has_cap(struct iommu_domain *domain, 277 unsigned long cap) 278{ 279 return 0; 280} 281 282static inline void iommu_set_fault_handler(struct iommu_domain *domain, 283 iommu_fault_handler_t handler, void *token) 284{ 285} 286 287static inline int iommu_attach_group(struct iommu_domain *domain, 288 struct iommu_group *group) 289{ 290 return -ENODEV; 291} 292 293static inline void iommu_detach_group(struct iommu_domain *domain, 294 struct iommu_group *group) 295{ 296} 297 298static inline struct iommu_group *iommu_group_alloc(void) 299{ 300 return ERR_PTR(-ENODEV); 301} 302 303static inline void *iommu_group_get_iommudata(struct iommu_group *group) 304{ 305 return NULL; 306} 307 308static inline void iommu_group_set_iommudata(struct iommu_group *group, 309 void *iommu_data, 310 void (*release)(void *iommu_data)) 311{ 312} 313 314static inline int iommu_group_set_name(struct iommu_group *group, 315 const char *name) 316{ 317 return -ENODEV; 318} 319 320static inline int iommu_group_add_device(struct iommu_group *group, 321 struct device *dev) 322{ 323 return -ENODEV; 324} 325 326static inline void iommu_group_remove_device(struct device *dev) 327{ 328} 329 330static inline int iommu_group_for_each_dev(struct iommu_group *group, 331 void *data, 332 int (*fn)(struct device *, void *)) 333{ 334 return -ENODEV; 335} 336 337static inline struct iommu_group *iommu_group_get(struct device *dev) 338{ 339 return NULL; 340} 341 342static inline void iommu_group_put(struct iommu_group *group) 343{ 344} 345 346static inline int iommu_group_register_notifier(struct iommu_group *group, 347 struct notifier_block *nb) 348{ 349 return -ENODEV; 350} 351 352static inline int iommu_group_unregister_notifier(struct iommu_group *group, 353 struct notifier_block *nb) 354{ 355 return 0; 356} 357 358static inline int iommu_group_id(struct iommu_group *group) 359{ 360 return -ENODEV; 361} 362 363static inline int iommu_domain_get_attr(struct iommu_domain *domain, 364 enum iommu_attr attr, void *data) 365{ 366 return -EINVAL; 367} 368 369static inline int iommu_domain_set_attr(struct iommu_domain *domain, 370 enum iommu_attr attr, void *data) 371{ 372 return -EINVAL; 373} 374 375#endif /* CONFIG_IOMMU_API */ 376 377#endif /* __LINUX_IOMMU_H */