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