1 /* 2 * Copyright (C) 2007-2008 Advanced Micro Devices, Inc. 3 * Author: Joerg Roedel <[email protected]> 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 26 struct device; 27 28 struct iommu_domain { 29 void *priv; 30 }; 31 32 #define IOMMU_CAP_CACHE_COHERENCY 0x1 33 34 struct 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 51 extern void register_iommu(struct iommu_ops *ops); 52 extern bool iommu_found(void); 53 extern struct iommu_domain *iommu_domain_alloc(void); 54 extern void iommu_domain_free(struct iommu_domain *domain); 55 extern int iommu_attach_device(struct iommu_domain *domain, 56 struct device *dev); 57 extern void iommu_detach_device(struct iommu_domain *domain, 58 struct device *dev); 59 extern int iommu_map_range(struct iommu_domain *domain, unsigned long iova, 60 phys_addr_t paddr, size_t size, int prot); 61 extern void iommu_unmap_range(struct iommu_domain *domain, unsigned long iova, 62 size_t size); 63 extern phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, 64 unsigned long iova); 65 extern int iommu_domain_has_cap(struct iommu_domain *domain, 66 unsigned long cap); 67 68 #else /* CONFIG_IOMMU_API */ 69 70 static inline void register_iommu(struct iommu_ops *ops) 71 { 72 } 73 74 static inline bool iommu_found(void) 75 { 76 return false; 77 } 78 79 static inline struct iommu_domain *iommu_domain_alloc(void) 80 { 81 return NULL; 82 } 83 84 static inline void iommu_domain_free(struct iommu_domain *domain) 85 { 86 } 87 88 static inline int iommu_attach_device(struct iommu_domain *domain, 89 struct device *dev) 90 { 91 return -ENODEV; 92 } 93 94 static inline void iommu_detach_device(struct iommu_domain *domain, 95 struct device *dev) 96 { 97 } 98 99 static 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 106 static inline void iommu_unmap_range(struct iommu_domain *domain, 107 unsigned long iova, size_t size) 108 { 109 } 110 111 static inline phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, 112 unsigned long iova) 113 { 114 return 0; 115 } 116 117 static 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