drivers: video: tegra: release mem_handle after unmap_buffer
[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         struct page_directory_gk20a pdes;
147
148         struct nvhost_allocator vma; /* page interval allocator */
149         struct rb_root mapped_buffers;
150
151         u64 (*alloc_va)(struct vm_gk20a *vm,
152                         u64 size,
153                         u32 page_size);
154
155         void (*free_va)(struct vm_gk20a *vm, u64 offset, u64 size, u32 page_size);
156
157         u64 (*map)(struct vm_gk20a *vm,
158                    struct mem_mgr *memmgr,
159                    struct mem_handle *r,
160                    u64 offset_align,
161                    u32 flags /*NVHOST_MAP_BUFFER_FLAGS_*/,
162                    u32 kind);
163
164         /* unmap handle from kernel */
165         void (*unmap)(struct vm_gk20a *vm,
166                 u64 offset);
167
168         /* unmap handle from user */
169         void (*unmap_user)(struct vm_gk20a *vm,
170                 u64 offset,
171                 struct mem_mgr **memmgr,
172                 struct mem_handle **r);
173
174         void (*remove_support)(struct vm_gk20a *vm);
175 };
176
177 struct gk20a;
178 struct channel_gk20a;
179
180 int gk20a_init_mm_support(struct gk20a *g, bool reinit);
181 int gk20a_init_bar1_vm(struct mm_gk20a *mm);
182 int gk20a_init_pmu_vm(struct mm_gk20a *mm);
183
184 void gk20a_mm_fb_flush(struct gk20a *g);
185 void gk20a_mm_l2_flush(struct gk20a *g, bool invalidate);
186 void gk20a_mm_tlb_invalidate(struct gk20a *g, struct vm_gk20a *vm);
187
188 struct mm_gk20a {
189         struct gk20a *g;
190
191         u32 big_page_size;
192         u32 pde_stride;
193         u32 pde_stride_shift;
194
195         struct {
196                 u32 order;
197                 u32 num_ptes;
198         } page_table_sizing[2];
199
200
201         struct {
202                 u64 size;
203         } channel;
204
205         struct {
206                 u32 aperture_size;
207                 struct vm_gk20a vm;
208                 struct inst_desc inst_block;
209         } bar1;
210
211         struct {
212                 u32 aperture_size;
213                 struct vm_gk20a vm;
214                 struct inst_desc inst_block;
215         } pmu;
216 };
217 int gk20a_mm_init(struct mm_gk20a *mm);
218
219 #define gk20a_from_mm(mm) ((mm)->g)
220 #define gk20a_from_vm(vm) ((vm)->mm->g)
221
222 #define mem_mgr_from_mm(mm) (gk20a_from_mm(mm)->host->memmgr)
223 #define mem_mgr_from_vm(vm) (gk20a_from_vm(vm)->host->memmgr)
224 #define dev_from_vm(vm) dev_from_gk20a(vm->mm->g)
225
226 #define DEFAULT_ALLOC_FLAGS (mem_mgr_flag_uncacheable)
227 #define DEFAULT_ALLOC_ALIGNMENT (4*1024)
228
229 static inline int bar1_aperture_size_mb_gk20a(void)
230 {
231         return 128; /*TBD read this from fuses?*/
232 }
233 /* max address bits */
234 static inline int max_physaddr_bits_gk20a(void)
235 {
236         return 40;/*"old" sys physaddr, meaningful? */
237 }
238 static inline int max_vid_physaddr_bits_gk20a(void)
239 {
240         /* "vid phys" is asid/smmu phys?,
241          * i.e. is this the real sys physaddr? */
242         return 37;
243 }
244 static inline int max_vaddr_bits_gk20a(void)
245 {
246         return 40; /* chopped for area? */
247 }
248
249 #if 0 /*related to addr bits above, concern below TBD on which is accurate */
250 #define bar1_instance_block_shift_gk20a() (max_physaddr_bits_gk20a() -\
251                                            bus_bar1_block_ptr_s())
252 #else
253 #define bar1_instance_block_shift_gk20a() bus_bar1_block_ptr_shift_v()
254 #endif
255
256 void gk20a_mm_dump_vm(struct vm_gk20a *vm,
257                 u64 va_begin, u64 va_end, char *label);
258
259 #endif /*_MM_GK20A_H_ */