xref: /linux/drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf100.c (revision 6762510bc8447dc4eb4c3d99541de6b31843e649)
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
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
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
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
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
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
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
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
1068 gf100_grctx_generate_unkn(struct gf100_gr *gr)
1069 {
1070 }
1071 
1072 void
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
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
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
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
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
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
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
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 	gf100_gr_wait_idle(gr);
1363 
1364 	idle_timeout = nvkm_mask(device, 0x404154, 0xffffffff, 0x00000000);
1365 
1366 	grctx->pagepool(chan, chan->pagepool->addr);
1367 	grctx->bundle(chan, chan->bundle_cb->addr, grctx->bundle_size);
1368 	grctx->attrib_cb(chan, chan->attrib_cb->addr, grctx->attrib_cb_size(gr));
1369 	grctx->attrib(chan);
1370 	if (grctx->patch_ltc)
1371 		grctx->patch_ltc(chan);
1372 	if (grctx->unknown_size)
1373 		grctx->unknown(chan, chan->unknown->addr, grctx->unknown_size);
1374 	grctx->unkn(gr);
1375 
1376 	gf100_grctx_generate_floorsweep(gr);
1377 
1378 	gf100_gr_wait_idle(gr);
1379 
1380 	if (grctx->r400088) grctx->r400088(gr, false);
1381 	if (gr->bundle)
1382 		gf100_gr_icmd(gr, gr->bundle);
1383 	else
1384 		gf100_gr_icmd(gr, grctx->icmd);
1385 	if (grctx->sw_veid_bundle_init)
1386 		gf100_gr_icmd(gr, grctx->sw_veid_bundle_init);
1387 	if (grctx->r400088) grctx->r400088(gr, true);
1388 
1389 	nvkm_wr32(device, 0x404154, idle_timeout);
1390 
1391 	if (gr->method)
1392 		gf100_gr_mthd(gr, gr->method);
1393 	else
1394 		gf100_gr_mthd(gr, grctx->mthd);
1395 	nvkm_mc_unk260(device, 1);
1396 
1397 	if (grctx->r419cb8)
1398 		grctx->r419cb8(gr);
1399 	if (grctx->r418800)
1400 		grctx->r418800(gr);
1401 	if (grctx->r419eb0)
1402 		grctx->r419eb0(gr);
1403 	if (grctx->r419e00)
1404 		grctx->r419e00(gr);
1405 	if (grctx->r418e94)
1406 		grctx->r418e94(gr);
1407 	if (grctx->r419a3c)
1408 		grctx->r419a3c(gr);
1409 	if (grctx->r408840)
1410 		grctx->r408840(gr);
1411 	if (grctx->r419c0c)
1412 		grctx->r419c0c(gr);
1413 }
1414 
1415 #define CB_RESERVED 0x80000
1416 
1417 int
1418 gf100_grctx_generate(struct gf100_gr *gr, struct gf100_gr_chan *chan, struct nvkm_gpuobj *inst)
1419 {
1420 	const struct gf100_grctx_func *grctx = gr->func->grctx;
1421 	struct nvkm_subdev *subdev = &gr->base.engine.subdev;
1422 	struct nvkm_device *device = subdev->device;
1423 	struct nvkm_memory *data = NULL;
1424 	struct nvkm_vma *ctx = NULL;
1425 	int ret, i;
1426 	u64 addr;
1427 
1428 	/* NV_PGRAPH_FE_PWR_MODE_FORCE_ON. */
1429 	nvkm_wr32(device, 0x404170, 0x00000012);
1430 	nvkm_msec(device, 2000,
1431 		if (!(nvkm_rd32(device, 0x404170) & 0x00000010))
1432 			break;
1433 	);
1434 
1435 	if (grctx->unkn88c)
1436 		grctx->unkn88c(gr, true);
1437 
1438 	/* Reset FECS. */
1439 	nvkm_wr32(device, 0x409614, 0x00000070);
1440 	nvkm_usec(device, 10, NVKM_DELAY);
1441 	nvkm_mask(device, 0x409614, 0x00000700, 0x00000700);
1442 	nvkm_usec(device, 10, NVKM_DELAY);
1443 	nvkm_rd32(device, 0x409614);
1444 
1445 	if (grctx->unkn88c)
1446 		grctx->unkn88c(gr, false);
1447 
1448 	/* NV_PGRAPH_FE_PWR_MODE_AUTO. */
1449 	nvkm_wr32(device, 0x404170, 0x00000010);
1450 
1451 	/* Init SCC RAM. */
1452 	nvkm_wr32(device, 0x40802c, 0x00000001);
1453 
1454 	/* Allocate memory to store context, and dummy global context buffers. */
1455 	ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST,
1456 			      CB_RESERVED + gr->size, 0, true, &data);
1457 	if (ret)
1458 		goto done;
1459 
1460 	ret = nvkm_vmm_get(chan->vmm, 0, nvkm_memory_size(data), &ctx);
1461 	if (ret)
1462 		goto done;
1463 
1464 	ret = nvkm_memory_map(data, 0, chan->vmm, ctx, NULL, 0);
1465 	if (ret)
1466 		goto done;
1467 
1468 	/* Setup context pointer. */
1469 	nvkm_kmap(inst);
1470 	nvkm_wo32(inst, 0x0210, lower_32_bits(ctx->addr + CB_RESERVED) | 4);
1471 	nvkm_wo32(inst, 0x0214, upper_32_bits(ctx->addr + CB_RESERVED));
1472 	nvkm_done(inst);
1473 
1474 	/* Make channel current. */
1475 	addr = inst->addr >> 12;
1476 	if (gr->firmware) {
1477 		ret = gf100_gr_fecs_bind_pointer(gr, 0x80000000 | addr);
1478 		if (ret)
1479 			goto done_inst;
1480 
1481 		nvkm_kmap(data);
1482 		nvkm_wo32(data, 0x1c, 1);
1483 		nvkm_wo32(data, 0x20, 0);
1484 		nvkm_wo32(data, 0x28, 0);
1485 		nvkm_wo32(data, 0x2c, 0);
1486 		nvkm_done(data);
1487 	} else {
1488 		nvkm_wr32(device, 0x409840, 0x80000000);
1489 		nvkm_wr32(device, 0x409500, 0x80000000 | addr);
1490 		nvkm_wr32(device, 0x409504, 0x00000001);
1491 		nvkm_msec(device, 2000,
1492 			if (nvkm_rd32(device, 0x409800) & 0x80000000)
1493 				break;
1494 		);
1495 	}
1496 
1497 	grctx->main(chan);
1498 
1499 	if (!gr->firmware) {
1500 		/* Trigger a context unload by unsetting the "next channel valid" bit
1501 		 * and faking a context switch interrupt.
1502 		 */
1503 		nvkm_mask(device, 0x409b04, 0x80000000, 0x00000000);
1504 		nvkm_wr32(device, 0x409000, 0x00000100);
1505 		if (nvkm_msec(device, 2000,
1506 			if (!(nvkm_rd32(device, 0x409b00) & 0x80000000))
1507 				break;
1508 		) < 0) {
1509 			ret = -EBUSY;
1510 			goto done_inst;
1511 		}
1512 	} else {
1513 		ret = gf100_gr_fecs_wfi_golden_save(gr, 0x80000000 | addr);
1514 		if (ret)
1515 			goto done_inst;
1516 
1517 		nvkm_mask(device, 0x409b00, 0x80000000, 0x00000000);
1518 	}
1519 
1520 	gr->data = kmalloc(gr->size, GFP_KERNEL);
1521 	if (gr->data) {
1522 		nvkm_kmap(data);
1523 		for (i = 0; i < gr->size; i += 4)
1524 			gr->data[i / 4] = nvkm_ro32(data, CB_RESERVED + i);
1525 		nvkm_done(data);
1526 		ret = 0;
1527 	} else {
1528 		ret = -ENOMEM;
1529 	}
1530 
1531 done_inst:
1532 	nvkm_kmap(inst);
1533 	nvkm_wo32(inst, 0x0210, 0);
1534 	nvkm_wo32(inst, 0x0214, 0);
1535 	nvkm_done(inst);
1536 done:
1537 	nvkm_vmm_put(chan->vmm, &ctx);
1538 	nvkm_memory_unref(&data);
1539 	return ret;
1540 }
1541 
1542 const struct gf100_grctx_func
1543 gf100_grctx = {
1544 	.main  = gf100_grctx_generate_main,
1545 	.unkn  = gf100_grctx_generate_unkn,
1546 	.hub   = gf100_grctx_pack_hub,
1547 	.gpc_0 = gf100_grctx_pack_gpc_0,
1548 	.gpc_1 = gf100_grctx_pack_gpc_1,
1549 	.zcull = gf100_grctx_pack_zcull,
1550 	.tpc   = gf100_grctx_pack_tpc,
1551 	.icmd  = gf100_grctx_pack_icmd,
1552 	.mthd  = gf100_grctx_pack_mthd,
1553 	.bundle = gf100_grctx_generate_bundle,
1554 	.bundle_size = 0x1800,
1555 	.pagepool = gf100_grctx_generate_pagepool,
1556 	.pagepool_size = 0x8000,
1557 	.attrib_cb_size = gf100_grctx_generate_attrib_cb_size,
1558 	.attrib_cb = gf100_grctx_generate_attrib_cb,
1559 	.attrib = gf100_grctx_generate_attrib,
1560 	.attrib_nr_max = 0x324,
1561 	.attrib_nr = 0x218,
1562 	.sm_id = gf100_grctx_generate_sm_id,
1563 	.tpc_nr = gf100_grctx_generate_tpc_nr,
1564 	.r4060a8 = gf100_grctx_generate_r4060a8,
1565 	.rop_mapping = gf100_grctx_generate_rop_mapping,
1566 	.alpha_beta_tables = gf100_grctx_generate_alpha_beta_tables,
1567 	.max_ways_evict = gf100_grctx_generate_max_ways_evict,
1568 	.r419cb8 = gf100_grctx_generate_r419cb8,
1569 };
1570