linux/include/linux/iommu.h History
<<
>>
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#define IOMMU_READ      (1)
  23#define IOMMU_WRITE     (2)
  24#define IOMMU_CACHE     (4) /* DMA cache coherency */
  25
  26struct device;
  27
  28struct iommu_domain {
  29        void *priv;
  30};
  31
  32#define IOMMU_CAP_CACHE_COHERENCY       0x1
  33
  34struct iommu_ops {
  35        int (*domain_init)(struct iommu_domain *domain);
  36        void (*domain_destroy)(struct iommu_domain *domain);
  37        int (*attach_dev)(struct iommu_domain *domain, struct device *dev);
  38        void (*detach_dev)(struct iommu_domain *domain, struct device *dev);
  39        int (*map)(struct iommu_domain *domain, unsigned long iova,
  40                   phys_addr_t paddr, size_t size, int prot);
  41        void (*unmap)(struct iommu_domain *domain, unsigned long iova,
  42                      size_t size);
  43        phys_addr_t (*iova_to_phys)(struct iommu_domain *domain,
  44                                    unsigned long iova);
  45        int (*domain_has_cap)(struct iommu_domain *domain,
  46                              unsigned long cap);
  47};
  48
  49#ifdef CONFIG_IOMMU_API
  50
  51extern void register_iommu(struct iommu_ops *ops);
  52extern bool iommu_found(void);
  53extern struct iommu_domain *iommu_domain_alloc(void);
  54extern void iommu_domain_free(struct iommu_domain *domain);
  55extern int iommu_attach_device(struct iommu_domain *domain,
  56                               struct device *dev);
  57extern void iommu_detach_device(struct iommu_domain *domain,
  58                                struct device *dev);
  59extern int iommu_map_range(struct iommu_domain *domain, unsigned long iova,
  60                           phys_addr_t paddr, size_t size, int prot);
  61extern void iommu_unmap_range(struct iommu_domain *domain, unsigned long iova,
  62                              size_t size);
  63extern phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain,
  64                                      unsigned long iova);
  65extern int iommu_domain_has_cap(struct iommu_domain *domain,
  66                                unsigned long cap);
  67
  68#else /* CONFIG_IOMMU_API */
  69
  70static inline void register_iommu(struct iommu_ops *ops)
  71{
  72}
  73
  74static inline bool iommu_found(void)
  75{
  76        return false;
  77}
  78
  79static inline struct iommu_domain *iommu_domain_alloc(void)
  80{
  81        return NULL;
  82}
  83
  84static inline void iommu_domain_free(struct iommu_domain *domain)
  85{
  86}
  87
  88static inline int iommu_attach_device(struct iommu_domain *domain,
  89                                      struct device *dev)
  90{
  91        return -ENODEV;
  92}
  93
  94static inline void iommu_detach_device(struct iommu_domain *domain,
  95                                       struct device *dev)
  96{
  97}
  98
  99static inline int iommu_map_range(struct iommu_domain *domain,
 100                                  unsigned long iova, phys_addr_t paddr,
 101                                  size_t size, int prot)
 102{
 103        return -ENODEV;
 104}
 105
 106static inline void iommu_unmap_range(struct iommu_domain *domain,
 107                                     unsigned long iova, size_t size)
 108{
 109}
 110
 111static inline phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain,
 112                                             unsigned long iova)
 113{
 114        return 0;
 115}
 116
 117static inline int domain_has_cap(struct iommu_domain *domain,
 118                                 unsigned long cap)
 119{
 120        return 0;
 121}
 122
 123#endif /* CONFIG_IOMMU_API */
 124
 125#endif /* __LINUX_IOMMU_H */
 126
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.