at v3.2 5.6 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 24#define IOMMU_READ (1) 25#define IOMMU_WRITE (2) 26#define IOMMU_CACHE (4) /* DMA cache coherency */ 27 28struct iommu_ops; 29struct bus_type; 30struct device; 31struct iommu_domain; 32 33/* iommu fault flags */ 34#define IOMMU_FAULT_READ 0x0 35#define IOMMU_FAULT_WRITE 0x1 36 37typedef int (*iommu_fault_handler_t)(struct iommu_domain *, 38 struct device *, unsigned long, int); 39 40struct iommu_domain { 41 struct iommu_ops *ops; 42 void *priv; 43 iommu_fault_handler_t handler; 44}; 45 46#define IOMMU_CAP_CACHE_COHERENCY 0x1 47#define IOMMU_CAP_INTR_REMAP 0x2 /* isolates device intrs */ 48 49#ifdef CONFIG_IOMMU_API 50 51struct iommu_ops { 52 int (*domain_init)(struct iommu_domain *domain); 53 void (*domain_destroy)(struct iommu_domain *domain); 54 int (*attach_dev)(struct iommu_domain *domain, struct device *dev); 55 void (*detach_dev)(struct iommu_domain *domain, struct device *dev); 56 int (*map)(struct iommu_domain *domain, unsigned long iova, 57 phys_addr_t paddr, int gfp_order, int prot); 58 int (*unmap)(struct iommu_domain *domain, unsigned long iova, 59 int gfp_order); 60 phys_addr_t (*iova_to_phys)(struct iommu_domain *domain, 61 unsigned long iova); 62 int (*domain_has_cap)(struct iommu_domain *domain, 63 unsigned long cap); 64}; 65 66extern int bus_set_iommu(struct bus_type *bus, struct iommu_ops *ops); 67extern bool iommu_present(struct bus_type *bus); 68extern struct iommu_domain *iommu_domain_alloc(struct bus_type *bus); 69extern void iommu_domain_free(struct iommu_domain *domain); 70extern int iommu_attach_device(struct iommu_domain *domain, 71 struct device *dev); 72extern void iommu_detach_device(struct iommu_domain *domain, 73 struct device *dev); 74extern int iommu_map(struct iommu_domain *domain, unsigned long iova, 75 phys_addr_t paddr, int gfp_order, int prot); 76extern int iommu_unmap(struct iommu_domain *domain, unsigned long iova, 77 int gfp_order); 78extern phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, 79 unsigned long iova); 80extern int iommu_domain_has_cap(struct iommu_domain *domain, 81 unsigned long cap); 82extern void iommu_set_fault_handler(struct iommu_domain *domain, 83 iommu_fault_handler_t handler); 84 85/** 86 * report_iommu_fault() - report about an IOMMU fault to the IOMMU framework 87 * @domain: the iommu domain where the fault has happened 88 * @dev: the device where the fault has happened 89 * @iova: the faulting address 90 * @flags: mmu fault flags (e.g. IOMMU_FAULT_READ/IOMMU_FAULT_WRITE/...) 91 * 92 * This function should be called by the low-level IOMMU implementations 93 * whenever IOMMU faults happen, to allow high-level users, that are 94 * interested in such events, to know about them. 95 * 96 * This event may be useful for several possible use cases: 97 * - mere logging of the event 98 * - dynamic TLB/PTE loading 99 * - if restarting of the faulting device is required 100 * 101 * Returns 0 on success and an appropriate error code otherwise (if dynamic 102 * PTE/TLB loading will one day be supported, implementations will be able 103 * to tell whether it succeeded or not according to this return value). 104 * 105 * Specifically, -ENOSYS is returned if a fault handler isn't installed 106 * (though fault handlers can also return -ENOSYS, in case they want to 107 * elicit the default behavior of the IOMMU drivers). 108 */ 109static inline int report_iommu_fault(struct iommu_domain *domain, 110 struct device *dev, unsigned long iova, int flags) 111{ 112 int ret = -ENOSYS; 113 114 /* 115 * if upper layers showed interest and installed a fault handler, 116 * invoke it. 117 */ 118 if (domain->handler) 119 ret = domain->handler(domain, dev, iova, flags); 120 121 return ret; 122} 123 124#else /* CONFIG_IOMMU_API */ 125 126struct iommu_ops {}; 127 128static inline bool iommu_present(struct bus_type *bus) 129{ 130 return false; 131} 132 133static inline struct iommu_domain *iommu_domain_alloc(struct bus_type *bus) 134{ 135 return NULL; 136} 137 138static inline void iommu_domain_free(struct iommu_domain *domain) 139{ 140} 141 142static inline int iommu_attach_device(struct iommu_domain *domain, 143 struct device *dev) 144{ 145 return -ENODEV; 146} 147 148static inline void iommu_detach_device(struct iommu_domain *domain, 149 struct device *dev) 150{ 151} 152 153static inline int iommu_map(struct iommu_domain *domain, unsigned long iova, 154 phys_addr_t paddr, int gfp_order, int prot) 155{ 156 return -ENODEV; 157} 158 159static inline int iommu_unmap(struct iommu_domain *domain, unsigned long iova, 160 int gfp_order) 161{ 162 return -ENODEV; 163} 164 165static inline phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, 166 unsigned long iova) 167{ 168 return 0; 169} 170 171static inline int domain_has_cap(struct iommu_domain *domain, 172 unsigned long cap) 173{ 174 return 0; 175} 176 177static inline void iommu_set_fault_handler(struct iommu_domain *domain, 178 iommu_fault_handler_t handler) 179{ 180} 181 182#endif /* CONFIG_IOMMU_API */ 183 184#endif /* __LINUX_IOMMU_H */