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 	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
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