Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
iommu.h
Go to the documentation of this file.
1 /*
2  * omap iommu: main structures
3  *
4  * Copyright (C) 2008-2009 Nokia Corporation
5  *
6  * Written by Hiroshi DOYU <[email protected]>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as
10  * published by the Free Software Foundation.
11  */
12 
13 #ifndef __MACH_IOMMU_H
14 #define __MACH_IOMMU_H
15 
16 struct iotlb_entry {
20  union {
22  struct {
24  };
25  };
26 };
27 
28 struct omap_iommu {
29  const char *name;
30  struct module *owner;
31  struct clk *clk;
33  struct device *dev;
34  void *isr_priv;
36 
37  unsigned int refcount;
38  spinlock_t iommu_lock; /* global for this whole object */
39 
40  /*
41  * We don't change iopgd for a situation like pgd for a task,
42  * but share it globally for each iommu.
43  */
45  spinlock_t page_table_lock; /* protect iopgd */
46 
48 
49  struct list_head mmap;
50  struct mutex mmap_lock; /* protect mmap */
51 
52  void *ctx; /* iommu context: registres saved area */
55 };
56 
57 struct cr_regs {
58  union {
59  struct {
62  };
64  };
65  union {
66  struct {
69  };
71  };
72 };
73 
74 struct iotlb_lock {
75  short base;
76  short vict;
77 };
78 
79 /* architecture specific functions */
81  unsigned long version;
82 
83  int (*enable)(struct omap_iommu *obj);
84  void (*disable)(struct omap_iommu *obj);
85  void (*set_twl)(struct omap_iommu *obj, bool on);
86  u32 (*fault_isr)(struct omap_iommu *obj, u32 *ra);
87 
88  void (*tlb_read_cr)(struct omap_iommu *obj, struct cr_regs *cr);
89  void (*tlb_load_cr)(struct omap_iommu *obj, struct cr_regs *cr);
90 
91  struct cr_regs *(*alloc_cr)(struct omap_iommu *obj,
92  struct iotlb_entry *e);
93  int (*cr_valid)(struct cr_regs *cr);
94  u32 (*cr_to_virt)(struct cr_regs *cr);
95  void (*cr_to_e)(struct cr_regs *cr, struct iotlb_entry *e);
96  ssize_t (*dump_cr)(struct omap_iommu *obj, struct cr_regs *cr,
97  char *buf);
98 
100 
101  void (*save_ctx)(struct omap_iommu *obj);
102  void (*restore_ctx)(struct omap_iommu *obj);
103  ssize_t (*dump_ctx)(struct omap_iommu *obj, char *buf, ssize_t len);
104 };
105 
117 };
118 
120  const char *name;
121  const char *clk_name;
122  const int nr_tlb_entries;
125 };
126 
138  const char *name;
140 };
141 
142 #ifdef CONFIG_IOMMU_API
143 
147 static inline struct omap_iommu *dev_to_omap_iommu(struct device *dev)
148 {
149  struct omap_iommu_arch_data *arch_data = dev->archdata.iommu;
150 
151  return arch_data->iommu_dev;
152 }
153 #endif
154 
155 /* IOMMU errors */
156 #define OMAP_IOMMU_ERR_TLB_MISS (1 << 0)
157 #define OMAP_IOMMU_ERR_TRANS_FAULT (1 << 1)
158 #define OMAP_IOMMU_ERR_EMU_MISS (1 << 2)
159 #define OMAP_IOMMU_ERR_TBLWALK_FAULT (1 << 3)
160 #define OMAP_IOMMU_ERR_MULTIHIT_FAULT (1 << 4)
161 
162 #if defined(CONFIG_ARCH_OMAP1)
163 #error "iommu for this processor not implemented yet"
164 #else
165 #include <plat/iommu2.h>
166 #endif
167 
168 /*
169  * utilities for super page(16MB, 1MB, 64KB and 4KB)
170  */
171 
172 #define iopgsz_max(bytes) \
173  (((bytes) >= SZ_16M) ? SZ_16M : \
174  ((bytes) >= SZ_1M) ? SZ_1M : \
175  ((bytes) >= SZ_64K) ? SZ_64K : \
176  ((bytes) >= SZ_4K) ? SZ_4K : 0)
177 
178 #define bytes_to_iopgsz(bytes) \
179  (((bytes) == SZ_16M) ? MMU_CAM_PGSZ_16M : \
180  ((bytes) == SZ_1M) ? MMU_CAM_PGSZ_1M : \
181  ((bytes) == SZ_64K) ? MMU_CAM_PGSZ_64K : \
182  ((bytes) == SZ_4K) ? MMU_CAM_PGSZ_4K : -1)
183 
184 #define iopgsz_to_bytes(iopgsz) \
185  (((iopgsz) == MMU_CAM_PGSZ_16M) ? SZ_16M : \
186  ((iopgsz) == MMU_CAM_PGSZ_1M) ? SZ_1M : \
187  ((iopgsz) == MMU_CAM_PGSZ_64K) ? SZ_64K : \
188  ((iopgsz) == MMU_CAM_PGSZ_4K) ? SZ_4K : 0)
189 
190 #define iopgsz_ok(bytes) (bytes_to_iopgsz(bytes) >= 0)
191 
192 /*
193  * global functions
194  */
195 extern u32 omap_iommu_arch_version(void);
196 
197 extern void omap_iotlb_cr_to_e(struct cr_regs *cr, struct iotlb_entry *e);
198 
199 extern int
200 omap_iopgtable_store_entry(struct omap_iommu *obj, struct iotlb_entry *e);
201 
202 extern int omap_iommu_set_isr(const char *name,
203  int (*isr)(struct omap_iommu *obj, u32 da, u32 iommu_errs,
204  void *priv),
205  void *isr_priv);
206 
207 extern void omap_iommu_save_ctx(struct device *dev);
208 extern void omap_iommu_restore_ctx(struct device *dev);
209 
210 extern int omap_install_iommu_arch(const struct iommu_functions *ops);
211 extern void omap_uninstall_iommu_arch(const struct iommu_functions *ops);
212 
213 extern int omap_foreach_iommu_device(void *data,
214  int (*fn)(struct device *, void *));
215 
216 extern ssize_t
217 omap_iommu_dump_ctx(struct omap_iommu *obj, char *buf, ssize_t len);
218 extern size_t
219 omap_dump_tlb_entries(struct omap_iommu *obj, char *buf, ssize_t len);
220 
221 #endif /* __MACH_IOMMU_H */