xref: /linux/drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf100.c (revision d05095b53cd41c7e1db8f680610386f73c0f7290)
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 int
1007 gf100_grctx_mmio_data(struct gf100_grctx *info, u32 size, u32 align, bool priv)
1008 {
1009 	if (info->data) {
1010 		info->buffer[info->buffer_nr] = round_up(info->addr, align);
1011 		info->addr = info->buffer[info->buffer_nr] + size;
1012 		info->data->size = size;
1013 		info->data->align = align;
1014 		info->data->priv = priv;
1015 		info->data++;
1016 		return info->buffer_nr++;
1017 	}
1018 	return -1;
1019 }
1020 
1021 void
1022 gf100_grctx_mmio_item(struct gf100_grctx *info, u32 addr, u32 data,
1023 		      int shift, int buffer)
1024 {
1025 	struct nvkm_device *device = info->gr->base.engine.subdev.device;
1026 	if (info->data) {
1027 		if (shift >= 0) {
1028 			info->mmio->addr = addr;
1029 			info->mmio->data = data;
1030 			info->mmio->shift = shift;
1031 			info->mmio->buffer = buffer;
1032 			if (buffer >= 0)
1033 				data |= info->buffer[buffer] >> shift;
1034 			info->mmio++;
1035 		} else
1036 			return;
1037 	} else {
1038 		if (buffer >= 0)
1039 			return;
1040 	}
1041 
1042 	nvkm_wr32(device, addr, data);
1043 }
1044 
1045 void
1046 gf100_grctx_generate_r419cb8(struct gf100_gr *gr)
1047 {
1048 	struct nvkm_device *device = gr->base.engine.subdev.device;
1049 	nvkm_mask(device, 0x419cb8, 0x00007c00, 0x00000000);
1050 }
1051 
1052 void
1053 gf100_grctx_generate_bundle(struct gf100_grctx *info)
1054 {
1055 	const struct gf100_grctx_func *grctx = info->gr->func->grctx;
1056 	const int s = 8;
1057 	const int b = mmio_vram(info, grctx->bundle_size, (1 << s), true);
1058 	mmio_refn(info, 0x408004, 0x00000000, s, b);
1059 	mmio_wr32(info, 0x408008, 0x80000000 | (grctx->bundle_size >> s));
1060 	mmio_refn(info, 0x418808, 0x00000000, s, b);
1061 	mmio_wr32(info, 0x41880c, 0x80000000 | (grctx->bundle_size >> s));
1062 }
1063 
1064 void
1065 gf100_grctx_generate_pagepool(struct gf100_gr_chan *chan, u64 addr)
1066 {
1067 	gf100_grctx_patch_wr32(chan, 0x40800c, addr >> 8);
1068 	gf100_grctx_patch_wr32(chan, 0x408010, 0x80000000);
1069 	gf100_grctx_patch_wr32(chan, 0x419004, addr >> 8);
1070 	gf100_grctx_patch_wr32(chan, 0x419008, 0x00000000);
1071 }
1072 
1073 void
1074 gf100_grctx_generate_attrib(struct gf100_grctx *info)
1075 {
1076 	struct gf100_gr *gr = info->gr;
1077 	const struct gf100_grctx_func *grctx = gr->func->grctx;
1078 	const u32 attrib = grctx->attrib_nr;
1079 	const u32   size = 0x20 * (grctx->attrib_nr_max + grctx->alpha_nr_max);
1080 	const int s = 12;
1081 	const int b = mmio_vram(info, size * gr->tpc_total, (1 << s), false);
1082 	int gpc, tpc;
1083 	u32 bo = 0;
1084 
1085 	mmio_refn(info, 0x418810, 0x80000000, s, b);
1086 	mmio_refn(info, 0x419848, 0x10000000, s, b);
1087 	mmio_wr32(info, 0x405830, (attrib << 16));
1088 
1089 	for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
1090 		for (tpc = 0; tpc < gr->tpc_nr[gpc]; tpc++) {
1091 			const u32 o = TPC_UNIT(gpc, tpc, 0x0520);
1092 			mmio_skip(info, o, (attrib << 16) | ++bo);
1093 			mmio_wr32(info, o, (attrib << 16) | --bo);
1094 			bo += grctx->attrib_nr_max;
1095 		}
1096 	}
1097 }
1098 
1099 void
1100 gf100_grctx_generate_unkn(struct gf100_gr *gr)
1101 {
1102 }
1103 
1104 void
1105 gf100_grctx_generate_r4060a8(struct gf100_gr *gr)
1106 {
1107 	struct nvkm_device *device = gr->base.engine.subdev.device;
1108 	const u8 gpcmax = nvkm_rd32(device, 0x022430);
1109 	const u8 tpcmax = nvkm_rd32(device, 0x022434) * gpcmax;
1110 	int i, j, sm = 0;
1111 	u32 data;
1112 
1113 	for (i = 0; i < DIV_ROUND_UP(tpcmax, 4); i++) {
1114 		for (data = 0, j = 0; j < 4; j++) {
1115 			if (sm < gr->sm_nr)
1116 				data |= gr->sm[sm++].gpc << (j * 8);
1117 			else
1118 				data |= 0x1f << (j * 8);
1119 		}
1120 		nvkm_wr32(device, 0x4060a8 + (i * 4), data);
1121 	}
1122 }
1123 
1124 void
1125 gf100_grctx_generate_rop_mapping(struct gf100_gr *gr)
1126 {
1127 	struct nvkm_device *device = gr->base.engine.subdev.device;
1128 	u32 data[6] = {}, data2[2] = {};
1129 	u8  shift, ntpcv;
1130 	int i;
1131 
1132 	/* Pack tile map into register format. */
1133 	for (i = 0; i < 32; i++)
1134 		data[i / 6] |= (gr->tile[i] & 0x07) << ((i % 6) * 5);
1135 
1136 	/* Magic. */
1137 	shift = 0;
1138 	ntpcv = gr->tpc_total;
1139 	while (!(ntpcv & (1 << 4))) {
1140 		ntpcv <<= 1;
1141 		shift++;
1142 	}
1143 
1144 	data2[0]  = (ntpcv << 16);
1145 	data2[0] |= (shift << 21);
1146 	data2[0] |= (((1 << (0 + 5)) % ntpcv) << 24);
1147 	for (i = 1; i < 7; i++)
1148 		data2[1] |= ((1 << (i + 5)) % ntpcv) << ((i - 1) * 5);
1149 
1150 	/* GPC_BROADCAST */
1151 	nvkm_wr32(device, 0x418bb8, (gr->tpc_total << 8) |
1152 				     gr->screen_tile_row_offset);
1153 	for (i = 0; i < 6; i++)
1154 		nvkm_wr32(device, 0x418b08 + (i * 4), data[i]);
1155 
1156 	/* GPC_BROADCAST.TP_BROADCAST */
1157 	nvkm_wr32(device, 0x419bd0, (gr->tpc_total << 8) |
1158 				     gr->screen_tile_row_offset | data2[0]);
1159 	nvkm_wr32(device, 0x419be4, data2[1]);
1160 	for (i = 0; i < 6; i++)
1161 		nvkm_wr32(device, 0x419b00 + (i * 4), data[i]);
1162 
1163 	/* UNK78xx */
1164 	nvkm_wr32(device, 0x4078bc, (gr->tpc_total << 8) |
1165 				     gr->screen_tile_row_offset);
1166 	for (i = 0; i < 6; i++)
1167 		nvkm_wr32(device, 0x40780c + (i * 4), data[i]);
1168 }
1169 
1170 void
1171 gf100_grctx_generate_max_ways_evict(struct gf100_gr *gr)
1172 {
1173 	struct nvkm_device *device = gr->base.engine.subdev.device;
1174 	u32 fbps = nvkm_rd32(device, 0x121c74);
1175 	if (fbps == 1)
1176 		nvkm_mask(device, 0x17e91c, 0x001f0000, 0x00090000);
1177 }
1178 
1179 static const u32
1180 gf100_grctx_alpha_beta_map[17][32] = {
1181 	[1] = {
1182 		1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1183 		1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1184 	},
1185 	[2] = {
1186 		1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1187 		1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1188 	},
1189 	//XXX: 3
1190 	[4] = {
1191 		1, 1, 1, 1, 1, 1, 1, 1,
1192 		2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1193 		3, 3, 3, 3, 3, 3, 3, 3,
1194 	},
1195 	//XXX: 5
1196 	//XXX: 6
1197 	[7] = {
1198 		1, 1, 1, 1,
1199 		2, 2, 2, 2, 2, 2,
1200 		3, 3, 3, 3, 3, 3,
1201 		4, 4, 4, 4, 4, 4,
1202 		5, 5, 5, 5, 5, 5,
1203 		6, 6, 6, 6,
1204 	},
1205 	[8] = {
1206 		1, 1, 1,
1207 		2, 2, 2, 2, 2,
1208 		3, 3, 3, 3, 3,
1209 		4, 4, 4, 4, 4, 4,
1210 		5, 5, 5, 5, 5,
1211 		6, 6, 6, 6, 6,
1212 		7, 7, 7,
1213 	},
1214 	//XXX: 9
1215 	//XXX: 10
1216 	[11] = {
1217 		1, 1,
1218 		2, 2, 2, 2,
1219 		3, 3, 3,
1220 		4, 4, 4, 4,
1221 		5, 5, 5,
1222 		6, 6, 6,
1223 		7, 7, 7, 7,
1224 		8, 8, 8,
1225 		9, 9, 9, 9,
1226 		10, 10,
1227 	},
1228 	//XXX: 12
1229 	//XXX: 13
1230 	[14] = {
1231 		1, 1,
1232 		2, 2,
1233 		3, 3, 3,
1234 		4, 4, 4,
1235 		5, 5,
1236 		6, 6, 6,
1237 		7, 7,
1238 		8, 8, 8,
1239 		9, 9,
1240 		10, 10, 10,
1241 		11, 11, 11,
1242 		12, 12,
1243 		13, 13,
1244 	},
1245 	[15] = {
1246 		1, 1,
1247 		2, 2,
1248 		3, 3,
1249 		4, 4, 4,
1250 		5, 5,
1251 		6, 6, 6,
1252 		7, 7,
1253 		8, 8,
1254 		9, 9, 9,
1255 		10, 10,
1256 		11, 11, 11,
1257 		12, 12,
1258 		13, 13,
1259 		14, 14,
1260 	},
1261 	[16] = {
1262 		1, 1,
1263 		2, 2,
1264 		3, 3,
1265 		4, 4,
1266 		5, 5,
1267 		6, 6, 6,
1268 		7, 7,
1269 		8, 8,
1270 		9, 9,
1271 		10, 10, 10,
1272 		11, 11,
1273 		12, 12,
1274 		13, 13,
1275 		14, 14,
1276 		15, 15,
1277 	},
1278 };
1279 
1280 void
1281 gf100_grctx_generate_alpha_beta_tables(struct gf100_gr *gr)
1282 {
1283 	struct nvkm_subdev *subdev = &gr->base.engine.subdev;
1284 	struct nvkm_device *device = subdev->device;
1285 	int i, gpc;
1286 
1287 	for (i = 0; i < 32; i++) {
1288 		u32 atarget = gf100_grctx_alpha_beta_map[gr->tpc_total][i];
1289 		u32 abits[GPC_MAX] = {}, amask = 0, bmask = 0;
1290 
1291 		if (!atarget) {
1292 			nvkm_warn(subdev, "missing alpha/beta mapping table\n");
1293 			atarget = max_t(u32, gr->tpc_total * i / 32, 1);
1294 		}
1295 
1296 		while (atarget) {
1297 			for (gpc = 0; atarget && gpc < gr->gpc_nr; gpc++) {
1298 				if (abits[gpc] < gr->tpc_nr[gpc]) {
1299 					abits[gpc]++;
1300 					atarget--;
1301 				}
1302 			}
1303 		}
1304 
1305 		for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
1306 			u32 bbits = gr->tpc_nr[gpc] - abits[gpc];
1307 			amask |= ((1 << abits[gpc]) - 1) << (gpc * 8);
1308 			bmask |= ((1 << bbits) - 1) << abits[gpc] << (gpc * 8);
1309 		}
1310 
1311 		nvkm_wr32(device, 0x406800 + (i * 0x20), amask);
1312 		nvkm_wr32(device, 0x406c00 + (i * 0x20), bmask);
1313 	}
1314 }
1315 
1316 void
1317 gf100_grctx_generate_tpc_nr(struct gf100_gr *gr, int gpc)
1318 {
1319 	struct nvkm_device *device = gr->base.engine.subdev.device;
1320 	nvkm_wr32(device, GPC_UNIT(gpc, 0x0c08), gr->tpc_nr[gpc]);
1321 	nvkm_wr32(device, GPC_UNIT(gpc, 0x0c8c), gr->tpc_nr[gpc]);
1322 }
1323 
1324 void
1325 gf100_grctx_generate_sm_id(struct gf100_gr *gr, int gpc, int tpc, int sm)
1326 {
1327 	struct nvkm_device *device = gr->base.engine.subdev.device;
1328 	nvkm_wr32(device, TPC_UNIT(gpc, tpc, 0x698), sm);
1329 	nvkm_wr32(device, TPC_UNIT(gpc, tpc, 0x4e8), sm);
1330 	nvkm_wr32(device, GPC_UNIT(gpc, 0x0c10 + tpc * 4), sm);
1331 	nvkm_wr32(device, TPC_UNIT(gpc, tpc, 0x088), sm);
1332 }
1333 
1334 void
1335 gf100_grctx_generate_floorsweep(struct gf100_gr *gr)
1336 {
1337 	const struct gf100_grctx_func *func = gr->func->grctx;
1338 	int sm;
1339 
1340 	for (sm = 0; sm < gr->sm_nr; sm++) {
1341 		func->sm_id(gr, gr->sm[sm].gpc, gr->sm[sm].tpc, sm);
1342 		if (func->tpc_nr)
1343 			func->tpc_nr(gr, gr->sm[sm].gpc);
1344 	}
1345 
1346 	gf100_gr_init_num_tpc_per_gpc(gr, false, true);
1347 	if (!func->skip_pd_num_tpc_per_gpc)
1348 		gf100_gr_init_num_tpc_per_gpc(gr, true, false);
1349 
1350 	if (func->r4060a8)
1351 		func->r4060a8(gr);
1352 
1353 	func->rop_mapping(gr);
1354 
1355 	if (func->alpha_beta_tables)
1356 		func->alpha_beta_tables(gr);
1357 	if (func->max_ways_evict)
1358 		func->max_ways_evict(gr);
1359 	if (func->dist_skip_table)
1360 		func->dist_skip_table(gr);
1361 	if (func->r406500)
1362 		func->r406500(gr);
1363 	if (func->gpc_tpc_nr)
1364 		func->gpc_tpc_nr(gr);
1365 	if (func->r419f78)
1366 		func->r419f78(gr);
1367 	if (func->tpc_mask)
1368 		func->tpc_mask(gr);
1369 	if (func->smid_config)
1370 		func->smid_config(gr);
1371 }
1372 
1373 void
1374 gf100_grctx_generate_main(struct gf100_gr_chan *chan, struct gf100_grctx *info)
1375 {
1376 	struct gf100_gr *gr = chan->gr;
1377 	struct nvkm_device *device = gr->base.engine.subdev.device;
1378 	const struct gf100_grctx_func *grctx = gr->func->grctx;
1379 	u32 idle_timeout;
1380 
1381 	nvkm_mc_unk260(device, 0);
1382 
1383 	if (!gr->sw_ctx) {
1384 		gf100_gr_mmio(gr, grctx->hub);
1385 		gf100_gr_mmio(gr, grctx->gpc_0);
1386 		gf100_gr_mmio(gr, grctx->zcull);
1387 		gf100_gr_mmio(gr, grctx->gpc_1);
1388 		gf100_gr_mmio(gr, grctx->tpc);
1389 		gf100_gr_mmio(gr, grctx->ppc);
1390 	} else {
1391 		gf100_gr_mmio(gr, gr->sw_ctx);
1392 	}
1393 
1394 	gf100_gr_wait_idle(gr);
1395 
1396 	idle_timeout = nvkm_mask(device, 0x404154, 0xffffffff, 0x00000000);
1397 
1398 	grctx->pagepool(chan, chan->pagepool->addr);
1399 	grctx->bundle(info);
1400 	grctx->attrib(info);
1401 	if (grctx->patch_ltc)
1402 		grctx->patch_ltc(info);
1403 	grctx->unkn(gr);
1404 
1405 	gf100_grctx_generate_floorsweep(gr);
1406 
1407 	gf100_gr_wait_idle(gr);
1408 
1409 	if (grctx->r400088) grctx->r400088(gr, false);
1410 	if (gr->bundle)
1411 		gf100_gr_icmd(gr, gr->bundle);
1412 	else
1413 		gf100_gr_icmd(gr, grctx->icmd);
1414 	if (grctx->sw_veid_bundle_init)
1415 		gf100_gr_icmd(gr, grctx->sw_veid_bundle_init);
1416 	if (grctx->r400088) grctx->r400088(gr, true);
1417 
1418 	nvkm_wr32(device, 0x404154, idle_timeout);
1419 
1420 	if (gr->method)
1421 		gf100_gr_mthd(gr, gr->method);
1422 	else
1423 		gf100_gr_mthd(gr, grctx->mthd);
1424 	nvkm_mc_unk260(device, 1);
1425 
1426 	if (grctx->r419cb8)
1427 		grctx->r419cb8(gr);
1428 	if (grctx->r418800)
1429 		grctx->r418800(gr);
1430 	if (grctx->r419eb0)
1431 		grctx->r419eb0(gr);
1432 	if (grctx->r419e00)
1433 		grctx->r419e00(gr);
1434 	if (grctx->r418e94)
1435 		grctx->r418e94(gr);
1436 	if (grctx->r419a3c)
1437 		grctx->r419a3c(gr);
1438 	if (grctx->r408840)
1439 		grctx->r408840(gr);
1440 	if (grctx->r419c0c)
1441 		grctx->r419c0c(gr);
1442 }
1443 
1444 #define CB_RESERVED 0x80000
1445 
1446 int
1447 gf100_grctx_generate(struct gf100_gr *gr, struct gf100_gr_chan *chan, struct nvkm_gpuobj *inst)
1448 {
1449 	const struct gf100_grctx_func *grctx = gr->func->grctx;
1450 	struct nvkm_subdev *subdev = &gr->base.engine.subdev;
1451 	struct nvkm_device *device = subdev->device;
1452 	struct nvkm_memory *data = NULL;
1453 	struct nvkm_vma *ctx = NULL;
1454 	struct gf100_grctx info;
1455 	int ret, i;
1456 	u64 addr;
1457 
1458 	/* NV_PGRAPH_FE_PWR_MODE_FORCE_ON. */
1459 	nvkm_wr32(device, 0x404170, 0x00000012);
1460 	nvkm_msec(device, 2000,
1461 		if (!(nvkm_rd32(device, 0x404170) & 0x00000010))
1462 			break;
1463 	);
1464 
1465 	if (grctx->unkn88c)
1466 		grctx->unkn88c(gr, true);
1467 
1468 	/* Reset FECS. */
1469 	nvkm_wr32(device, 0x409614, 0x00000070);
1470 	nvkm_usec(device, 10, NVKM_DELAY);
1471 	nvkm_mask(device, 0x409614, 0x00000700, 0x00000700);
1472 	nvkm_usec(device, 10, NVKM_DELAY);
1473 	nvkm_rd32(device, 0x409614);
1474 
1475 	if (grctx->unkn88c)
1476 		grctx->unkn88c(gr, false);
1477 
1478 	/* NV_PGRAPH_FE_PWR_MODE_AUTO. */
1479 	nvkm_wr32(device, 0x404170, 0x00000010);
1480 
1481 	/* Init SCC RAM. */
1482 	nvkm_wr32(device, 0x40802c, 0x00000001);
1483 
1484 	/* Allocate memory to store context, and dummy global context buffers. */
1485 	ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST,
1486 			      CB_RESERVED + gr->size, 0, true, &data);
1487 	if (ret)
1488 		goto done;
1489 
1490 	ret = nvkm_vmm_get(chan->vmm, 0, nvkm_memory_size(data), &ctx);
1491 	if (ret)
1492 		goto done;
1493 
1494 	ret = nvkm_memory_map(data, 0, chan->vmm, ctx, NULL, 0);
1495 	if (ret)
1496 		goto done;
1497 
1498 	/* Setup context pointer. */
1499 	nvkm_kmap(inst);
1500 	nvkm_wo32(inst, 0x0210, lower_32_bits(ctx->addr + CB_RESERVED) | 4);
1501 	nvkm_wo32(inst, 0x0214, upper_32_bits(ctx->addr + CB_RESERVED));
1502 	nvkm_done(inst);
1503 
1504 	/* Setup default state for mmio list construction. */
1505 	info.gr = gr;
1506 	info.data = gr->mmio_data;
1507 	info.mmio = gr->mmio_list;
1508 	info.addr = ctx->addr;
1509 	info.buffer_nr = 0;
1510 
1511 	/* Make channel current. */
1512 	addr = inst->addr >> 12;
1513 	if (gr->firmware) {
1514 		ret = gf100_gr_fecs_bind_pointer(gr, 0x80000000 | addr);
1515 		if (ret)
1516 			goto done_inst;
1517 
1518 		nvkm_kmap(data);
1519 		nvkm_wo32(data, 0x1c, 1);
1520 		nvkm_wo32(data, 0x20, 0);
1521 		nvkm_wo32(data, 0x28, 0);
1522 		nvkm_wo32(data, 0x2c, 0);
1523 		nvkm_done(data);
1524 	} else {
1525 		nvkm_wr32(device, 0x409840, 0x80000000);
1526 		nvkm_wr32(device, 0x409500, 0x80000000 | addr);
1527 		nvkm_wr32(device, 0x409504, 0x00000001);
1528 		nvkm_msec(device, 2000,
1529 			if (nvkm_rd32(device, 0x409800) & 0x80000000)
1530 				break;
1531 		);
1532 	}
1533 
1534 	grctx->main(chan, &info);
1535 
1536 	/* Trigger a context unload by unsetting the "next channel valid" bit
1537 	 * and faking a context switch interrupt.
1538 	 */
1539 	nvkm_mask(device, 0x409b04, 0x80000000, 0x00000000);
1540 	nvkm_wr32(device, 0x409000, 0x00000100);
1541 	if (nvkm_msec(device, 2000,
1542 		if (!(nvkm_rd32(device, 0x409b00) & 0x80000000))
1543 			break;
1544 	) < 0) {
1545 		ret = -EBUSY;
1546 		goto done_inst;
1547 	}
1548 
1549 	gr->data = kmalloc(gr->size, GFP_KERNEL);
1550 	if (gr->data) {
1551 		nvkm_kmap(data);
1552 		for (i = 0; i < gr->size; i += 4)
1553 			gr->data[i / 4] = nvkm_ro32(data, CB_RESERVED + i);
1554 		nvkm_done(data);
1555 		ret = 0;
1556 	} else {
1557 		ret = -ENOMEM;
1558 	}
1559 
1560 done_inst:
1561 	nvkm_kmap(inst);
1562 	nvkm_wo32(inst, 0x0210, 0);
1563 	nvkm_wo32(inst, 0x0214, 0);
1564 	nvkm_done(inst);
1565 done:
1566 	nvkm_vmm_put(chan->vmm, &ctx);
1567 	nvkm_memory_unref(&data);
1568 	return ret;
1569 }
1570 
1571 const struct gf100_grctx_func
1572 gf100_grctx = {
1573 	.main  = gf100_grctx_generate_main,
1574 	.unkn  = gf100_grctx_generate_unkn,
1575 	.hub   = gf100_grctx_pack_hub,
1576 	.gpc_0 = gf100_grctx_pack_gpc_0,
1577 	.gpc_1 = gf100_grctx_pack_gpc_1,
1578 	.zcull = gf100_grctx_pack_zcull,
1579 	.tpc   = gf100_grctx_pack_tpc,
1580 	.icmd  = gf100_grctx_pack_icmd,
1581 	.mthd  = gf100_grctx_pack_mthd,
1582 	.bundle = gf100_grctx_generate_bundle,
1583 	.bundle_size = 0x1800,
1584 	.pagepool = gf100_grctx_generate_pagepool,
1585 	.pagepool_size = 0x8000,
1586 	.attrib = gf100_grctx_generate_attrib,
1587 	.attrib_nr_max = 0x324,
1588 	.attrib_nr = 0x218,
1589 	.sm_id = gf100_grctx_generate_sm_id,
1590 	.tpc_nr = gf100_grctx_generate_tpc_nr,
1591 	.r4060a8 = gf100_grctx_generate_r4060a8,
1592 	.rop_mapping = gf100_grctx_generate_rop_mapping,
1593 	.alpha_beta_tables = gf100_grctx_generate_alpha_beta_tables,
1594 	.max_ways_evict = gf100_grctx_generate_max_ways_evict,
1595 	.r419cb8 = gf100_grctx_generate_r419cb8,
1596 };
1597