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