video: tegra: host: gk20a: Fix duplication checks
[linux-3.10.git] / drivers / video / tegra / host / gk20a / mm_gk20a.h
1 /*
2  * drivers/video/tegra/host/gk20a/mm_gk20a.h
3  *
4  * GK20A memory management
5  *
6  * Copyright (c) 2011-2013, NVIDIA CORPORATION.  All rights reserved.
7  *
8  * This program is free software; you can redistribute it and/or modify it
9  * under the terms and conditions of the GNU General Public License,
10  * version 2, as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope it will be useful, but WITHOUT
13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
15  * more details.
16  *
17  * You should have received a copy of the GNU General Public License along with
18  * this program; if not, write to the Free Software Foundation, Inc.,
19  * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
20  */
21 #ifndef __MM_GK20A_H__
22 #define __MM_GK20A_H__
23
24 #include <linux/scatterlist.h>
25 #include <linux/iommu.h>
26 #include <asm/dma-iommu.h>
27 #include "../nvhost_allocator.h"
28
29 /* This "address bit" in the gmmu ptes (and other gk20a accesses)
30  * signals the address as presented should be translated by the SMMU.
31  * Without this bit present gk20a accesses are *not* translated.
32  */
33 /* Hack, get this from manuals somehow... */
34 #define NV_MC_SMMU_VADDR_TRANSLATION_BIT     34
35 #define NV_MC_SMMU_VADDR_TRANSLATE(x) (x | \
36                                 (1ULL << NV_MC_SMMU_VADDR_TRANSLATION_BIT))
37
38 /* For now keep the size relatively small-ish compared to the full
39  * 40b va.  32GB for now. It consists of two 16GB spaces. */
40 #define NV_GMMU_VA_RANGE        35ULL
41 #define NV_GMMU_VA_IS_UPPER(x)  ((x) >= ((u64)0x1 << (NV_GMMU_VA_RANGE-1)))
42
43 struct mem_desc {
44         struct mem_handle *ref;
45         struct sg_table *sgt;
46         u32 size;
47 };
48
49 struct mem_desc_sub {
50         u32 offset;
51         u32 size;
52 };
53
54 struct gpfifo_desc {
55         size_t size;
56         u32 entry_num;
57
58         u32 get;
59         u32 put;
60
61         bool wrap;
62
63         u64 iova;
64         struct gpfifo *cpu_va;
65         u64 gpu_va;
66 };
67
68 struct mmu_desc {
69         struct mem_desc mem;
70         phys_addr_t cpu_pa;
71 };
72
73 struct inst_desc {
74         u64 iova;
75         void *cpuva;
76         phys_addr_t cpu_pa;
77         size_t size;
78 };
79
80 struct surface_mem_desc {
81         u64 iova;
82         void *cpuva;
83         struct sg_table *sgt;
84         size_t size;
85 };
86
87 struct userd_desc {
88         struct sg_table *sgt;
89         u64 iova;
90         void *cpuva;
91         size_t size;
92         u64 gpu_va;
93 };
94
95 struct runlist_mem_desc {
96         u64 iova;
97         void *cpuva;
98         size_t size;
99 };
100
101 struct patch_desc {
102         struct mem_desc mem;
103         void *cpu_va;
104         u64 gpu_va;
105         u32 data_count;
106 };
107
108 struct pmu_mem_desc {
109         void *cpuva;
110         u64 iova;
111         u64 pmu_va;
112         size_t size;
113 };
114
115 struct priv_cmd_queue_mem_desc {
116         u64 base_iova;
117         u32 *base_cpuva;
118         size_t size;
119 };
120
121 struct zcull_ctx_desc {
122         struct mem_desc mem;
123         u64 gpu_va;
124         u32 ctx_attr;
125         u32 ctx_sw_mode;
126 };
127
128 struct pm_ctx_desc {
129         struct mem_desc mem;
130         u64 gpu_va;
131         u32 ctx_attr;
132         u32 ctx_sw_mode;
133 };
134
135 struct gr_ctx_desc {
136         struct mem_desc mem;
137         u64 gpu_va;
138 };
139
140 struct compbit_store_desc {
141         struct mem_desc mem;
142         u64 base_pa;
143         u32 alignment;
144 };
145
146 struct page_table_gk20a {
147         /* backing for */
148         /* Either a *page or a *mem_handle */
149         void *ref;
150         /* track mapping cnt on this page table */
151         u32 ref_cnt;
152         struct sg_table *sgt;
153 };
154
155 enum gmmu_pgsz_gk20a {
156         gmmu_page_size_small = 0,
157         gmmu_page_size_big   = 1,
158         gmmu_nr_page_sizes   = 2
159 };
160
161
162 struct page_directory_gk20a {
163         /* backing for */
164         u32 num_pdes;
165         void *kv;
166         /* Either a *page or a *mem_handle */
167         void *ref;
168         struct sg_table *sgt;
169         struct page_table_gk20a *ptes[gmmu_nr_page_sizes];
170 };
171
172 struct mapped_buffer_node {
173         struct vm_gk20a *vm;
174         struct rb_node node;
175         struct list_head unmap_list;
176         struct list_head va_buffers_list;
177         u64 addr;
178         u64 size;
179         struct mem_mgr *memmgr;
180         struct mem_handle *handle_ref;
181         struct sg_table *sgt;
182         struct kref ref;
183         u32 user_mapped;
184         bool own_mem_ref;
185         u32 pgsz_idx;
186         u32 ctag_offset;
187         u32 ctag_lines;
188         u32 flags;
189         bool va_allocated;
190 };
191
192 struct vm_reserved_va_node {
193         struct list_head reserved_va_list;
194         struct list_head va_buffers_list;
195         u64 vaddr_start;
196         u64 size;
197 };
198
199 struct vm_gk20a {
200         struct mm_gk20a *mm;
201         struct nvhost_as_share *as_share; /* as_share this represents */
202
203         u64 va_start;
204         u64 va_limit;
205
206         int num_user_mapped_buffers;
207
208         bool big_pages;   /* enable large page support */
209         bool enable_ctag;
210         bool tlb_dirty;
211         bool mapped;
212
213         struct kref ref;
214
215         struct mutex update_gmmu_lock;
216
217         struct page_directory_gk20a pdes;
218
219         struct nvhost_allocator vma[gmmu_nr_page_sizes];
220         struct rb_root mapped_buffers;
221
222         struct list_head reserved_va_list;
223 };
224
225 struct gk20a;
226 struct channel_gk20a;
227
228 int gk20a_init_mm_support(struct gk20a *g);
229 int gk20a_init_mm_setup_sw(struct gk20a *g);
230 int gk20a_init_bar1_vm(struct mm_gk20a *mm);
231 int gk20a_init_pmu_vm(struct mm_gk20a *mm);
232
233 void gk20a_mm_fb_flush(struct gk20a *g);
234 void gk20a_mm_l2_flush(struct gk20a *g, bool invalidate);
235 void gk20a_mm_l2_invalidate(struct gk20a *g);
236
237 struct mm_gk20a {
238         struct gk20a *g;
239
240         u32 big_page_size;
241         u32 pde_stride;
242         u32 pde_stride_shift;
243
244         struct {
245                 u32 order;
246                 u32 num_ptes;
247         } page_table_sizing[gmmu_nr_page_sizes];
248
249
250         struct {
251                 u64 size;
252         } channel;
253
254         struct {
255                 u32 aperture_size;
256                 struct vm_gk20a vm;
257                 struct inst_desc inst_block;
258         } bar1;
259
260         struct {
261                 u32 aperture_size;
262                 struct vm_gk20a vm;
263                 struct inst_desc inst_block;
264         } pmu;
265
266         struct mutex tlb_lock;
267         struct mutex l2_op_lock;
268
269         void (*remove_support)(struct mm_gk20a *mm);
270         bool sw_ready;
271 #ifdef CONFIG_DEBUG_FS
272         u32 ltc_enabled;
273         u32 ltc_enabled_debug;
274 #endif
275 };
276
277 int gk20a_mm_init(struct mm_gk20a *mm);
278
279 #define gk20a_from_mm(mm) ((mm)->g)
280 #define gk20a_from_vm(vm) ((vm)->mm->g)
281
282 #define mem_mgr_from_mm(mm) (gk20a_from_mm(mm)->host->memmgr)
283 #define mem_mgr_from_vm(vm) (gk20a_from_vm(vm)->host->memmgr)
284 #define dev_from_vm(vm) dev_from_gk20a(vm->mm->g)
285
286 #define DEFAULT_ALLOC_FLAGS (mem_mgr_flag_uncacheable)
287 #define DEFAULT_ALLOC_ALIGNMENT (4*1024)
288
289 static inline int bar1_aperture_size_mb_gk20a(void)
290 {
291         return 128; /*TBD read this from fuses?*/
292 }
293 /* max address bits */
294 static inline int max_physaddr_bits_gk20a(void)
295 {
296         return 40;/*"old" sys physaddr, meaningful? */
297 }
298 static inline int max_vid_physaddr_bits_gk20a(void)
299 {
300         /* "vid phys" is asid/smmu phys?,
301          * i.e. is this the real sys physaddr? */
302         return 37;
303 }
304 static inline int max_vaddr_bits_gk20a(void)
305 {
306         return 40; /* chopped for area? */
307 }
308
309 #if 0 /*related to addr bits above, concern below TBD on which is accurate */
310 #define bar1_instance_block_shift_gk20a() (max_physaddr_bits_gk20a() -\
311                                            bus_bar1_block_ptr_s())
312 #else
313 #define bar1_instance_block_shift_gk20a() bus_bar1_block_ptr_shift_v()
314 #endif
315
316 void gk20a_mm_dump_vm(struct vm_gk20a *vm,
317                 u64 va_begin, u64 va_end, char *label);
318
319 int gk20a_mm_suspend(struct gk20a *g);
320
321 phys_addr_t gk20a_get_phys_from_iova(struct device *d,
322                                 u64 dma_addr);
323
324 int gk20a_get_sgtable(struct device *d, struct sg_table **sgt,
325                         void *cpuva, u64 iova,
326                         size_t size);
327
328 void gk20a_free_sgtable(struct sg_table **sgt);
329
330 u64 gk20a_mm_iova_addr(struct scatterlist *sgl);
331
332 void gk20a_mm_ltc_isr(struct gk20a *g);
333
334 bool gk20a_mm_mmu_debug_mode_enabled(struct gk20a *g);
335
336 u64 gk20a_gmmu_map(struct vm_gk20a *vm,
337                 struct sg_table **sgt,
338                 u64 size,
339                 u32 flags,
340                 int rw_flag);
341
342 void gk20a_gmmu_unmap(struct vm_gk20a *vm,
343                 u64 vaddr,
344                 u64 size,
345                 int rw_flag);
346
347 u64 gk20a_vm_map(struct vm_gk20a *vm,
348                  struct mem_mgr *memmgr,
349                  struct mem_handle *r,
350                  u64 offset_align,
351                  u32 flags /*NVHOST_MAP_BUFFER_FLAGS_*/,
352                  u32 kind,
353                  struct sg_table **sgt,
354                  bool user_mapped,
355                  int rw_flag);
356
357 /* unmap handle from kernel */
358 void gk20a_vm_unmap(struct vm_gk20a *vm, u64 offset);
359
360 /* get reference to all currently mapped buffers */
361 int gk20a_vm_get_buffers(struct vm_gk20a *vm,
362                          struct mapped_buffer_node ***mapped_buffers,
363                          int *num_buffers);
364
365 /* put references on the given buffers */
366 void gk20a_vm_put_buffers(struct vm_gk20a *vm,
367                           struct mapped_buffer_node **mapped_buffers,
368                           int num_buffers);
369
370 /* invalidate tlbs for the vm area */
371 void gk20a_mm_tlb_invalidate(struct vm_gk20a *vm);
372
373 /* find buffer corresponding to va */
374 int gk20a_vm_find_buffer(struct vm_gk20a *vm, u64 gpu_va,
375                          struct mem_mgr **memmgr, struct mem_handle **r,
376                          u64 *offset);
377
378 void gk20a_vm_get(struct vm_gk20a *vm);
379 void gk20a_vm_put(struct vm_gk20a *vm);
380
381 #endif /*_MM_GK20A_H_ */