at v3.0 3.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#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#define IOMMU_CAP_INTR_REMAP 0x2 /* isolates device intrs */ 34 35struct iommu_ops { 36 int (*domain_init)(struct iommu_domain *domain); 37 void (*domain_destroy)(struct iommu_domain *domain); 38 int (*attach_dev)(struct iommu_domain *domain, struct device *dev); 39 void (*detach_dev)(struct iommu_domain *domain, struct device *dev); 40 int (*map)(struct iommu_domain *domain, unsigned long iova, 41 phys_addr_t paddr, int gfp_order, int prot); 42 int (*unmap)(struct iommu_domain *domain, unsigned long iova, 43 int gfp_order); 44 phys_addr_t (*iova_to_phys)(struct iommu_domain *domain, 45 unsigned long iova); 46 int (*domain_has_cap)(struct iommu_domain *domain, 47 unsigned long cap); 48}; 49 50#ifdef CONFIG_IOMMU_API 51 52extern void register_iommu(struct iommu_ops *ops); 53extern bool iommu_found(void); 54extern struct iommu_domain *iommu_domain_alloc(void); 55extern void iommu_domain_free(struct iommu_domain *domain); 56extern int iommu_attach_device(struct iommu_domain *domain, 57 struct device *dev); 58extern void iommu_detach_device(struct iommu_domain *domain, 59 struct device *dev); 60extern int iommu_map(struct iommu_domain *domain, unsigned long iova, 61 phys_addr_t paddr, int gfp_order, int prot); 62extern int iommu_unmap(struct iommu_domain *domain, unsigned long iova, 63 int gfp_order); 64extern phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, 65 unsigned long iova); 66extern int iommu_domain_has_cap(struct iommu_domain *domain, 67 unsigned long cap); 68 69#else /* CONFIG_IOMMU_API */ 70 71static inline void register_iommu(struct iommu_ops *ops) 72{ 73} 74 75static inline bool iommu_found(void) 76{ 77 return false; 78} 79 80static inline struct iommu_domain *iommu_domain_alloc(void) 81{ 82 return NULL; 83} 84 85static inline void iommu_domain_free(struct iommu_domain *domain) 86{ 87} 88 89static inline int iommu_attach_device(struct iommu_domain *domain, 90 struct device *dev) 91{ 92 return -ENODEV; 93} 94 95static inline void iommu_detach_device(struct iommu_domain *domain, 96 struct device *dev) 97{ 98} 99 100static inline int iommu_map(struct iommu_domain *domain, unsigned long iova, 101 phys_addr_t paddr, int gfp_order, int prot) 102{ 103 return -ENODEV; 104} 105 106static inline int iommu_unmap(struct iommu_domain *domain, unsigned long iova, 107 int gfp_order) 108{ 109 return -ENODEV; 110} 111 112static inline phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, 113 unsigned long iova) 114{ 115 return 0; 116} 117 118static inline int domain_has_cap(struct iommu_domain *domain, 119 unsigned long cap) 120{ 121 return 0; 122} 123 124#endif /* CONFIG_IOMMU_API */ 125 126#endif /* __LINUX_IOMMU_H */