linux/include/linux/iommu.h
<<
>>
Prefs
   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/of.h>
  25#include <linux/types.h>
  26#include <linux/scatterlist.h>
  27#include <trace/events/iommu.h>
  28
  29#define IOMMU_READ      (1 << 0)
  30#define IOMMU_WRITE     (1 << 1)
  31#define IOMMU_CACHE     (1 << 2) /* DMA cache coherency */
  32#define IOMMU_NOEXEC    (1 << 3)
  33#define IOMMU_MMIO      (1 << 4) /* e.g. things like MSI doorbells */
  34
  35struct iommu_ops;
  36struct iommu_group;
  37struct bus_type;
  38struct device;
  39struct iommu_domain;
  40struct notifier_block;
  41
  42/* iommu fault flags */
  43#define IOMMU_FAULT_READ        0x0
  44#define IOMMU_FAULT_WRITE       0x1
  45
  46typedef int (*iommu_fault_handler_t)(struct iommu_domain *,
  47                        struct device *, unsigned long, int, void *);
  48
  49struct iommu_domain_geometry {
  50        dma_addr_t aperture_start; /* First address that can be mapped    */
  51        dma_addr_t aperture_end;   /* Last address that can be mapped     */
  52        bool force_aperture;       /* DMA only allowed in mappable range? */
  53};
  54
  55/* Domain feature flags */
  56#define __IOMMU_DOMAIN_PAGING   (1U << 0)  /* Support for iommu_map/unmap */
  57#define __IOMMU_DOMAIN_DMA_API  (1U << 1)  /* Domain for use in DMA-API
  58                                              implementation              */
  59#define __IOMMU_DOMAIN_PT       (1U << 2)  /* Domain is identity mapped   */
  60
  61/*
  62 * This are the possible domain-types
  63 *
  64 *      IOMMU_DOMAIN_BLOCKED    - All DMA is blocked, can be used to isolate
  65 *                                devices
  66 *      IOMMU_DOMAIN_IDENTITY   - DMA addresses are system physical addresses
  67 *      IOMMU_DOMAIN_UNMANAGED  - DMA mappings managed by IOMMU-API user, used
  68 *                                for VMs
  69 *      IOMMU_DOMAIN_DMA        - Internally used for DMA-API implementations.
  70 *                                This flag allows IOMMU drivers to implement
  71 *                                certain optimizations for these domains
  72 */
  73#define IOMMU_DOMAIN_BLOCKED    (0U)
  74#define IOMMU_DOMAIN_IDENTITY   (__IOMMU_DOMAIN_PT)
  75#define IOMMU_DOMAIN_UNMANAGED  (__IOMMU_DOMAIN_PAGING)
  76#define IOMMU_DOMAIN_DMA        (__IOMMU_DOMAIN_PAGING |        \
  77                                 __IOMMU_DOMAIN_DMA_API)
  78
  79struct iommu_domain {
  80        unsigned type;
  81        const struct iommu_ops *ops;
  82        unsigned long pgsize_bitmap;    /* Bitmap of page sizes in use */
  83        iommu_fault_handler_t handler;
  84        void *handler_token;
  85        struct iommu_domain_geometry geometry;
  86        void *iova_cookie;
  87};
  88
  89enum iommu_cap {
  90        IOMMU_CAP_CACHE_COHERENCY,      /* IOMMU can enforce cache coherent DMA
  91                                           transactions */
  92        IOMMU_CAP_INTR_REMAP,           /* IOMMU supports interrupt isolation */
  93        IOMMU_CAP_NOEXEC,               /* IOMMU_NOEXEC flag */
  94};
  95
  96/*
  97 * Following constraints are specifc to FSL_PAMUV1:
  98 *  -aperture must be power of 2, and naturally aligned
  99 *  -number of windows must be power of 2, and address space size
 100 *   of each window is determined by aperture size / # of windows
 101 *  -the actual size of the mapped region of a window must be power
 102 *   of 2 starting with 4KB and physical address must be naturally
 103 *   aligned.
 104 * DOMAIN_ATTR_FSL_PAMUV1 corresponds to the above mentioned contraints.
 105 * The caller can invoke iommu_domain_get_attr to check if the underlying
 106 * iommu implementation supports these constraints.
 107 */
 108
 109enum iommu_attr {
 110        DOMAIN_ATTR_GEOMETRY,
 111        DOMAIN_ATTR_PAGING,
 112        DOMAIN_ATTR_WINDOWS,
 113        DOMAIN_ATTR_FSL_PAMU_STASH,
 114        DOMAIN_ATTR_FSL_PAMU_ENABLE,
 115        DOMAIN_ATTR_FSL_PAMUV1,
 116        DOMAIN_ATTR_NESTING,    /* two stages of translation */
 117        DOMAIN_ATTR_MAX,
 118};
 119
 120/**
 121 * struct iommu_dm_region - descriptor for a direct mapped memory region
 122 * @list: Linked list pointers
 123 * @start: System physical start address of the region
 124 * @length: Length of the region in bytes
 125 * @prot: IOMMU Protection flags (READ/WRITE/...)
 126 */
 127struct iommu_dm_region {
 128        struct list_head        list;
 129        phys_addr_t             start;
 130        size_t                  length;
 131        int                     prot;
 132};
 133
 134#ifdef CONFIG_IOMMU_API
 135
 136/**
 137 * struct iommu_ops - iommu ops and capabilities
 138 * @capable: check capability
 139 * @domain_alloc: allocate iommu domain
 140 * @domain_free: free iommu domain
 141 * @attach_dev: attach device to an iommu domain
 142 * @detach_dev: detach device from an iommu domain
 143 * @map: map a physically contiguous memory region to an iommu domain
 144 * @unmap: unmap a physically contiguous memory region from an iommu domain
 145 * @map_sg: map a scatter-gather list of physically contiguous memory chunks
 146 * to an iommu domain
 147 * @iova_to_phys: translate iova to physical address
 148 * @add_device: add device to iommu grouping
 149 * @remove_device: remove device from iommu grouping
 150 * @device_group: find iommu group for a particular device
 151 * @domain_get_attr: Query domain attributes
 152 * @domain_set_attr: Change domain attributes
 153 * @get_dm_regions: Request list of direct mapping requirements for a device
 154 * @put_dm_regions: Free list of direct mapping requirements for a device
 155 * @apply_dm_region: Temporary helper call-back for iova reserved ranges
 156 * @domain_window_enable: Configure and enable a particular window for a domain
 157 * @domain_window_disable: Disable a particular window for a domain
 158 * @domain_set_windows: Set the number of windows for a domain
 159 * @domain_get_windows: Return the number of windows for a domain
 160 * @of_xlate: add OF master IDs to iommu grouping
 161 * @pgsize_bitmap: bitmap of all possible supported page sizes
 162 */
 163struct iommu_ops {
 164        bool (*capable)(enum iommu_cap);
 165
 166        /* Domain allocation and freeing by the iommu driver */
 167        struct iommu_domain *(*domain_alloc)(unsigned iommu_domain_type);
 168        void (*domain_free)(struct iommu_domain *);
 169
 170        int (*attach_dev)(struct iommu_domain *domain, struct device *dev);
 171        void (*detach_dev)(struct iommu_domain *domain, struct device *dev);
 172        int (*map)(struct iommu_domain *domain, unsigned long iova,
 173                   phys_addr_t paddr, size_t size, int prot);
 174        size_t (*unmap)(struct iommu_domain *domain, unsigned long iova,
 175                     size_t size);
 176        size_t (*map_sg)(struct iommu_domain *domain, unsigned long iova,
 177                         struct scatterlist *sg, unsigned int nents, int prot);
 178        phys_addr_t (*iova_to_phys)(struct iommu_domain *domain, dma_addr_t iova);
 179        int (*add_device)(struct device *dev);
 180        void (*remove_device)(struct device *dev);
 181        struct iommu_group *(*device_group)(struct device *dev);
 182        int (*domain_get_attr)(struct iommu_domain *domain,
 183                               enum iommu_attr attr, void *data);
 184        int (*domain_set_attr)(struct iommu_domain *domain,
 185                               enum iommu_attr attr, void *data);
 186
 187        /* Request/Free a list of direct mapping requirements for a device */
 188        void (*get_dm_regions)(struct device *dev, struct list_head *list);
 189        void (*put_dm_regions)(struct device *dev, struct list_head *list);
 190        void (*apply_dm_region)(struct device *dev, struct iommu_domain *domain,
 191                                struct iommu_dm_region *region);
 192
 193        /* Window handling functions */
 194        int (*domain_window_enable)(struct iommu_domain *domain, u32 wnd_nr,
 195                                    phys_addr_t paddr, u64 size, int prot);
 196        void (*domain_window_disable)(struct iommu_domain *domain, u32 wnd_nr);
 197        /* Set the number of windows per domain */
 198        int (*domain_set_windows)(struct iommu_domain *domain, u32 w_count);
 199        /* Get the number of windows per domain */
 200        u32 (*domain_get_windows)(struct iommu_domain *domain);
 201
 202        int (*of_xlate)(struct device *dev, struct of_phandle_args *args);
 203
 204        unsigned long pgsize_bitmap;
 205};
 206
 207#define IOMMU_GROUP_NOTIFY_ADD_DEVICE           1 /* Device added */
 208#define IOMMU_GROUP_NOTIFY_DEL_DEVICE           2 /* Pre Device removed */
 209#define IOMMU_GROUP_NOTIFY_BIND_DRIVER          3 /* Pre Driver bind */
 210#define IOMMU_GROUP_NOTIFY_BOUND_DRIVER         4 /* Post Driver bind */
 211#define IOMMU_GROUP_NOTIFY_UNBIND_DRIVER        5 /* Pre Driver unbind */
 212#define IOMMU_GROUP_NOTIFY_UNBOUND_DRIVER       6 /* Post Driver unbind */
 213
 214extern int bus_set_iommu(struct bus_type *bus, const struct iommu_ops *ops);
 215extern bool iommu_present(struct bus_type *bus);
 216extern bool iommu_capable(struct bus_type *bus, enum iommu_cap cap);
 217extern struct iommu_domain *iommu_domain_alloc(struct bus_type *bus);
 218extern struct iommu_group *iommu_group_get_by_id(int id);
 219extern void iommu_domain_free(struct iommu_domain *domain);
 220extern int iommu_attach_device(struct iommu_domain *domain,
 221                               struct device *dev);
 222extern void iommu_detach_device(struct iommu_domain *domain,
 223                                struct device *dev);
 224extern struct iommu_domain *iommu_get_domain_for_dev(struct device *dev);
 225extern int iommu_map(struct iommu_domain *domain, unsigned long iova,
 226                     phys_addr_t paddr, size_t size, int prot);
 227extern size_t iommu_unmap(struct iommu_domain *domain, unsigned long iova,
 228                       size_t size);
 229extern size_t default_iommu_map_sg(struct iommu_domain *domain, unsigned long iova,
 230                                struct scatterlist *sg,unsigned int nents,
 231                                int prot);
 232extern phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, dma_addr_t iova);
 233extern void iommu_set_fault_handler(struct iommu_domain *domain,
 234                        iommu_fault_handler_t handler, void *token);
 235
 236extern void iommu_get_dm_regions(struct device *dev, struct list_head *list);
 237extern void iommu_put_dm_regions(struct device *dev, struct list_head *list);
 238extern int iommu_request_dm_for_dev(struct device *dev);
 239
 240extern int iommu_attach_group(struct iommu_domain *domain,
 241                              struct iommu_group *group);
 242extern void iommu_detach_group(struct iommu_domain *domain,
 243                               struct iommu_group *group);
 244extern struct iommu_group *iommu_group_alloc(void);
 245extern void *iommu_group_get_iommudata(struct iommu_group *group);
 246extern void iommu_group_set_iommudata(struct iommu_group *group,
 247                                      void *iommu_data,
 248                                      void (*release)(void *iommu_data));
 249extern int iommu_group_set_name(struct iommu_group *group, const char *name);
 250extern int iommu_group_add_device(struct iommu_group *group,
 251                                  struct device *dev);
 252extern void iommu_group_remove_device(struct device *dev);
 253extern int iommu_group_for_each_dev(struct iommu_group *group, void *data,
 254                                    int (*fn)(struct device *, void *));
 255extern struct iommu_group *iommu_group_get(struct device *dev);
 256extern void iommu_group_put(struct iommu_group *group);
 257extern int iommu_group_register_notifier(struct iommu_group *group,
 258                                         struct notifier_block *nb);
 259extern int iommu_group_unregister_notifier(struct iommu_group *group,
 260                                           struct notifier_block *nb);
 261extern int iommu_group_id(struct iommu_group *group);
 262extern struct iommu_group *iommu_group_get_for_dev(struct device *dev);
 263extern struct iommu_domain *iommu_group_default_domain(struct iommu_group *);
 264
 265extern int iommu_domain_get_attr(struct iommu_domain *domain, enum iommu_attr,
 266                                 void *data);
 267extern int iommu_domain_set_attr(struct iommu_domain *domain, enum iommu_attr,
 268                                 void *data);
 269struct device *iommu_device_create(struct device *parent, void *drvdata,
 270                                   const struct attribute_group **groups,
 271                                   const char *fmt, ...) __printf(4, 5);
 272void iommu_device_destroy(struct device *dev);
 273int iommu_device_link(struct device *dev, struct device *link);
 274void iommu_device_unlink(struct device *dev, struct device *link);
 275
 276/* Window handling function prototypes */
 277extern int iommu_domain_window_enable(struct iommu_domain *domain, u32 wnd_nr,
 278                                      phys_addr_t offset, u64 size,
 279                                      int prot);
 280extern void iommu_domain_window_disable(struct iommu_domain *domain, u32 wnd_nr);
 281/**
 282 * report_iommu_fault() - report about an IOMMU fault to the IOMMU framework
 283 * @domain: the iommu domain where the fault has happened
 284 * @dev: the device where the fault has happened
 285 * @iova: the faulting address
 286 * @flags: mmu fault flags (e.g. IOMMU_FAULT_READ/IOMMU_FAULT_WRITE/...)
 287 *
 288 * This function should be called by the low-level IOMMU implementations
 289 * whenever IOMMU faults happen, to allow high-level users, that are
 290 * interested in such events, to know about them.
 291 *
 292 * This event may be useful for several possible use cases:
 293 * - mere logging of the event
 294 * - dynamic TLB/PTE loading
 295 * - if restarting of the faulting device is required
 296 *
 297 * Returns 0 on success and an appropriate error code otherwise (if dynamic
 298 * PTE/TLB loading will one day be supported, implementations will be able
 299 * to tell whether it succeeded or not according to this return value).
 300 *
 301 * Specifically, -ENOSYS is returned if a fault handler isn't installed
 302 * (though fault handlers can also return -ENOSYS, in case they want to
 303 * elicit the default behavior of the IOMMU drivers).
 304 */
 305static inline int report_iommu_fault(struct iommu_domain *domain,
 306                struct device *dev, unsigned long iova, int flags)
 307{
 308        int ret = -ENOSYS;
 309
 310        /*
 311         * if upper layers showed interest and installed a fault handler,
 312         * invoke it.
 313         */
 314        if (domain->handler)
 315                ret = domain->handler(domain, dev, iova, flags,
 316                                                domain->handler_token);
 317
 318        trace_io_page_fault(dev, iova, flags);
 319        return ret;
 320}
 321
 322static inline size_t iommu_map_sg(struct iommu_domain *domain,
 323                                  unsigned long iova, struct scatterlist *sg,
 324                                  unsigned int nents, int prot)
 325{
 326        return domain->ops->map_sg(domain, iova, sg, nents, prot);
 327}
 328
 329/* PCI device grouping function */
 330extern struct iommu_group *pci_device_group(struct device *dev);
 331/* Generic device grouping function */
 332extern struct iommu_group *generic_device_group(struct device *dev);
 333
 334/**
 335 * struct iommu_fwspec - per-device IOMMU instance data
 336 * @ops: ops for this device's IOMMU
 337 * @iommu_fwnode: firmware handle for this device's IOMMU
 338 * @iommu_priv: IOMMU driver private data for this device
 339 * @num_ids: number of associated device IDs
 340 * @ids: IDs which this device may present to the IOMMU
 341 */
 342struct iommu_fwspec {
 343        const struct iommu_ops  *ops;
 344        struct fwnode_handle    *iommu_fwnode;
 345        void                    *iommu_priv;
 346        unsigned int            num_ids;
 347        u32                     ids[1];
 348};
 349
 350int iommu_fwspec_init(struct device *dev, struct fwnode_handle *iommu_fwnode,
 351                      const struct iommu_ops *ops);
 352void iommu_fwspec_free(struct device *dev);
 353int iommu_fwspec_add_ids(struct device *dev, u32 *ids, int num_ids);
 354
 355#else /* CONFIG_IOMMU_API */
 356
 357struct iommu_ops {};
 358struct iommu_group {};
 359struct iommu_fwspec {};
 360
 361static inline bool iommu_present(struct bus_type *bus)
 362{
 363        return false;
 364}
 365
 366static inline bool iommu_capable(struct bus_type *bus, enum iommu_cap cap)
 367{
 368        return false;
 369}
 370
 371static inline struct iommu_domain *iommu_domain_alloc(struct bus_type *bus)
 372{
 373        return NULL;
 374}
 375
 376static inline struct iommu_group *iommu_group_get_by_id(int id)
 377{
 378        return NULL;
 379}
 380
 381static inline void iommu_domain_free(struct iommu_domain *domain)
 382{
 383}
 384
 385static inline int iommu_attach_device(struct iommu_domain *domain,
 386                                      struct device *dev)
 387{
 388        return -ENODEV;
 389}
 390
 391static inline void iommu_detach_device(struct iommu_domain *domain,
 392                                       struct device *dev)
 393{
 394}
 395
 396static inline struct iommu_domain *iommu_get_domain_for_dev(struct device *dev)
 397{
 398        return NULL;
 399}
 400
 401static inline int iommu_map(struct iommu_domain *domain, unsigned long iova,
 402                            phys_addr_t paddr, int gfp_order, int prot)
 403{
 404        return -ENODEV;
 405}
 406
 407static inline int iommu_unmap(struct iommu_domain *domain, unsigned long iova,
 408                              int gfp_order)
 409{
 410        return -ENODEV;
 411}
 412
 413static inline size_t iommu_map_sg(struct iommu_domain *domain,
 414                                  unsigned long iova, struct scatterlist *sg,
 415                                  unsigned int nents, int prot)
 416{
 417        return -ENODEV;
 418}
 419
 420static inline int iommu_domain_window_enable(struct iommu_domain *domain,
 421                                             u32 wnd_nr, phys_addr_t paddr,
 422                                             u64 size, int prot)
 423{
 424        return -ENODEV;
 425}
 426
 427static inline void iommu_domain_window_disable(struct iommu_domain *domain,
 428                                               u32 wnd_nr)
 429{
 430}
 431
 432static inline phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, dma_addr_t iova)
 433{
 434        return 0;
 435}
 436
 437static inline void iommu_set_fault_handler(struct iommu_domain *domain,
 438                                iommu_fault_handler_t handler, void *token)
 439{
 440}
 441
 442static inline void iommu_get_dm_regions(struct device *dev,
 443                                        struct list_head *list)
 444{
 445}
 446
 447static inline void iommu_put_dm_regions(struct device *dev,
 448                                        struct list_head *list)
 449{
 450}
 451
 452static inline int iommu_request_dm_for_dev(struct device *dev)
 453{
 454        return -ENODEV;
 455}
 456
 457static inline int iommu_attach_group(struct iommu_domain *domain,
 458                                     struct iommu_group *group)
 459{
 460        return -ENODEV;
 461}
 462
 463static inline void iommu_detach_group(struct iommu_domain *domain,
 464                                      struct iommu_group *group)
 465{
 466}
 467
 468static inline struct iommu_group *iommu_group_alloc(void)
 469{
 470        return ERR_PTR(-ENODEV);
 471}
 472
 473static inline void *iommu_group_get_iommudata(struct iommu_group *group)
 474{
 475        return NULL;
 476}
 477
 478static inline void iommu_group_set_iommudata(struct iommu_group *group,
 479                                             void *iommu_data,
 480                                             void (*release)(void *iommu_data))
 481{
 482}
 483
 484static inline int iommu_group_set_name(struct iommu_group *group,
 485                                       const char *name)
 486{
 487        return -ENODEV;
 488}
 489
 490static inline int iommu_group_add_device(struct iommu_group *group,
 491                                         struct device *dev)
 492{
 493        return -ENODEV;
 494}
 495
 496static inline void iommu_group_remove_device(struct device *dev)
 497{
 498}
 499
 500static inline int iommu_group_for_each_dev(struct iommu_group *group,
 501                                           void *data,
 502                                           int (*fn)(struct device *, void *))
 503{
 504        return -ENODEV;
 505}
 506
 507static inline struct iommu_group *iommu_group_get(struct device *dev)
 508{
 509        return NULL;
 510}
 511
 512static inline void iommu_group_put(struct iommu_group *group)
 513{
 514}
 515
 516static inline int iommu_group_register_notifier(struct iommu_group *group,
 517                                                struct notifier_block *nb)
 518{
 519        return -ENODEV;
 520}
 521
 522static inline int iommu_group_unregister_notifier(struct iommu_group *group,
 523                                                  struct notifier_block *nb)
 524{
 525        return 0;
 526}
 527
 528static inline int iommu_group_id(struct iommu_group *group)
 529{
 530        return -ENODEV;
 531}
 532
 533static inline int iommu_domain_get_attr(struct iommu_domain *domain,
 534                                        enum iommu_attr attr, void *data)
 535{
 536        return -EINVAL;
 537}
 538
 539static inline int iommu_domain_set_attr(struct iommu_domain *domain,
 540                                        enum iommu_attr attr, void *data)
 541{
 542        return -EINVAL;
 543}
 544
 545static inline struct device *iommu_device_create(struct device *parent,
 546                                        void *drvdata,
 547                                        const struct attribute_group **groups,
 548                                        const char *fmt, ...)
 549{
 550        return ERR_PTR(-ENODEV);
 551}
 552
 553static inline void iommu_device_destroy(struct device *dev)
 554{
 555}
 556
 557static inline int iommu_device_link(struct device *dev, struct device *link)
 558{
 559        return -EINVAL;
 560}
 561
 562static inline void iommu_device_unlink(struct device *dev, struct device *link)
 563{
 564}
 565
 566static inline int iommu_fwspec_init(struct device *dev,
 567                                    struct fwnode_handle *iommu_fwnode,
 568                                    const struct iommu_ops *ops)
 569{
 570        return -ENODEV;
 571}
 572
 573static inline void iommu_fwspec_free(struct device *dev)
 574{
 575}
 576
 577static inline int iommu_fwspec_add_ids(struct device *dev, u32 *ids,
 578                                       int num_ids)
 579{
 580        return -ENODEV;
 581}
 582
 583#endif /* CONFIG_IOMMU_API */
 584
 585#endif /* __LINUX_IOMMU_H */
 586