video:tegra:gk20a: add debugfs knobs for gk20a
[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 "../nvhost_allocator.h"
26
27 /* This "address bit" in the gmmu ptes (and other gk20a accesses)
28  * signals the address as presented should be translated by the SMMU.
29  * Without this bit present gk20a accesses are *not* translated.
30  */
31 /* Hack, get this from manuals somehow... */
32 #define NV_MC_SMMU_VADDR_TRANSLATION_BIT     34
33
34
35 struct mem_desc {
36         struct mem_handle *ref;
37         struct sg_table *sgt;
38         u32 size;
39 };
40
41 struct mem_desc_sub {
42         u32 offset;
43         u32 size;
44 };
45
46 struct gpfifo_desc {
47         struct mem_desc mem;
48         u32 entry_num;
49
50         u32 get;
51         u32 put;
52
53         bool wrap;
54
55         struct gpfifo *cpu_va;
56         u64 gpu_va;
57 };
58
59 struct mmu_desc {
60         struct mem_desc mem;
61         phys_addr_t cpu_pa;
62 };
63
64 struct inst_desc {
65         struct mem_desc mem;
66 };
67
68 struct userd_desc {
69         struct mem_desc mem;
70         void *cpu_va;
71         u64 cpu_pa;
72         u64 gpu_va;
73 };
74
75 struct patch_desc {
76         struct mem_desc mem;
77         u64 gpu_va;
78         u32 data_count;
79 };
80
81 struct pmu_mem_desc {
82         struct mem_desc mem;
83         phys_addr_t cpu_pa;
84         u64 pmu_va;
85 };
86
87 struct zcull_ctx_desc {
88         struct mem_desc mem;
89         u64 gpu_va;
90         u32 ctx_attr;
91         u32 ctx_sw_mode;
92 };
93
94 struct pm_ctx_desc {
95         struct mem_desc mem;
96         u64 gpu_va;
97         u32 ctx_attr;
98         u32 ctx_sw_mode;
99 };
100
101 struct gr_ctx_desc {
102         struct mem_desc mem;
103         u64 gpu_va;
104 };
105
106 struct compbit_store_desc {
107         struct mem_desc mem;
108         u64 base_pa;
109         u32 alignment;
110 };
111
112 struct page_table_gk20a {
113         /* backing for */
114         /* Either a *page or a *mem_handle */
115         void *ref;
116         /* track mapping cnt on this page table */
117         u32 ref_cnt;
118         struct sg_table *sgt;
119 };
120
121 enum gmmu_pgsz_gk20a {
122         gmmu_page_size_small = 0,
123         gmmu_page_size_big   = 1,
124         gmmu_nr_page_sizes   = 2
125 };
126
127
128 struct page_directory_gk20a {
129         /* backing for */
130         u32 num_pdes;
131         void *kv;
132         /* Either a *page or a *mem_handle */
133         void *ref;
134         struct sg_table *sgt;
135         struct page_table_gk20a *ptes[gmmu_nr_page_sizes];
136 };
137
138 struct mapped_buffer_node {
139         struct vm_gk20a *vm;
140         struct rb_node node;
141         struct list_head unmap_list;
142         u64 addr;
143         u64 size;
144         struct mem_mgr *memmgr;
145         struct mem_handle *handle_ref;
146         struct sg_table *sgt;
147         struct kref ref;
148         bool user_mapped;
149         u32 pgsz_idx;
150         u32 ctag_offset;
151         u32 ctag_lines;
152         u32 flags;
153 };
154
155 struct vm_gk20a {
156         struct mm_gk20a *mm;
157         struct nvhost_as_share *as_share; /* as_share this represents */
158
159         u64 va_start;
160         u64 va_limit;
161
162         int num_user_mapped_buffers;
163
164         bool big_pages;   /* enable large page support */
165         bool enable_ctag;
166         bool tlb_dirty;
167         bool mapped;
168
169         struct mutex update_gmmu_lock;
170
171         struct page_directory_gk20a pdes;
172
173         struct nvhost_allocator vma[gmmu_nr_page_sizes];
174         struct rb_root mapped_buffers;
175
176         struct list_head deferred_unmaps;
177
178         u64 (*alloc_va)(struct vm_gk20a *vm, u64 size,
179                         enum gmmu_pgsz_gk20a gmmu_pgsz_idx);
180
181         void (*free_va)(struct vm_gk20a *vm, u64 offset, u64 size,
182                         enum gmmu_pgsz_gk20a pgsz_idx);
183
184         u64 (*map)(struct vm_gk20a *vm,
185                    struct mem_mgr *memmgr,
186                    struct mem_handle *r,
187                    u64 offset_align,
188                    u32 flags /*NVHOST_MAP_BUFFER_FLAGS_*/,
189                    u32 kind,
190                    struct sg_table **sgt);
191
192         /* unmap handle from kernel */
193         void (*unmap)(struct vm_gk20a *vm,
194                 u64 offset);
195
196         /* unmap handle from user */
197         void (*unmap_user)(struct vm_gk20a *vm, u64 offset);
198
199         /* get reference to all currently mapped buffers */
200         int (*get_buffers)(struct vm_gk20a *vm,
201                  struct mapped_buffer_node ***mapped_buffers,
202                  int *num_buffers);
203
204         /* put references on the given buffers */
205         void (*put_buffers)(struct vm_gk20a *vm,
206                  struct mapped_buffer_node **mapped_buffers,
207                  int num_buffers);
208
209         /* invalidate tlbs for the vm area */
210         void (*tlb_inval)(struct vm_gk20a *vm);
211
212         /* find buffer corresponding to va */
213         int (*find_buffer)(struct vm_gk20a *vm, u64 gpu_va,
214                         struct mem_mgr **memmgr, struct mem_handle **r,
215                         u64 *offset);
216
217         void (*remove_support)(struct vm_gk20a *vm);
218 };
219
220 struct gk20a;
221 struct channel_gk20a;
222
223 int gk20a_init_mm_support(struct gk20a *g);
224 int gk20a_init_mm_setup_sw(struct gk20a *g);
225 int gk20a_init_bar1_vm(struct mm_gk20a *mm);
226 int gk20a_init_pmu_vm(struct mm_gk20a *mm);
227
228 void gk20a_mm_fb_flush(struct gk20a *g);
229 void gk20a_mm_l2_flush(struct gk20a *g, bool invalidate);
230 void gk20a_mm_l2_invalidate(struct gk20a *g);
231
232 struct mm_gk20a {
233         struct gk20a *g;
234
235         u32 big_page_size;
236         u32 pde_stride;
237         u32 pde_stride_shift;
238
239         struct {
240                 u32 order;
241                 u32 num_ptes;
242         } page_table_sizing[gmmu_nr_page_sizes];
243
244
245         struct {
246                 u64 size;
247         } channel;
248
249         struct {
250                 u32 aperture_size;
251                 struct vm_gk20a vm;
252                 struct inst_desc inst_block;
253         } bar1;
254
255         struct {
256                 u32 aperture_size;
257                 struct vm_gk20a vm;
258                 struct inst_desc inst_block;
259         } pmu;
260
261         void (*remove_support)(struct mm_gk20a *mm);
262         bool sw_ready;
263 #ifdef CONFIG_DEBUG_FS
264         u32 ltc_enabled;
265         u32 ltc_enabled_debug;
266 #endif
267 };
268
269 int gk20a_mm_init(struct mm_gk20a *mm);
270
271 #define gk20a_from_mm(mm) ((mm)->g)
272 #define gk20a_from_vm(vm) ((vm)->mm->g)
273
274 #define mem_mgr_from_mm(mm) (gk20a_from_mm(mm)->host->memmgr)
275 #define mem_mgr_from_vm(vm) (gk20a_from_vm(vm)->host->memmgr)
276 #define dev_from_vm(vm) dev_from_gk20a(vm->mm->g)
277
278 #define DEFAULT_ALLOC_FLAGS (mem_mgr_flag_uncacheable)
279 #define DEFAULT_ALLOC_ALIGNMENT (4*1024)
280
281 static inline int bar1_aperture_size_mb_gk20a(void)
282 {
283         return 128; /*TBD read this from fuses?*/
284 }
285 /* max address bits */
286 static inline int max_physaddr_bits_gk20a(void)
287 {
288         return 40;/*"old" sys physaddr, meaningful? */
289 }
290 static inline int max_vid_physaddr_bits_gk20a(void)
291 {
292         /* "vid phys" is asid/smmu phys?,
293          * i.e. is this the real sys physaddr? */
294         return 37;
295 }
296 static inline int max_vaddr_bits_gk20a(void)
297 {
298         return 40; /* chopped for area? */
299 }
300
301 #if 0 /*related to addr bits above, concern below TBD on which is accurate */
302 #define bar1_instance_block_shift_gk20a() (max_physaddr_bits_gk20a() -\
303                                            bus_bar1_block_ptr_s())
304 #else
305 #define bar1_instance_block_shift_gk20a() bus_bar1_block_ptr_shift_v()
306 #endif
307
308 void gk20a_mm_dump_vm(struct vm_gk20a *vm,
309                 u64 va_begin, u64 va_end, char *label);
310
311 int gk20a_mm_suspend(struct gk20a *g);
312
313 u64 gk20a_mm_iova_addr(struct scatterlist *sgl);
314
315 #endif /*_MM_GK20A_H_ */