1 /*
2 * Copyright 2010 Red Hat Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 * Authors: Ben Skeggs
23 */
24 #include "ctxgf100.h"
25
26 #include <subdev/fb.h>
27 #include <subdev/mc.h>
28 #include <subdev/timer.h>
29 #include <engine/fifo.h>
30
31 /*******************************************************************************
32 * PGRAPH context register lists
33 ******************************************************************************/
34
35 static const struct gf100_gr_init
36 gf100_grctx_init_icmd_0[] = {
37 { 0x001000, 1, 0x01, 0x00000004 },
38 { 0x0000a9, 1, 0x01, 0x0000ffff },
39 { 0x000038, 1, 0x01, 0x0fac6881 },
40 { 0x00003d, 1, 0x01, 0x00000001 },
41 { 0x0000e8, 8, 0x01, 0x00000400 },
42 { 0x000078, 8, 0x01, 0x00000300 },
43 { 0x000050, 1, 0x01, 0x00000011 },
44 { 0x000058, 8, 0x01, 0x00000008 },
45 { 0x000208, 8, 0x01, 0x00000001 },
46 { 0x000081, 1, 0x01, 0x00000001 },
47 { 0x000085, 1, 0x01, 0x00000004 },
48 { 0x000088, 1, 0x01, 0x00000400 },
49 { 0x000090, 1, 0x01, 0x00000300 },
50 { 0x000098, 1, 0x01, 0x00001001 },
51 { 0x0000e3, 1, 0x01, 0x00000001 },
52 { 0x0000da, 1, 0x01, 0x00000001 },
53 { 0x0000f8, 1, 0x01, 0x00000003 },
54 { 0x0000fa, 1, 0x01, 0x00000001 },
55 { 0x00009f, 4, 0x01, 0x0000ffff },
56 { 0x0000b1, 1, 0x01, 0x00000001 },
57 { 0x0000b2, 40, 0x01, 0x00000000 },
58 { 0x000210, 8, 0x01, 0x00000040 },
59 { 0x000218, 8, 0x01, 0x0000c080 },
60 { 0x0000ad, 1, 0x01, 0x0000013e },
61 { 0x0000e1, 1, 0x01, 0x00000010 },
62 { 0x000290, 16, 0x01, 0x00000000 },
63 { 0x0003b0, 16, 0x01, 0x00000000 },
64 { 0x0002a0, 16, 0x01, 0x00000000 },
65 { 0x000420, 16, 0x01, 0x00000000 },
66 { 0x0002b0, 16, 0x01, 0x00000000 },
67 { 0x000430, 16, 0x01, 0x00000000 },
68 { 0x0002c0, 16, 0x01, 0x00000000 },
69 { 0x0004d0, 16, 0x01, 0x00000000 },
70 { 0x000720, 16, 0x01, 0x00000000 },
71 { 0x0008c0, 16, 0x01, 0x00000000 },
72 { 0x000890, 16, 0x01, 0x00000000 },
73 { 0x0008e0, 16, 0x01, 0x00000000 },
74 { 0x0008a0, 16, 0x01, 0x00000000 },
75 { 0x0008f0, 16, 0x01, 0x00000000 },
76 { 0x00094c, 1, 0x01, 0x000000ff },
77 { 0x00094d, 1, 0x01, 0xffffffff },
78 { 0x00094e, 1, 0x01, 0x00000002 },
79 { 0x0002ec, 1, 0x01, 0x00000001 },
80 { 0x000303, 1, 0x01, 0x00000001 },
81 { 0x0002e6, 1, 0x01, 0x00000001 },
82 { 0x000466, 1, 0x01, 0x00000052 },
83 { 0x000301, 1, 0x01, 0x3f800000 },
84 { 0x000304, 1, 0x01, 0x30201000 },
85 { 0x000305, 1, 0x01, 0x70605040 },
86 { 0x000306, 1, 0x01, 0xb8a89888 },
87 { 0x000307, 1, 0x01, 0xf8e8d8c8 },
88 { 0x00030a, 1, 0x01, 0x00ffff00 },
89 { 0x00030b, 1, 0x01, 0x0000001a },
90 { 0x00030c, 1, 0x01, 0x00000001 },
91 { 0x000318, 1, 0x01, 0x00000001 },
92 { 0x000340, 1, 0x01, 0x00000000 },
93 { 0x000375, 1, 0x01, 0x00000001 },
94 { 0x000351, 1, 0x01, 0x00000100 },
95 { 0x00037d, 1, 0x01, 0x00000006 },
96 { 0x0003a0, 1, 0x01, 0x00000002 },
97 { 0x0003aa, 1, 0x01, 0x00000001 },
98 { 0x0003a9, 1, 0x01, 0x00000001 },
99 { 0x000380, 1, 0x01, 0x00000001 },
100 { 0x000360, 1, 0x01, 0x00000040 },
101 { 0x000366, 2, 0x01, 0x00000000 },
102 { 0x000368, 1, 0x01, 0x00001fff },
103 { 0x000370, 2, 0x01, 0x00000000 },
104 { 0x000372, 1, 0x01, 0x003fffff },
105 { 0x00037a, 1, 0x01, 0x00000012 },
106 { 0x0005e0, 5, 0x01, 0x00000022 },
107 { 0x000619, 1, 0x01, 0x00000003 },
108 { 0x000811, 1, 0x01, 0x00000003 },
109 { 0x000812, 1, 0x01, 0x00000004 },
110 { 0x000813, 1, 0x01, 0x00000006 },
111 { 0x000814, 1, 0x01, 0x00000008 },
112 { 0x000815, 1, 0x01, 0x0000000b },
113 { 0x000800, 6, 0x01, 0x00000001 },
114 { 0x000632, 1, 0x01, 0x00000001 },
115 { 0x000633, 1, 0x01, 0x00000002 },
116 { 0x000634, 1, 0x01, 0x00000003 },
117 { 0x000635, 1, 0x01, 0x00000004 },
118 { 0x000654, 1, 0x01, 0x3f800000 },
119 { 0x000657, 1, 0x01, 0x3f800000 },
120 { 0x000655, 2, 0x01, 0x3f800000 },
121 { 0x0006cd, 1, 0x01, 0x3f800000 },
122 { 0x0007f5, 1, 0x01, 0x3f800000 },
123 { 0x0007dc, 1, 0x01, 0x39291909 },
124 { 0x0007dd, 1, 0x01, 0x79695949 },
125 { 0x0007de, 1, 0x01, 0xb9a99989 },
126 { 0x0007df, 1, 0x01, 0xf9e9d9c9 },
127 { 0x0007e8, 1, 0x01, 0x00003210 },
128 { 0x0007e9, 1, 0x01, 0x00007654 },
129 { 0x0007ea, 1, 0x01, 0x00000098 },
130 { 0x0007ec, 1, 0x01, 0x39291909 },
131 { 0x0007ed, 1, 0x01, 0x79695949 },
132 { 0x0007ee, 1, 0x01, 0xb9a99989 },
133 { 0x0007ef, 1, 0x01, 0xf9e9d9c9 },
134 { 0x0007f0, 1, 0x01, 0x00003210 },
135 { 0x0007f1, 1, 0x01, 0x00007654 },
136 { 0x0007f2, 1, 0x01, 0x00000098 },
137 { 0x0005a5, 1, 0x01, 0x00000001 },
138 { 0x000980, 128, 0x01, 0x00000000 },
139 { 0x000468, 1, 0x01, 0x00000004 },
140 { 0x00046c, 1, 0x01, 0x00000001 },
141 { 0x000470, 96, 0x01, 0x00000000 },
142 { 0x000510, 16, 0x01, 0x3f800000 },
143 { 0x000520, 1, 0x01, 0x000002b6 },
144 { 0x000529, 1, 0x01, 0x00000001 },
145 { 0x000530, 16, 0x01, 0xffff0000 },
146 { 0x000585, 1, 0x01, 0x0000003f },
147 { 0x000576, 1, 0x01, 0x00000003 },
148 { 0x000586, 1, 0x01, 0x00000040 },
149 { 0x000582, 2, 0x01, 0x00000080 },
150 { 0x0005c2, 1, 0x01, 0x00000001 },
151 { 0x000638, 2, 0x01, 0x00000001 },
152 { 0x00063a, 1, 0x01, 0x00000002 },
153 { 0x00063b, 2, 0x01, 0x00000001 },
154 { 0x00063d, 1, 0x01, 0x00000002 },
155 { 0x00063e, 1, 0x01, 0x00000001 },
156 { 0x0008b8, 8, 0x01, 0x00000001 },
157 { 0x000900, 8, 0x01, 0x00000001 },
158 { 0x000908, 8, 0x01, 0x00000002 },
159 { 0x000910, 16, 0x01, 0x00000001 },
160 { 0x000920, 8, 0x01, 0x00000002 },
161 { 0x000928, 8, 0x01, 0x00000001 },
162 { 0x000648, 9, 0x01, 0x00000001 },
163 { 0x000658, 1, 0x01, 0x0000000f },
164 { 0x0007ff, 1, 0x01, 0x0000000a },
165 { 0x00066a, 1, 0x01, 0x40000000 },
166 { 0x00066b, 1, 0x01, 0x10000000 },
167 { 0x00066c, 2, 0x01, 0xffff0000 },
168 { 0x0007af, 2, 0x01, 0x00000008 },
169 { 0x0007f6, 1, 0x01, 0x00000001 },
170 { 0x0006b2, 1, 0x01, 0x00000055 },
171 { 0x0007ad, 1, 0x01, 0x00000003 },
172 { 0x000937, 1, 0x01, 0x00000001 },
173 { 0x000971, 1, 0x01, 0x00000008 },
174 { 0x000972, 1, 0x01, 0x00000040 },
175 { 0x000973, 1, 0x01, 0x0000012c },
176 { 0x00097c, 1, 0x01, 0x00000040 },
177 { 0x000979, 1, 0x01, 0x00000003 },
178 { 0x000975, 1, 0x01, 0x00000020 },
179 { 0x000976, 1, 0x01, 0x00000001 },
180 { 0x000977, 1, 0x01, 0x00000020 },
181 { 0x000978, 1, 0x01, 0x00000001 },
182 { 0x000957, 1, 0x01, 0x00000003 },
183 { 0x00095e, 1, 0x01, 0x20164010 },
184 { 0x00095f, 1, 0x01, 0x00000020 },
185 { 0x000683, 1, 0x01, 0x00000006 },
186 { 0x000685, 1, 0x01, 0x003fffff },
187 { 0x000687, 1, 0x01, 0x00000c48 },
188 { 0x0006a0, 1, 0x01, 0x00000005 },
189 { 0x000840, 1, 0x01, 0x00300008 },
190 { 0x000841, 1, 0x01, 0x04000080 },
191 { 0x000842, 1, 0x01, 0x00300008 },
192 { 0x000843, 1, 0x01, 0x04000080 },
193 { 0x000818, 8, 0x01, 0x00000000 },
194 { 0x000848, 16, 0x01, 0x00000000 },
195 { 0x000738, 1, 0x01, 0x00000000 },
196 { 0x0006aa, 1, 0x01, 0x00000001 },
197 { 0x0006ab, 1, 0x01, 0x00000002 },
198 { 0x0006ac, 1, 0x01, 0x00000080 },
199 { 0x0006ad, 2, 0x01, 0x00000100 },
200 { 0x0006b1, 1, 0x01, 0x00000011 },
201 { 0x0006bb, 1, 0x01, 0x000000cf },
202 { 0x0006ce, 1, 0x01, 0x2a712488 },
203 { 0x000739, 1, 0x01, 0x4085c000 },
204 { 0x00073a, 1, 0x01, 0x00000080 },
205 { 0x000786, 1, 0x01, 0x80000100 },
206 { 0x00073c, 1, 0x01, 0x00010100 },
207 { 0x00073d, 1, 0x01, 0x02800000 },
208 { 0x000787, 1, 0x01, 0x000000cf },
209 { 0x00078c, 1, 0x01, 0x00000008 },
210 { 0x000792, 1, 0x01, 0x00000001 },
211 { 0x000794, 3, 0x01, 0x00000001 },
212 { 0x000797, 1, 0x01, 0x000000cf },
213 { 0x000836, 1, 0x01, 0x00000001 },
214 { 0x00079a, 1, 0x01, 0x00000002 },
215 { 0x000833, 1, 0x01, 0x04444480 },
216 { 0x0007a1, 1, 0x01, 0x00000001 },
217 { 0x0007a3, 3, 0x01, 0x00000001 },
218 { 0x000831, 1, 0x01, 0x00000004 },
219 { 0x00080c, 1, 0x01, 0x00000002 },
220 { 0x00080d, 2, 0x01, 0x00000100 },
221 { 0x00080f, 1, 0x01, 0x00000001 },
222 { 0x000823, 1, 0x01, 0x00000002 },
223 { 0x000824, 2, 0x01, 0x00000100 },
224 { 0x000826, 1, 0x01, 0x00000001 },
225 { 0x00095d, 1, 0x01, 0x00000001 },
226 { 0x00082b, 1, 0x01, 0x00000004 },
227 { 0x000942, 1, 0x01, 0x00010001 },
228 { 0x000943, 1, 0x01, 0x00000001 },
229 { 0x000944, 1, 0x01, 0x00000022 },
230 { 0x0007c5, 1, 0x01, 0x00010001 },
231 { 0x000834, 1, 0x01, 0x00000001 },
232 { 0x0007c7, 1, 0x01, 0x00000001 },
233 { 0x00c1b0, 8, 0x01, 0x0000000f },
234 { 0x00c1b8, 1, 0x01, 0x0fac6881 },
235 { 0x00c1b9, 1, 0x01, 0x00fac688 },
236 { 0x01e100, 1, 0x01, 0x00000001 },
237 { 0x001000, 1, 0x01, 0x00000002 },
238 { 0x0006aa, 1, 0x01, 0x00000001 },
239 { 0x0006ad, 2, 0x01, 0x00000100 },
240 { 0x0006b1, 1, 0x01, 0x00000011 },
241 { 0x00078c, 1, 0x01, 0x00000008 },
242 { 0x000792, 1, 0x01, 0x00000001 },
243 { 0x000794, 3, 0x01, 0x00000001 },
244 { 0x000797, 1, 0x01, 0x000000cf },
245 { 0x00079a, 1, 0x01, 0x00000002 },
246 { 0x000833, 1, 0x01, 0x04444480 },
247 { 0x0007a1, 1, 0x01, 0x00000001 },
248 { 0x0007a3, 3, 0x01, 0x00000001 },
249 { 0x000831, 1, 0x01, 0x00000004 },
250 { 0x01e100, 1, 0x01, 0x00000001 },
251 { 0x001000, 1, 0x01, 0x00000014 },
252 { 0x000351, 1, 0x01, 0x00000100 },
253 { 0x000957, 1, 0x01, 0x00000003 },
254 { 0x00095d, 1, 0x01, 0x00000001 },
255 { 0x00082b, 1, 0x01, 0x00000004 },
256 { 0x000942, 1, 0x01, 0x00010001 },
257 { 0x000943, 1, 0x01, 0x00000001 },
258 { 0x0007c5, 1, 0x01, 0x00010001 },
259 { 0x000834, 1, 0x01, 0x00000001 },
260 { 0x0007c7, 1, 0x01, 0x00000001 },
261 { 0x01e100, 1, 0x01, 0x00000001 },
262 { 0x001000, 1, 0x01, 0x00000001 },
263 { 0x00080c, 1, 0x01, 0x00000002 },
264 { 0x00080d, 2, 0x01, 0x00000100 },
265 { 0x00080f, 1, 0x01, 0x00000001 },
266 { 0x000823, 1, 0x01, 0x00000002 },
267 { 0x000824, 2, 0x01, 0x00000100 },
268 { 0x000826, 1, 0x01, 0x00000001 },
269 { 0x01e100, 1, 0x01, 0x00000001 },
270 {}
271 };
272
273 const struct gf100_gr_pack
274 gf100_grctx_pack_icmd[] = {
275 { gf100_grctx_init_icmd_0 },
276 {}
277 };
278
279 static const struct gf100_gr_init
280 gf100_grctx_init_9097_0[] = {
281 { 0x000800, 8, 0x40, 0x00000000 },
282 { 0x000804, 8, 0x40, 0x00000000 },
283 { 0x000808, 8, 0x40, 0x00000400 },
284 { 0x00080c, 8, 0x40, 0x00000300 },
285 { 0x000810, 1, 0x04, 0x000000cf },
286 { 0x000850, 7, 0x40, 0x00000000 },
287 { 0x000814, 8, 0x40, 0x00000040 },
288 { 0x000818, 8, 0x40, 0x00000001 },
289 { 0x00081c, 8, 0x40, 0x00000000 },
290 { 0x000820, 8, 0x40, 0x00000000 },
291 { 0x002700, 8, 0x20, 0x00000000 },
292 { 0x002704, 8, 0x20, 0x00000000 },
293 { 0x002708, 8, 0x20, 0x00000000 },
294 { 0x00270c, 8, 0x20, 0x00000000 },
295 { 0x002710, 8, 0x20, 0x00014000 },
296 { 0x002714, 8, 0x20, 0x00000040 },
297 { 0x001c00, 16, 0x10, 0x00000000 },
298 { 0x001c04, 16, 0x10, 0x00000000 },
299 { 0x001c08, 16, 0x10, 0x00000000 },
300 { 0x001c0c, 16, 0x10, 0x00000000 },
301 { 0x001d00, 16, 0x10, 0x00000000 },
302 { 0x001d04, 16, 0x10, 0x00000000 },
303 { 0x001d08, 16, 0x10, 0x00000000 },
304 { 0x001d0c, 16, 0x10, 0x00000000 },
305 { 0x001f00, 16, 0x08, 0x00000000 },
306 { 0x001f04, 16, 0x08, 0x00000000 },
307 { 0x001f80, 16, 0x08, 0x00000000 },
308 { 0x001f84, 16, 0x08, 0x00000000 },
309 { 0x002200, 5, 0x10, 0x00000022 },
310 { 0x002000, 1, 0x04, 0x00000000 },
311 { 0x002040, 1, 0x04, 0x00000011 },
312 { 0x002080, 1, 0x04, 0x00000020 },
313 { 0x0020c0, 1, 0x04, 0x00000030 },
314 { 0x002100, 1, 0x04, 0x00000040 },
315 { 0x002140, 1, 0x04, 0x00000051 },
316 { 0x00200c, 6, 0x40, 0x00000001 },
317 { 0x002010, 1, 0x04, 0x00000000 },
318 { 0x002050, 1, 0x04, 0x00000000 },
319 { 0x002090, 1, 0x04, 0x00000001 },
320 { 0x0020d0, 1, 0x04, 0x00000002 },
321 { 0x002110, 1, 0x04, 0x00000003 },
322 { 0x002150, 1, 0x04, 0x00000004 },
323 { 0x000380, 4, 0x20, 0x00000000 },
324 { 0x000384, 4, 0x20, 0x00000000 },
325 { 0x000388, 4, 0x20, 0x00000000 },
326 { 0x00038c, 4, 0x20, 0x00000000 },
327 { 0x000700, 4, 0x10, 0x00000000 },
328 { 0x000704, 4, 0x10, 0x00000000 },
329 { 0x000708, 4, 0x10, 0x00000000 },
330 { 0x002800, 128, 0x04, 0x00000000 },
331 { 0x000a00, 16, 0x20, 0x00000000 },
332 { 0x000a04, 16, 0x20, 0x00000000 },
333 { 0x000a08, 16, 0x20, 0x00000000 },
334 { 0x000a0c, 16, 0x20, 0x00000000 },
335 { 0x000a10, 16, 0x20, 0x00000000 },
336 { 0x000a14, 16, 0x20, 0x00000000 },
337 { 0x000c00, 16, 0x10, 0x00000000 },
338 { 0x000c04, 16, 0x10, 0x00000000 },
339 { 0x000c08, 16, 0x10, 0x00000000 },
340 { 0x000c0c, 16, 0x10, 0x3f800000 },
341 { 0x000d00, 8, 0x08, 0xffff0000 },
342 { 0x000d04, 8, 0x08, 0xffff0000 },
343 { 0x000e00, 16, 0x10, 0x00000000 },
344 { 0x000e04, 16, 0x10, 0xffff0000 },
345 { 0x000e08, 16, 0x10, 0xffff0000 },
346 { 0x000d40, 4, 0x08, 0x00000000 },
347 { 0x000d44, 4, 0x08, 0x00000000 },
348 { 0x001e00, 8, 0x20, 0x00000001 },
349 { 0x001e04, 8, 0x20, 0x00000001 },
350 { 0x001e08, 8, 0x20, 0x00000002 },
351 { 0x001e0c, 8, 0x20, 0x00000001 },
352 { 0x001e10, 8, 0x20, 0x00000001 },
353 { 0x001e14, 8, 0x20, 0x00000002 },
354 { 0x001e18, 8, 0x20, 0x00000001 },
355 { 0x003400, 128, 0x04, 0x00000000 },
356 { 0x00030c, 1, 0x04, 0x00000001 },
357 { 0x001944, 1, 0x04, 0x00000000 },
358 { 0x001514, 1, 0x04, 0x00000000 },
359 { 0x000d68, 1, 0x04, 0x0000ffff },
360 { 0x00121c, 1, 0x04, 0x0fac6881 },
361 { 0x000fac, 1, 0x04, 0x00000001 },
362 { 0x001538, 1, 0x04, 0x00000001 },
363 { 0x000fe0, 2, 0x04, 0x00000000 },
364 { 0x000fe8, 1, 0x04, 0x00000014 },
365 { 0x000fec, 1, 0x04, 0x00000040 },
366 { 0x000ff0, 1, 0x04, 0x00000000 },
367 { 0x00179c, 1, 0x04, 0x00000000 },
368 { 0x001228, 1, 0x04, 0x00000400 },
369 { 0x00122c, 1, 0x04, 0x00000300 },
370 { 0x001230, 1, 0x04, 0x00010001 },
371 { 0x0007f8, 1, 0x04, 0x00000000 },
372 { 0x0015b4, 1, 0x04, 0x00000001 },
373 { 0x0015cc, 1, 0x04, 0x00000000 },
374 { 0x001534, 1, 0x04, 0x00000000 },
375 { 0x000fb0, 1, 0x04, 0x00000000 },
376 { 0x0015d0, 1, 0x04, 0x00000000 },
377 { 0x00153c, 1, 0x04, 0x00000000 },
378 { 0x0016b4, 1, 0x04, 0x00000003 },
379 { 0x000fbc, 4, 0x04, 0x0000ffff },
380 { 0x000df8, 2, 0x04, 0x00000000 },
381 { 0x001948, 1, 0x04, 0x00000000 },
382 { 0x001970, 1, 0x04, 0x00000001 },
383 { 0x00161c, 1, 0x04, 0x000009f0 },
384 { 0x000dcc, 1, 0x04, 0x00000010 },
385 { 0x00163c, 1, 0x04, 0x00000000 },
386 { 0x0015e4, 1, 0x04, 0x00000000 },
387 { 0x001160, 32, 0x04, 0x25e00040 },
388 { 0x001880, 32, 0x04, 0x00000000 },
389 { 0x000f84, 2, 0x04, 0x00000000 },
390 { 0x0017c8, 2, 0x04, 0x00000000 },
391 { 0x0017d0, 1, 0x04, 0x000000ff },
392 { 0x0017d4, 1, 0x04, 0xffffffff },
393 { 0x0017d8, 1, 0x04, 0x00000002 },
394 { 0x0017dc, 1, 0x04, 0x00000000 },
395 { 0x0015f4, 2, 0x04, 0x00000000 },
396 { 0x001434, 2, 0x04, 0x00000000 },
397 { 0x000d74, 1, 0x04, 0x00000000 },
398 { 0x000dec, 1, 0x04, 0x00000001 },
399 { 0x0013a4, 1, 0x04, 0x00000000 },
400 { 0x001318, 1, 0x04, 0x00000001 },
401 { 0x001644, 1, 0x04, 0x00000000 },
402 { 0x000748, 1, 0x04, 0x00000000 },
403 { 0x000de8, 1, 0x04, 0x00000000 },
404 { 0x001648, 1, 0x04, 0x00000000 },
405 { 0x0012a4, 1, 0x04, 0x00000000 },
406 { 0x001120, 4, 0x04, 0x00000000 },
407 { 0x001118, 1, 0x04, 0x00000000 },
408 { 0x00164c, 1, 0x04, 0x00000000 },
409 { 0x001658, 1, 0x04, 0x00000000 },
410 { 0x001910, 1, 0x04, 0x00000290 },
411 { 0x001518, 1, 0x04, 0x00000000 },
412 { 0x00165c, 1, 0x04, 0x00000001 },
413 { 0x001520, 1, 0x04, 0x00000000 },
414 { 0x001604, 1, 0x04, 0x00000000 },
415 { 0x001570, 1, 0x04, 0x00000000 },
416 { 0x0013b0, 2, 0x04, 0x3f800000 },
417 { 0x00020c, 1, 0x04, 0x00000000 },
418 { 0x001670, 1, 0x04, 0x30201000 },
419 { 0x001674, 1, 0x04, 0x70605040 },
420 { 0x001678, 1, 0x04, 0xb8a89888 },
421 { 0x00167c, 1, 0x04, 0xf8e8d8c8 },
422 { 0x00166c, 1, 0x04, 0x00000000 },
423 { 0x001680, 1, 0x04, 0x00ffff00 },
424 { 0x0012d0, 1, 0x04, 0x00000003 },
425 { 0x0012d4, 1, 0x04, 0x00000002 },
426 { 0x001684, 2, 0x04, 0x00000000 },
427 { 0x000dac, 2, 0x04, 0x00001b02 },
428 { 0x000db4, 1, 0x04, 0x00000000 },
429 { 0x00168c, 1, 0x04, 0x00000000 },
430 { 0x0015bc, 1, 0x04, 0x00000000 },
431 { 0x00156c, 1, 0x04, 0x00000000 },
432 { 0x00187c, 1, 0x04, 0x00000000 },
433 { 0x001110, 1, 0x04, 0x00000001 },
434 { 0x000dc0, 3, 0x04, 0x00000000 },
435 { 0x001234, 1, 0x04, 0x00000000 },
436 { 0x001690, 1, 0x04, 0x00000000 },
437 { 0x0012ac, 1, 0x04, 0x00000001 },
438 { 0x0002c4, 1, 0x04, 0x00000000 },
439 { 0x000790, 5, 0x04, 0x00000000 },
440 { 0x00077c, 1, 0x04, 0x00000000 },
441 { 0x001000, 1, 0x04, 0x00000010 },
442 { 0x0010fc, 1, 0x04, 0x00000000 },
443 { 0x001290, 1, 0x04, 0x00000000 },
444 { 0x000218, 1, 0x04, 0x00000010 },
445 { 0x0012d8, 1, 0x04, 0x00000000 },
446 { 0x0012dc, 1, 0x04, 0x00000010 },
447 { 0x000d94, 1, 0x04, 0x00000001 },
448 { 0x00155c, 2, 0x04, 0x00000000 },
449 { 0x001564, 1, 0x04, 0x00001fff },
450 { 0x001574, 2, 0x04, 0x00000000 },
451 { 0x00157c, 1, 0x04, 0x003fffff },
452 { 0x001354, 1, 0x04, 0x00000000 },
453 { 0x001664, 1, 0x04, 0x00000000 },
454 { 0x001610, 1, 0x04, 0x00000012 },
455 { 0x001608, 2, 0x04, 0x00000000 },
456 { 0x00162c, 1, 0x04, 0x00000003 },
457 { 0x000210, 1, 0x04, 0x00000000 },
458 { 0x000320, 1, 0x04, 0x00000000 },
459 { 0x000324, 6, 0x04, 0x3f800000 },
460 { 0x000750, 1, 0x04, 0x00000000 },
461 { 0x000760, 1, 0x04, 0x39291909 },
462 { 0x000764, 1, 0x04, 0x79695949 },
463 { 0x000768, 1, 0x04, 0xb9a99989 },
464 { 0x00076c, 1, 0x04, 0xf9e9d9c9 },
465 { 0x000770, 1, 0x04, 0x30201000 },
466 { 0x000774, 1, 0x04, 0x70605040 },
467 { 0x000778, 1, 0x04, 0x00009080 },
468 { 0x000780, 1, 0x04, 0x39291909 },
469 { 0x000784, 1, 0x04, 0x79695949 },
470 { 0x000788, 1, 0x04, 0xb9a99989 },
471 { 0x00078c, 1, 0x04, 0xf9e9d9c9 },
472 { 0x0007d0, 1, 0x04, 0x30201000 },
473 { 0x0007d4, 1, 0x04, 0x70605040 },
474 { 0x0007d8, 1, 0x04, 0x00009080 },
475 { 0x00037c, 1, 0x04, 0x00000001 },
476 { 0x000740, 2, 0x04, 0x00000000 },
477 { 0x002600, 1, 0x04, 0x00000000 },
478 { 0x001918, 1, 0x04, 0x00000000 },
479 { 0x00191c, 1, 0x04, 0x00000900 },
480 { 0x001920, 1, 0x04, 0x00000405 },
481 { 0x001308, 1, 0x04, 0x00000001 },
482 { 0x001924, 1, 0x04, 0x00000000 },
483 { 0x0013ac, 1, 0x04, 0x00000000 },
484 { 0x00192c, 1, 0x04, 0x00000001 },
485 { 0x00193c, 1, 0x04, 0x00002c1c },
486 { 0x000d7c, 1, 0x04, 0x00000000 },
487 { 0x000f8c, 1, 0x04, 0x00000000 },
488 { 0x0002c0, 1, 0x04, 0x00000001 },
489 { 0x001510, 1, 0x04, 0x00000000 },
490 { 0x001940, 1, 0x04, 0x00000000 },
491 { 0x000ff4, 2, 0x04, 0x00000000 },
492 { 0x00194c, 2, 0x04, 0x00000000 },
493 { 0x001968, 1, 0x04, 0x00000000 },
494 { 0x001590, 1, 0x04, 0x0000003f },
495 { 0x0007e8, 4, 0x04, 0x00000000 },
496 { 0x00196c, 1, 0x04, 0x00000011 },
497 { 0x00197c, 1, 0x04, 0x00000000 },
498 { 0x000fcc, 2, 0x04, 0x00000000 },
499 { 0x0002d8, 1, 0x04, 0x00000040 },
500 { 0x001980, 1, 0x04, 0x00000080 },
501 { 0x001504, 1, 0x04, 0x00000080 },
502 { 0x001984, 1, 0x04, 0x00000000 },
503 { 0x000300, 1, 0x04, 0x00000001 },
504 { 0x0013a8, 1, 0x04, 0x00000000 },
505 { 0x0012ec, 1, 0x04, 0x00000000 },
506 { 0x001310, 1, 0x04, 0x00000000 },
507 { 0x001314, 1, 0x04, 0x00000001 },
508 { 0x001380, 1, 0x04, 0x00000000 },
509 { 0x001384, 4, 0x04, 0x00000001 },
510 { 0x001394, 1, 0x04, 0x00000000 },
511 { 0x00139c, 1, 0x04, 0x00000000 },
512 { 0x001398, 1, 0x04, 0x00000000 },
513 { 0x001594, 1, 0x04, 0x00000000 },
514 { 0x001598, 4, 0x04, 0x00000001 },
515 { 0x000f54, 3, 0x04, 0x00000000 },
516 { 0x0019bc, 1, 0x04, 0x00000000 },
517 { 0x000f9c, 2, 0x04, 0x00000000 },
518 { 0x0012cc, 1, 0x04, 0x00000000 },
519 { 0x0012e8, 1, 0x04, 0x00000000 },
520 { 0x00130c, 1, 0x04, 0x00000001 },
521 { 0x001360, 8, 0x04, 0x00000000 },
522 { 0x00133c, 2, 0x04, 0x00000001 },
523 { 0x001344, 1, 0x04, 0x00000002 },
524 { 0x001348, 2, 0x04, 0x00000001 },
525 { 0x001350, 1, 0x04, 0x00000002 },
526 { 0x001358, 1, 0x04, 0x00000001 },
527 { 0x0012e4, 1, 0x04, 0x00000000 },
528 { 0x00131c, 4, 0x04, 0x00000000 },
529 { 0x0019c0, 1, 0x04, 0x00000000 },
530 { 0x001140, 1, 0x04, 0x00000000 },
531 { 0x0019c4, 1, 0x04, 0x00000000 },
532 { 0x0019c8, 1, 0x04, 0x00001500 },
533 { 0x00135c, 1, 0x04, 0x00000000 },
534 { 0x000f90, 1, 0x04, 0x00000000 },
535 { 0x0019e0, 8, 0x04, 0x00000001 },
536 { 0x0019cc, 1, 0x04, 0x00000001 },
537 { 0x0015b8, 1, 0x04, 0x00000000 },
538 { 0x001a00, 1, 0x04, 0x00001111 },
539 { 0x001a04, 7, 0x04, 0x00000000 },
540 { 0x000d6c, 2, 0x04, 0xffff0000 },
541 { 0x0010f8, 1, 0x04, 0x00001010 },
542 { 0x000d80, 5, 0x04, 0x00000000 },
543 { 0x000da0, 1, 0x04, 0x00000000 },
544 { 0x001508, 1, 0x04, 0x80000000 },
545 { 0x00150c, 1, 0x04, 0x40000000 },
546 { 0x001668, 1, 0x04, 0x00000000 },
547 { 0x000318, 2, 0x04, 0x00000008 },
548 { 0x000d9c, 1, 0x04, 0x00000001 },
549 { 0x0007dc, 1, 0x04, 0x00000000 },
550 { 0x00074c, 1, 0x04, 0x00000055 },
551 { 0x001420, 1, 0x04, 0x00000003 },
552 { 0x0017bc, 2, 0x04, 0x00000000 },
553 { 0x0017c4, 1, 0x04, 0x00000001 },
554 { 0x001008, 1, 0x04, 0x00000008 },
555 { 0x00100c, 1, 0x04, 0x00000040 },
556 { 0x001010, 1, 0x04, 0x0000012c },
557 { 0x000d60, 1, 0x04, 0x00000040 },
558 { 0x00075c, 1, 0x04, 0x00000003 },
559 { 0x001018, 1, 0x04, 0x00000020 },
560 { 0x00101c, 1, 0x04, 0x00000001 },
561 { 0x001020, 1, 0x04, 0x00000020 },
562 { 0x001024, 1, 0x04, 0x00000001 },
563 { 0x001444, 3, 0x04, 0x00000000 },
564 { 0x000360, 1, 0x04, 0x20164010 },
565 { 0x000364, 1, 0x04, 0x00000020 },
566 { 0x000368, 1, 0x04, 0x00000000 },
567 { 0x000de4, 1, 0x04, 0x00000000 },
568 { 0x000204, 1, 0x04, 0x00000006 },
569 { 0x000208, 1, 0x04, 0x00000000 },
570 { 0x0002cc, 1, 0x04, 0x003fffff },
571 { 0x0002d0, 1, 0x04, 0x00000c48 },
572 { 0x001220, 1, 0x04, 0x00000005 },
573 { 0x000fdc, 1, 0x04, 0x00000000 },
574 { 0x000f98, 1, 0x04, 0x00300008 },
575 { 0x001284, 1, 0x04, 0x04000080 },
576 { 0x001450, 1, 0x04, 0x00300008 },
577 { 0x001454, 1, 0x04, 0x04000080 },
578 { 0x000214, 1, 0x04, 0x00000000 },
579 {}
580 };
581
582 const struct gf100_gr_init
583 gf100_grctx_init_902d_0[] = {
584 { 0x000200, 1, 0x04, 0x000000cf },
585 { 0x000204, 1, 0x04, 0x00000001 },
586 { 0x000208, 1, 0x04, 0x00000020 },
587 { 0x00020c, 1, 0x04, 0x00000001 },
588 { 0x000210, 1, 0x04, 0x00000000 },
589 { 0x000214, 1, 0x04, 0x00000080 },
590 { 0x000218, 2, 0x04, 0x00000100 },
591 { 0x000220, 2, 0x04, 0x00000000 },
592 { 0x000230, 1, 0x04, 0x000000cf },
593 { 0x000234, 1, 0x04, 0x00000001 },
594 { 0x000238, 1, 0x04, 0x00000020 },
595 { 0x00023c, 1, 0x04, 0x00000001 },
596 { 0x000244, 1, 0x04, 0x00000080 },
597 { 0x000248, 2, 0x04, 0x00000100 },
598 {}
599 };
600
601 const struct gf100_gr_init
602 gf100_grctx_init_9039_0[] = {
603 { 0x00030c, 3, 0x04, 0x00000000 },
604 { 0x000320, 1, 0x04, 0x00000000 },
605 { 0x000238, 2, 0x04, 0x00000000 },
606 { 0x000318, 2, 0x04, 0x00000000 },
607 {}
608 };
609
610 const struct gf100_gr_init
611 gf100_grctx_init_90c0_0[] = {
612 { 0x00270c, 8, 0x20, 0x00000000 },
613 { 0x00030c, 1, 0x04, 0x00000001 },
614 { 0x001944, 1, 0x04, 0x00000000 },
615 { 0x000758, 1, 0x04, 0x00000100 },
616 { 0x0002c4, 1, 0x04, 0x00000000 },
617 { 0x000790, 5, 0x04, 0x00000000 },
618 { 0x00077c, 1, 0x04, 0x00000000 },
619 { 0x000204, 3, 0x04, 0x00000000 },
620 { 0x000214, 1, 0x04, 0x00000000 },
621 { 0x00024c, 1, 0x04, 0x00000000 },
622 { 0x000d94, 1, 0x04, 0x00000001 },
623 { 0x001608, 2, 0x04, 0x00000000 },
624 { 0x001664, 1, 0x04, 0x00000000 },
625 {}
626 };
627
628 const struct gf100_gr_pack
629 gf100_grctx_pack_mthd[] = {
630 { gf100_grctx_init_9097_0, 0x9097 },
631 { gf100_grctx_init_902d_0, 0x902d },
632 { gf100_grctx_init_9039_0, 0x9039 },
633 { gf100_grctx_init_90c0_0, 0x90c0 },
634 {}
635 };
636
637 const struct gf100_gr_init
638 gf100_grctx_init_main_0[] = {
639 { 0x400204, 2, 0x04, 0x00000000 },
640 {}
641 };
642
643 const struct gf100_gr_init
644 gf100_grctx_init_fe_0[] = {
645 { 0x404004, 11, 0x04, 0x00000000 },
646 { 0x404044, 1, 0x04, 0x00000000 },
647 { 0x404094, 13, 0x04, 0x00000000 },
648 { 0x4040c8, 1, 0x04, 0xf0000087 },
649 { 0x4040d0, 6, 0x04, 0x00000000 },
650 { 0x4040e8, 1, 0x04, 0x00001000 },
651 { 0x4040f8, 1, 0x04, 0x00000000 },
652 { 0x404130, 2, 0x04, 0x00000000 },
653 { 0x404138, 1, 0x04, 0x20000040 },
654 { 0x404150, 1, 0x04, 0x0000002e },
655 { 0x404154, 1, 0x04, 0x00000400 },
656 { 0x404158, 1, 0x04, 0x00000200 },
657 { 0x404164, 1, 0x04, 0x00000055 },
658 { 0x404168, 1, 0x04, 0x00000000 },
659 { 0x404174, 3, 0x04, 0x00000000 },
660 { 0x404200, 8, 0x04, 0x00000000 },
661 {}
662 };
663
664 const struct gf100_gr_init
665 gf100_grctx_init_pri_0[] = {
666 { 0x404404, 14, 0x04, 0x00000000 },
667 { 0x404460, 2, 0x04, 0x00000000 },
668 { 0x404468, 1, 0x04, 0x00ffffff },
669 { 0x40446c, 1, 0x04, 0x00000000 },
670 { 0x404480, 1, 0x04, 0x00000001 },
671 { 0x404498, 1, 0x04, 0x00000001 },
672 {}
673 };
674
675 const struct gf100_gr_init
676 gf100_grctx_init_memfmt_0[] = {
677 { 0x404604, 1, 0x04, 0x00000015 },
678 { 0x404608, 1, 0x04, 0x00000000 },
679 { 0x40460c, 1, 0x04, 0x00002e00 },
680 { 0x404610, 1, 0x04, 0x00000100 },
681 { 0x404618, 8, 0x04, 0x00000000 },
682 { 0x404638, 1, 0x04, 0x00000004 },
683 { 0x40463c, 8, 0x04, 0x00000000 },
684 { 0x40465c, 1, 0x04, 0x007f0100 },
685 { 0x404660, 7, 0x04, 0x00000000 },
686 { 0x40467c, 1, 0x04, 0x00000002 },
687 { 0x404680, 8, 0x04, 0x00000000 },
688 { 0x4046a0, 1, 0x04, 0x007f0080 },
689 { 0x4046a4, 18, 0x04, 0x00000000 },
690 { 0x4046f0, 2, 0x04, 0x00000000 },
691 { 0x404700, 13, 0x04, 0x00000000 },
692 { 0x404734, 1, 0x04, 0x00000100 },
693 { 0x404738, 8, 0x04, 0x00000000 },
694 {}
695 };
696
697 static const struct gf100_gr_init
698 gf100_grctx_init_ds_0[] = {
699 { 0x405800, 1, 0x04, 0x078000bf },
700 { 0x405830, 1, 0x04, 0x02180000 },
701 { 0x405834, 2, 0x04, 0x00000000 },
702 { 0x405854, 1, 0x04, 0x00000000 },
703 { 0x405870, 4, 0x04, 0x00000001 },
704 { 0x405a00, 2, 0x04, 0x00000000 },
705 { 0x405a18, 1, 0x04, 0x00000000 },
706 {}
707 };
708
709 static const struct gf100_gr_init
710 gf100_grctx_init_pd_0[] = {
711 { 0x406020, 1, 0x04, 0x000103c1 },
712 { 0x406028, 4, 0x04, 0x00000001 },
713 { 0x4064a8, 1, 0x04, 0x00000000 },
714 { 0x4064ac, 1, 0x04, 0x00003fff },
715 { 0x4064b4, 2, 0x04, 0x00000000 },
716 {}
717 };
718
719 const struct gf100_gr_init
720 gf100_grctx_init_rstr2d_0[] = {
721 { 0x407804, 1, 0x04, 0x00000023 },
722 { 0x40780c, 1, 0x04, 0x0a418820 },
723 { 0x407810, 1, 0x04, 0x062080e6 },
724 { 0x407814, 1, 0x04, 0x020398a4 },
725 { 0x407818, 1, 0x04, 0x0e629062 },
726 { 0x40781c, 1, 0x04, 0x0a418820 },
727 { 0x407820, 1, 0x04, 0x000000e6 },
728 { 0x4078bc, 1, 0x04, 0x00000103 },
729 {}
730 };
731
732 const struct gf100_gr_init
733 gf100_grctx_init_scc_0[] = {
734 { 0x408000, 2, 0x04, 0x00000000 },
735 { 0x408008, 1, 0x04, 0x00000018 },
736 { 0x40800c, 2, 0x04, 0x00000000 },
737 { 0x408014, 1, 0x04, 0x00000069 },
738 { 0x408018, 1, 0x04, 0xe100e100 },
739 { 0x408064, 1, 0x04, 0x00000000 },
740 {}
741 };
742
743 static const struct gf100_gr_init
744 gf100_grctx_init_be_0[] = {
745 { 0x408800, 1, 0x04, 0x02802a3c },
746 { 0x408804, 1, 0x04, 0x00000040 },
747 { 0x408808, 1, 0x04, 0x0003e00d },
748 { 0x408900, 1, 0x04, 0x3080b801 },
749 { 0x408904, 1, 0x04, 0x02000001 },
750 { 0x408908, 1, 0x04, 0x00c80929 },
751 { 0x408980, 1, 0x04, 0x0000011d },
752 {}
753 };
754
755 const struct gf100_gr_pack
756 gf100_grctx_pack_hub[] = {
757 { gf100_grctx_init_main_0 },
758 { gf100_grctx_init_fe_0 },
759 { gf100_grctx_init_pri_0 },
760 { gf100_grctx_init_memfmt_0 },
761 { gf100_grctx_init_ds_0 },
762 { gf100_grctx_init_pd_0 },
763 { gf100_grctx_init_rstr2d_0 },
764 { gf100_grctx_init_scc_0 },
765 { gf100_grctx_init_be_0 },
766 {}
767 };
768
769 const struct gf100_gr_init
770 gf100_grctx_init_gpc_unk_0[] = {
771 { 0x418380, 1, 0x04, 0x00000016 },
772 {}
773 };
774
775 const struct gf100_gr_init
776 gf100_grctx_init_prop_0[] = {
777 { 0x418400, 1, 0x04, 0x38004e00 },
778 { 0x418404, 1, 0x04, 0x71e0ffff },
779 { 0x418408, 1, 0x04, 0x00000000 },
780 { 0x41840c, 1, 0x04, 0x00001008 },
781 { 0x418410, 1, 0x04, 0x0fff0fff },
782 { 0x418414, 1, 0x04, 0x00200fff },
783 { 0x418450, 6, 0x04, 0x00000000 },
784 { 0x418468, 1, 0x04, 0x00000001 },
785 { 0x41846c, 2, 0x04, 0x00000000 },
786 {}
787 };
788
789 const struct gf100_gr_init
790 gf100_grctx_init_gpc_unk_1[] = {
791 { 0x418600, 1, 0x04, 0x0000001f },
792 { 0x418684, 1, 0x04, 0x0000000f },
793 { 0x418700, 1, 0x04, 0x00000002 },
794 { 0x418704, 1, 0x04, 0x00000080 },
795 { 0x418708, 1, 0x04, 0x00000000 },
796 { 0x41870c, 1, 0x04, 0x07c80000 },
797 { 0x418710, 1, 0x04, 0x00000000 },
798 {}
799 };
800
801 static const struct gf100_gr_init
802 gf100_grctx_init_setup_0[] = {
803 { 0x418800, 1, 0x04, 0x0006860a },
804 { 0x418808, 3, 0x04, 0x00000000 },
805 { 0x418828, 1, 0x04, 0x00008442 },
806 { 0x418830, 1, 0x04, 0x00000001 },
807 { 0x4188d8, 1, 0x04, 0x00000008 },
808 { 0x4188e0, 1, 0x04, 0x01000000 },
809 { 0x4188e8, 5, 0x04, 0x00000000 },
810 { 0x4188fc, 1, 0x04, 0x00100000 },
811 {}
812 };
813
814 const struct gf100_gr_init
815 gf100_grctx_init_zcull_0[] = {
816 { 0x41891c, 1, 0x04, 0x00ff00ff },
817 { 0x418924, 1, 0x04, 0x00000000 },
818 { 0x418928, 1, 0x04, 0x00ffff00 },
819 { 0x41892c, 1, 0x04, 0x0000ff00 },
820 {}
821 };
822
823 const struct gf100_gr_init
824 gf100_grctx_init_crstr_0[] = {
825 { 0x418b00, 1, 0x04, 0x00000000 },
826 { 0x418b08, 1, 0x04, 0x0a418820 },
827 { 0x418b0c, 1, 0x04, 0x062080e6 },
828 { 0x418b10, 1, 0x04, 0x020398a4 },
829 { 0x418b14, 1, 0x04, 0x0e629062 },
830 { 0x418b18, 1, 0x04, 0x0a418820 },
831 { 0x418b1c, 1, 0x04, 0x000000e6 },
832 { 0x418bb8, 1, 0x04, 0x00000103 },
833 {}
834 };
835
836 const struct gf100_gr_init
837 gf100_grctx_init_gpm_0[] = {
838 { 0x418c08, 1, 0x04, 0x00000001 },
839 { 0x418c10, 8, 0x04, 0x00000000 },
840 { 0x418c80, 1, 0x04, 0x20200004 },
841 { 0x418c8c, 1, 0x04, 0x00000001 },
842 {}
843 };
844
845 const struct gf100_gr_init
846 gf100_grctx_init_gcc_0[] = {
847 { 0x419000, 1, 0x04, 0x00000780 },
848 { 0x419004, 2, 0x04, 0x00000000 },
849 { 0x419014, 1, 0x04, 0x00000004 },
850 {}
851 };
852
853 const struct gf100_gr_pack
854 gf100_grctx_pack_gpc_0[] = {
855 { gf100_grctx_init_gpc_unk_0 },
856 { gf100_grctx_init_prop_0 },
857 { gf100_grctx_init_gpc_unk_1 },
858 { gf100_grctx_init_setup_0 },
859 { gf100_grctx_init_zcull_0 },
860 {}
861 };
862
863 const struct gf100_gr_pack
864 gf100_grctx_pack_gpc_1[] = {
865 { gf100_grctx_init_crstr_0 },
866 { gf100_grctx_init_gpm_0 },
867 { gf100_grctx_init_gcc_0 },
868 {}
869 };
870
871 static const struct gf100_gr_init
872 gf100_grctx_init_zcullr_0[] = {
873 { 0x418a00, 3, 0x04, 0x00000000 },
874 { 0x418a0c, 1, 0x04, 0x00010000 },
875 { 0x418a10, 3, 0x04, 0x00000000 },
876 { 0x418a20, 3, 0x04, 0x00000000 },
877 { 0x418a2c, 1, 0x04, 0x00010000 },
878 { 0x418a30, 3, 0x04, 0x00000000 },
879 { 0x418a40, 3, 0x04, 0x00000000 },
880 { 0x418a4c, 1, 0x04, 0x00010000 },
881 { 0x418a50, 3, 0x04, 0x00000000 },
882 { 0x418a60, 3, 0x04, 0x00000000 },
883 { 0x418a6c, 1, 0x04, 0x00010000 },
884 { 0x418a70, 3, 0x04, 0x00000000 },
885 { 0x418a80, 3, 0x04, 0x00000000 },
886 { 0x418a8c, 1, 0x04, 0x00010000 },
887 { 0x418a90, 3, 0x04, 0x00000000 },
888 { 0x418aa0, 3, 0x04, 0x00000000 },
889 { 0x418aac, 1, 0x04, 0x00010000 },
890 { 0x418ab0, 3, 0x04, 0x00000000 },
891 { 0x418ac0, 3, 0x04, 0x00000000 },
892 { 0x418acc, 1, 0x04, 0x00010000 },
893 { 0x418ad0, 3, 0x04, 0x00000000 },
894 { 0x418ae0, 3, 0x04, 0x00000000 },
895 { 0x418aec, 1, 0x04, 0x00010000 },
896 { 0x418af0, 3, 0x04, 0x00000000 },
897 {}
898 };
899
900 const struct gf100_gr_pack
901 gf100_grctx_pack_zcull[] = {
902 { gf100_grctx_init_zcullr_0 },
903 {}
904 };
905
906 const struct gf100_gr_init
907 gf100_grctx_init_pe_0[] = {
908 { 0x419818, 1, 0x04, 0x00000000 },
909 { 0x41983c, 1, 0x04, 0x00038bc7 },
910 { 0x419848, 1, 0x04, 0x00000000 },
911 { 0x419864, 1, 0x04, 0x0000012a },
912 { 0x419888, 1, 0x04, 0x00000000 },
913 {}
914 };
915
916 static const struct gf100_gr_init
917 gf100_grctx_init_tex_0[] = {
918 { 0x419a00, 1, 0x04, 0x000001f0 },
919 { 0x419a04, 1, 0x04, 0x00000001 },
920 { 0x419a08, 1, 0x04, 0x00000023 },
921 { 0x419a0c, 1, 0x04, 0x00020000 },
922 { 0x419a10, 1, 0x04, 0x00000000 },
923 { 0x419a14, 1, 0x04, 0x00000200 },
924 {}
925 };
926
927 const struct gf100_gr_init
928 gf100_grctx_init_wwdx_0[] = {
929 { 0x419b00, 1, 0x04, 0x0a418820 },
930 { 0x419b04, 1, 0x04, 0x062080e6 },
931 { 0x419b08, 1, 0x04, 0x020398a4 },
932 { 0x419b0c, 1, 0x04, 0x0e629062 },
933 { 0x419b10, 1, 0x04, 0x0a418820 },
934 { 0x419b14, 1, 0x04, 0x000000e6 },
935 { 0x419bd0, 1, 0x04, 0x00900103 },
936 { 0x419be0, 1, 0x04, 0x00000001 },
937 { 0x419be4, 1, 0x04, 0x00000000 },
938 {}
939 };
940
941 const struct gf100_gr_init
942 gf100_grctx_init_mpc_0[] = {
943 { 0x419c00, 1, 0x04, 0x00000002 },
944 { 0x419c04, 1, 0x04, 0x00000006 },
945 { 0x419c08, 1, 0x04, 0x00000002 },
946 { 0x419c20, 1, 0x04, 0x00000000 },
947 {}
948 };
949
950 static const struct gf100_gr_init
951 gf100_grctx_init_l1c_0[] = {
952 { 0x419cb0, 1, 0x04, 0x00060048 },
953 { 0x419ce8, 1, 0x04, 0x00000000 },
954 { 0x419cf4, 1, 0x04, 0x00000183 },
955 {}
956 };
957
958 const struct gf100_gr_init
959 gf100_grctx_init_tpccs_0[] = {
960 { 0x419d20, 1, 0x04, 0x02180000 },
961 { 0x419d24, 1, 0x04, 0x00001fff },
962 {}
963 };
964
965 static const struct gf100_gr_init
966 gf100_grctx_init_sm_0[] = {
967 { 0x419e04, 3, 0x04, 0x00000000 },
968 { 0x419e10, 1, 0x04, 0x00000002 },
969 { 0x419e44, 1, 0x04, 0x001beff2 },
970 { 0x419e48, 1, 0x04, 0x00000000 },
971 { 0x419e4c, 1, 0x04, 0x0000000f },
972 { 0x419e50, 17, 0x04, 0x00000000 },
973 { 0x419e98, 1, 0x04, 0x00000000 },
974 { 0x419f50, 2, 0x04, 0x00000000 },
975 {}
976 };
977
978 const struct gf100_gr_pack
979 gf100_grctx_pack_tpc[] = {
980 { gf100_grctx_init_pe_0 },
981 { gf100_grctx_init_tex_0 },
982 { gf100_grctx_init_wwdx_0 },
983 { gf100_grctx_init_mpc_0 },
984 { gf100_grctx_init_l1c_0 },
985 { gf100_grctx_init_tpccs_0 },
986 { gf100_grctx_init_sm_0 },
987 {}
988 };
989
990 /*******************************************************************************
991 * PGRAPH context implementation
992 ******************************************************************************/
993
994 void
gf100_grctx_patch_wr32(struct gf100_gr_chan * chan,u32 addr,u32 data)995 gf100_grctx_patch_wr32(struct gf100_gr_chan *chan, u32 addr, u32 data)
996 {
997 if (unlikely(!chan->mmio)) {
998 nvkm_wr32(chan->gr->base.engine.subdev.device, addr, data);
999 return;
1000 }
1001
1002 nvkm_wo32(chan->mmio, chan->mmio_nr++ * 4, addr);
1003 nvkm_wo32(chan->mmio, chan->mmio_nr++ * 4, data);
1004 }
1005
1006 void
gf100_grctx_generate_r419cb8(struct gf100_gr * gr)1007 gf100_grctx_generate_r419cb8(struct gf100_gr *gr)
1008 {
1009 struct nvkm_device *device = gr->base.engine.subdev.device;
1010 nvkm_mask(device, 0x419cb8, 0x00007c00, 0x00000000);
1011 }
1012
1013 void
gf100_grctx_generate_bundle(struct gf100_gr_chan * chan,u64 addr,u32 size)1014 gf100_grctx_generate_bundle(struct gf100_gr_chan *chan, u64 addr, u32 size)
1015 {
1016 gf100_grctx_patch_wr32(chan, 0x408004, addr >> 8);
1017 gf100_grctx_patch_wr32(chan, 0x408008, 0x80000000 | (size >> 8));
1018 gf100_grctx_patch_wr32(chan, 0x418808, addr >> 8);
1019 gf100_grctx_patch_wr32(chan, 0x41880c, 0x80000000 | (size >> 8));
1020 }
1021
1022 void
gf100_grctx_generate_pagepool(struct gf100_gr_chan * chan,u64 addr)1023 gf100_grctx_generate_pagepool(struct gf100_gr_chan *chan, u64 addr)
1024 {
1025 gf100_grctx_patch_wr32(chan, 0x40800c, addr >> 8);
1026 gf100_grctx_patch_wr32(chan, 0x408010, 0x80000000);
1027 gf100_grctx_patch_wr32(chan, 0x419004, addr >> 8);
1028 gf100_grctx_patch_wr32(chan, 0x419008, 0x00000000);
1029 }
1030
1031 void
gf100_grctx_generate_attrib(struct gf100_gr_chan * chan)1032 gf100_grctx_generate_attrib(struct gf100_gr_chan *chan)
1033 {
1034 struct gf100_gr *gr = chan->gr;
1035 const struct gf100_grctx_func *grctx = gr->func->grctx;
1036 const u32 attrib = grctx->attrib_nr;
1037 int gpc, tpc;
1038 u32 bo = 0;
1039
1040 gf100_grctx_patch_wr32(chan, 0x405830, (attrib << 16));
1041
1042 for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
1043 for (tpc = 0; tpc < gr->tpc_nr[gpc]; tpc++) {
1044 const u32 o = TPC_UNIT(gpc, tpc, 0x0520);
1045
1046 gf100_grctx_patch_wr32(chan, o, (attrib << 16) | bo);
1047 bo += grctx->attrib_nr_max;
1048 }
1049 }
1050 }
1051
1052 void
gf100_grctx_generate_attrib_cb(struct gf100_gr_chan * chan,u64 addr,u32 size)1053 gf100_grctx_generate_attrib_cb(struct gf100_gr_chan *chan, u64 addr, u32 size)
1054 {
1055 gf100_grctx_patch_wr32(chan, 0x418810, 0x80000000 | addr >> 12);
1056 gf100_grctx_patch_wr32(chan, 0x419848, 0x10000000 | addr >> 12);
1057 }
1058
1059 u32
gf100_grctx_generate_attrib_cb_size(struct gf100_gr * gr)1060 gf100_grctx_generate_attrib_cb_size(struct gf100_gr *gr)
1061 {
1062 const struct gf100_grctx_func *grctx = gr->func->grctx;
1063
1064 return 0x20 * (grctx->attrib_nr_max + grctx->alpha_nr_max) * gr->tpc_total;
1065 }
1066
1067 void
gf100_grctx_generate_unkn(struct gf100_gr * gr)1068 gf100_grctx_generate_unkn(struct gf100_gr *gr)
1069 {
1070 }
1071
1072 void
gf100_grctx_generate_r4060a8(struct gf100_gr * gr)1073 gf100_grctx_generate_r4060a8(struct gf100_gr *gr)
1074 {
1075 struct nvkm_device *device = gr->base.engine.subdev.device;
1076 const u8 gpcmax = nvkm_rd32(device, 0x022430);
1077 const u8 tpcmax = nvkm_rd32(device, 0x022434) * gpcmax;
1078 int i, j, sm = 0;
1079 u32 data;
1080
1081 for (i = 0; i < DIV_ROUND_UP(tpcmax, 4); i++) {
1082 for (data = 0, j = 0; j < 4; j++) {
1083 if (sm < gr->sm_nr)
1084 data |= gr->sm[sm++].gpc << (j * 8);
1085 else
1086 data |= 0x1f << (j * 8);
1087 }
1088 nvkm_wr32(device, 0x4060a8 + (i * 4), data);
1089 }
1090 }
1091
1092 void
gf100_grctx_generate_rop_mapping(struct gf100_gr * gr)1093 gf100_grctx_generate_rop_mapping(struct gf100_gr *gr)
1094 {
1095 struct nvkm_device *device = gr->base.engine.subdev.device;
1096 u32 data[6] = {}, data2[2] = {};
1097 u8 shift, ntpcv;
1098 int i;
1099
1100 /* Pack tile map into register format. */
1101 for (i = 0; i < 32; i++)
1102 data[i / 6] |= (gr->tile[i] & 0x07) << ((i % 6) * 5);
1103
1104 /* Magic. */
1105 shift = 0;
1106 ntpcv = gr->tpc_total;
1107 while (!(ntpcv & (1 << 4))) {
1108 ntpcv <<= 1;
1109 shift++;
1110 }
1111
1112 data2[0] = (ntpcv << 16);
1113 data2[0] |= (shift << 21);
1114 data2[0] |= (((1 << (0 + 5)) % ntpcv) << 24);
1115 for (i = 1; i < 7; i++)
1116 data2[1] |= ((1 << (i + 5)) % ntpcv) << ((i - 1) * 5);
1117
1118 /* GPC_BROADCAST */
1119 nvkm_wr32(device, 0x418bb8, (gr->tpc_total << 8) |
1120 gr->screen_tile_row_offset);
1121 for (i = 0; i < 6; i++)
1122 nvkm_wr32(device, 0x418b08 + (i * 4), data[i]);
1123
1124 /* GPC_BROADCAST.TP_BROADCAST */
1125 nvkm_wr32(device, 0x419bd0, (gr->tpc_total << 8) |
1126 gr->screen_tile_row_offset | data2[0]);
1127 nvkm_wr32(device, 0x419be4, data2[1]);
1128 for (i = 0; i < 6; i++)
1129 nvkm_wr32(device, 0x419b00 + (i * 4), data[i]);
1130
1131 /* UNK78xx */
1132 nvkm_wr32(device, 0x4078bc, (gr->tpc_total << 8) |
1133 gr->screen_tile_row_offset);
1134 for (i = 0; i < 6; i++)
1135 nvkm_wr32(device, 0x40780c + (i * 4), data[i]);
1136 }
1137
1138 void
gf100_grctx_generate_max_ways_evict(struct gf100_gr * gr)1139 gf100_grctx_generate_max_ways_evict(struct gf100_gr *gr)
1140 {
1141 struct nvkm_device *device = gr->base.engine.subdev.device;
1142 u32 fbps = nvkm_rd32(device, 0x121c74);
1143 if (fbps == 1)
1144 nvkm_mask(device, 0x17e91c, 0x001f0000, 0x00090000);
1145 }
1146
1147 static const u32
1148 gf100_grctx_alpha_beta_map[17][32] = {
1149 [1] = {
1150 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1151 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1152 },
1153 [2] = {
1154 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1155 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1156 },
1157 //XXX: 3
1158 [4] = {
1159 1, 1, 1, 1, 1, 1, 1, 1,
1160 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1161 3, 3, 3, 3, 3, 3, 3, 3,
1162 },
1163 //XXX: 5
1164 //XXX: 6
1165 [7] = {
1166 1, 1, 1, 1,
1167 2, 2, 2, 2, 2, 2,
1168 3, 3, 3, 3, 3, 3,
1169 4, 4, 4, 4, 4, 4,
1170 5, 5, 5, 5, 5, 5,
1171 6, 6, 6, 6,
1172 },
1173 [8] = {
1174 1, 1, 1,
1175 2, 2, 2, 2, 2,
1176 3, 3, 3, 3, 3,
1177 4, 4, 4, 4, 4, 4,
1178 5, 5, 5, 5, 5,
1179 6, 6, 6, 6, 6,
1180 7, 7, 7,
1181 },
1182 //XXX: 9
1183 //XXX: 10
1184 [11] = {
1185 1, 1,
1186 2, 2, 2, 2,
1187 3, 3, 3,
1188 4, 4, 4, 4,
1189 5, 5, 5,
1190 6, 6, 6,
1191 7, 7, 7, 7,
1192 8, 8, 8,
1193 9, 9, 9, 9,
1194 10, 10,
1195 },
1196 //XXX: 12
1197 //XXX: 13
1198 [14] = {
1199 1, 1,
1200 2, 2,
1201 3, 3, 3,
1202 4, 4, 4,
1203 5, 5,
1204 6, 6, 6,
1205 7, 7,
1206 8, 8, 8,
1207 9, 9,
1208 10, 10, 10,
1209 11, 11, 11,
1210 12, 12,
1211 13, 13,
1212 },
1213 [15] = {
1214 1, 1,
1215 2, 2,
1216 3, 3,
1217 4, 4, 4,
1218 5, 5,
1219 6, 6, 6,
1220 7, 7,
1221 8, 8,
1222 9, 9, 9,
1223 10, 10,
1224 11, 11, 11,
1225 12, 12,
1226 13, 13,
1227 14, 14,
1228 },
1229 [16] = {
1230 1, 1,
1231 2, 2,
1232 3, 3,
1233 4, 4,
1234 5, 5,
1235 6, 6, 6,
1236 7, 7,
1237 8, 8,
1238 9, 9,
1239 10, 10, 10,
1240 11, 11,
1241 12, 12,
1242 13, 13,
1243 14, 14,
1244 15, 15,
1245 },
1246 };
1247
1248 void
gf100_grctx_generate_alpha_beta_tables(struct gf100_gr * gr)1249 gf100_grctx_generate_alpha_beta_tables(struct gf100_gr *gr)
1250 {
1251 struct nvkm_subdev *subdev = &gr->base.engine.subdev;
1252 struct nvkm_device *device = subdev->device;
1253 int i, gpc;
1254
1255 for (i = 0; i < 32; i++) {
1256 u32 atarget = gf100_grctx_alpha_beta_map[gr->tpc_total][i];
1257 u32 abits[GPC_MAX] = {}, amask = 0, bmask = 0;
1258
1259 if (!atarget) {
1260 nvkm_warn(subdev, "missing alpha/beta mapping table\n");
1261 atarget = max_t(u32, gr->tpc_total * i / 32, 1);
1262 }
1263
1264 while (atarget) {
1265 for (gpc = 0; atarget && gpc < gr->gpc_nr; gpc++) {
1266 if (abits[gpc] < gr->tpc_nr[gpc]) {
1267 abits[gpc]++;
1268 atarget--;
1269 }
1270 }
1271 }
1272
1273 for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
1274 u32 bbits = gr->tpc_nr[gpc] - abits[gpc];
1275 amask |= ((1 << abits[gpc]) - 1) << (gpc * 8);
1276 bmask |= ((1 << bbits) - 1) << abits[gpc] << (gpc * 8);
1277 }
1278
1279 nvkm_wr32(device, 0x406800 + (i * 0x20), amask);
1280 nvkm_wr32(device, 0x406c00 + (i * 0x20), bmask);
1281 }
1282 }
1283
1284 void
gf100_grctx_generate_tpc_nr(struct gf100_gr * gr,int gpc)1285 gf100_grctx_generate_tpc_nr(struct gf100_gr *gr, int gpc)
1286 {
1287 struct nvkm_device *device = gr->base.engine.subdev.device;
1288 nvkm_wr32(device, GPC_UNIT(gpc, 0x0c08), gr->tpc_nr[gpc]);
1289 nvkm_wr32(device, GPC_UNIT(gpc, 0x0c8c), gr->tpc_nr[gpc]);
1290 }
1291
1292 void
gf100_grctx_generate_sm_id(struct gf100_gr * gr,int gpc,int tpc,int sm)1293 gf100_grctx_generate_sm_id(struct gf100_gr *gr, int gpc, int tpc, int sm)
1294 {
1295 struct nvkm_device *device = gr->base.engine.subdev.device;
1296 nvkm_wr32(device, TPC_UNIT(gpc, tpc, 0x698), sm);
1297 nvkm_wr32(device, TPC_UNIT(gpc, tpc, 0x4e8), sm);
1298 nvkm_wr32(device, GPC_UNIT(gpc, 0x0c10 + tpc * 4), sm);
1299 nvkm_wr32(device, TPC_UNIT(gpc, tpc, 0x088), sm);
1300 }
1301
1302 void
gf100_grctx_generate_floorsweep(struct gf100_gr * gr)1303 gf100_grctx_generate_floorsweep(struct gf100_gr *gr)
1304 {
1305 const struct gf100_grctx_func *func = gr->func->grctx;
1306 int sm;
1307
1308 for (sm = 0; sm < gr->sm_nr; sm++) {
1309 func->sm_id(gr, gr->sm[sm].gpc, gr->sm[sm].tpc, sm);
1310 if (func->tpc_nr)
1311 func->tpc_nr(gr, gr->sm[sm].gpc);
1312 }
1313
1314 gf100_gr_init_num_tpc_per_gpc(gr, false, true);
1315 if (!func->skip_pd_num_tpc_per_gpc)
1316 gf100_gr_init_num_tpc_per_gpc(gr, true, false);
1317
1318 if (func->r4060a8)
1319 func->r4060a8(gr);
1320
1321 func->rop_mapping(gr);
1322
1323 if (func->alpha_beta_tables)
1324 func->alpha_beta_tables(gr);
1325 if (func->max_ways_evict)
1326 func->max_ways_evict(gr);
1327 if (func->dist_skip_table)
1328 func->dist_skip_table(gr);
1329 if (func->r406500)
1330 func->r406500(gr);
1331 if (func->gpc_tpc_nr)
1332 func->gpc_tpc_nr(gr);
1333 if (func->r419f78)
1334 func->r419f78(gr);
1335 if (func->tpc_mask)
1336 func->tpc_mask(gr);
1337 if (func->smid_config)
1338 func->smid_config(gr);
1339 }
1340
1341 void
gf100_grctx_generate_main(struct gf100_gr_chan * chan)1342 gf100_grctx_generate_main(struct gf100_gr_chan *chan)
1343 {
1344 struct gf100_gr *gr = chan->gr;
1345 struct nvkm_device *device = gr->base.engine.subdev.device;
1346 const struct gf100_grctx_func *grctx = gr->func->grctx;
1347 u32 idle_timeout;
1348
1349 nvkm_mc_unk260(device, 0);
1350
1351 if (!gr->sw_ctx) {
1352 gf100_gr_mmio(gr, grctx->hub);
1353 gf100_gr_mmio(gr, grctx->gpc_0);
1354 gf100_gr_mmio(gr, grctx->zcull);
1355 gf100_gr_mmio(gr, grctx->gpc_1);
1356 gf100_gr_mmio(gr, grctx->tpc);
1357 gf100_gr_mmio(gr, grctx->ppc);
1358 } else {
1359 gf100_gr_mmio(gr, gr->sw_ctx);
1360 }
1361
1362 if (gr->func->init_419bd8)
1363 gr->func->init_419bd8(gr);
1364 if (grctx->r419ea8)
1365 grctx->r419ea8(gr);
1366
1367 gf100_gr_wait_idle(gr);
1368
1369 idle_timeout = nvkm_mask(device, 0x404154, 0xffffffff, 0x00000000);
1370
1371 grctx->pagepool(chan, chan->pagepool->addr);
1372 grctx->bundle(chan, chan->bundle_cb->addr, grctx->bundle_size);
1373 grctx->attrib_cb(chan, chan->attrib_cb->addr, grctx->attrib_cb_size(gr));
1374 grctx->attrib(chan);
1375 if (grctx->patch_ltc)
1376 grctx->patch_ltc(chan);
1377 if (grctx->unknown_size)
1378 grctx->unknown(chan, chan->unknown->addr, grctx->unknown_size);
1379 grctx->unkn(gr);
1380
1381 gf100_grctx_generate_floorsweep(gr);
1382
1383 gf100_gr_wait_idle(gr);
1384
1385 if (grctx->r400088) grctx->r400088(gr, false);
1386
1387 if (gr->bundle)
1388 gf100_gr_icmd(gr, gr->bundle);
1389 else
1390 gf100_gr_icmd(gr, grctx->icmd);
1391
1392 if (gr->bundle_veid)
1393 gf100_gr_icmd(gr, gr->bundle_veid);
1394 else
1395 gf100_gr_icmd(gr, grctx->sw_veid_bundle_init);
1396
1397 if (gr->bundle64)
1398 gf100_gr_icmd(gr, gr->bundle64);
1399 else
1400 if (grctx->sw_bundle64_init)
1401 gf100_gr_icmd(gr, grctx->sw_bundle64_init);
1402
1403 if (grctx->r400088) grctx->r400088(gr, true);
1404
1405 nvkm_wr32(device, 0x404154, idle_timeout);
1406
1407 if (gr->method)
1408 gf100_gr_mthd(gr, gr->method);
1409 else
1410 gf100_gr_mthd(gr, grctx->mthd);
1411 nvkm_mc_unk260(device, 1);
1412
1413 if (grctx->r419cb8)
1414 grctx->r419cb8(gr);
1415 if (grctx->r418800)
1416 grctx->r418800(gr);
1417 if (grctx->r419eb0)
1418 grctx->r419eb0(gr);
1419 if (grctx->r419e00)
1420 grctx->r419e00(gr);
1421 if (grctx->r418e94)
1422 grctx->r418e94(gr);
1423 if (grctx->r419a3c)
1424 grctx->r419a3c(gr);
1425 if (grctx->r408840)
1426 grctx->r408840(gr);
1427 if (grctx->r419c0c)
1428 grctx->r419c0c(gr);
1429
1430 gf100_gr_wait_idle(gr);
1431 }
1432
1433 #define CB_RESERVED 0x80000
1434
1435 int
gf100_grctx_generate(struct gf100_gr * gr,struct gf100_gr_chan * chan,struct nvkm_gpuobj * inst)1436 gf100_grctx_generate(struct gf100_gr *gr, struct gf100_gr_chan *chan, struct nvkm_gpuobj *inst)
1437 {
1438 const struct gf100_grctx_func *grctx = gr->func->grctx;
1439 struct nvkm_subdev *subdev = &gr->base.engine.subdev;
1440 struct nvkm_device *device = subdev->device;
1441 struct nvkm_memory *data = NULL;
1442 struct nvkm_vma *ctx = NULL;
1443 int ret, i;
1444 u64 addr;
1445
1446 /* NV_PGRAPH_FE_PWR_MODE_FORCE_ON. */
1447 nvkm_wr32(device, 0x404170, 0x00000012);
1448 nvkm_msec(device, 2000,
1449 if (!(nvkm_rd32(device, 0x404170) & 0x00000010))
1450 break;
1451 );
1452
1453 if (grctx->unkn88c)
1454 grctx->unkn88c(gr, true);
1455
1456 /* Reset FECS. */
1457 gr->func->fecs.reset(gr);
1458
1459 if (grctx->unkn88c)
1460 grctx->unkn88c(gr, false);
1461
1462 /* NV_PGRAPH_FE_PWR_MODE_AUTO. */
1463 nvkm_wr32(device, 0x404170, 0x00000010);
1464 nvkm_msec(device, 2000,
1465 if (!(nvkm_rd32(device, 0x404170) & 0x00000010))
1466 break;
1467 );
1468
1469 /* Init SCC RAM. */
1470 nvkm_wr32(device, 0x40802c, 0x00000001);
1471
1472 /* Allocate memory to store context, and dummy global context buffers. */
1473 ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST,
1474 CB_RESERVED + gr->size, 0, true, &data);
1475 if (ret)
1476 goto done;
1477
1478 ret = nvkm_vmm_get(chan->vmm, 0, nvkm_memory_size(data), &ctx);
1479 if (ret)
1480 goto done;
1481
1482 ret = nvkm_memory_map(data, 0, chan->vmm, ctx, NULL, 0);
1483 if (ret)
1484 goto done;
1485
1486 /* Setup context pointer. */
1487 nvkm_kmap(inst);
1488 nvkm_wo32(inst, 0x0210, lower_32_bits(ctx->addr + CB_RESERVED) | 4);
1489 nvkm_wo32(inst, 0x0214, upper_32_bits(ctx->addr + CB_RESERVED));
1490 nvkm_done(inst);
1491
1492 /* Make channel current. */
1493 addr = inst->addr >> 12;
1494 if (gr->firmware) {
1495 ret = gf100_gr_fecs_bind_pointer(gr, 0x80000000 | addr);
1496 if (ret)
1497 goto done_inst;
1498
1499 nvkm_kmap(data);
1500 nvkm_wo32(data, 0x1c, 1);
1501 nvkm_wo32(data, 0x20, 0);
1502 nvkm_wo32(data, 0x28, 0);
1503 nvkm_wo32(data, 0x2c, 0);
1504 nvkm_done(data);
1505 } else {
1506 nvkm_wr32(device, 0x409840, 0x80000000);
1507 nvkm_wr32(device, 0x409500, 0x80000000 | addr);
1508 nvkm_wr32(device, 0x409504, 0x00000001);
1509 nvkm_msec(device, 2000,
1510 if (nvkm_rd32(device, 0x409800) & 0x80000000)
1511 break;
1512 );
1513 }
1514
1515 grctx->main(chan);
1516
1517 if (!gr->firmware) {
1518 /* Trigger a context unload by unsetting the "next channel valid" bit
1519 * and faking a context switch interrupt.
1520 */
1521 nvkm_mask(device, 0x409b04, 0x80000000, 0x00000000);
1522 nvkm_wr32(device, 0x409000, 0x00000100);
1523 if (nvkm_msec(device, 2000,
1524 if (!(nvkm_rd32(device, 0x409b00) & 0x80000000))
1525 break;
1526 ) < 0) {
1527 ret = -EBUSY;
1528 goto done_inst;
1529 }
1530 } else {
1531 ret = gf100_gr_fecs_wfi_golden_save(gr, 0x80000000 | addr);
1532 if (ret)
1533 goto done_inst;
1534
1535 nvkm_mask(device, 0x409b00, 0x80000000, 0x00000000);
1536 }
1537
1538 gr->data = kmalloc(gr->size, GFP_KERNEL);
1539 if (gr->data) {
1540 nvkm_kmap(data);
1541 for (i = 0; i < gr->size; i += 4)
1542 gr->data[i / 4] = nvkm_ro32(data, CB_RESERVED + i);
1543 nvkm_done(data);
1544 ret = 0;
1545 } else {
1546 ret = -ENOMEM;
1547 }
1548
1549 done_inst:
1550 nvkm_kmap(inst);
1551 nvkm_wo32(inst, 0x0210, 0);
1552 nvkm_wo32(inst, 0x0214, 0);
1553 nvkm_done(inst);
1554 done:
1555 nvkm_vmm_put(chan->vmm, &ctx);
1556 nvkm_memory_unref(&data);
1557 return ret;
1558 }
1559
1560 const struct gf100_grctx_func
1561 gf100_grctx = {
1562 .main = gf100_grctx_generate_main,
1563 .unkn = gf100_grctx_generate_unkn,
1564 .hub = gf100_grctx_pack_hub,
1565 .gpc_0 = gf100_grctx_pack_gpc_0,
1566 .gpc_1 = gf100_grctx_pack_gpc_1,
1567 .zcull = gf100_grctx_pack_zcull,
1568 .tpc = gf100_grctx_pack_tpc,
1569 .icmd = gf100_grctx_pack_icmd,
1570 .mthd = gf100_grctx_pack_mthd,
1571 .bundle = gf100_grctx_generate_bundle,
1572 .bundle_size = 0x1800,
1573 .pagepool = gf100_grctx_generate_pagepool,
1574 .pagepool_size = 0x8000,
1575 .attrib_cb_size = gf100_grctx_generate_attrib_cb_size,
1576 .attrib_cb = gf100_grctx_generate_attrib_cb,
1577 .attrib = gf100_grctx_generate_attrib,
1578 .attrib_nr_max = 0x324,
1579 .attrib_nr = 0x218,
1580 .sm_id = gf100_grctx_generate_sm_id,
1581 .tpc_nr = gf100_grctx_generate_tpc_nr,
1582 .r4060a8 = gf100_grctx_generate_r4060a8,
1583 .rop_mapping = gf100_grctx_generate_rop_mapping,
1584 .alpha_beta_tables = gf100_grctx_generate_alpha_beta_tables,
1585 .max_ways_evict = gf100_grctx_generate_max_ways_evict,
1586 .r419cb8 = gf100_grctx_generate_r419cb8,
1587 };
1588