diff options
Diffstat (limited to 'arch/arm/plat-omap/include/plat/iommu.h')
-rw-r--r-- | arch/arm/plat-omap/include/plat/iommu.h | 221 |
1 files changed, 0 insertions, 221 deletions
diff --git a/arch/arm/plat-omap/include/plat/iommu.h b/arch/arm/plat-omap/include/plat/iommu.h deleted file mode 100644 index 68b5f0362f35..000000000000 --- a/arch/arm/plat-omap/include/plat/iommu.h +++ /dev/null | |||
@@ -1,221 +0,0 @@ | |||
1 | /* | ||
2 | * omap iommu: main structures | ||
3 | * | ||
4 | * Copyright (C) 2008-2009 Nokia Corporation | ||
5 | * | ||
6 | * Written by Hiroshi DOYU <Hiroshi.DOYU@nokia.com> | ||
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 { | ||
17 | u32 da; | ||
18 | u32 pa; | ||
19 | u32 pgsz, prsvd, valid; | ||
20 | union { | ||
21 | u16 ap; | ||
22 | struct { | ||
23 | u32 endian, elsz, mixed; | ||
24 | }; | ||
25 | }; | ||
26 | }; | ||
27 | |||
28 | struct omap_iommu { | ||
29 | const char *name; | ||
30 | struct module *owner; | ||
31 | struct clk *clk; | ||
32 | void __iomem *regbase; | ||
33 | struct device *dev; | ||
34 | void *isr_priv; | ||
35 | struct iommu_domain *domain; | ||
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 | */ | ||
44 | u32 *iopgd; | ||
45 | spinlock_t page_table_lock; /* protect iopgd */ | ||
46 | |||
47 | int nr_tlb_entries; | ||
48 | |||
49 | struct list_head mmap; | ||
50 | struct mutex mmap_lock; /* protect mmap */ | ||
51 | |||
52 | void *ctx; /* iommu context: registres saved area */ | ||
53 | u32 da_start; | ||
54 | u32 da_end; | ||
55 | }; | ||
56 | |||
57 | struct cr_regs { | ||
58 | union { | ||
59 | struct { | ||
60 | u16 cam_l; | ||
61 | u16 cam_h; | ||
62 | }; | ||
63 | u32 cam; | ||
64 | }; | ||
65 | union { | ||
66 | struct { | ||
67 | u16 ram_l; | ||
68 | u16 ram_h; | ||
69 | }; | ||
70 | u32 ram; | ||
71 | }; | ||
72 | }; | ||
73 | |||
74 | struct iotlb_lock { | ||
75 | short base; | ||
76 | short vict; | ||
77 | }; | ||
78 | |||
79 | /* architecture specific functions */ | ||
80 | struct iommu_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 | |||
99 | u32 (*get_pte_attr)(struct iotlb_entry *e); | ||
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 | |||
106 | /** | ||
107 | * struct omap_mmu_dev_attr - OMAP mmu device attributes for omap_hwmod | ||
108 | * @da_start: device address where the va space starts. | ||
109 | * @da_end: device address where the va space ends. | ||
110 | * @nr_tlb_entries: number of entries supported by the translation | ||
111 | * look-aside buffer (TLB). | ||
112 | */ | ||
113 | struct omap_mmu_dev_attr { | ||
114 | u32 da_start; | ||
115 | u32 da_end; | ||
116 | int nr_tlb_entries; | ||
117 | }; | ||
118 | |||
119 | struct iommu_platform_data { | ||
120 | const char *name; | ||
121 | const char *clk_name; | ||
122 | const int nr_tlb_entries; | ||
123 | u32 da_start; | ||
124 | u32 da_end; | ||
125 | }; | ||
126 | |||
127 | /** | ||
128 | * struct iommu_arch_data - omap iommu private data | ||
129 | * @name: name of the iommu device | ||
130 | * @iommu_dev: handle of the iommu device | ||
131 | * | ||
132 | * This is an omap iommu private data object, which binds an iommu user | ||
133 | * to its iommu device. This object should be placed at the iommu user's | ||
134 | * dev_archdata so generic IOMMU API can be used without having to | ||
135 | * utilize omap-specific plumbing anymore. | ||
136 | */ | ||
137 | struct omap_iommu_arch_data { | ||
138 | const char *name; | ||
139 | struct omap_iommu *iommu_dev; | ||
140 | }; | ||
141 | |||
142 | #ifdef CONFIG_IOMMU_API | ||
143 | /** | ||
144 | * dev_to_omap_iommu() - retrieves an omap iommu object from a user device | ||
145 | * @dev: iommu client device | ||
146 | */ | ||
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 */ | ||