drivers: video: tegra: enable gk20a deinit path
[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, 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 "../nvhost_allocator.h"
25
26 struct mem_desc {
27         struct mem_handle *ref;
28         struct sg_table *sgt;
29         u32 size;
30 };
31
32 struct mem_desc_sub {
33         u32 offset;
34         u32 size;
35 };
36
37 struct gpfifo_desc {
38         struct mem_desc mem;
39         u32 entry_num;
40
41         u32 get;
42         u32 put;
43
44         bool wrap;
45
46         struct gpfifo *cpu_va;
47         u64 gpu_va;
48 };
49
50 struct mmu_desc {
51         struct mem_desc mem;
52         phys_addr_t cpu_pa;
53 };
54
55 struct inst_desc {
56         struct mem_desc mem;
57         phys_addr_t cpu_pa;
58 };
59
60 struct userd_desc {
61         struct mem_desc mem;
62         void *cpu_va;
63         phys_addr_t cpu_pa;
64         u64 gpu_va;
65 };
66
67 struct patch_desc {
68         struct mem_desc mem;
69         u64 gpu_va;
70         u32 data_count;
71 };
72
73 struct pmu_mem_desc {
74         struct mem_desc mem;
75         phys_addr_t cpu_pa;
76         u64 pmu_va;
77 };
78
79 struct zcull_ctx_desc {
80         struct mem_desc mem;
81         u64 gpu_va;
82         u32 ctx_attr;
83         u32 ctx_sw_mode;
84 };
85
86 struct pm_ctx_desc {
87         struct mem_desc mem;
88         u64 gpu_va;
89         u32 ctx_attr;
90         u32 ctx_sw_mode;
91 };
92
93 struct gr_ctx_desc {
94         struct mem_desc mem;
95         u64 gpu_va;
96 };
97
98 struct compbit_store_desc {
99         struct mem_desc mem;
100         phys_addr_t base_pa;
101         u32 alignment;
102 };
103
104 struct page_table_gk20a {
105         /* backing for */
106         /* Either a *page or a *mem_handle */
107         void *ref;
108         /* track mapping cnt on this page table */
109         u32 ref_cnt;
110         struct sg_table *sgt;
111         /* 4k or 128k */
112         u32 page_size_idx;
113 };
114
115 struct page_directory_gk20a {
116         /* backing for */
117         u32 num_pdes;
118         void *kv;
119         phys_addr_t phys;
120         /* Either a *page or a *mem_handle */
121         void *ref;
122         bool dirty;
123         struct sg_table *sgt;
124         struct page_table_gk20a *ptes;
125 };
126
127 struct mapped_buffer_node {
128         struct rb_node node;
129         u64 addr;
130         u64 size;
131         struct mem_mgr *memmgr;
132         struct mem_handle *handle_ref;
133         struct sg_table *sgt;
134         u32 page_size;
135         u32 ctag_offset;
136         u32 ctag_lines;
137 };
138
139 struct vm_gk20a {
140         struct mm_gk20a *mm;
141         struct nvhost_as_share *as_share; /* as_share this represents */
142
143         u64 va_start;
144         u64 va_limit;
145
146         bool enable_ctag;
147
148         struct page_directory_gk20a pdes;
149
150         struct nvhost_allocator vma; /* page interval allocator */
151         struct rb_root mapped_buffers;
152
153         u64 (*alloc_va)(struct vm_gk20a *vm,
154                         u64 size,
155                         u32 page_size);
156
157         void (*free_va)(struct vm_gk20a *vm, u64 offset, u64 size, u32 page_size);
158
159         u64 (*map)(struct vm_gk20a *vm,
160                    struct mem_mgr *memmgr,
161                    struct mem_handle *r,
162                    u64 offset_align,
163                    u32 flags /*NVHOST_MAP_BUFFER_FLAGS_*/,
164                    u32 kind);
165
166         /* unmap handle from kernel */
167         void (*unmap)(struct vm_gk20a *vm,
168                 u64 offset);
169
170         /* unmap handle from user */
171         void (*unmap_user)(struct vm_gk20a *vm,
172                 u64 offset,
173                 struct mem_mgr **memmgr,
174                 struct mem_handle **r);
175
176         void (*remove_support)(struct vm_gk20a *vm);
177 };
178
179 struct gk20a;
180 struct channel_gk20a;
181
182 int gk20a_init_mm_support(struct gk20a *g);
183 int gk20a_init_mm_setup_sw(struct gk20a *g);
184 int gk20a_init_bar1_vm(struct mm_gk20a *mm);
185 int gk20a_init_pmu_vm(struct mm_gk20a *mm);
186
187 void gk20a_mm_fb_flush(struct gk20a *g);
188 void gk20a_mm_l2_flush(struct gk20a *g, bool invalidate);
189 void gk20a_mm_tlb_invalidate(struct gk20a *g, struct vm_gk20a *vm);
190
191 struct mm_gk20a {
192         struct gk20a *g;
193
194         u32 big_page_size;
195         u32 pde_stride;
196         u32 pde_stride_shift;
197
198         struct {
199                 u32 order;
200                 u32 num_ptes;
201         } page_table_sizing[2];
202
203
204         struct {
205                 u64 size;
206         } channel;
207
208         struct {
209                 u32 aperture_size;
210                 struct vm_gk20a vm;
211                 struct inst_desc inst_block;
212         } bar1;
213
214         struct {
215                 u32 aperture_size;
216                 struct vm_gk20a vm;
217                 struct inst_desc inst_block;
218         } pmu;
219
220         void (*remove_support)(struct mm_gk20a *mm);
221         bool sw_ready;
222 };
223
224 int gk20a_mm_init(struct mm_gk20a *mm);
225
226 #define gk20a_from_mm(mm) ((mm)->g)
227 #define gk20a_from_vm(vm) ((vm)->mm->g)
228
229 #define mem_mgr_from_mm(mm) (gk20a_from_mm(mm)->host->memmgr)
230 #define mem_mgr_from_vm(vm) (gk20a_from_vm(vm)->host->memmgr)
231 #define dev_from_vm(vm) dev_from_gk20a(vm->mm->g)
232
233 #define DEFAULT_ALLOC_FLAGS (mem_mgr_flag_uncacheable)
234 #define DEFAULT_ALLOC_ALIGNMENT (4*1024)
235
236 static inline int bar1_aperture_size_mb_gk20a(void)
237 {
238         return 128; /*TBD read this from fuses?*/
239 }
240 /* max address bits */
241 static inline int max_physaddr_bits_gk20a(void)
242 {
243         return 40;/*"old" sys physaddr, meaningful? */
244 }
245 static inline int max_vid_physaddr_bits_gk20a(void)
246 {
247         /* "vid phys" is asid/smmu phys?,
248          * i.e. is this the real sys physaddr? */
249         return 37;
250 }
251 static inline int max_vaddr_bits_gk20a(void)
252 {
253         return 40; /* chopped for area? */
254 }
255
256 #if 0 /*related to addr bits above, concern below TBD on which is accurate */
257 #define bar1_instance_block_shift_gk20a() (max_physaddr_bits_gk20a() -\
258                                            bus_bar1_block_ptr_s())
259 #else
260 #define bar1_instance_block_shift_gk20a() bus_bar1_block_ptr_shift_v()
261 #endif
262
263 void gk20a_mm_dump_vm(struct vm_gk20a *vm,
264                 u64 va_begin, u64 va_end, char *label);
265
266 int gk20a_mm_suspend(struct gk20a *g);
267
268 #endif /*_MM_GK20A_H_ */