1b8bf04e1SBen Skeggs /*
2b8bf04e1SBen Skeggs  * Copyright 2009 Marcin Kościelnicki
3b8bf04e1SBen Skeggs  *
4b8bf04e1SBen Skeggs  * Permission is hereby granted, free of charge, to any person obtaining a
5b8bf04e1SBen Skeggs  * copy of this software and associated documentation files (the "Software"),
6b8bf04e1SBen Skeggs  * to deal in the Software without restriction, including without limitation
7b8bf04e1SBen Skeggs  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8b8bf04e1SBen Skeggs  * and/or sell copies of the Software, and to permit persons to whom the
9b8bf04e1SBen Skeggs  * Software is furnished to do so, subject to the following conditions:
10b8bf04e1SBen Skeggs  *
11b8bf04e1SBen Skeggs  * The above copyright notice and this permission notice shall be included in
12b8bf04e1SBen Skeggs  * all copies or substantial portions of the Software.
13b8bf04e1SBen Skeggs  *
14b8bf04e1SBen Skeggs  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15b8bf04e1SBen Skeggs  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16b8bf04e1SBen Skeggs  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17b8bf04e1SBen Skeggs  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18b8bf04e1SBen Skeggs  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19b8bf04e1SBen Skeggs  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20b8bf04e1SBen Skeggs  * OTHER DEALINGS IN THE SOFTWARE.
21b8bf04e1SBen Skeggs  */
22b8bf04e1SBen Skeggs 
23b8bf04e1SBen Skeggs #define CP_FLAG_CLEAR                 0
24b8bf04e1SBen Skeggs #define CP_FLAG_SET                   1
25b8bf04e1SBen Skeggs #define CP_FLAG_SWAP_DIRECTION        ((0 * 32) + 0)
26b8bf04e1SBen Skeggs #define CP_FLAG_SWAP_DIRECTION_LOAD   0
27b8bf04e1SBen Skeggs #define CP_FLAG_SWAP_DIRECTION_SAVE   1
28b8bf04e1SBen Skeggs #define CP_FLAG_UNK01                 ((0 * 32) + 1)
29b8bf04e1SBen Skeggs #define CP_FLAG_UNK01_CLEAR           0
30b8bf04e1SBen Skeggs #define CP_FLAG_UNK01_SET             1
31b8bf04e1SBen Skeggs #define CP_FLAG_UNK03                 ((0 * 32) + 3)
32b8bf04e1SBen Skeggs #define CP_FLAG_UNK03_CLEAR           0
33b8bf04e1SBen Skeggs #define CP_FLAG_UNK03_SET             1
34b8bf04e1SBen Skeggs #define CP_FLAG_USER_SAVE             ((0 * 32) + 5)
35b8bf04e1SBen Skeggs #define CP_FLAG_USER_SAVE_NOT_PENDING 0
36b8bf04e1SBen Skeggs #define CP_FLAG_USER_SAVE_PENDING     1
37b8bf04e1SBen Skeggs #define CP_FLAG_USER_LOAD             ((0 * 32) + 6)
38b8bf04e1SBen Skeggs #define CP_FLAG_USER_LOAD_NOT_PENDING 0
39b8bf04e1SBen Skeggs #define CP_FLAG_USER_LOAD_PENDING     1
40b8bf04e1SBen Skeggs #define CP_FLAG_UNK0B                 ((0 * 32) + 0xb)
41b8bf04e1SBen Skeggs #define CP_FLAG_UNK0B_CLEAR           0
42b8bf04e1SBen Skeggs #define CP_FLAG_UNK0B_SET             1
43b8bf04e1SBen Skeggs #define CP_FLAG_XFER_SWITCH           ((0 * 32) + 0xe)
44b8bf04e1SBen Skeggs #define CP_FLAG_XFER_SWITCH_DISABLE   0
45b8bf04e1SBen Skeggs #define CP_FLAG_XFER_SWITCH_ENABLE    1
46b8bf04e1SBen Skeggs #define CP_FLAG_STATE                 ((0 * 32) + 0x1c)
47b8bf04e1SBen Skeggs #define CP_FLAG_STATE_STOPPED         0
48b8bf04e1SBen Skeggs #define CP_FLAG_STATE_RUNNING         1
49b8bf04e1SBen Skeggs #define CP_FLAG_UNK1D                 ((0 * 32) + 0x1d)
50b8bf04e1SBen Skeggs #define CP_FLAG_UNK1D_CLEAR           0
51b8bf04e1SBen Skeggs #define CP_FLAG_UNK1D_SET             1
52b8bf04e1SBen Skeggs #define CP_FLAG_UNK20                 ((1 * 32) + 0)
53b8bf04e1SBen Skeggs #define CP_FLAG_UNK20_CLEAR           0
54b8bf04e1SBen Skeggs #define CP_FLAG_UNK20_SET             1
55b8bf04e1SBen Skeggs #define CP_FLAG_STATUS                ((2 * 32) + 0)
56b8bf04e1SBen Skeggs #define CP_FLAG_STATUS_BUSY           0
57b8bf04e1SBen Skeggs #define CP_FLAG_STATUS_IDLE           1
58b8bf04e1SBen Skeggs #define CP_FLAG_AUTO_SAVE             ((2 * 32) + 4)
59b8bf04e1SBen Skeggs #define CP_FLAG_AUTO_SAVE_NOT_PENDING 0
60b8bf04e1SBen Skeggs #define CP_FLAG_AUTO_SAVE_PENDING     1
61b8bf04e1SBen Skeggs #define CP_FLAG_AUTO_LOAD             ((2 * 32) + 5)
62b8bf04e1SBen Skeggs #define CP_FLAG_AUTO_LOAD_NOT_PENDING 0
63b8bf04e1SBen Skeggs #define CP_FLAG_AUTO_LOAD_PENDING     1
64b8bf04e1SBen Skeggs #define CP_FLAG_NEWCTX                ((2 * 32) + 10)
65b8bf04e1SBen Skeggs #define CP_FLAG_NEWCTX_BUSY           0
66b8bf04e1SBen Skeggs #define CP_FLAG_NEWCTX_DONE           1
67b8bf04e1SBen Skeggs #define CP_FLAG_XFER                  ((2 * 32) + 11)
68b8bf04e1SBen Skeggs #define CP_FLAG_XFER_IDLE             0
69b8bf04e1SBen Skeggs #define CP_FLAG_XFER_BUSY             1
70b8bf04e1SBen Skeggs #define CP_FLAG_ALWAYS                ((2 * 32) + 13)
71b8bf04e1SBen Skeggs #define CP_FLAG_ALWAYS_FALSE          0
72b8bf04e1SBen Skeggs #define CP_FLAG_ALWAYS_TRUE           1
73b8bf04e1SBen Skeggs #define CP_FLAG_INTR                  ((2 * 32) + 15)
74b8bf04e1SBen Skeggs #define CP_FLAG_INTR_NOT_PENDING      0
75b8bf04e1SBen Skeggs #define CP_FLAG_INTR_PENDING          1
76b8bf04e1SBen Skeggs 
77b8bf04e1SBen Skeggs #define CP_CTX                   0x00100000
78b8bf04e1SBen Skeggs #define CP_CTX_COUNT             0x000f0000
79b8bf04e1SBen Skeggs #define CP_CTX_COUNT_SHIFT               16
80b8bf04e1SBen Skeggs #define CP_CTX_REG               0x00003fff
81b8bf04e1SBen Skeggs #define CP_LOAD_SR               0x00200000
82b8bf04e1SBen Skeggs #define CP_LOAD_SR_VALUE         0x000fffff
83b8bf04e1SBen Skeggs #define CP_BRA                   0x00400000
84b8bf04e1SBen Skeggs #define CP_BRA_IP                0x0001ff00
85b8bf04e1SBen Skeggs #define CP_BRA_IP_SHIFT                   8
86b8bf04e1SBen Skeggs #define CP_BRA_IF_CLEAR          0x00000080
87b8bf04e1SBen Skeggs #define CP_BRA_FLAG              0x0000007f
88b8bf04e1SBen Skeggs #define CP_WAIT                  0x00500000
89b8bf04e1SBen Skeggs #define CP_WAIT_SET              0x00000080
90b8bf04e1SBen Skeggs #define CP_WAIT_FLAG             0x0000007f
91b8bf04e1SBen Skeggs #define CP_SET                   0x00700000
92b8bf04e1SBen Skeggs #define CP_SET_1                 0x00000080
93b8bf04e1SBen Skeggs #define CP_SET_FLAG              0x0000007f
94b8bf04e1SBen Skeggs #define CP_NEWCTX                0x00600004
95b8bf04e1SBen Skeggs #define CP_NEXT_TO_SWAP          0x00600005
96b8bf04e1SBen Skeggs #define CP_SET_CONTEXT_POINTER   0x00600006
97b8bf04e1SBen Skeggs #define CP_SET_XFER_POINTER      0x00600007
98b8bf04e1SBen Skeggs #define CP_ENABLE                0x00600009
99b8bf04e1SBen Skeggs #define CP_END                   0x0060000c
100b8bf04e1SBen Skeggs #define CP_NEXT_TO_CURRENT       0x0060000d
101b8bf04e1SBen Skeggs #define CP_DISABLE1              0x0090ffff
102b8bf04e1SBen Skeggs #define CP_DISABLE2              0x0091ffff
103b8bf04e1SBen Skeggs #define CP_XFER_1      0x008000ff
104b8bf04e1SBen Skeggs #define CP_XFER_2      0x008800ff
105b8bf04e1SBen Skeggs #define CP_SEEK_1      0x00c000ff
106b8bf04e1SBen Skeggs #define CP_SEEK_2      0x00c800ff
107b8bf04e1SBen Skeggs 
108e3c71eb2SBen Skeggs #include "ctxnv40.h"
109e8390eb2SBaoyou Xie #include "nv50.h"
110e3c71eb2SBen Skeggs 
111e3c71eb2SBen Skeggs #include <subdev/fb.h>
112b8bf04e1SBen Skeggs 
113b8bf04e1SBen Skeggs #define IS_NVA3F(x) (((x) > 0xa0 && (x) < 0xaa) || (x) == 0xaf)
114b8bf04e1SBen Skeggs #define IS_NVAAF(x) ((x) >= 0xaa && (x) <= 0xac)
115b8bf04e1SBen Skeggs 
116b8bf04e1SBen Skeggs /*
117b8bf04e1SBen Skeggs  * This code deals with PGRAPH contexts on NV50 family cards. Like NV40, it's
118b8bf04e1SBen Skeggs  * the GPU itself that does context-switching, but it needs a special
119b8bf04e1SBen Skeggs  * microcode to do it. And it's the driver's task to supply this microcode,
120b8bf04e1SBen Skeggs  * further known as ctxprog, as well as the initial context values, known
121b8bf04e1SBen Skeggs  * as ctxvals.
122b8bf04e1SBen Skeggs  *
123b8bf04e1SBen Skeggs  * Without ctxprog, you cannot switch contexts. Not even in software, since
124b8bf04e1SBen Skeggs  * the majority of context [xfer strands] isn't accessible directly. You're
125b8bf04e1SBen Skeggs  * stuck with a single channel, and you also suffer all the problems resulting
126b8bf04e1SBen Skeggs  * from missing ctxvals, since you cannot load them.
127b8bf04e1SBen Skeggs  *
128b8bf04e1SBen Skeggs  * Without ctxvals, you're stuck with PGRAPH's default context. It's enough to
129b8bf04e1SBen Skeggs  * run 2d operations, but trying to utilise 3d or CUDA will just lock you up,
130b8bf04e1SBen Skeggs  * since you don't have... some sort of needed setup.
131b8bf04e1SBen Skeggs  *
132b8bf04e1SBen Skeggs  * Nouveau will just disable acceleration if not given ctxprog + ctxvals, since
133b8bf04e1SBen Skeggs  * it's too much hassle to handle no-ctxprog as a special case.
134b8bf04e1SBen Skeggs  */
135b8bf04e1SBen Skeggs 
136b8bf04e1SBen Skeggs /*
137b8bf04e1SBen Skeggs  * How ctxprogs work.
138b8bf04e1SBen Skeggs  *
139b8bf04e1SBen Skeggs  * The ctxprog is written in its own kind of microcode, with very small and
140b8bf04e1SBen Skeggs  * crappy set of available commands. You upload it to a small [512 insns]
141b8bf04e1SBen Skeggs  * area of memory on PGRAPH, and it'll be run when PFIFO wants PGRAPH to
142b8bf04e1SBen Skeggs  * switch channel. or when the driver explicitely requests it. Stuff visible
143b8bf04e1SBen Skeggs  * to ctxprog consists of: PGRAPH MMIO registers, PGRAPH context strands,
144b8bf04e1SBen Skeggs  * the per-channel context save area in VRAM [known as ctxvals or grctx],
145b8bf04e1SBen Skeggs  * 4 flags registers, a scratch register, two grctx pointers, plus many
146b8bf04e1SBen Skeggs  * random poorly-understood details.
147b8bf04e1SBen Skeggs  *
148b8bf04e1SBen Skeggs  * When ctxprog runs, it's supposed to check what operations are asked of it,
149b8bf04e1SBen Skeggs  * save old context if requested, optionally reset PGRAPH and switch to the
150b8bf04e1SBen Skeggs  * new channel, and load the new context. Context consists of three major
151b8bf04e1SBen Skeggs  * parts: subset of MMIO registers and two "xfer areas".
152b8bf04e1SBen Skeggs  */
153b8bf04e1SBen Skeggs 
154b8bf04e1SBen Skeggs /* TODO:
155b8bf04e1SBen Skeggs  *  - document unimplemented bits compared to nvidia
156b8bf04e1SBen Skeggs  *  - NVAx: make a TP subroutine, use it.
157b8bf04e1SBen Skeggs  *  - use 0x4008fc instead of 0x1540?
158b8bf04e1SBen Skeggs  */
159b8bf04e1SBen Skeggs 
160b8bf04e1SBen Skeggs enum cp_label {
161b8bf04e1SBen Skeggs 	cp_check_load = 1,
162b8bf04e1SBen Skeggs 	cp_setup_auto_load,
163b8bf04e1SBen Skeggs 	cp_setup_load,
164b8bf04e1SBen Skeggs 	cp_setup_save,
165b8bf04e1SBen Skeggs 	cp_swap_state,
166b8bf04e1SBen Skeggs 	cp_prepare_exit,
167b8bf04e1SBen Skeggs 	cp_exit,
168b8bf04e1SBen Skeggs };
169b8bf04e1SBen Skeggs 
170e3c71eb2SBen Skeggs static void nv50_gr_construct_mmio(struct nvkm_grctx *ctx);
171e3c71eb2SBen Skeggs static void nv50_gr_construct_xfer1(struct nvkm_grctx *ctx);
172e3c71eb2SBen Skeggs static void nv50_gr_construct_xfer2(struct nvkm_grctx *ctx);
173b8bf04e1SBen Skeggs 
174b8bf04e1SBen Skeggs /* Main function: construct the ctxprog skeleton, call the other functions. */
175b8bf04e1SBen Skeggs 
176b8bf04e1SBen Skeggs static int
nv50_grctx_generate(struct nvkm_grctx * ctx)177e3c71eb2SBen Skeggs nv50_grctx_generate(struct nvkm_grctx *ctx)
178b8bf04e1SBen Skeggs {
179b8bf04e1SBen Skeggs 	cp_set (ctx, STATE, RUNNING);
180b8bf04e1SBen Skeggs 	cp_set (ctx, XFER_SWITCH, ENABLE);
181b8bf04e1SBen Skeggs 	/* decide whether we're loading/unloading the context */
182b8bf04e1SBen Skeggs 	cp_bra (ctx, AUTO_SAVE, PENDING, cp_setup_save);
183b8bf04e1SBen Skeggs 	cp_bra (ctx, USER_SAVE, PENDING, cp_setup_save);
184b8bf04e1SBen Skeggs 
185b8bf04e1SBen Skeggs 	cp_name(ctx, cp_check_load);
186b8bf04e1SBen Skeggs 	cp_bra (ctx, AUTO_LOAD, PENDING, cp_setup_auto_load);
187b8bf04e1SBen Skeggs 	cp_bra (ctx, USER_LOAD, PENDING, cp_setup_load);
188b8bf04e1SBen Skeggs 	cp_bra (ctx, ALWAYS, TRUE, cp_prepare_exit);
189b8bf04e1SBen Skeggs 
190b8bf04e1SBen Skeggs 	/* setup for context load */
191b8bf04e1SBen Skeggs 	cp_name(ctx, cp_setup_auto_load);
192b8bf04e1SBen Skeggs 	cp_out (ctx, CP_DISABLE1);
193b8bf04e1SBen Skeggs 	cp_out (ctx, CP_DISABLE2);
194b8bf04e1SBen Skeggs 	cp_out (ctx, CP_ENABLE);
195b8bf04e1SBen Skeggs 	cp_out (ctx, CP_NEXT_TO_SWAP);
196b8bf04e1SBen Skeggs 	cp_set (ctx, UNK01, SET);
197b8bf04e1SBen Skeggs 	cp_name(ctx, cp_setup_load);
198b8bf04e1SBen Skeggs 	cp_out (ctx, CP_NEWCTX);
199b8bf04e1SBen Skeggs 	cp_wait(ctx, NEWCTX, BUSY);
200b8bf04e1SBen Skeggs 	cp_set (ctx, UNK1D, CLEAR);
201b8bf04e1SBen Skeggs 	cp_set (ctx, SWAP_DIRECTION, LOAD);
202b8bf04e1SBen Skeggs 	cp_bra (ctx, UNK0B, SET, cp_prepare_exit);
203b8bf04e1SBen Skeggs 	cp_bra (ctx, ALWAYS, TRUE, cp_swap_state);
204b8bf04e1SBen Skeggs 
205b8bf04e1SBen Skeggs 	/* setup for context save */
206b8bf04e1SBen Skeggs 	cp_name(ctx, cp_setup_save);
207b8bf04e1SBen Skeggs 	cp_set (ctx, UNK1D, SET);
208b8bf04e1SBen Skeggs 	cp_wait(ctx, STATUS, BUSY);
209b8bf04e1SBen Skeggs 	cp_wait(ctx, INTR, PENDING);
210b8bf04e1SBen Skeggs 	cp_bra (ctx, STATUS, BUSY, cp_setup_save);
211b8bf04e1SBen Skeggs 	cp_set (ctx, UNK01, SET);
212b8bf04e1SBen Skeggs 	cp_set (ctx, SWAP_DIRECTION, SAVE);
213b8bf04e1SBen Skeggs 
214b8bf04e1SBen Skeggs 	/* general PGRAPH state */
215b8bf04e1SBen Skeggs 	cp_name(ctx, cp_swap_state);
216b8bf04e1SBen Skeggs 	cp_set (ctx, UNK03, SET);
217b8bf04e1SBen Skeggs 	cp_pos (ctx, 0x00004/4);
218b8bf04e1SBen Skeggs 	cp_ctx (ctx, 0x400828, 1); /* needed. otherwise, flickering happens. */
219b8bf04e1SBen Skeggs 	cp_pos (ctx, 0x00100/4);
220b8bf04e1SBen Skeggs 	nv50_gr_construct_mmio(ctx);
221b8bf04e1SBen Skeggs 	nv50_gr_construct_xfer1(ctx);
222b8bf04e1SBen Skeggs 	nv50_gr_construct_xfer2(ctx);
223b8bf04e1SBen Skeggs 
224b8bf04e1SBen Skeggs 	cp_bra (ctx, SWAP_DIRECTION, SAVE, cp_check_load);
225b8bf04e1SBen Skeggs 
226b8bf04e1SBen Skeggs 	cp_set (ctx, UNK20, SET);
227b8bf04e1SBen Skeggs 	cp_set (ctx, SWAP_DIRECTION, SAVE); /* no idea why this is needed, but fixes at least one lockup. */
228b8bf04e1SBen Skeggs 	cp_lsr (ctx, ctx->ctxvals_base);
229b8bf04e1SBen Skeggs 	cp_out (ctx, CP_SET_XFER_POINTER);
230b8bf04e1SBen Skeggs 	cp_lsr (ctx, 4);
231b8bf04e1SBen Skeggs 	cp_out (ctx, CP_SEEK_1);
232b8bf04e1SBen Skeggs 	cp_out (ctx, CP_XFER_1);
233b8bf04e1SBen Skeggs 	cp_wait(ctx, XFER, BUSY);
234b8bf04e1SBen Skeggs 
235b8bf04e1SBen Skeggs 	/* pre-exit state updates */
236b8bf04e1SBen Skeggs 	cp_name(ctx, cp_prepare_exit);
237b8bf04e1SBen Skeggs 	cp_set (ctx, UNK01, CLEAR);
238b8bf04e1SBen Skeggs 	cp_set (ctx, UNK03, CLEAR);
239b8bf04e1SBen Skeggs 	cp_set (ctx, UNK1D, CLEAR);
240b8bf04e1SBen Skeggs 
241b8bf04e1SBen Skeggs 	cp_bra (ctx, USER_SAVE, PENDING, cp_exit);
242b8bf04e1SBen Skeggs 	cp_out (ctx, CP_NEXT_TO_CURRENT);
243b8bf04e1SBen Skeggs 
244b8bf04e1SBen Skeggs 	cp_name(ctx, cp_exit);
245b8bf04e1SBen Skeggs 	cp_set (ctx, USER_SAVE, NOT_PENDING);
246b8bf04e1SBen Skeggs 	cp_set (ctx, USER_LOAD, NOT_PENDING);
247b8bf04e1SBen Skeggs 	cp_set (ctx, XFER_SWITCH, DISABLE);
248b8bf04e1SBen Skeggs 	cp_set (ctx, STATE, STOPPED);
249b8bf04e1SBen Skeggs 	cp_out (ctx, CP_END);
250b8bf04e1SBen Skeggs 	ctx->ctxvals_pos += 0x400; /* padding... no idea why you need it */
251b8bf04e1SBen Skeggs 
252b8bf04e1SBen Skeggs 	return 0;
253b8bf04e1SBen Skeggs }
254b8bf04e1SBen Skeggs 
255b8bf04e1SBen Skeggs void
nv50_grctx_fill(struct nvkm_device * device,struct nvkm_gpuobj * mem)256e3c71eb2SBen Skeggs nv50_grctx_fill(struct nvkm_device *device, struct nvkm_gpuobj *mem)
257b8bf04e1SBen Skeggs {
258e3c71eb2SBen Skeggs 	nv50_grctx_generate(&(struct nvkm_grctx) {
259b8bf04e1SBen Skeggs 			     .device = device,
260e3c71eb2SBen Skeggs 			     .mode = NVKM_GRCTX_VALS,
261b8bf04e1SBen Skeggs 			     .data = mem,
262b8bf04e1SBen Skeggs 			   });
263b8bf04e1SBen Skeggs }
264b8bf04e1SBen Skeggs 
265b8bf04e1SBen Skeggs int
nv50_grctx_init(struct nvkm_device * device,u32 * size)266e3c71eb2SBen Skeggs nv50_grctx_init(struct nvkm_device *device, u32 *size)
267b8bf04e1SBen Skeggs {
268b8bf04e1SBen Skeggs 	u32 *ctxprog = kmalloc(512 * 4, GFP_KERNEL), i;
269e3c71eb2SBen Skeggs 	struct nvkm_grctx ctx = {
270b8bf04e1SBen Skeggs 		.device = device,
271e3c71eb2SBen Skeggs 		.mode = NVKM_GRCTX_PROG,
272142ea05fSBen Skeggs 		.ucode = ctxprog,
273b8bf04e1SBen Skeggs 		.ctxprog_max = 512,
274b8bf04e1SBen Skeggs 	};
275b8bf04e1SBen Skeggs 
276b8bf04e1SBen Skeggs 	if (!ctxprog)
277b8bf04e1SBen Skeggs 		return -ENOMEM;
278b8bf04e1SBen Skeggs 	nv50_grctx_generate(&ctx);
279b8bf04e1SBen Skeggs 
280276836d4SBen Skeggs 	nvkm_wr32(device, 0x400324, 0);
281b8bf04e1SBen Skeggs 	for (i = 0; i < ctx.ctxprog_len; i++)
282276836d4SBen Skeggs 		nvkm_wr32(device, 0x400328, ctxprog[i]);
283b8bf04e1SBen Skeggs 	*size = ctx.ctxvals_pos * 4;
284b8bf04e1SBen Skeggs 	kfree(ctxprog);
285b8bf04e1SBen Skeggs 	return 0;
286b8bf04e1SBen Skeggs }
287b8bf04e1SBen Skeggs 
288b8bf04e1SBen Skeggs /*
289b8bf04e1SBen Skeggs  * Constructs MMIO part of ctxprog and ctxvals. Just a matter of knowing which
290b8bf04e1SBen Skeggs  * registers to save/restore and the default values for them.
291b8bf04e1SBen Skeggs  */
292b8bf04e1SBen Skeggs 
293b8bf04e1SBen Skeggs static void
294e3c71eb2SBen Skeggs nv50_gr_construct_mmio_ddata(struct nvkm_grctx *ctx);
295b8bf04e1SBen Skeggs 
296b8bf04e1SBen Skeggs static void
nv50_gr_construct_mmio(struct nvkm_grctx * ctx)297e3c71eb2SBen Skeggs nv50_gr_construct_mmio(struct nvkm_grctx *ctx)
298b8bf04e1SBen Skeggs {
299e3c71eb2SBen Skeggs 	struct nvkm_device *device = ctx->device;
300b8bf04e1SBen Skeggs 	int i, j;
301b8bf04e1SBen Skeggs 	int offset, base;
302276836d4SBen Skeggs 	u32 units = nvkm_rd32(device, 0x1540);
303b8bf04e1SBen Skeggs 
304b8bf04e1SBen Skeggs 	/* 0800: DISPATCH */
305b8bf04e1SBen Skeggs 	cp_ctx(ctx, 0x400808, 7);
306b8bf04e1SBen Skeggs 	gr_def(ctx, 0x400814, 0x00000030);
307b8bf04e1SBen Skeggs 	cp_ctx(ctx, 0x400834, 0x32);
308b8bf04e1SBen Skeggs 	if (device->chipset == 0x50) {
309b8bf04e1SBen Skeggs 		gr_def(ctx, 0x400834, 0xff400040);
310b8bf04e1SBen Skeggs 		gr_def(ctx, 0x400838, 0xfff00080);
311b8bf04e1SBen Skeggs 		gr_def(ctx, 0x40083c, 0xfff70090);
312b8bf04e1SBen Skeggs 		gr_def(ctx, 0x400840, 0xffe806a8);
313b8bf04e1SBen Skeggs 	}
314b8bf04e1SBen Skeggs 	gr_def(ctx, 0x400844, 0x00000002);
315b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset))
316b8bf04e1SBen Skeggs 		gr_def(ctx, 0x400894, 0x00001000);
317b8bf04e1SBen Skeggs 	gr_def(ctx, 0x4008e8, 0x00000003);
318b8bf04e1SBen Skeggs 	gr_def(ctx, 0x4008ec, 0x00001000);
319b8bf04e1SBen Skeggs 	if (device->chipset == 0x50)
320b8bf04e1SBen Skeggs 		cp_ctx(ctx, 0x400908, 0xb);
321b8bf04e1SBen Skeggs 	else if (device->chipset < 0xa0)
322b8bf04e1SBen Skeggs 		cp_ctx(ctx, 0x400908, 0xc);
323b8bf04e1SBen Skeggs 	else
324b8bf04e1SBen Skeggs 		cp_ctx(ctx, 0x400908, 0xe);
325b8bf04e1SBen Skeggs 
326b8bf04e1SBen Skeggs 	if (device->chipset >= 0xa0)
327b8bf04e1SBen Skeggs 		cp_ctx(ctx, 0x400b00, 0x1);
328b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset)) {
329b8bf04e1SBen Skeggs 		cp_ctx(ctx, 0x400b10, 0x1);
330b8bf04e1SBen Skeggs 		gr_def(ctx, 0x400b10, 0x0001629d);
331b8bf04e1SBen Skeggs 		cp_ctx(ctx, 0x400b20, 0x1);
332b8bf04e1SBen Skeggs 		gr_def(ctx, 0x400b20, 0x0001629d);
333b8bf04e1SBen Skeggs 	}
334b8bf04e1SBen Skeggs 
335b8bf04e1SBen Skeggs 	nv50_gr_construct_mmio_ddata(ctx);
336b8bf04e1SBen Skeggs 
337b8bf04e1SBen Skeggs 	/* 0C00: VFETCH */
338b8bf04e1SBen Skeggs 	cp_ctx(ctx, 0x400c08, 0x2);
339b8bf04e1SBen Skeggs 	gr_def(ctx, 0x400c08, 0x0000fe0c);
340b8bf04e1SBen Skeggs 
341b8bf04e1SBen Skeggs 	/* 1000 */
342b8bf04e1SBen Skeggs 	if (device->chipset < 0xa0) {
343b8bf04e1SBen Skeggs 		cp_ctx(ctx, 0x401008, 0x4);
344b8bf04e1SBen Skeggs 		gr_def(ctx, 0x401014, 0x00001000);
345b8bf04e1SBen Skeggs 	} else if (!IS_NVA3F(device->chipset)) {
346b8bf04e1SBen Skeggs 		cp_ctx(ctx, 0x401008, 0x5);
347b8bf04e1SBen Skeggs 		gr_def(ctx, 0x401018, 0x00001000);
348b8bf04e1SBen Skeggs 	} else {
349b8bf04e1SBen Skeggs 		cp_ctx(ctx, 0x401008, 0x5);
350b8bf04e1SBen Skeggs 		gr_def(ctx, 0x401018, 0x00004000);
351b8bf04e1SBen Skeggs 	}
352b8bf04e1SBen Skeggs 
353b8bf04e1SBen Skeggs 	/* 1400 */
354b8bf04e1SBen Skeggs 	cp_ctx(ctx, 0x401400, 0x8);
355b8bf04e1SBen Skeggs 	cp_ctx(ctx, 0x401424, 0x3);
356b8bf04e1SBen Skeggs 	if (device->chipset == 0x50)
357b8bf04e1SBen Skeggs 		gr_def(ctx, 0x40142c, 0x0001fd87);
358b8bf04e1SBen Skeggs 	else
359b8bf04e1SBen Skeggs 		gr_def(ctx, 0x40142c, 0x00000187);
360b8bf04e1SBen Skeggs 	cp_ctx(ctx, 0x401540, 0x5);
361b8bf04e1SBen Skeggs 	gr_def(ctx, 0x401550, 0x00001018);
362b8bf04e1SBen Skeggs 
363b8bf04e1SBen Skeggs 	/* 1800: STREAMOUT */
364b8bf04e1SBen Skeggs 	cp_ctx(ctx, 0x401814, 0x1);
365b8bf04e1SBen Skeggs 	gr_def(ctx, 0x401814, 0x000000ff);
366b8bf04e1SBen Skeggs 	if (device->chipset == 0x50) {
367b8bf04e1SBen Skeggs 		cp_ctx(ctx, 0x40181c, 0xe);
368b8bf04e1SBen Skeggs 		gr_def(ctx, 0x401850, 0x00000004);
369b8bf04e1SBen Skeggs 	} else if (device->chipset < 0xa0) {
370b8bf04e1SBen Skeggs 		cp_ctx(ctx, 0x40181c, 0xf);
371b8bf04e1SBen Skeggs 		gr_def(ctx, 0x401854, 0x00000004);
372b8bf04e1SBen Skeggs 	} else {
373b8bf04e1SBen Skeggs 		cp_ctx(ctx, 0x40181c, 0x13);
374b8bf04e1SBen Skeggs 		gr_def(ctx, 0x401864, 0x00000004);
375b8bf04e1SBen Skeggs 	}
376b8bf04e1SBen Skeggs 
377b8bf04e1SBen Skeggs 	/* 1C00 */
378b8bf04e1SBen Skeggs 	cp_ctx(ctx, 0x401c00, 0x1);
379b8bf04e1SBen Skeggs 	switch (device->chipset) {
380b8bf04e1SBen Skeggs 	case 0x50:
381b8bf04e1SBen Skeggs 		gr_def(ctx, 0x401c00, 0x0001005f);
382b8bf04e1SBen Skeggs 		break;
383b8bf04e1SBen Skeggs 	case 0x84:
384b8bf04e1SBen Skeggs 	case 0x86:
385b8bf04e1SBen Skeggs 	case 0x94:
386b8bf04e1SBen Skeggs 		gr_def(ctx, 0x401c00, 0x044d00df);
387b8bf04e1SBen Skeggs 		break;
388b8bf04e1SBen Skeggs 	case 0x92:
389b8bf04e1SBen Skeggs 	case 0x96:
390b8bf04e1SBen Skeggs 	case 0x98:
391b8bf04e1SBen Skeggs 	case 0xa0:
392b8bf04e1SBen Skeggs 	case 0xaa:
393b8bf04e1SBen Skeggs 	case 0xac:
394b8bf04e1SBen Skeggs 		gr_def(ctx, 0x401c00, 0x042500df);
395b8bf04e1SBen Skeggs 		break;
396b8bf04e1SBen Skeggs 	case 0xa3:
397b8bf04e1SBen Skeggs 	case 0xa5:
398b8bf04e1SBen Skeggs 	case 0xa8:
399b8bf04e1SBen Skeggs 	case 0xaf:
400b8bf04e1SBen Skeggs 		gr_def(ctx, 0x401c00, 0x142500df);
401b8bf04e1SBen Skeggs 		break;
402b8bf04e1SBen Skeggs 	}
403b8bf04e1SBen Skeggs 
404b8bf04e1SBen Skeggs 	/* 2000 */
405b8bf04e1SBen Skeggs 
406b8bf04e1SBen Skeggs 	/* 2400 */
407b8bf04e1SBen Skeggs 	cp_ctx(ctx, 0x402400, 0x1);
408b8bf04e1SBen Skeggs 	if (device->chipset == 0x50)
409b8bf04e1SBen Skeggs 		cp_ctx(ctx, 0x402408, 0x1);
410b8bf04e1SBen Skeggs 	else
411b8bf04e1SBen Skeggs 		cp_ctx(ctx, 0x402408, 0x2);
412b8bf04e1SBen Skeggs 	gr_def(ctx, 0x402408, 0x00000600);
413b8bf04e1SBen Skeggs 
414b8bf04e1SBen Skeggs 	/* 2800: CSCHED */
415b8bf04e1SBen Skeggs 	cp_ctx(ctx, 0x402800, 0x1);
416b8bf04e1SBen Skeggs 	if (device->chipset == 0x50)
417b8bf04e1SBen Skeggs 		gr_def(ctx, 0x402800, 0x00000006);
418b8bf04e1SBen Skeggs 
419b8bf04e1SBen Skeggs 	/* 2C00: ZCULL */
420b8bf04e1SBen Skeggs 	cp_ctx(ctx, 0x402c08, 0x6);
421b8bf04e1SBen Skeggs 	if (device->chipset != 0x50)
422b8bf04e1SBen Skeggs 		gr_def(ctx, 0x402c14, 0x01000000);
423b8bf04e1SBen Skeggs 	gr_def(ctx, 0x402c18, 0x000000ff);
424b8bf04e1SBen Skeggs 	if (device->chipset == 0x50)
425b8bf04e1SBen Skeggs 		cp_ctx(ctx, 0x402ca0, 0x1);
426b8bf04e1SBen Skeggs 	else
427b8bf04e1SBen Skeggs 		cp_ctx(ctx, 0x402ca0, 0x2);
428b8bf04e1SBen Skeggs 	if (device->chipset < 0xa0)
429b8bf04e1SBen Skeggs 		gr_def(ctx, 0x402ca0, 0x00000400);
430b8bf04e1SBen Skeggs 	else if (!IS_NVA3F(device->chipset))
431b8bf04e1SBen Skeggs 		gr_def(ctx, 0x402ca0, 0x00000800);
432b8bf04e1SBen Skeggs 	else
433b8bf04e1SBen Skeggs 		gr_def(ctx, 0x402ca0, 0x00000400);
434b8bf04e1SBen Skeggs 	cp_ctx(ctx, 0x402cac, 0x4);
435b8bf04e1SBen Skeggs 
436b8bf04e1SBen Skeggs 	/* 3000: ENG2D */
437b8bf04e1SBen Skeggs 	cp_ctx(ctx, 0x403004, 0x1);
438b8bf04e1SBen Skeggs 	gr_def(ctx, 0x403004, 0x00000001);
439b8bf04e1SBen Skeggs 
440b8bf04e1SBen Skeggs 	/* 3400 */
441b8bf04e1SBen Skeggs 	if (device->chipset >= 0xa0) {
442b8bf04e1SBen Skeggs 		cp_ctx(ctx, 0x403404, 0x1);
443b8bf04e1SBen Skeggs 		gr_def(ctx, 0x403404, 0x00000001);
444b8bf04e1SBen Skeggs 	}
445b8bf04e1SBen Skeggs 
446b8bf04e1SBen Skeggs 	/* 5000: CCACHE */
447b8bf04e1SBen Skeggs 	cp_ctx(ctx, 0x405000, 0x1);
448b8bf04e1SBen Skeggs 	switch (device->chipset) {
449b8bf04e1SBen Skeggs 	case 0x50:
450b8bf04e1SBen Skeggs 		gr_def(ctx, 0x405000, 0x00300080);
451b8bf04e1SBen Skeggs 		break;
452b8bf04e1SBen Skeggs 	case 0x84:
453b8bf04e1SBen Skeggs 	case 0xa0:
454b8bf04e1SBen Skeggs 	case 0xa3:
455b8bf04e1SBen Skeggs 	case 0xa5:
456b8bf04e1SBen Skeggs 	case 0xa8:
457b8bf04e1SBen Skeggs 	case 0xaa:
458b8bf04e1SBen Skeggs 	case 0xac:
459b8bf04e1SBen Skeggs 	case 0xaf:
460b8bf04e1SBen Skeggs 		gr_def(ctx, 0x405000, 0x000e0080);
461b8bf04e1SBen Skeggs 		break;
462b8bf04e1SBen Skeggs 	case 0x86:
463b8bf04e1SBen Skeggs 	case 0x92:
464b8bf04e1SBen Skeggs 	case 0x94:
465b8bf04e1SBen Skeggs 	case 0x96:
466b8bf04e1SBen Skeggs 	case 0x98:
467b8bf04e1SBen Skeggs 		gr_def(ctx, 0x405000, 0x00000080);
468b8bf04e1SBen Skeggs 		break;
469b8bf04e1SBen Skeggs 	}
470b8bf04e1SBen Skeggs 	cp_ctx(ctx, 0x405014, 0x1);
471b8bf04e1SBen Skeggs 	gr_def(ctx, 0x405014, 0x00000004);
472b8bf04e1SBen Skeggs 	cp_ctx(ctx, 0x40501c, 0x1);
473b8bf04e1SBen Skeggs 	cp_ctx(ctx, 0x405024, 0x1);
474b8bf04e1SBen Skeggs 	cp_ctx(ctx, 0x40502c, 0x1);
475b8bf04e1SBen Skeggs 
476b8bf04e1SBen Skeggs 	/* 6000? */
477b8bf04e1SBen Skeggs 	if (device->chipset == 0x50)
478b8bf04e1SBen Skeggs 		cp_ctx(ctx, 0x4063e0, 0x1);
479b8bf04e1SBen Skeggs 
480b8bf04e1SBen Skeggs 	/* 6800: M2MF */
481b8bf04e1SBen Skeggs 	if (device->chipset < 0x90) {
482b8bf04e1SBen Skeggs 		cp_ctx(ctx, 0x406814, 0x2b);
483b8bf04e1SBen Skeggs 		gr_def(ctx, 0x406818, 0x00000f80);
484b8bf04e1SBen Skeggs 		gr_def(ctx, 0x406860, 0x007f0080);
485b8bf04e1SBen Skeggs 		gr_def(ctx, 0x40689c, 0x007f0080);
486b8bf04e1SBen Skeggs 	} else {
487b8bf04e1SBen Skeggs 		cp_ctx(ctx, 0x406814, 0x4);
488b8bf04e1SBen Skeggs 		if (device->chipset == 0x98)
489b8bf04e1SBen Skeggs 			gr_def(ctx, 0x406818, 0x00000f80);
490b8bf04e1SBen Skeggs 		else
491b8bf04e1SBen Skeggs 			gr_def(ctx, 0x406818, 0x00001f80);
492b8bf04e1SBen Skeggs 		if (IS_NVA3F(device->chipset))
493b8bf04e1SBen Skeggs 			gr_def(ctx, 0x40681c, 0x00000030);
494b8bf04e1SBen Skeggs 		cp_ctx(ctx, 0x406830, 0x3);
495b8bf04e1SBen Skeggs 	}
496b8bf04e1SBen Skeggs 
497b8bf04e1SBen Skeggs 	/* 7000: per-ROP group state */
498b8bf04e1SBen Skeggs 	for (i = 0; i < 8; i++) {
499b8bf04e1SBen Skeggs 		if (units & (1<<(i+16))) {
500b8bf04e1SBen Skeggs 			cp_ctx(ctx, 0x407000 + (i<<8), 3);
501b8bf04e1SBen Skeggs 			if (device->chipset == 0x50)
502b8bf04e1SBen Skeggs 				gr_def(ctx, 0x407000 + (i<<8), 0x1b74f820);
503b8bf04e1SBen Skeggs 			else if (device->chipset != 0xa5)
504b8bf04e1SBen Skeggs 				gr_def(ctx, 0x407000 + (i<<8), 0x3b74f821);
505b8bf04e1SBen Skeggs 			else
506b8bf04e1SBen Skeggs 				gr_def(ctx, 0x407000 + (i<<8), 0x7b74f821);
507b8bf04e1SBen Skeggs 			gr_def(ctx, 0x407004 + (i<<8), 0x89058001);
508b8bf04e1SBen Skeggs 
509b8bf04e1SBen Skeggs 			if (device->chipset == 0x50) {
510b8bf04e1SBen Skeggs 				cp_ctx(ctx, 0x407010 + (i<<8), 1);
511b8bf04e1SBen Skeggs 			} else if (device->chipset < 0xa0) {
512b8bf04e1SBen Skeggs 				cp_ctx(ctx, 0x407010 + (i<<8), 2);
513b8bf04e1SBen Skeggs 				gr_def(ctx, 0x407010 + (i<<8), 0x00001000);
514b8bf04e1SBen Skeggs 				gr_def(ctx, 0x407014 + (i<<8), 0x0000001f);
515b8bf04e1SBen Skeggs 			} else {
516b8bf04e1SBen Skeggs 				cp_ctx(ctx, 0x407010 + (i<<8), 3);
517b8bf04e1SBen Skeggs 				gr_def(ctx, 0x407010 + (i<<8), 0x00001000);
518b8bf04e1SBen Skeggs 				if (device->chipset != 0xa5)
519b8bf04e1SBen Skeggs 					gr_def(ctx, 0x407014 + (i<<8), 0x000000ff);
520b8bf04e1SBen Skeggs 				else
521b8bf04e1SBen Skeggs 					gr_def(ctx, 0x407014 + (i<<8), 0x000001ff);
522b8bf04e1SBen Skeggs 			}
523b8bf04e1SBen Skeggs 
524b8bf04e1SBen Skeggs 			cp_ctx(ctx, 0x407080 + (i<<8), 4);
525b8bf04e1SBen Skeggs 			if (device->chipset != 0xa5)
526b8bf04e1SBen Skeggs 				gr_def(ctx, 0x407080 + (i<<8), 0x027c10fa);
527b8bf04e1SBen Skeggs 			else
528b8bf04e1SBen Skeggs 				gr_def(ctx, 0x407080 + (i<<8), 0x827c10fa);
529b8bf04e1SBen Skeggs 			if (device->chipset == 0x50)
530b8bf04e1SBen Skeggs 				gr_def(ctx, 0x407084 + (i<<8), 0x000000c0);
531b8bf04e1SBen Skeggs 			else
532b8bf04e1SBen Skeggs 				gr_def(ctx, 0x407084 + (i<<8), 0x400000c0);
533b8bf04e1SBen Skeggs 			gr_def(ctx, 0x407088 + (i<<8), 0xb7892080);
534b8bf04e1SBen Skeggs 
535b8bf04e1SBen Skeggs 			if (device->chipset < 0xa0)
536b8bf04e1SBen Skeggs 				cp_ctx(ctx, 0x407094 + (i<<8), 1);
537b8bf04e1SBen Skeggs 			else if (!IS_NVA3F(device->chipset))
538b8bf04e1SBen Skeggs 				cp_ctx(ctx, 0x407094 + (i<<8), 3);
539b8bf04e1SBen Skeggs 			else {
540b8bf04e1SBen Skeggs 				cp_ctx(ctx, 0x407094 + (i<<8), 4);
541b8bf04e1SBen Skeggs 				gr_def(ctx, 0x4070a0 + (i<<8), 1);
542b8bf04e1SBen Skeggs 			}
543b8bf04e1SBen Skeggs 		}
544b8bf04e1SBen Skeggs 	}
545b8bf04e1SBen Skeggs 
546b8bf04e1SBen Skeggs 	cp_ctx(ctx, 0x407c00, 0x3);
547b8bf04e1SBen Skeggs 	if (device->chipset < 0x90)
548b8bf04e1SBen Skeggs 		gr_def(ctx, 0x407c00, 0x00010040);
549b8bf04e1SBen Skeggs 	else if (device->chipset < 0xa0)
550b8bf04e1SBen Skeggs 		gr_def(ctx, 0x407c00, 0x00390040);
551b8bf04e1SBen Skeggs 	else
552b8bf04e1SBen Skeggs 		gr_def(ctx, 0x407c00, 0x003d0040);
553b8bf04e1SBen Skeggs 	gr_def(ctx, 0x407c08, 0x00000022);
554b8bf04e1SBen Skeggs 	if (device->chipset >= 0xa0) {
555b8bf04e1SBen Skeggs 		cp_ctx(ctx, 0x407c10, 0x3);
556b8bf04e1SBen Skeggs 		cp_ctx(ctx, 0x407c20, 0x1);
557b8bf04e1SBen Skeggs 		cp_ctx(ctx, 0x407c2c, 0x1);
558b8bf04e1SBen Skeggs 	}
559b8bf04e1SBen Skeggs 
560b8bf04e1SBen Skeggs 	if (device->chipset < 0xa0) {
561b8bf04e1SBen Skeggs 		cp_ctx(ctx, 0x407d00, 0x9);
562b8bf04e1SBen Skeggs 	} else {
563b8bf04e1SBen Skeggs 		cp_ctx(ctx, 0x407d00, 0x15);
564b8bf04e1SBen Skeggs 	}
565b8bf04e1SBen Skeggs 	if (device->chipset == 0x98)
566b8bf04e1SBen Skeggs 		gr_def(ctx, 0x407d08, 0x00380040);
567b8bf04e1SBen Skeggs 	else {
568b8bf04e1SBen Skeggs 		if (device->chipset < 0x90)
569b8bf04e1SBen Skeggs 			gr_def(ctx, 0x407d08, 0x00010040);
570b8bf04e1SBen Skeggs 		else if (device->chipset < 0xa0)
571b8bf04e1SBen Skeggs 			gr_def(ctx, 0x407d08, 0x00390040);
572b8bf04e1SBen Skeggs 		else {
57303c8952fSBen Skeggs 			if (device->fb->ram->type != NVKM_RAM_TYPE_GDDR5)
574b8bf04e1SBen Skeggs 				gr_def(ctx, 0x407d08, 0x003d0040);
575b8bf04e1SBen Skeggs 			else
576b8bf04e1SBen Skeggs 				gr_def(ctx, 0x407d08, 0x003c0040);
577b8bf04e1SBen Skeggs 		}
578b8bf04e1SBen Skeggs 		gr_def(ctx, 0x407d0c, 0x00000022);
579b8bf04e1SBen Skeggs 	}
580b8bf04e1SBen Skeggs 
581b8bf04e1SBen Skeggs 	/* 8000+: per-TP state */
582b8bf04e1SBen Skeggs 	for (i = 0; i < 10; i++) {
583b8bf04e1SBen Skeggs 		if (units & (1<<i)) {
584b8bf04e1SBen Skeggs 			if (device->chipset < 0xa0)
585b8bf04e1SBen Skeggs 				base = 0x408000 + (i<<12);
586b8bf04e1SBen Skeggs 			else
587b8bf04e1SBen Skeggs 				base = 0x408000 + (i<<11);
588b8bf04e1SBen Skeggs 			if (device->chipset < 0xa0)
589b8bf04e1SBen Skeggs 				offset = base + 0xc00;
590b8bf04e1SBen Skeggs 			else
591b8bf04e1SBen Skeggs 				offset = base + 0x80;
592b8bf04e1SBen Skeggs 			cp_ctx(ctx, offset + 0x00, 1);
593b8bf04e1SBen Skeggs 			gr_def(ctx, offset + 0x00, 0x0000ff0a);
594b8bf04e1SBen Skeggs 			cp_ctx(ctx, offset + 0x08, 1);
595b8bf04e1SBen Skeggs 
596b8bf04e1SBen Skeggs 			/* per-MP state */
597b8bf04e1SBen Skeggs 			for (j = 0; j < (device->chipset < 0xa0 ? 2 : 4); j++) {
598b8bf04e1SBen Skeggs 				if (!(units & (1 << (j+24)))) continue;
599b8bf04e1SBen Skeggs 				if (device->chipset < 0xa0)
600b8bf04e1SBen Skeggs 					offset = base + 0x200 + (j<<7);
601b8bf04e1SBen Skeggs 				else
602b8bf04e1SBen Skeggs 					offset = base + 0x100 + (j<<7);
603b8bf04e1SBen Skeggs 				cp_ctx(ctx, offset, 0x20);
604b8bf04e1SBen Skeggs 				gr_def(ctx, offset + 0x00, 0x01800000);
605b8bf04e1SBen Skeggs 				gr_def(ctx, offset + 0x04, 0x00160000);
606b8bf04e1SBen Skeggs 				gr_def(ctx, offset + 0x08, 0x01800000);
607b8bf04e1SBen Skeggs 				gr_def(ctx, offset + 0x18, 0x0003ffff);
608b8bf04e1SBen Skeggs 				switch (device->chipset) {
609b8bf04e1SBen Skeggs 				case 0x50:
610b8bf04e1SBen Skeggs 					gr_def(ctx, offset + 0x1c, 0x00080000);
611b8bf04e1SBen Skeggs 					break;
612b8bf04e1SBen Skeggs 				case 0x84:
613b8bf04e1SBen Skeggs 					gr_def(ctx, offset + 0x1c, 0x00880000);
614b8bf04e1SBen Skeggs 					break;
615b8bf04e1SBen Skeggs 				case 0x86:
616b8bf04e1SBen Skeggs 					gr_def(ctx, offset + 0x1c, 0x018c0000);
617b8bf04e1SBen Skeggs 					break;
618b8bf04e1SBen Skeggs 				case 0x92:
619b8bf04e1SBen Skeggs 				case 0x96:
620b8bf04e1SBen Skeggs 				case 0x98:
621b8bf04e1SBen Skeggs 					gr_def(ctx, offset + 0x1c, 0x118c0000);
622b8bf04e1SBen Skeggs 					break;
623b8bf04e1SBen Skeggs 				case 0x94:
624b8bf04e1SBen Skeggs 					gr_def(ctx, offset + 0x1c, 0x10880000);
625b8bf04e1SBen Skeggs 					break;
626b8bf04e1SBen Skeggs 				case 0xa0:
627b8bf04e1SBen Skeggs 				case 0xa5:
628b8bf04e1SBen Skeggs 					gr_def(ctx, offset + 0x1c, 0x310c0000);
629b8bf04e1SBen Skeggs 					break;
630b8bf04e1SBen Skeggs 				case 0xa3:
631b8bf04e1SBen Skeggs 				case 0xa8:
632b8bf04e1SBen Skeggs 				case 0xaa:
633b8bf04e1SBen Skeggs 				case 0xac:
634b8bf04e1SBen Skeggs 				case 0xaf:
635b8bf04e1SBen Skeggs 					gr_def(ctx, offset + 0x1c, 0x300c0000);
636b8bf04e1SBen Skeggs 					break;
637b8bf04e1SBen Skeggs 				}
638b8bf04e1SBen Skeggs 				gr_def(ctx, offset + 0x40, 0x00010401);
639b8bf04e1SBen Skeggs 				if (device->chipset == 0x50)
640b8bf04e1SBen Skeggs 					gr_def(ctx, offset + 0x48, 0x00000040);
641b8bf04e1SBen Skeggs 				else
642b8bf04e1SBen Skeggs 					gr_def(ctx, offset + 0x48, 0x00000078);
643b8bf04e1SBen Skeggs 				gr_def(ctx, offset + 0x50, 0x000000bf);
644b8bf04e1SBen Skeggs 				gr_def(ctx, offset + 0x58, 0x00001210);
645b8bf04e1SBen Skeggs 				if (device->chipset == 0x50)
646b8bf04e1SBen Skeggs 					gr_def(ctx, offset + 0x5c, 0x00000080);
647b8bf04e1SBen Skeggs 				else
648b8bf04e1SBen Skeggs 					gr_def(ctx, offset + 0x5c, 0x08000080);
649b8bf04e1SBen Skeggs 				if (device->chipset >= 0xa0)
650b8bf04e1SBen Skeggs 					gr_def(ctx, offset + 0x68, 0x0000003e);
651b8bf04e1SBen Skeggs 			}
652b8bf04e1SBen Skeggs 
653b8bf04e1SBen Skeggs 			if (device->chipset < 0xa0)
654b8bf04e1SBen Skeggs 				cp_ctx(ctx, base + 0x300, 0x4);
655b8bf04e1SBen Skeggs 			else
656b8bf04e1SBen Skeggs 				cp_ctx(ctx, base + 0x300, 0x5);
657b8bf04e1SBen Skeggs 			if (device->chipset == 0x50)
658b8bf04e1SBen Skeggs 				gr_def(ctx, base + 0x304, 0x00007070);
659b8bf04e1SBen Skeggs 			else if (device->chipset < 0xa0)
660b8bf04e1SBen Skeggs 				gr_def(ctx, base + 0x304, 0x00027070);
661b8bf04e1SBen Skeggs 			else if (!IS_NVA3F(device->chipset))
662b8bf04e1SBen Skeggs 				gr_def(ctx, base + 0x304, 0x01127070);
663b8bf04e1SBen Skeggs 			else
664b8bf04e1SBen Skeggs 				gr_def(ctx, base + 0x304, 0x05127070);
665b8bf04e1SBen Skeggs 
666b8bf04e1SBen Skeggs 			if (device->chipset < 0xa0)
667b8bf04e1SBen Skeggs 				cp_ctx(ctx, base + 0x318, 1);
668b8bf04e1SBen Skeggs 			else
669b8bf04e1SBen Skeggs 				cp_ctx(ctx, base + 0x320, 1);
670b8bf04e1SBen Skeggs 			if (device->chipset == 0x50)
671b8bf04e1SBen Skeggs 				gr_def(ctx, base + 0x318, 0x0003ffff);
672b8bf04e1SBen Skeggs 			else if (device->chipset < 0xa0)
673b8bf04e1SBen Skeggs 				gr_def(ctx, base + 0x318, 0x03ffffff);
674b8bf04e1SBen Skeggs 			else
675b8bf04e1SBen Skeggs 				gr_def(ctx, base + 0x320, 0x07ffffff);
676b8bf04e1SBen Skeggs 
677b8bf04e1SBen Skeggs 			if (device->chipset < 0xa0)
678b8bf04e1SBen Skeggs 				cp_ctx(ctx, base + 0x324, 5);
679b8bf04e1SBen Skeggs 			else
680b8bf04e1SBen Skeggs 				cp_ctx(ctx, base + 0x328, 4);
681b8bf04e1SBen Skeggs 
682b8bf04e1SBen Skeggs 			if (device->chipset < 0xa0) {
683b8bf04e1SBen Skeggs 				cp_ctx(ctx, base + 0x340, 9);
684b8bf04e1SBen Skeggs 				offset = base + 0x340;
685b8bf04e1SBen Skeggs 			} else if (!IS_NVA3F(device->chipset)) {
686b8bf04e1SBen Skeggs 				cp_ctx(ctx, base + 0x33c, 0xb);
687b8bf04e1SBen Skeggs 				offset = base + 0x344;
688b8bf04e1SBen Skeggs 			} else {
689b8bf04e1SBen Skeggs 				cp_ctx(ctx, base + 0x33c, 0xd);
690b8bf04e1SBen Skeggs 				offset = base + 0x344;
691b8bf04e1SBen Skeggs 			}
692b8bf04e1SBen Skeggs 			gr_def(ctx, offset + 0x0, 0x00120407);
693b8bf04e1SBen Skeggs 			gr_def(ctx, offset + 0x4, 0x05091507);
694b8bf04e1SBen Skeggs 			if (device->chipset == 0x84)
695b8bf04e1SBen Skeggs 				gr_def(ctx, offset + 0x8, 0x05100202);
696b8bf04e1SBen Skeggs 			else
697b8bf04e1SBen Skeggs 				gr_def(ctx, offset + 0x8, 0x05010202);
698b8bf04e1SBen Skeggs 			gr_def(ctx, offset + 0xc, 0x00030201);
699b8bf04e1SBen Skeggs 			if (device->chipset == 0xa3)
700b8bf04e1SBen Skeggs 				cp_ctx(ctx, base + 0x36c, 1);
701b8bf04e1SBen Skeggs 
702b8bf04e1SBen Skeggs 			cp_ctx(ctx, base + 0x400, 2);
703b8bf04e1SBen Skeggs 			gr_def(ctx, base + 0x404, 0x00000040);
704b8bf04e1SBen Skeggs 			cp_ctx(ctx, base + 0x40c, 2);
705b8bf04e1SBen Skeggs 			gr_def(ctx, base + 0x40c, 0x0d0c0b0a);
706b8bf04e1SBen Skeggs 			gr_def(ctx, base + 0x410, 0x00141210);
707b8bf04e1SBen Skeggs 
708b8bf04e1SBen Skeggs 			if (device->chipset < 0xa0)
709b8bf04e1SBen Skeggs 				offset = base + 0x800;
710b8bf04e1SBen Skeggs 			else
711b8bf04e1SBen Skeggs 				offset = base + 0x500;
712b8bf04e1SBen Skeggs 			cp_ctx(ctx, offset, 6);
713b8bf04e1SBen Skeggs 			gr_def(ctx, offset + 0x0, 0x000001f0);
714b8bf04e1SBen Skeggs 			gr_def(ctx, offset + 0x4, 0x00000001);
715b8bf04e1SBen Skeggs 			gr_def(ctx, offset + 0x8, 0x00000003);
716b8bf04e1SBen Skeggs 			if (device->chipset == 0x50 || IS_NVAAF(device->chipset))
717b8bf04e1SBen Skeggs 				gr_def(ctx, offset + 0xc, 0x00008000);
718b8bf04e1SBen Skeggs 			gr_def(ctx, offset + 0x14, 0x00039e00);
719b8bf04e1SBen Skeggs 			cp_ctx(ctx, offset + 0x1c, 2);
720b8bf04e1SBen Skeggs 			if (device->chipset == 0x50)
721b8bf04e1SBen Skeggs 				gr_def(ctx, offset + 0x1c, 0x00000040);
722b8bf04e1SBen Skeggs 			else
723b8bf04e1SBen Skeggs 				gr_def(ctx, offset + 0x1c, 0x00000100);
724b8bf04e1SBen Skeggs 			gr_def(ctx, offset + 0x20, 0x00003800);
725b8bf04e1SBen Skeggs 
726b8bf04e1SBen Skeggs 			if (device->chipset >= 0xa0) {
727b8bf04e1SBen Skeggs 				cp_ctx(ctx, base + 0x54c, 2);
728b8bf04e1SBen Skeggs 				if (!IS_NVA3F(device->chipset))
729b8bf04e1SBen Skeggs 					gr_def(ctx, base + 0x54c, 0x003fe006);
730b8bf04e1SBen Skeggs 				else
731b8bf04e1SBen Skeggs 					gr_def(ctx, base + 0x54c, 0x003fe007);
732b8bf04e1SBen Skeggs 				gr_def(ctx, base + 0x550, 0x003fe000);
733b8bf04e1SBen Skeggs 			}
734b8bf04e1SBen Skeggs 
735b8bf04e1SBen Skeggs 			if (device->chipset < 0xa0)
736b8bf04e1SBen Skeggs 				offset = base + 0xa00;
737b8bf04e1SBen Skeggs 			else
738b8bf04e1SBen Skeggs 				offset = base + 0x680;
739b8bf04e1SBen Skeggs 			cp_ctx(ctx, offset, 1);
740b8bf04e1SBen Skeggs 			gr_def(ctx, offset, 0x00404040);
741b8bf04e1SBen Skeggs 
742b8bf04e1SBen Skeggs 			if (device->chipset < 0xa0)
743b8bf04e1SBen Skeggs 				offset = base + 0xe00;
744b8bf04e1SBen Skeggs 			else
745b8bf04e1SBen Skeggs 				offset = base + 0x700;
746b8bf04e1SBen Skeggs 			cp_ctx(ctx, offset, 2);
747b8bf04e1SBen Skeggs 			if (device->chipset < 0xa0)
748b8bf04e1SBen Skeggs 				gr_def(ctx, offset, 0x0077f005);
749b8bf04e1SBen Skeggs 			else if (device->chipset == 0xa5)
750b8bf04e1SBen Skeggs 				gr_def(ctx, offset, 0x6cf7f007);
751b8bf04e1SBen Skeggs 			else if (device->chipset == 0xa8)
752b8bf04e1SBen Skeggs 				gr_def(ctx, offset, 0x6cfff007);
753b8bf04e1SBen Skeggs 			else if (device->chipset == 0xac)
754b8bf04e1SBen Skeggs 				gr_def(ctx, offset, 0x0cfff007);
755b8bf04e1SBen Skeggs 			else
756b8bf04e1SBen Skeggs 				gr_def(ctx, offset, 0x0cf7f007);
757b8bf04e1SBen Skeggs 			if (device->chipset == 0x50)
758b8bf04e1SBen Skeggs 				gr_def(ctx, offset + 0x4, 0x00007fff);
759b8bf04e1SBen Skeggs 			else if (device->chipset < 0xa0)
760b8bf04e1SBen Skeggs 				gr_def(ctx, offset + 0x4, 0x003f7fff);
761b8bf04e1SBen Skeggs 			else
762b8bf04e1SBen Skeggs 				gr_def(ctx, offset + 0x4, 0x02bf7fff);
763b8bf04e1SBen Skeggs 			cp_ctx(ctx, offset + 0x2c, 1);
764b8bf04e1SBen Skeggs 			if (device->chipset == 0x50) {
765b8bf04e1SBen Skeggs 				cp_ctx(ctx, offset + 0x50, 9);
766b8bf04e1SBen Skeggs 				gr_def(ctx, offset + 0x54, 0x000003ff);
767b8bf04e1SBen Skeggs 				gr_def(ctx, offset + 0x58, 0x00000003);
768b8bf04e1SBen Skeggs 				gr_def(ctx, offset + 0x5c, 0x00000003);
769b8bf04e1SBen Skeggs 				gr_def(ctx, offset + 0x60, 0x000001ff);
770b8bf04e1SBen Skeggs 				gr_def(ctx, offset + 0x64, 0x0000001f);
771b8bf04e1SBen Skeggs 				gr_def(ctx, offset + 0x68, 0x0000000f);
772b8bf04e1SBen Skeggs 				gr_def(ctx, offset + 0x6c, 0x0000000f);
773b8bf04e1SBen Skeggs 			} else if (device->chipset < 0xa0) {
774b8bf04e1SBen Skeggs 				cp_ctx(ctx, offset + 0x50, 1);
775b8bf04e1SBen Skeggs 				cp_ctx(ctx, offset + 0x70, 1);
776b8bf04e1SBen Skeggs 			} else {
777b8bf04e1SBen Skeggs 				cp_ctx(ctx, offset + 0x50, 1);
778b8bf04e1SBen Skeggs 				cp_ctx(ctx, offset + 0x60, 5);
779b8bf04e1SBen Skeggs 			}
780b8bf04e1SBen Skeggs 		}
781b8bf04e1SBen Skeggs 	}
782b8bf04e1SBen Skeggs }
783b8bf04e1SBen Skeggs 
784b8bf04e1SBen Skeggs static void
dd_emit(struct nvkm_grctx * ctx,int num,u32 val)785e3c71eb2SBen Skeggs dd_emit(struct nvkm_grctx *ctx, int num, u32 val) {
786b8bf04e1SBen Skeggs 	int i;
787142ea05fSBen Skeggs 	if (val && ctx->mode == NVKM_GRCTX_VALS) {
788b8bf04e1SBen Skeggs 		for (i = 0; i < num; i++)
789142ea05fSBen Skeggs 			nvkm_wo32(ctx->data, 4 * (ctx->ctxvals_pos + i), val);
790142ea05fSBen Skeggs 	}
791b8bf04e1SBen Skeggs 	ctx->ctxvals_pos += num;
792b8bf04e1SBen Skeggs }
793b8bf04e1SBen Skeggs 
794b8bf04e1SBen Skeggs static void
nv50_gr_construct_mmio_ddata(struct nvkm_grctx * ctx)795e3c71eb2SBen Skeggs nv50_gr_construct_mmio_ddata(struct nvkm_grctx *ctx)
796b8bf04e1SBen Skeggs {
797e3c71eb2SBen Skeggs 	struct nvkm_device *device = ctx->device;
798b8bf04e1SBen Skeggs 	int base, num;
799b8bf04e1SBen Skeggs 	base = ctx->ctxvals_pos;
800b8bf04e1SBen Skeggs 
801b8bf04e1SBen Skeggs 	/* tesla state */
802b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);	/* 00000001 UNK0F90 */
803b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);	/* 00000001 UNK135C */
804b8bf04e1SBen Skeggs 
805b8bf04e1SBen Skeggs 	/* SRC_TIC state */
806b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);	/* 00000007 SRC_TILE_MODE_Z */
807b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 2);	/* 00000007 SRC_TILE_MODE_Y */
808b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);	/* 00000001 SRC_LINEAR #1 */
809b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);	/* 000000ff SRC_ADDRESS_HIGH */
810b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);	/* 00000001 SRC_SRGB */
811b8bf04e1SBen Skeggs 	if (device->chipset >= 0x94)
812b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);	/* 00000003 eng2d UNK0258 */
813b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);	/* 00000fff SRC_DEPTH */
814b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0x100);	/* 0000ffff SRC_HEIGHT */
815b8bf04e1SBen Skeggs 
816b8bf04e1SBen Skeggs 	/* turing state */
817b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 0000000f TEXTURES_LOG2 */
818b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 0000000f SAMPLERS_LOG2 */
819b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 000000ff CB_DEF_ADDRESS_HIGH */
820b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* ffffffff CB_DEF_ADDRESS_LOW */
821b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* ffffffff SHARED_SIZE */
822b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 2);		/* ffffffff REG_MODE */
823b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* 0000ffff BLOCK_ALLOC_THREADS */
824b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* 00000001 LANES32 */
825b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 000000ff UNK370 */
826b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 000000ff USER_PARAM_UNK */
827b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 000000ff USER_PARAM_COUNT */
828b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* 000000ff UNK384 bits 8-15 */
829b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0x3fffff);	/* 003fffff TIC_LIMIT */
830b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0x1fff);	/* 000fffff TSC_LIMIT */
831b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 0000ffff CB_ADDR_INDEX */
832b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* 000007ff BLOCKDIM_X */
833b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* 000007ff BLOCKDIM_XMY */
834b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 00000001 BLOCKDIM_XMY_OVERFLOW */
835b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* 0003ffff BLOCKDIM_XMYMZ */
836b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* 000007ff BLOCKDIM_Y */
837b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* 0000007f BLOCKDIM_Z */
838b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 4);		/* 000000ff CP_REG_ALLOC_TEMP */
839b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* 00000001 BLOCKDIM_DIRTY */
840b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset))
841b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);	/* 00000003 UNK03E8 */
842b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* 0000007f BLOCK_ALLOC_HALFWARPS */
843b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* 00000007 LOCAL_WARPS_NO_CLAMP */
844b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 7);		/* 00000007 LOCAL_WARPS_LOG_ALLOC */
845b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* 00000007 STACK_WARPS_NO_CLAMP */
846b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 7);		/* 00000007 STACK_WARPS_LOG_ALLOC */
847b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* 00001fff BLOCK_ALLOC_REGSLOTS_PACKED */
848b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* 00001fff BLOCK_ALLOC_REGSLOTS_STRIDED */
849b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* 000007ff BLOCK_ALLOC_THREADS */
850b8bf04e1SBen Skeggs 
851b8bf04e1SBen Skeggs 	/* compat 2d state */
852b8bf04e1SBen Skeggs 	if (device->chipset == 0x50) {
853b8bf04e1SBen Skeggs 		dd_emit(ctx, 4, 0);		/* 0000ffff clip X, Y, W, H */
854b8bf04e1SBen Skeggs 
855b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 1);		/* ffffffff chroma COLOR_FORMAT */
856b8bf04e1SBen Skeggs 
857b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 1);		/* ffffffff pattern COLOR_FORMAT */
858b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);		/* ffffffff pattern SHAPE */
859b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 1);		/* ffffffff pattern PATTERN_SELECT */
860b8bf04e1SBen Skeggs 
861b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0xa);		/* ffffffff surf2d SRC_FORMAT */
862b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);		/* ffffffff surf2d DMA_SRC */
863b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);		/* 000000ff surf2d SRC_ADDRESS_HIGH */
864b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);		/* ffffffff surf2d SRC_ADDRESS_LOW */
865b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0x40);		/* 0000ffff surf2d SRC_PITCH */
866b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);		/* 0000000f surf2d SRC_TILE_MODE_Z */
867b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 2);		/* 0000000f surf2d SRC_TILE_MODE_Y */
868b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0x100);		/* ffffffff surf2d SRC_HEIGHT */
869b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 1);		/* 00000001 surf2d SRC_LINEAR */
870b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0x100);		/* ffffffff surf2d SRC_WIDTH */
871b8bf04e1SBen Skeggs 
872b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);		/* 0000ffff gdirect CLIP_B_X */
873b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);		/* 0000ffff gdirect CLIP_B_Y */
874b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);		/* 0000ffff gdirect CLIP_C_X */
875b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);		/* 0000ffff gdirect CLIP_C_Y */
876b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);		/* 0000ffff gdirect CLIP_D_X */
877b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);		/* 0000ffff gdirect CLIP_D_Y */
878b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 1);		/* ffffffff gdirect COLOR_FORMAT */
879b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);		/* ffffffff gdirect OPERATION */
880b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);		/* 0000ffff gdirect POINT_X */
881b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);		/* 0000ffff gdirect POINT_Y */
882b8bf04e1SBen Skeggs 
883b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);		/* 0000ffff blit SRC_Y */
884b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);		/* ffffffff blit OPERATION */
885b8bf04e1SBen Skeggs 
886b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);		/* ffffffff ifc OPERATION */
887b8bf04e1SBen Skeggs 
888b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);		/* ffffffff iifc INDEX_FORMAT */
889b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);		/* ffffffff iifc LUT_OFFSET */
890b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 4);		/* ffffffff iifc COLOR_FORMAT */
891b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);		/* ffffffff iifc OPERATION */
892b8bf04e1SBen Skeggs 	}
893b8bf04e1SBen Skeggs 
894b8bf04e1SBen Skeggs 	/* m2mf state */
895b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* ffffffff m2mf LINE_COUNT */
896b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* ffffffff m2mf LINE_LENGTH_IN */
897b8bf04e1SBen Skeggs 	dd_emit(ctx, 2, 0);		/* ffffffff m2mf OFFSET_IN, OFFSET_OUT */
898b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* ffffffff m2mf TILING_DEPTH_OUT */
899b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0x100);		/* ffffffff m2mf TILING_HEIGHT_OUT */
900b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* ffffffff m2mf TILING_POSITION_OUT_Z */
901b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* 00000001 m2mf LINEAR_OUT */
902b8bf04e1SBen Skeggs 	dd_emit(ctx, 2, 0);		/* 0000ffff m2mf TILING_POSITION_OUT_X, Y */
903b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0x100);		/* ffffffff m2mf TILING_PITCH_OUT */
904b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* ffffffff m2mf TILING_DEPTH_IN */
905b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0x100);		/* ffffffff m2mf TILING_HEIGHT_IN */
906b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* ffffffff m2mf TILING_POSITION_IN_Z */
907b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* 00000001 m2mf LINEAR_IN */
908b8bf04e1SBen Skeggs 	dd_emit(ctx, 2, 0);		/* 0000ffff m2mf TILING_POSITION_IN_X, Y */
909b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0x100);		/* ffffffff m2mf TILING_PITCH_IN */
910b8bf04e1SBen Skeggs 
911b8bf04e1SBen Skeggs 	/* more compat 2d state */
912b8bf04e1SBen Skeggs 	if (device->chipset == 0x50) {
913b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 1);		/* ffffffff line COLOR_FORMAT */
914b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);		/* ffffffff line OPERATION */
915b8bf04e1SBen Skeggs 
916b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 1);		/* ffffffff triangle COLOR_FORMAT */
917b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);		/* ffffffff triangle OPERATION */
918b8bf04e1SBen Skeggs 
919b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);		/* 0000000f sifm TILE_MODE_Z */
920b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 2);		/* 0000000f sifm TILE_MODE_Y */
921b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);		/* 000000ff sifm FORMAT_FILTER */
922b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 1);		/* 000000ff sifm FORMAT_ORIGIN */
923b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);		/* 0000ffff sifm SRC_PITCH */
924b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 1);		/* 00000001 sifm SRC_LINEAR */
925b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);		/* 000000ff sifm SRC_OFFSET_HIGH */
926b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);		/* ffffffff sifm SRC_OFFSET */
927b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);		/* 0000ffff sifm SRC_HEIGHT */
928b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);		/* 0000ffff sifm SRC_WIDTH */
929b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 3);		/* ffffffff sifm COLOR_FORMAT */
930b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);		/* ffffffff sifm OPERATION */
931b8bf04e1SBen Skeggs 
932b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);		/* ffffffff sifc OPERATION */
933b8bf04e1SBen Skeggs 	}
934b8bf04e1SBen Skeggs 
935b8bf04e1SBen Skeggs 	/* tesla state */
936b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 0000000f GP_TEXTURES_LOG2 */
937b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 0000000f GP_SAMPLERS_LOG2 */
938b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 000000ff */
939b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* ffffffff */
940b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 4);		/* 000000ff UNK12B0_0 */
941b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0x70);		/* 000000ff UNK12B0_1 */
942b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0x80);		/* 000000ff UNK12B0_3 */
943b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 000000ff UNK12B0_2 */
944b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 0000000f FP_TEXTURES_LOG2 */
945b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 0000000f FP_SAMPLERS_LOG2 */
946b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset)) {
947b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);	/* ffffffff */
948b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);	/* 0000007f MULTISAMPLE_SAMPLES_LOG2 */
949b8bf04e1SBen Skeggs 	} else {
950b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);	/* 0000000f MULTISAMPLE_SAMPLES_LOG2 */
951b8bf04e1SBen Skeggs 	}
952b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0xc);		/* 000000ff SEMANTIC_COLOR.BFC0_ID */
953b8bf04e1SBen Skeggs 	if (device->chipset != 0x50)
954b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);	/* 00000001 SEMANTIC_COLOR.CLMP_EN */
955b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 8);		/* 000000ff SEMANTIC_COLOR.COLR_NR */
956b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0x14);		/* 000000ff SEMANTIC_COLOR.FFC0_ID */
957b8bf04e1SBen Skeggs 	if (device->chipset == 0x50) {
958b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);	/* 000000ff SEMANTIC_LAYER */
959b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);	/* 00000001 */
960b8bf04e1SBen Skeggs 	} else {
961b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);	/* 00000001 SEMANTIC_PTSZ.ENABLE */
962b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0x29);	/* 000000ff SEMANTIC_PTSZ.PTSZ_ID */
963b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0x27);	/* 000000ff SEMANTIC_PRIM */
964b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0x26);	/* 000000ff SEMANTIC_LAYER */
965b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 8);	/* 0000000f SMENATIC_CLIP.CLIP_HIGH */
966b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 4);	/* 000000ff SEMANTIC_CLIP.CLIP_LO */
967b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0x27);	/* 000000ff UNK0FD4 */
968b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);	/* 00000001 UNK1900 */
969b8bf04e1SBen Skeggs 	}
970b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 00000007 RT_CONTROL_MAP0 */
971b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* 00000007 RT_CONTROL_MAP1 */
972b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 2);		/* 00000007 RT_CONTROL_MAP2 */
973b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 3);		/* 00000007 RT_CONTROL_MAP3 */
974b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 4);		/* 00000007 RT_CONTROL_MAP4 */
975b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 5);		/* 00000007 RT_CONTROL_MAP5 */
976b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 6);		/* 00000007 RT_CONTROL_MAP6 */
977b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 7);		/* 00000007 RT_CONTROL_MAP7 */
978b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* 0000000f RT_CONTROL_COUNT */
979b8bf04e1SBen Skeggs 	dd_emit(ctx, 8, 0);		/* 00000001 RT_HORIZ_UNK */
980b8bf04e1SBen Skeggs 	dd_emit(ctx, 8, 0);		/* ffffffff RT_ADDRESS_LOW */
981b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0xcf);		/* 000000ff RT_FORMAT */
982b8bf04e1SBen Skeggs 	dd_emit(ctx, 7, 0);		/* 000000ff RT_FORMAT */
983b8bf04e1SBen Skeggs 	if (device->chipset != 0x50)
984b8bf04e1SBen Skeggs 		dd_emit(ctx, 3, 0);	/* 1, 1, 1 */
985b8bf04e1SBen Skeggs 	else
986b8bf04e1SBen Skeggs 		dd_emit(ctx, 2, 0);	/* 1, 1 */
987b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* ffffffff GP_ENABLE */
988b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0x80);		/* 0000ffff GP_VERTEX_OUTPUT_COUNT*/
989b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 4);		/* 000000ff GP_REG_ALLOC_RESULT */
990b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 4);		/* 000000ff GP_RESULT_MAP_SIZE */
991b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset)) {
992b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 3);	/* 00000003 */
993b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);	/* 00000001 UNK1418. Alone. */
994b8bf04e1SBen Skeggs 	}
995b8bf04e1SBen Skeggs 	if (device->chipset != 0x50)
996b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 3);	/* 00000003 UNK15AC */
997b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* ffffffff RASTERIZE_ENABLE */
998b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 00000001 FP_CONTROL.EXPORTS_Z */
999b8bf04e1SBen Skeggs 	if (device->chipset != 0x50)
1000b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);	/* 00000001 FP_CONTROL.MULTIPLE_RESULTS */
1001b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0x12);		/* 000000ff FP_INTERPOLANT_CTRL.COUNT */
1002b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0x10);		/* 000000ff FP_INTERPOLANT_CTRL.COUNT_NONFLAT */
1003b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0xc);		/* 000000ff FP_INTERPOLANT_CTRL.OFFSET */
1004b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* 00000001 FP_INTERPOLANT_CTRL.UMASK.W */
1005b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 00000001 FP_INTERPOLANT_CTRL.UMASK.X */
1006b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 00000001 FP_INTERPOLANT_CTRL.UMASK.Y */
1007b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 00000001 FP_INTERPOLANT_CTRL.UMASK.Z */
1008b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 4);		/* 000000ff FP_RESULT_COUNT */
1009b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 2);		/* ffffffff REG_MODE */
1010b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 4);		/* 000000ff FP_REG_ALLOC_TEMP */
1011b8bf04e1SBen Skeggs 	if (device->chipset >= 0xa0)
1012b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);	/* ffffffff */
1013b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 00000001 GP_BUILTIN_RESULT_EN.LAYER_IDX */
1014b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* ffffffff STRMOUT_ENABLE */
1015b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0x3fffff);	/* 003fffff TIC_LIMIT */
1016b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0x1fff);	/* 000fffff TSC_LIMIT */
1017b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 00000001 VERTEX_TWO_SIDE_ENABLE*/
1018b8bf04e1SBen Skeggs 	if (device->chipset != 0x50)
1019b8bf04e1SBen Skeggs 		dd_emit(ctx, 8, 0);	/* 00000001 */
1020b8bf04e1SBen Skeggs 	if (device->chipset >= 0xa0) {
1021b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 1);	/* 00000007 VTX_ATTR_DEFINE.COMP */
1022b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 1);	/* 00000007 VTX_ATTR_DEFINE.SIZE */
1023b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 2);	/* 00000007 VTX_ATTR_DEFINE.TYPE */
1024b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);	/* 000000ff VTX_ATTR_DEFINE.ATTR */
1025b8bf04e1SBen Skeggs 	}
1026b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 4);		/* 0000007f VP_RESULT_MAP_SIZE */
1027b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0x14);		/* 0000001f ZETA_FORMAT */
1028b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* 00000001 ZETA_ENABLE */
1029b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 0000000f VP_TEXTURES_LOG2 */
1030b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 0000000f VP_SAMPLERS_LOG2 */
1031b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset))
1032b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);	/* 00000001 */
1033b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 2);		/* 00000003 POLYGON_MODE_BACK */
1034b8bf04e1SBen Skeggs 	if (device->chipset >= 0xa0)
1035b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);	/* 00000003 VTX_ATTR_DEFINE.SIZE - 1 */
1036b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 0000ffff CB_ADDR_INDEX */
1037b8bf04e1SBen Skeggs 	if (device->chipset >= 0xa0)
1038b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);	/* 00000003 */
1039b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 00000001 CULL_FACE_ENABLE */
1040b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* 00000003 CULL_FACE */
1041b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 00000001 FRONT_FACE */
1042b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 2);		/* 00000003 POLYGON_MODE_FRONT */
1043b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0x1000);	/* 00007fff UNK141C */
1044b8bf04e1SBen Skeggs 	if (device->chipset != 0x50) {
1045b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0xe00);		/* 7fff */
1046b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0x1000);	/* 7fff */
1047b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0x1e00);	/* 7fff */
1048b8bf04e1SBen Skeggs 	}
1049b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 00000001 BEGIN_END_ACTIVE */
1050b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* 00000001 POLYGON_MODE_??? */
1051b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* 000000ff GP_REG_ALLOC_TEMP / 4 rounded up */
1052b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* 000000ff FP_REG_ALLOC_TEMP... without /4? */
1053b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* 000000ff VP_REG_ALLOC_TEMP / 4 rounded up */
1054b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* 00000001 */
1055b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 00000001 */
1056b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 00000001 VTX_ATTR_MASK_UNK0 nonempty */
1057b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 00000001 VTX_ATTR_MASK_UNK1 nonempty */
1058b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0x200);		/* 0003ffff GP_VERTEX_OUTPUT_COUNT*GP_REG_ALLOC_RESULT */
1059b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset))
1060b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0x200);
1061b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 00000001 */
1062b8bf04e1SBen Skeggs 	if (device->chipset < 0xa0) {
1063b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 1);	/* 00000001 */
1064b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0x70);	/* 000000ff */
1065b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0x80);	/* 000000ff */
1066b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);	/* 000000ff */
1067b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);	/* 00000001 */
1068b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 1);	/* 00000001 */
1069b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0x70);	/* 000000ff */
1070b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0x80);	/* 000000ff */
1071b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);	/* 000000ff */
1072b8bf04e1SBen Skeggs 	} else {
1073b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 1);	/* 00000001 */
1074b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0xf0);	/* 000000ff */
1075b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0xff);	/* 000000ff */
1076b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);	/* 000000ff */
1077b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);	/* 00000001 */
1078b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 1);	/* 00000001 */
1079b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0xf0);	/* 000000ff */
1080b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0xff);	/* 000000ff */
1081b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 0);	/* 000000ff */
1082b8bf04e1SBen Skeggs 		dd_emit(ctx, 1, 9);	/* 0000003f UNK114C.COMP,SIZE */
1083b8bf04e1SBen Skeggs 	}
1084b8bf04e1SBen Skeggs 
1085b8bf04e1SBen Skeggs 	/* eng2d state */
1086b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 00000001 eng2d COLOR_KEY_ENABLE */
1087b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 00000007 eng2d COLOR_KEY_FORMAT */
1088b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* ffffffff eng2d DST_DEPTH */
1089b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0xcf);		/* 000000ff eng2d DST_FORMAT */
1090b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* ffffffff eng2d DST_LAYER */
1091b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* 00000001 eng2d DST_LINEAR */
1092b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 00000007 eng2d PATTERN_COLOR_FORMAT */
1093b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 00000007 eng2d OPERATION */
1094b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 00000003 eng2d PATTERN_SELECT */
1095b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0xcf);		/* 000000ff eng2d SIFC_FORMAT */
1096b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 00000001 eng2d SIFC_BITMAP_ENABLE */
1097b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 2);		/* 00000003 eng2d SIFC_BITMAP_UNK808 */
1098b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* ffffffff eng2d BLIT_DU_DX_FRACT */
1099b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* ffffffff eng2d BLIT_DU_DX_INT */
1100b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* ffffffff eng2d BLIT_DV_DY_FRACT */
1101b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* ffffffff eng2d BLIT_DV_DY_INT */
1102b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0);		/* 00000001 eng2d BLIT_CONTROL_FILTER */
1103b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0xcf);		/* 000000ff eng2d DRAW_COLOR_FORMAT */
1104b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 0xcf);		/* 000000ff eng2d SRC_FORMAT */
1105b8bf04e1SBen Skeggs 	dd_emit(ctx, 1, 1);		/* 00000001 eng2d SRC_LINEAR #2 */
1106b8bf04e1SBen Skeggs 
1107b8bf04e1SBen Skeggs 	num = ctx->ctxvals_pos - base;
1108b8bf04e1SBen Skeggs 	ctx->ctxvals_pos = base;
1109b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset))
1110b8bf04e1SBen Skeggs 		cp_ctx(ctx, 0x404800, num);
1111b8bf04e1SBen Skeggs 	else
1112b8bf04e1SBen Skeggs 		cp_ctx(ctx, 0x405400, num);
1113b8bf04e1SBen Skeggs }
1114b8bf04e1SBen Skeggs 
1115b8bf04e1SBen Skeggs /*
1116b8bf04e1SBen Skeggs  * xfer areas. These are a pain.
1117b8bf04e1SBen Skeggs  *
1118b8bf04e1SBen Skeggs  * There are 2 xfer areas: the first one is big and contains all sorts of
1119b8bf04e1SBen Skeggs  * stuff, the second is small and contains some per-TP context.
1120b8bf04e1SBen Skeggs  *
1121b8bf04e1SBen Skeggs  * Each area is split into 8 "strands". The areas, when saved to grctx,
1122b8bf04e1SBen Skeggs  * are made of 8-word blocks. Each block contains a single word from
1123b8bf04e1SBen Skeggs  * each strand. The strands are independent of each other, their
1124b8bf04e1SBen Skeggs  * addresses are unrelated to each other, and data in them is closely
1125b8bf04e1SBen Skeggs  * packed together. The strand layout varies a bit between cards: here
1126b8bf04e1SBen Skeggs  * and there, a single word is thrown out in the middle and the whole
1127b8bf04e1SBen Skeggs  * strand is offset by a bit from corresponding one on another chipset.
1128b8bf04e1SBen Skeggs  * For this reason, addresses of stuff in strands are almost useless.
1129b8bf04e1SBen Skeggs  * Knowing sequence of stuff and size of gaps between them is much more
1130b8bf04e1SBen Skeggs  * useful, and that's how we build the strands in our generator.
1131b8bf04e1SBen Skeggs  *
1132b8bf04e1SBen Skeggs  * NVA0 takes this mess to a whole new level by cutting the old strands
1133b8bf04e1SBen Skeggs  * into a few dozen pieces [known as genes], rearranging them randomly,
1134b8bf04e1SBen Skeggs  * and putting them back together to make new strands. Hopefully these
1135b8bf04e1SBen Skeggs  * genes correspond more or less directly to the same PGRAPH subunits
1136b8bf04e1SBen Skeggs  * as in 400040 register.
1137b8bf04e1SBen Skeggs  *
1138b8bf04e1SBen Skeggs  * The most common value in default context is 0, and when the genes
1139b8bf04e1SBen Skeggs  * are separated by 0's, gene bounduaries are quite speculative...
1140b8bf04e1SBen Skeggs  * some of them can be clearly deduced, others can be guessed, and yet
1141b8bf04e1SBen Skeggs  * others won't be resolved without figuring out the real meaning of
1142b8bf04e1SBen Skeggs  * given ctxval. For the same reason, ending point of each strand
1143b8bf04e1SBen Skeggs  * is unknown. Except for strand 0, which is the longest strand and
1144b8bf04e1SBen Skeggs  * its end corresponds to end of the whole xfer.
1145b8bf04e1SBen Skeggs  *
1146b8bf04e1SBen Skeggs  * An unsolved mystery is the seek instruction: it takes an argument
1147b8bf04e1SBen Skeggs  * in bits 8-18, and that argument is clearly the place in strands to
1148b8bf04e1SBen Skeggs  * seek to... but the offsets don't seem to correspond to offsets as
1149b8bf04e1SBen Skeggs  * seen in grctx. Perhaps there's another, real, not randomly-changing
1150b8bf04e1SBen Skeggs  * addressing in strands, and the xfer insn just happens to skip over
1151b8bf04e1SBen Skeggs  * the unused bits? NV10-NV30 PIPE comes to mind...
1152b8bf04e1SBen Skeggs  *
1153b8bf04e1SBen Skeggs  * As far as I know, there's no way to access the xfer areas directly
1154b8bf04e1SBen Skeggs  * without the help of ctxprog.
1155b8bf04e1SBen Skeggs  */
1156b8bf04e1SBen Skeggs 
1157b8bf04e1SBen Skeggs static void
xf_emit(struct nvkm_grctx * ctx,int num,u32 val)1158e3c71eb2SBen Skeggs xf_emit(struct nvkm_grctx *ctx, int num, u32 val) {
1159b8bf04e1SBen Skeggs 	int i;
1160142ea05fSBen Skeggs 	if (val && ctx->mode == NVKM_GRCTX_VALS) {
1161b8bf04e1SBen Skeggs 		for (i = 0; i < num; i++)
1162142ea05fSBen Skeggs 			nvkm_wo32(ctx->data, 4 * (ctx->ctxvals_pos + (i << 3)), val);
1163142ea05fSBen Skeggs 	}
1164b8bf04e1SBen Skeggs 	ctx->ctxvals_pos += num << 3;
1165b8bf04e1SBen Skeggs }
1166b8bf04e1SBen Skeggs 
1167b8bf04e1SBen Skeggs /* Gene declarations... */
1168b8bf04e1SBen Skeggs 
1169e3c71eb2SBen Skeggs static void nv50_gr_construct_gene_dispatch(struct nvkm_grctx *ctx);
1170e3c71eb2SBen Skeggs static void nv50_gr_construct_gene_m2mf(struct nvkm_grctx *ctx);
1171e3c71eb2SBen Skeggs static void nv50_gr_construct_gene_ccache(struct nvkm_grctx *ctx);
1172e3c71eb2SBen Skeggs static void nv50_gr_construct_gene_unk10xx(struct nvkm_grctx *ctx);
1173e3c71eb2SBen Skeggs static void nv50_gr_construct_gene_unk14xx(struct nvkm_grctx *ctx);
1174e3c71eb2SBen Skeggs static void nv50_gr_construct_gene_zcull(struct nvkm_grctx *ctx);
1175e3c71eb2SBen Skeggs static void nv50_gr_construct_gene_clipid(struct nvkm_grctx *ctx);
1176e3c71eb2SBen Skeggs static void nv50_gr_construct_gene_unk24xx(struct nvkm_grctx *ctx);
1177e3c71eb2SBen Skeggs static void nv50_gr_construct_gene_vfetch(struct nvkm_grctx *ctx);
1178e3c71eb2SBen Skeggs static void nv50_gr_construct_gene_eng2d(struct nvkm_grctx *ctx);
1179e3c71eb2SBen Skeggs static void nv50_gr_construct_gene_csched(struct nvkm_grctx *ctx);
1180e3c71eb2SBen Skeggs static void nv50_gr_construct_gene_unk1cxx(struct nvkm_grctx *ctx);
1181e3c71eb2SBen Skeggs static void nv50_gr_construct_gene_strmout(struct nvkm_grctx *ctx);
1182e3c71eb2SBen Skeggs static void nv50_gr_construct_gene_unk34xx(struct nvkm_grctx *ctx);
1183e3c71eb2SBen Skeggs static void nv50_gr_construct_gene_ropm1(struct nvkm_grctx *ctx);
1184e3c71eb2SBen Skeggs static void nv50_gr_construct_gene_ropm2(struct nvkm_grctx *ctx);
1185e3c71eb2SBen Skeggs static void nv50_gr_construct_gene_ropc(struct nvkm_grctx *ctx);
1186e3c71eb2SBen Skeggs static void nv50_gr_construct_xfer_tp(struct nvkm_grctx *ctx);
1187b8bf04e1SBen Skeggs 
1188b8bf04e1SBen Skeggs static void
nv50_gr_construct_xfer1(struct nvkm_grctx * ctx)1189e3c71eb2SBen Skeggs nv50_gr_construct_xfer1(struct nvkm_grctx *ctx)
1190b8bf04e1SBen Skeggs {
1191e3c71eb2SBen Skeggs 	struct nvkm_device *device = ctx->device;
1192b8bf04e1SBen Skeggs 	int i;
1193b8bf04e1SBen Skeggs 	int offset;
1194b8bf04e1SBen Skeggs 	int size = 0;
1195276836d4SBen Skeggs 	u32 units = nvkm_rd32(device, 0x1540);
1196b8bf04e1SBen Skeggs 
1197b8bf04e1SBen Skeggs 	offset = (ctx->ctxvals_pos+0x3f)&~0x3f;
1198b8bf04e1SBen Skeggs 	ctx->ctxvals_base = offset;
1199b8bf04e1SBen Skeggs 
1200b8bf04e1SBen Skeggs 	if (device->chipset < 0xa0) {
1201b8bf04e1SBen Skeggs 		/* Strand 0 */
1202b8bf04e1SBen Skeggs 		ctx->ctxvals_pos = offset;
1203b8bf04e1SBen Skeggs 		nv50_gr_construct_gene_dispatch(ctx);
1204b8bf04e1SBen Skeggs 		nv50_gr_construct_gene_m2mf(ctx);
1205b8bf04e1SBen Skeggs 		nv50_gr_construct_gene_unk24xx(ctx);
1206b8bf04e1SBen Skeggs 		nv50_gr_construct_gene_clipid(ctx);
1207b8bf04e1SBen Skeggs 		nv50_gr_construct_gene_zcull(ctx);
1208b8bf04e1SBen Skeggs 		if ((ctx->ctxvals_pos-offset)/8 > size)
1209b8bf04e1SBen Skeggs 			size = (ctx->ctxvals_pos-offset)/8;
1210b8bf04e1SBen Skeggs 
1211b8bf04e1SBen Skeggs 		/* Strand 1 */
1212b8bf04e1SBen Skeggs 		ctx->ctxvals_pos = offset + 0x1;
1213b8bf04e1SBen Skeggs 		nv50_gr_construct_gene_vfetch(ctx);
1214b8bf04e1SBen Skeggs 		nv50_gr_construct_gene_eng2d(ctx);
1215b8bf04e1SBen Skeggs 		nv50_gr_construct_gene_csched(ctx);
1216b8bf04e1SBen Skeggs 		nv50_gr_construct_gene_ropm1(ctx);
1217b8bf04e1SBen Skeggs 		nv50_gr_construct_gene_ropm2(ctx);
1218b8bf04e1SBen Skeggs 		if ((ctx->ctxvals_pos-offset)/8 > size)
1219b8bf04e1SBen Skeggs 			size = (ctx->ctxvals_pos-offset)/8;
1220b8bf04e1SBen Skeggs 
1221b8bf04e1SBen Skeggs 		/* Strand 2 */
1222b8bf04e1SBen Skeggs 		ctx->ctxvals_pos = offset + 0x2;
1223b8bf04e1SBen Skeggs 		nv50_gr_construct_gene_ccache(ctx);
1224b8bf04e1SBen Skeggs 		nv50_gr_construct_gene_unk1cxx(ctx);
1225b8bf04e1SBen Skeggs 		nv50_gr_construct_gene_strmout(ctx);
1226b8bf04e1SBen Skeggs 		nv50_gr_construct_gene_unk14xx(ctx);
1227b8bf04e1SBen Skeggs 		nv50_gr_construct_gene_unk10xx(ctx);
1228b8bf04e1SBen Skeggs 		nv50_gr_construct_gene_unk34xx(ctx);
1229b8bf04e1SBen Skeggs 		if ((ctx->ctxvals_pos-offset)/8 > size)
1230b8bf04e1SBen Skeggs 			size = (ctx->ctxvals_pos-offset)/8;
1231b8bf04e1SBen Skeggs 
1232b8bf04e1SBen Skeggs 		/* Strand 3: per-ROP group state */
1233b8bf04e1SBen Skeggs 		ctx->ctxvals_pos = offset + 3;
1234b8bf04e1SBen Skeggs 		for (i = 0; i < 6; i++)
1235b8bf04e1SBen Skeggs 			if (units & (1 << (i + 16)))
1236b8bf04e1SBen Skeggs 				nv50_gr_construct_gene_ropc(ctx);
1237b8bf04e1SBen Skeggs 		if ((ctx->ctxvals_pos-offset)/8 > size)
1238b8bf04e1SBen Skeggs 			size = (ctx->ctxvals_pos-offset)/8;
1239b8bf04e1SBen Skeggs 
1240b8bf04e1SBen Skeggs 		/* Strands 4-7: per-TP state */
1241b8bf04e1SBen Skeggs 		for (i = 0; i < 4; i++) {
1242b8bf04e1SBen Skeggs 			ctx->ctxvals_pos = offset + 4 + i;
1243b8bf04e1SBen Skeggs 			if (units & (1 << (2 * i)))
1244b8bf04e1SBen Skeggs 				nv50_gr_construct_xfer_tp(ctx);
1245b8bf04e1SBen Skeggs 			if (units & (1 << (2 * i + 1)))
1246b8bf04e1SBen Skeggs 				nv50_gr_construct_xfer_tp(ctx);
1247b8bf04e1SBen Skeggs 			if ((ctx->ctxvals_pos-offset)/8 > size)
1248b8bf04e1SBen Skeggs 				size = (ctx->ctxvals_pos-offset)/8;
1249b8bf04e1SBen Skeggs 		}
1250b8bf04e1SBen Skeggs 	} else {
1251b8bf04e1SBen Skeggs 		/* Strand 0 */
1252b8bf04e1SBen Skeggs 		ctx->ctxvals_pos = offset;
1253b8bf04e1SBen Skeggs 		nv50_gr_construct_gene_dispatch(ctx);
1254b8bf04e1SBen Skeggs 		nv50_gr_construct_gene_m2mf(ctx);
1255b8bf04e1SBen Skeggs 		nv50_gr_construct_gene_unk34xx(ctx);
1256b8bf04e1SBen Skeggs 		nv50_gr_construct_gene_csched(ctx);
1257b8bf04e1SBen Skeggs 		nv50_gr_construct_gene_unk1cxx(ctx);
1258b8bf04e1SBen Skeggs 		nv50_gr_construct_gene_strmout(ctx);
1259b8bf04e1SBen Skeggs 		if ((ctx->ctxvals_pos-offset)/8 > size)
1260b8bf04e1SBen Skeggs 			size = (ctx->ctxvals_pos-offset)/8;
1261b8bf04e1SBen Skeggs 
1262b8bf04e1SBen Skeggs 		/* Strand 1 */
1263b8bf04e1SBen Skeggs 		ctx->ctxvals_pos = offset + 1;
1264b8bf04e1SBen Skeggs 		nv50_gr_construct_gene_unk10xx(ctx);
1265b8bf04e1SBen Skeggs 		if ((ctx->ctxvals_pos-offset)/8 > size)
1266b8bf04e1SBen Skeggs 			size = (ctx->ctxvals_pos-offset)/8;
1267b8bf04e1SBen Skeggs 
1268b8bf04e1SBen Skeggs 		/* Strand 2 */
1269b8bf04e1SBen Skeggs 		ctx->ctxvals_pos = offset + 2;
1270b8bf04e1SBen Skeggs 		if (device->chipset == 0xa0)
1271b8bf04e1SBen Skeggs 			nv50_gr_construct_gene_unk14xx(ctx);
1272b8bf04e1SBen Skeggs 		nv50_gr_construct_gene_unk24xx(ctx);
1273b8bf04e1SBen Skeggs 		if ((ctx->ctxvals_pos-offset)/8 > size)
1274b8bf04e1SBen Skeggs 			size = (ctx->ctxvals_pos-offset)/8;
1275b8bf04e1SBen Skeggs 
1276b8bf04e1SBen Skeggs 		/* Strand 3 */
1277b8bf04e1SBen Skeggs 		ctx->ctxvals_pos = offset + 3;
1278b8bf04e1SBen Skeggs 		nv50_gr_construct_gene_vfetch(ctx);
1279b8bf04e1SBen Skeggs 		if ((ctx->ctxvals_pos-offset)/8 > size)
1280b8bf04e1SBen Skeggs 			size = (ctx->ctxvals_pos-offset)/8;
1281b8bf04e1SBen Skeggs 
1282b8bf04e1SBen Skeggs 		/* Strand 4 */
1283b8bf04e1SBen Skeggs 		ctx->ctxvals_pos = offset + 4;
1284b8bf04e1SBen Skeggs 		nv50_gr_construct_gene_ccache(ctx);
1285b8bf04e1SBen Skeggs 		if ((ctx->ctxvals_pos-offset)/8 > size)
1286b8bf04e1SBen Skeggs 			size = (ctx->ctxvals_pos-offset)/8;
1287b8bf04e1SBen Skeggs 
1288b8bf04e1SBen Skeggs 		/* Strand 5 */
1289b8bf04e1SBen Skeggs 		ctx->ctxvals_pos = offset + 5;
1290b8bf04e1SBen Skeggs 		nv50_gr_construct_gene_ropm2(ctx);
1291b8bf04e1SBen Skeggs 		nv50_gr_construct_gene_ropm1(ctx);
1292b8bf04e1SBen Skeggs 		/* per-ROP context */
1293b8bf04e1SBen Skeggs 		for (i = 0; i < 8; i++)
1294b8bf04e1SBen Skeggs 			if (units & (1<<(i+16)))
1295b8bf04e1SBen Skeggs 				nv50_gr_construct_gene_ropc(ctx);
1296b8bf04e1SBen Skeggs 		if ((ctx->ctxvals_pos-offset)/8 > size)
1297b8bf04e1SBen Skeggs 			size = (ctx->ctxvals_pos-offset)/8;
1298b8bf04e1SBen Skeggs 
1299b8bf04e1SBen Skeggs 		/* Strand 6 */
1300b8bf04e1SBen Skeggs 		ctx->ctxvals_pos = offset + 6;
1301b8bf04e1SBen Skeggs 		nv50_gr_construct_gene_zcull(ctx);
1302b8bf04e1SBen Skeggs 		nv50_gr_construct_gene_clipid(ctx);
1303b8bf04e1SBen Skeggs 		nv50_gr_construct_gene_eng2d(ctx);
1304b8bf04e1SBen Skeggs 		if (units & (1 << 0))
1305b8bf04e1SBen Skeggs 			nv50_gr_construct_xfer_tp(ctx);
1306b8bf04e1SBen Skeggs 		if (units & (1 << 1))
1307b8bf04e1SBen Skeggs 			nv50_gr_construct_xfer_tp(ctx);
1308b8bf04e1SBen Skeggs 		if (units & (1 << 2))
1309b8bf04e1SBen Skeggs 			nv50_gr_construct_xfer_tp(ctx);
1310b8bf04e1SBen Skeggs 		if (units & (1 << 3))
1311b8bf04e1SBen Skeggs 			nv50_gr_construct_xfer_tp(ctx);
1312b8bf04e1SBen Skeggs 		if ((ctx->ctxvals_pos-offset)/8 > size)
1313b8bf04e1SBen Skeggs 			size = (ctx->ctxvals_pos-offset)/8;
1314b8bf04e1SBen Skeggs 
1315b8bf04e1SBen Skeggs 		/* Strand 7 */
1316b8bf04e1SBen Skeggs 		ctx->ctxvals_pos = offset + 7;
1317b8bf04e1SBen Skeggs 		if (device->chipset == 0xa0) {
1318b8bf04e1SBen Skeggs 			if (units & (1 << 4))
1319b8bf04e1SBen Skeggs 				nv50_gr_construct_xfer_tp(ctx);
1320b8bf04e1SBen Skeggs 			if (units & (1 << 5))
1321b8bf04e1SBen Skeggs 				nv50_gr_construct_xfer_tp(ctx);
1322b8bf04e1SBen Skeggs 			if (units & (1 << 6))
1323b8bf04e1SBen Skeggs 				nv50_gr_construct_xfer_tp(ctx);
1324b8bf04e1SBen Skeggs 			if (units & (1 << 7))
1325b8bf04e1SBen Skeggs 				nv50_gr_construct_xfer_tp(ctx);
1326b8bf04e1SBen Skeggs 			if (units & (1 << 8))
1327b8bf04e1SBen Skeggs 				nv50_gr_construct_xfer_tp(ctx);
1328b8bf04e1SBen Skeggs 			if (units & (1 << 9))
1329b8bf04e1SBen Skeggs 				nv50_gr_construct_xfer_tp(ctx);
1330b8bf04e1SBen Skeggs 		} else {
1331b8bf04e1SBen Skeggs 			nv50_gr_construct_gene_unk14xx(ctx);
1332b8bf04e1SBen Skeggs 		}
1333b8bf04e1SBen Skeggs 		if ((ctx->ctxvals_pos-offset)/8 > size)
1334b8bf04e1SBen Skeggs 			size = (ctx->ctxvals_pos-offset)/8;
1335b8bf04e1SBen Skeggs 	}
1336b8bf04e1SBen Skeggs 
1337b8bf04e1SBen Skeggs 	ctx->ctxvals_pos = offset + size * 8;
1338b8bf04e1SBen Skeggs 	ctx->ctxvals_pos = (ctx->ctxvals_pos+0x3f)&~0x3f;
1339b8bf04e1SBen Skeggs 	cp_lsr (ctx, offset);
1340b8bf04e1SBen Skeggs 	cp_out (ctx, CP_SET_XFER_POINTER);
1341b8bf04e1SBen Skeggs 	cp_lsr (ctx, size);
1342b8bf04e1SBen Skeggs 	cp_out (ctx, CP_SEEK_1);
1343b8bf04e1SBen Skeggs 	cp_out (ctx, CP_XFER_1);
1344b8bf04e1SBen Skeggs 	cp_wait(ctx, XFER, BUSY);
1345b8bf04e1SBen Skeggs }
1346b8bf04e1SBen Skeggs 
1347b8bf04e1SBen Skeggs /*
1348b8bf04e1SBen Skeggs  * non-trivial demagiced parts of ctx init go here
1349b8bf04e1SBen Skeggs  */
1350b8bf04e1SBen Skeggs 
1351b8bf04e1SBen Skeggs static void
nv50_gr_construct_gene_dispatch(struct nvkm_grctx * ctx)1352e3c71eb2SBen Skeggs nv50_gr_construct_gene_dispatch(struct nvkm_grctx *ctx)
1353b8bf04e1SBen Skeggs {
1354b8bf04e1SBen Skeggs 	/* start of strand 0 */
1355e3c71eb2SBen Skeggs 	struct nvkm_device *device = ctx->device;
1356b8bf04e1SBen Skeggs 	/* SEEK */
1357b8bf04e1SBen Skeggs 	if (device->chipset == 0x50)
1358b8bf04e1SBen Skeggs 		xf_emit(ctx, 5, 0);
1359b8bf04e1SBen Skeggs 	else if (!IS_NVA3F(device->chipset))
1360b8bf04e1SBen Skeggs 		xf_emit(ctx, 6, 0);
1361b8bf04e1SBen Skeggs 	else
1362b8bf04e1SBen Skeggs 		xf_emit(ctx, 4, 0);
1363b8bf04e1SBen Skeggs 	/* SEEK */
1364b8bf04e1SBen Skeggs 	/* the PGRAPH's internal FIFO */
1365b8bf04e1SBen Skeggs 	if (device->chipset == 0x50)
1366b8bf04e1SBen Skeggs 		xf_emit(ctx, 8*3, 0);
1367b8bf04e1SBen Skeggs 	else
1368b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x100*3, 0);
1369b8bf04e1SBen Skeggs 	/* and another bonus slot?!? */
1370b8bf04e1SBen Skeggs 	xf_emit(ctx, 3, 0);
1371b8bf04e1SBen Skeggs 	/* and YET ANOTHER bonus slot? */
1372b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset))
1373b8bf04e1SBen Skeggs 		xf_emit(ctx, 3, 0);
1374b8bf04e1SBen Skeggs 	/* SEEK */
1375b8bf04e1SBen Skeggs 	/* CTX_SWITCH: caches of gr objects bound to subchannels. 8 values, last used index */
1376b8bf04e1SBen Skeggs 	xf_emit(ctx, 9, 0);
1377b8bf04e1SBen Skeggs 	/* SEEK */
1378b8bf04e1SBen Skeggs 	xf_emit(ctx, 9, 0);
1379b8bf04e1SBen Skeggs 	/* SEEK */
1380b8bf04e1SBen Skeggs 	xf_emit(ctx, 9, 0);
1381b8bf04e1SBen Skeggs 	/* SEEK */
1382b8bf04e1SBen Skeggs 	xf_emit(ctx, 9, 0);
1383b8bf04e1SBen Skeggs 	/* SEEK */
1384b8bf04e1SBen Skeggs 	if (device->chipset < 0x90)
1385b8bf04e1SBen Skeggs 		xf_emit(ctx, 4, 0);
1386b8bf04e1SBen Skeggs 	/* SEEK */
1387b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);
1388b8bf04e1SBen Skeggs 	/* SEEK */
1389b8bf04e1SBen Skeggs 	xf_emit(ctx, 6*2, 0);
1390b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);
1391b8bf04e1SBen Skeggs 	/* SEEK */
1392b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);
1393b8bf04e1SBen Skeggs 	/* SEEK */
1394b8bf04e1SBen Skeggs 	xf_emit(ctx, 6*2, 0);
1395b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);
1396b8bf04e1SBen Skeggs 	/* SEEK */
1397b8bf04e1SBen Skeggs 	if (device->chipset == 0x50)
1398b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x1c, 0);
1399b8bf04e1SBen Skeggs 	else if (device->chipset < 0xa0)
1400b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x1e, 0);
1401b8bf04e1SBen Skeggs 	else
1402b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x22, 0);
1403b8bf04e1SBen Skeggs 	/* SEEK */
1404b8bf04e1SBen Skeggs 	xf_emit(ctx, 0x15, 0);
1405b8bf04e1SBen Skeggs }
1406b8bf04e1SBen Skeggs 
1407b8bf04e1SBen Skeggs static void
nv50_gr_construct_gene_m2mf(struct nvkm_grctx * ctx)1408e3c71eb2SBen Skeggs nv50_gr_construct_gene_m2mf(struct nvkm_grctx *ctx)
1409b8bf04e1SBen Skeggs {
1410b8bf04e1SBen Skeggs 	/* Strand 0, right after dispatch */
1411e3c71eb2SBen Skeggs 	struct nvkm_device *device = ctx->device;
1412b8bf04e1SBen Skeggs 	int smallm2mf = 0;
1413b8bf04e1SBen Skeggs 	if (device->chipset < 0x92 || device->chipset == 0x98)
1414b8bf04e1SBen Skeggs 		smallm2mf = 1;
1415b8bf04e1SBen Skeggs 	/* SEEK */
1416b8bf04e1SBen Skeggs 	xf_emit (ctx, 1, 0);		/* DMA_NOTIFY instance >> 4 */
1417b8bf04e1SBen Skeggs 	xf_emit (ctx, 1, 0);		/* DMA_BUFFER_IN instance >> 4 */
1418b8bf04e1SBen Skeggs 	xf_emit (ctx, 1, 0);		/* DMA_BUFFER_OUT instance >> 4 */
1419b8bf04e1SBen Skeggs 	xf_emit (ctx, 1, 0);		/* OFFSET_IN */
1420b8bf04e1SBen Skeggs 	xf_emit (ctx, 1, 0);		/* OFFSET_OUT */
1421b8bf04e1SBen Skeggs 	xf_emit (ctx, 1, 0);		/* PITCH_IN */
1422b8bf04e1SBen Skeggs 	xf_emit (ctx, 1, 0);		/* PITCH_OUT */
1423b8bf04e1SBen Skeggs 	xf_emit (ctx, 1, 0);		/* LINE_LENGTH */
1424b8bf04e1SBen Skeggs 	xf_emit (ctx, 1, 0);		/* LINE_COUNT */
1425b8bf04e1SBen Skeggs 	xf_emit (ctx, 1, 0x21);		/* FORMAT: bits 0-4 INPUT_INC, bits 5-9 OUTPUT_INC */
1426b8bf04e1SBen Skeggs 	xf_emit (ctx, 1, 1);		/* LINEAR_IN */
1427b8bf04e1SBen Skeggs 	xf_emit (ctx, 1, 0x2);		/* TILING_MODE_IN: bits 0-2 y tiling, bits 3-5 z tiling */
1428b8bf04e1SBen Skeggs 	xf_emit (ctx, 1, 0x100);	/* TILING_PITCH_IN */
1429b8bf04e1SBen Skeggs 	xf_emit (ctx, 1, 0x100);	/* TILING_HEIGHT_IN */
1430b8bf04e1SBen Skeggs 	xf_emit (ctx, 1, 1);		/* TILING_DEPTH_IN */
1431b8bf04e1SBen Skeggs 	xf_emit (ctx, 1, 0);		/* TILING_POSITION_IN_Z */
1432b8bf04e1SBen Skeggs 	xf_emit (ctx, 1, 0);		/* TILING_POSITION_IN */
1433b8bf04e1SBen Skeggs 	xf_emit (ctx, 1, 1);		/* LINEAR_OUT */
1434b8bf04e1SBen Skeggs 	xf_emit (ctx, 1, 0x2);		/* TILING_MODE_OUT: bits 0-2 y tiling, bits 3-5 z tiling */
1435b8bf04e1SBen Skeggs 	xf_emit (ctx, 1, 0x100);	/* TILING_PITCH_OUT */
1436b8bf04e1SBen Skeggs 	xf_emit (ctx, 1, 0x100);	/* TILING_HEIGHT_OUT */
1437b8bf04e1SBen Skeggs 	xf_emit (ctx, 1, 1);		/* TILING_DEPTH_OUT */
1438b8bf04e1SBen Skeggs 	xf_emit (ctx, 1, 0);		/* TILING_POSITION_OUT_Z */
1439b8bf04e1SBen Skeggs 	xf_emit (ctx, 1, 0);		/* TILING_POSITION_OUT */
1440b8bf04e1SBen Skeggs 	xf_emit (ctx, 1, 0);		/* OFFSET_IN_HIGH */
1441b8bf04e1SBen Skeggs 	xf_emit (ctx, 1, 0);		/* OFFSET_OUT_HIGH */
1442b8bf04e1SBen Skeggs 	/* SEEK */
1443b8bf04e1SBen Skeggs 	if (smallm2mf)
1444b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x40, 0);	/* 20 * ffffffff, 3ffff */
1445b8bf04e1SBen Skeggs 	else
1446b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x100, 0);	/* 80 * ffffffff, 3ffff */
1447b8bf04e1SBen Skeggs 	xf_emit(ctx, 4, 0);		/* 1f/7f, 0, 1f/7f, 0 [1f for smallm2mf, 7f otherwise] */
1448b8bf04e1SBen Skeggs 	/* SEEK */
1449b8bf04e1SBen Skeggs 	if (smallm2mf)
1450b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x400, 0);	/* ffffffff */
1451b8bf04e1SBen Skeggs 	else
1452b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x800, 0);	/* ffffffff */
1453b8bf04e1SBen Skeggs 	xf_emit(ctx, 4, 0);		/* ff/1ff, 0, 0, 0 [ff for smallm2mf, 1ff otherwise] */
1454b8bf04e1SBen Skeggs 	/* SEEK */
1455b8bf04e1SBen Skeggs 	xf_emit(ctx, 0x40, 0);		/* 20 * bits ffffffff, 3ffff */
1456b8bf04e1SBen Skeggs 	xf_emit(ctx, 0x6, 0);		/* 1f, 0, 1f, 0, 1f, 0 */
1457b8bf04e1SBen Skeggs }
1458b8bf04e1SBen Skeggs 
1459b8bf04e1SBen Skeggs static void
nv50_gr_construct_gene_ccache(struct nvkm_grctx * ctx)1460e3c71eb2SBen Skeggs nv50_gr_construct_gene_ccache(struct nvkm_grctx *ctx)
1461b8bf04e1SBen Skeggs {
1462e3c71eb2SBen Skeggs 	struct nvkm_device *device = ctx->device;
1463b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);		/* RO */
1464b8bf04e1SBen Skeggs 	xf_emit(ctx, 0x800, 0);		/* ffffffff */
1465b8bf04e1SBen Skeggs 	switch (device->chipset) {
1466b8bf04e1SBen Skeggs 	case 0x50:
1467b8bf04e1SBen Skeggs 	case 0x92:
1468b8bf04e1SBen Skeggs 	case 0xa0:
1469b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x2b, 0);
1470b8bf04e1SBen Skeggs 		break;
1471b8bf04e1SBen Skeggs 	case 0x84:
1472b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x29, 0);
1473b8bf04e1SBen Skeggs 		break;
1474b8bf04e1SBen Skeggs 	case 0x94:
1475b8bf04e1SBen Skeggs 	case 0x96:
1476b8bf04e1SBen Skeggs 	case 0xa3:
1477b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x27, 0);
1478b8bf04e1SBen Skeggs 		break;
1479b8bf04e1SBen Skeggs 	case 0x86:
1480b8bf04e1SBen Skeggs 	case 0x98:
1481b8bf04e1SBen Skeggs 	case 0xa5:
1482b8bf04e1SBen Skeggs 	case 0xa8:
1483b8bf04e1SBen Skeggs 	case 0xaa:
1484b8bf04e1SBen Skeggs 	case 0xac:
1485b8bf04e1SBen Skeggs 	case 0xaf:
1486b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x25, 0);
1487b8bf04e1SBen Skeggs 		break;
1488b8bf04e1SBen Skeggs 	}
1489b8bf04e1SBen Skeggs 	/* CB bindings, 0x80 of them. first word is address >> 8, second is
1490b8bf04e1SBen Skeggs 	 * size >> 4 | valid << 24 */
1491b8bf04e1SBen Skeggs 	xf_emit(ctx, 0x100, 0);		/* ffffffff CB_DEF */
1492b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000007f CB_ADDR_BUFFER */
1493b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0 */
1494b8bf04e1SBen Skeggs 	xf_emit(ctx, 0x30, 0);		/* ff SET_PROGRAM_CB */
1495b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 3f last SET_PROGRAM_CB */
1496b8bf04e1SBen Skeggs 	xf_emit(ctx, 4, 0);		/* RO */
1497b8bf04e1SBen Skeggs 	xf_emit(ctx, 0x100, 0);		/* ffffffff */
1498b8bf04e1SBen Skeggs 	xf_emit(ctx, 8, 0);		/* 1f, 0, 0, ... */
1499b8bf04e1SBen Skeggs 	xf_emit(ctx, 8, 0);		/* ffffffff */
1500b8bf04e1SBen Skeggs 	xf_emit(ctx, 4, 0);		/* ffffffff */
1501b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 3 */
1502b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff */
1503b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000ffff DMA_CODE_CB */
1504b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000ffff DMA_TIC */
1505b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000ffff DMA_TSC */
1506b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 LINKED_TSC */
1507b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff TIC_ADDRESS_HIGH */
1508b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff TIC_ADDRESS_LOW */
1509b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x3fffff);	/* 003fffff TIC_LIMIT */
1510b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff TSC_ADDRESS_HIGH */
1511b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff TSC_ADDRESS_LOW */
1512b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x1fff);	/* 000fffff TSC_LIMIT */
1513b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff VP_ADDRESS_HIGH */
1514b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff VP_ADDRESS_LOW */
1515b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00ffffff VP_START_ID */
1516b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff CB_DEF_ADDRESS_HIGH */
1517b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff CB_DEF_ADDRESS_LOW */
1518b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 GP_ENABLE */
1519b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff GP_ADDRESS_HIGH */
1520b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff GP_ADDRESS_LOW */
1521b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00ffffff GP_START_ID */
1522b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff FP_ADDRESS_HIGH */
1523b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff FP_ADDRESS_LOW */
1524b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00ffffff FP_START_ID */
1525b8bf04e1SBen Skeggs }
1526b8bf04e1SBen Skeggs 
1527b8bf04e1SBen Skeggs static void
nv50_gr_construct_gene_unk10xx(struct nvkm_grctx * ctx)1528e3c71eb2SBen Skeggs nv50_gr_construct_gene_unk10xx(struct nvkm_grctx *ctx)
1529b8bf04e1SBen Skeggs {
1530e3c71eb2SBen Skeggs 	struct nvkm_device *device = ctx->device;
1531b8bf04e1SBen Skeggs 	int i;
1532b8bf04e1SBen Skeggs 	/* end of area 2 on pre-NVA0, area 1 on NVAx */
1533b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 000000ff GP_RESULT_MAP_SIZE */
1534b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 0000007f VP_RESULT_MAP_SIZE */
1535b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 GP_ENABLE */
1536b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x80);		/* 0000ffff GP_VERTEX_OUTPUT_COUNT */
1537b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 000000ff GP_REG_ALLOC_RESULT */
1538b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x80c14);	/* 01ffffff SEMANTIC_COLOR */
1539b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 VERTEX_TWO_SIDE_ENABLE */
1540b8bf04e1SBen Skeggs 	if (device->chipset == 0x50)
1541b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0x3ff);
1542b8bf04e1SBen Skeggs 	else
1543b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0x7ff);	/* 000007ff */
1544b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 111/113 */
1545b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff tesla UNK1A30 */
1546b8bf04e1SBen Skeggs 	for (i = 0; i < 8; i++) {
1547b8bf04e1SBen Skeggs 		switch (device->chipset) {
1548b8bf04e1SBen Skeggs 		case 0x50:
1549b8bf04e1SBen Skeggs 		case 0x86:
1550b8bf04e1SBen Skeggs 		case 0x98:
1551b8bf04e1SBen Skeggs 		case 0xaa:
1552b8bf04e1SBen Skeggs 		case 0xac:
1553b8bf04e1SBen Skeggs 			xf_emit(ctx, 0xa0, 0);	/* ffffffff */
1554b8bf04e1SBen Skeggs 			break;
1555b8bf04e1SBen Skeggs 		case 0x84:
1556b8bf04e1SBen Skeggs 		case 0x92:
1557b8bf04e1SBen Skeggs 		case 0x94:
1558b8bf04e1SBen Skeggs 		case 0x96:
1559b8bf04e1SBen Skeggs 			xf_emit(ctx, 0x120, 0);
1560b8bf04e1SBen Skeggs 			break;
1561b8bf04e1SBen Skeggs 		case 0xa5:
1562b8bf04e1SBen Skeggs 		case 0xa8:
1563b8bf04e1SBen Skeggs 			xf_emit(ctx, 0x100, 0);	/* ffffffff */
1564b8bf04e1SBen Skeggs 			break;
1565b8bf04e1SBen Skeggs 		case 0xa0:
1566b8bf04e1SBen Skeggs 		case 0xa3:
1567b8bf04e1SBen Skeggs 		case 0xaf:
1568b8bf04e1SBen Skeggs 			xf_emit(ctx, 0x400, 0);	/* ffffffff */
1569b8bf04e1SBen Skeggs 			break;
1570b8bf04e1SBen Skeggs 		}
1571b8bf04e1SBen Skeggs 		xf_emit(ctx, 4, 0);	/* 3f, 0, 0, 0 */
1572b8bf04e1SBen Skeggs 		xf_emit(ctx, 4, 0);	/* ffffffff */
1573b8bf04e1SBen Skeggs 	}
1574b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 000000ff GP_RESULT_MAP_SIZE */
1575b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 0000007f VP_RESULT_MAP_SIZE */
1576b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 GP_ENABLE */
1577b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x80);		/* 0000ffff GP_VERTEX_OUTPUT_COUNT */
1578b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 000000ff GP_REG_ALLOC_TEMP */
1579b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 RASTERIZE_ENABLE */
1580b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 tesla UNK1900 */
1581b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x27);		/* 000000ff UNK0FD4 */
1582b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0001ffff GP_BUILTIN_RESULT_EN */
1583b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x26);		/* 000000ff SEMANTIC_LAYER */
1584b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff tesla UNK1A30 */
1585b8bf04e1SBen Skeggs }
1586b8bf04e1SBen Skeggs 
1587b8bf04e1SBen Skeggs static void
nv50_gr_construct_gene_unk34xx(struct nvkm_grctx * ctx)1588e3c71eb2SBen Skeggs nv50_gr_construct_gene_unk34xx(struct nvkm_grctx *ctx)
1589b8bf04e1SBen Skeggs {
1590e3c71eb2SBen Skeggs 	struct nvkm_device *device = ctx->device;
1591b8bf04e1SBen Skeggs 	/* end of area 2 on pre-NVA0, area 1 on NVAx */
1592b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 VIEWPORT_CLIP_RECTS_EN */
1593b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000003 VIEWPORT_CLIP_MODE */
1594b8bf04e1SBen Skeggs 	xf_emit(ctx, 0x10, 0x04000000);	/* 07ffffff VIEWPORT_CLIP_HORIZ*8, VIEWPORT_CLIP_VERT*8 */
1595b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 POLYGON_STIPPLE_ENABLE */
1596b8bf04e1SBen Skeggs 	xf_emit(ctx, 0x20, 0);		/* ffffffff POLYGON_STIPPLE */
1597b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);		/* 00007fff WINDOW_OFFSET_XY */
1598b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffff0ff3 */
1599b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x04e3bfdf);	/* ffffffff UNK0D64 */
1600b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x04e3bfdf);	/* ffffffff UNK0DF4 */
1601b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000003 WINDOW_ORIGIN */
1602b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 */
1603b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x1fe21);	/* 0001ffff tesla UNK0FAC */
1604b8bf04e1SBen Skeggs 	if (device->chipset >= 0xa0)
1605b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0x0fac6881);
1606b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset)) {
1607b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 1);
1608b8bf04e1SBen Skeggs 		xf_emit(ctx, 3, 0);
1609b8bf04e1SBen Skeggs 	}
1610b8bf04e1SBen Skeggs }
1611b8bf04e1SBen Skeggs 
1612b8bf04e1SBen Skeggs static void
nv50_gr_construct_gene_unk14xx(struct nvkm_grctx * ctx)1613e3c71eb2SBen Skeggs nv50_gr_construct_gene_unk14xx(struct nvkm_grctx *ctx)
1614b8bf04e1SBen Skeggs {
1615e3c71eb2SBen Skeggs 	struct nvkm_device *device = ctx->device;
1616b8bf04e1SBen Skeggs 	/* middle of area 2 on pre-NVA0, beginning of area 2 on NVA0, area 7 on >NVA0 */
1617b8bf04e1SBen Skeggs 	if (device->chipset != 0x50) {
1618b8bf04e1SBen Skeggs 		xf_emit(ctx, 5, 0);		/* ffffffff */
1619b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0x80c14);	/* 01ffffff SEMANTIC_COLOR */
1620b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);		/* 00000001 */
1621b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);		/* 000003ff */
1622b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0x804);		/* 00000fff SEMANTIC_CLIP */
1623b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);		/* 00000001 */
1624b8bf04e1SBen Skeggs 		xf_emit(ctx, 2, 4);		/* 7f, ff */
1625b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0x8100c12);	/* 1fffffff FP_INTERPOLANT_CTRL */
1626b8bf04e1SBen Skeggs 	}
1627b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* ffffffff tesla UNK1A30 */
1628b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);			/* 0000007f VP_RESULT_MAP_SIZE */
1629b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);			/* 000000ff GP_RESULT_MAP_SIZE */
1630b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 00000001 GP_ENABLE */
1631b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x10);			/* 7f/ff VIEW_VOLUME_CLIP_CTRL */
1632b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 000000ff VP_CLIP_DISTANCE_ENABLE */
1633b8bf04e1SBen Skeggs 	if (device->chipset != 0x50)
1634b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);		/* 3ff */
1635b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 000000ff tesla UNK1940 */
1636b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 00000001 tesla UNK0D7C */
1637b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x804);			/* 00000fff SEMANTIC_CLIP */
1638b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);			/* 00000001 VIEWPORT_TRANSFORM_EN */
1639b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x1a);			/* 0000001f POLYGON_MODE */
1640b8bf04e1SBen Skeggs 	if (device->chipset != 0x50)
1641b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0x7f);		/* 000000ff tesla UNK0FFC */
1642b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* ffffffff tesla UNK1A30 */
1643b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);			/* 00000001 SHADE_MODEL */
1644b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x80c14);		/* 01ffffff SEMANTIC_COLOR */
1645b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 00000001 tesla UNK1900 */
1646b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x8100c12);		/* 1fffffff FP_INTERPOLANT_CTRL */
1647b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);			/* 0000007f VP_RESULT_MAP_SIZE */
1648b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);			/* 000000ff GP_RESULT_MAP_SIZE */
1649b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 00000001 GP_ENABLE */
1650b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x10);			/* 7f/ff VIEW_VOLUME_CLIP_CTRL */
1651b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 00000001 tesla UNK0D7C */
1652b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 00000001 tesla UNK0F8C */
1653b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* ffffffff tesla UNK1A30 */
1654b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);			/* 00000001 VIEWPORT_TRANSFORM_EN */
1655b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x8100c12);		/* 1fffffff FP_INTERPOLANT_CTRL */
1656b8bf04e1SBen Skeggs 	xf_emit(ctx, 4, 0);			/* ffffffff NOPERSPECTIVE_BITMAP */
1657b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 00000001 tesla UNK1900 */
1658b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 0000000f */
1659b8bf04e1SBen Skeggs 	if (device->chipset == 0x50)
1660b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0x3ff);		/* 000003ff tesla UNK0D68 */
1661b8bf04e1SBen Skeggs 	else
1662b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0x7ff);		/* 000007ff tesla UNK0D68 */
1663b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x80c14);		/* 01ffffff SEMANTIC_COLOR */
1664b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 00000001 VERTEX_TWO_SIDE_ENABLE */
1665b8bf04e1SBen Skeggs 	xf_emit(ctx, 0x30, 0);			/* ffffffff VIEWPORT_SCALE: X0, Y0, Z0, X1, Y1, ... */
1666b8bf04e1SBen Skeggs 	xf_emit(ctx, 3, 0);			/* f, 0, 0 */
1667b8bf04e1SBen Skeggs 	xf_emit(ctx, 3, 0);			/* ffffffff last VIEWPORT_SCALE? */
1668b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* ffffffff tesla UNK1A30 */
1669b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);			/* 00000001 VIEWPORT_TRANSFORM_EN */
1670b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 00000001 tesla UNK1900 */
1671b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 00000001 tesla UNK1924 */
1672b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x10);			/* 000000ff VIEW_VOLUME_CLIP_CTRL */
1673b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 00000001 */
1674b8bf04e1SBen Skeggs 	xf_emit(ctx, 0x30, 0);			/* ffffffff VIEWPORT_TRANSLATE */
1675b8bf04e1SBen Skeggs 	xf_emit(ctx, 3, 0);			/* f, 0, 0 */
1676b8bf04e1SBen Skeggs 	xf_emit(ctx, 3, 0);			/* ffffffff */
1677b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* ffffffff tesla UNK1A30 */
1678b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0x88);			/* 000001ff tesla UNK19D8 */
1679b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 00000001 tesla UNK1924 */
1680b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* ffffffff tesla UNK1A30 */
1681b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);			/* 0000000f CULL_MODE */
1682b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);			/* 07ffffff SCREEN_SCISSOR */
1683b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);			/* 00007fff WINDOW_OFFSET_XY */
1684b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 00000003 WINDOW_ORIGIN */
1685b8bf04e1SBen Skeggs 	xf_emit(ctx, 0x10, 0);			/* 00000001 SCISSOR_ENABLE */
1686b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 0001ffff GP_BUILTIN_RESULT_EN */
1687b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x26);			/* 000000ff SEMANTIC_LAYER */
1688b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 00000001 tesla UNK1900 */
1689b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 0000000f */
1690b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x3f800000);		/* ffffffff LINE_WIDTH */
1691b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 00000001 LINE_STIPPLE_ENABLE */
1692b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 00000001 LINE_SMOOTH_ENABLE */
1693b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 00000007 MULTISAMPLE_SAMPLES_LOG2 */
1694b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset))
1695b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);		/* 00000001 */
1696b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x1a);			/* 0000001f POLYGON_MODE */
1697b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x10);			/* 000000ff VIEW_VOLUME_CLIP_CTRL */
1698b8bf04e1SBen Skeggs 	if (device->chipset != 0x50) {
1699b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);		/* ffffffff */
1700b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);		/* 00000001 */
1701b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);		/* 000003ff */
1702b8bf04e1SBen Skeggs 	}
1703b8bf04e1SBen Skeggs 	xf_emit(ctx, 0x20, 0);			/* 10xbits ffffffff, 3fffff. SCISSOR_* */
1704b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* f */
1705b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 0? */
1706b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* ffffffff */
1707b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 003fffff */
1708b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* ffffffff tesla UNK1A30 */
1709b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x52);			/* 000001ff SEMANTIC_PTSZ */
1710b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 0001ffff GP_BUILTIN_RESULT_EN */
1711b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x26);			/* 000000ff SEMANTIC_LAYER */
1712b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 00000001 tesla UNK1900 */
1713b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);			/* 0000007f VP_RESULT_MAP_SIZE */
1714b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);			/* 000000ff GP_RESULT_MAP_SIZE */
1715b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 00000001 GP_ENABLE */
1716b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x1a);			/* 0000001f POLYGON_MODE */
1717b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 00000001 LINE_SMOOTH_ENABLE */
1718b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 00000001 LINE_STIPPLE_ENABLE */
1719b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x00ffff00);		/* 00ffffff LINE_STIPPLE_PATTERN */
1720b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 0000000f */
1721b8bf04e1SBen Skeggs }
1722b8bf04e1SBen Skeggs 
1723b8bf04e1SBen Skeggs static void
nv50_gr_construct_gene_zcull(struct nvkm_grctx * ctx)1724e3c71eb2SBen Skeggs nv50_gr_construct_gene_zcull(struct nvkm_grctx *ctx)
1725b8bf04e1SBen Skeggs {
1726e3c71eb2SBen Skeggs 	struct nvkm_device *device = ctx->device;
1727b8bf04e1SBen Skeggs 	/* end of strand 0 on pre-NVA0, beginning of strand 6 on NVAx */
1728b8bf04e1SBen Skeggs 	/* SEEK */
1729b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x3f);		/* 0000003f UNK1590 */
1730b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 ALPHA_TEST_ENABLE */
1731b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 MULTISAMPLE_SAMPLES_LOG2 */
1732b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 tesla UNK1534 */
1733b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 STENCIL_BACK_FUNC_FUNC */
1734b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff STENCIL_BACK_FUNC_MASK */
1735b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff STENCIL_BACK_FUNC_REF */
1736b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff STENCIL_BACK_MASK */
1737b8bf04e1SBen Skeggs 	xf_emit(ctx, 3, 0);		/* 00000007 STENCIL_BACK_OP_FAIL, ZFAIL, ZPASS */
1738b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 2);		/* 00000003 tesla UNK143C */
1739b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0x04000000);	/* 07ffffff tesla UNK0D6C */
1740b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffff0ff3 */
1741b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 CLIPID_ENABLE */
1742b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);		/* ffffffff DEPTH_BOUNDS */
1743b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 */
1744b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 DEPTH_TEST_FUNC */
1745b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 DEPTH_TEST_ENABLE */
1746b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 DEPTH_WRITE_ENABLE */
1747b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 0000000f CULL_MODE */
1748b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000ffff */
1749b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 UNK0FB0 */
1750b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 POLYGON_STIPPLE_ENABLE */
1751b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 00000007 FP_CONTROL */
1752b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff */
1753b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0001ffff GP_BUILTIN_RESULT_EN */
1754b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff CLEAR_STENCIL */
1755b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 STENCIL_FRONT_FUNC_FUNC */
1756b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff STENCIL_FRONT_FUNC_MASK */
1757b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff STENCIL_FRONT_FUNC_REF */
1758b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff STENCIL_FRONT_MASK */
1759b8bf04e1SBen Skeggs 	xf_emit(ctx, 3, 0);		/* 00000007 STENCIL_FRONT_OP_FAIL, ZFAIL, ZPASS */
1760b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 STENCIL_FRONT_ENABLE */
1761b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 STENCIL_BACK_ENABLE */
1762b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff CLEAR_DEPTH */
1763b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 */
1764b8bf04e1SBen Skeggs 	if (device->chipset != 0x50)
1765b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000003 tesla UNK1108 */
1766b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 SAMPLECNT_ENABLE */
1767b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000000f ZETA_FORMAT */
1768b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 ZETA_ENABLE */
1769b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x1001);	/* 00001fff ZETA_ARRAY_MODE */
1770b8bf04e1SBen Skeggs 	/* SEEK */
1771b8bf04e1SBen Skeggs 	xf_emit(ctx, 4, 0xffff);	/* 0000ffff MSAA_MASK */
1772b8bf04e1SBen Skeggs 	xf_emit(ctx, 0x10, 0);		/* 00000001 SCISSOR_ENABLE */
1773b8bf04e1SBen Skeggs 	xf_emit(ctx, 0x10, 0);		/* ffffffff DEPTH_RANGE_NEAR */
1774b8bf04e1SBen Skeggs 	xf_emit(ctx, 0x10, 0x3f800000);	/* ffffffff DEPTH_RANGE_FAR */
1775b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x10);		/* 7f/ff/3ff VIEW_VOLUME_CLIP_CTRL */
1776b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 VIEWPORT_CLIP_RECTS_EN */
1777b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 3);		/* 00000003 FP_CTRL_UNK196C */
1778b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000003 tesla UNK1968 */
1779b8bf04e1SBen Skeggs 	if (device->chipset != 0x50)
1780b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 0fffffff tesla UNK1104 */
1781b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 tesla UNK151C */
1782b8bf04e1SBen Skeggs }
1783b8bf04e1SBen Skeggs 
1784b8bf04e1SBen Skeggs static void
nv50_gr_construct_gene_clipid(struct nvkm_grctx * ctx)1785e3c71eb2SBen Skeggs nv50_gr_construct_gene_clipid(struct nvkm_grctx *ctx)
1786b8bf04e1SBen Skeggs {
1787b8bf04e1SBen Skeggs 	/* middle of strand 0 on pre-NVA0 [after 24xx], middle of area 6 on NVAx */
1788b8bf04e1SBen Skeggs 	/* SEEK */
1789b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 UNK0FB4 */
1790b8bf04e1SBen Skeggs 	/* SEEK */
1791b8bf04e1SBen Skeggs 	xf_emit(ctx, 4, 0);		/* 07ffffff CLIPID_REGION_HORIZ */
1792b8bf04e1SBen Skeggs 	xf_emit(ctx, 4, 0);		/* 07ffffff CLIPID_REGION_VERT */
1793b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);		/* 07ffffff SCREEN_SCISSOR */
1794b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0x04000000);	/* 07ffffff UNK1508 */
1795b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 CLIPID_ENABLE */
1796b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x80);		/* 00003fff CLIPID_WIDTH */
1797b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff CLIPID_ID */
1798b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff CLIPID_ADDRESS_HIGH */
1799b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff CLIPID_ADDRESS_LOW */
1800b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x80);		/* 00003fff CLIPID_HEIGHT */
1801b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000ffff DMA_CLIPID */
1802b8bf04e1SBen Skeggs }
1803b8bf04e1SBen Skeggs 
1804b8bf04e1SBen Skeggs static void
nv50_gr_construct_gene_unk24xx(struct nvkm_grctx * ctx)1805e3c71eb2SBen Skeggs nv50_gr_construct_gene_unk24xx(struct nvkm_grctx *ctx)
1806b8bf04e1SBen Skeggs {
1807e3c71eb2SBen Skeggs 	struct nvkm_device *device = ctx->device;
1808b8bf04e1SBen Skeggs 	int i;
1809b8bf04e1SBen Skeggs 	/* middle of strand 0 on pre-NVA0 [after m2mf], end of strand 2 on NVAx */
1810b8bf04e1SBen Skeggs 	/* SEEK */
1811b8bf04e1SBen Skeggs 	xf_emit(ctx, 0x33, 0);
1812b8bf04e1SBen Skeggs 	/* SEEK */
1813b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);
1814b8bf04e1SBen Skeggs 	/* SEEK */
1815b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 GP_ENABLE */
1816b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 0000007f VP_RESULT_MAP_SIZE */
1817b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 000000ff GP_RESULT_MAP_SIZE */
1818b8bf04e1SBen Skeggs 	/* SEEK */
1819b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset)) {
1820b8bf04e1SBen Skeggs 		xf_emit(ctx, 4, 0);	/* RO */
1821b8bf04e1SBen Skeggs 		xf_emit(ctx, 0xe10, 0); /* 190 * 9: 8*ffffffff, 7ff */
1822b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 1ff */
1823b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 0);	/* 0? */
1824b8bf04e1SBen Skeggs 		xf_emit(ctx, 9, 0);	/* ffffffff, 7ff */
1825b8bf04e1SBen Skeggs 
1826b8bf04e1SBen Skeggs 		xf_emit(ctx, 4, 0);	/* RO */
1827b8bf04e1SBen Skeggs 		xf_emit(ctx, 0xe10, 0); /* 190 * 9: 8*ffffffff, 7ff */
1828b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 1ff */
1829b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 0);	/* 0? */
1830b8bf04e1SBen Skeggs 		xf_emit(ctx, 9, 0);	/* ffffffff, 7ff */
1831b8bf04e1SBen Skeggs 	} else {
1832b8bf04e1SBen Skeggs 		xf_emit(ctx, 0xc, 0);	/* RO */
1833b8bf04e1SBen Skeggs 		/* SEEK */
1834b8bf04e1SBen Skeggs 		xf_emit(ctx, 0xe10, 0); /* 190 * 9: 8*ffffffff, 7ff */
1835b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 1ff */
1836b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 0);	/* 0? */
1837b8bf04e1SBen Skeggs 
1838b8bf04e1SBen Skeggs 		/* SEEK */
1839b8bf04e1SBen Skeggs 		xf_emit(ctx, 0xc, 0);	/* RO */
1840b8bf04e1SBen Skeggs 		/* SEEK */
1841b8bf04e1SBen Skeggs 		xf_emit(ctx, 0xe10, 0); /* 190 * 9: 8*ffffffff, 7ff */
1842b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 1ff */
1843b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 0);	/* 0? */
1844b8bf04e1SBen Skeggs 	}
1845b8bf04e1SBen Skeggs 	/* SEEK */
1846b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 GP_ENABLE */
1847b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 000000ff GP_RESULT_MAP_SIZE */
1848b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 0000007f VP_RESULT_MAP_SIZE */
1849b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x8100c12);	/* 1fffffff FP_INTERPOLANT_CTRL */
1850b8bf04e1SBen Skeggs 	if (device->chipset != 0x50)
1851b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 3);	/* 00000003 tesla UNK1100 */
1852b8bf04e1SBen Skeggs 	/* SEEK */
1853b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 GP_ENABLE */
1854b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x8100c12);	/* 1fffffff FP_INTERPOLANT_CTRL */
1855b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000000f VP_GP_BUILTIN_ATTR_EN */
1856b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x80c14);	/* 01ffffff SEMANTIC_COLOR */
1857b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 */
1858b8bf04e1SBen Skeggs 	/* SEEK */
1859b8bf04e1SBen Skeggs 	if (device->chipset >= 0xa0)
1860b8bf04e1SBen Skeggs 		xf_emit(ctx, 2, 4);	/* 000000ff */
1861b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x80c14);	/* 01ffffff SEMANTIC_COLOR */
1862b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 VERTEX_TWO_SIDE_ENABLE */
1863b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 POINT_SPRITE_ENABLE */
1864b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x8100c12);	/* 1fffffff FP_INTERPOLANT_CTRL */
1865b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x27);		/* 000000ff SEMANTIC_PRIM_ID */
1866b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 GP_ENABLE */
1867b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000000f */
1868b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 */
1869b8bf04e1SBen Skeggs 	for (i = 0; i < 10; i++) {
1870b8bf04e1SBen Skeggs 		/* SEEK */
1871b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x40, 0);		/* ffffffff */
1872b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x10, 0);		/* 3, 0, 0.... */
1873b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x10, 0);		/* ffffffff */
1874b8bf04e1SBen Skeggs 	}
1875b8bf04e1SBen Skeggs 	/* SEEK */
1876b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 POINT_SPRITE_CTRL */
1877b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 */
1878b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff */
1879b8bf04e1SBen Skeggs 	xf_emit(ctx, 4, 0);		/* ffffffff NOPERSPECTIVE_BITMAP */
1880b8bf04e1SBen Skeggs 	xf_emit(ctx, 0x10, 0);		/* 00ffffff POINT_COORD_REPLACE_MAP */
1881b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000003 WINDOW_ORIGIN */
1882b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x8100c12);	/* 1fffffff FP_INTERPOLANT_CTRL */
1883b8bf04e1SBen Skeggs 	if (device->chipset != 0x50)
1884b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 000003ff */
1885b8bf04e1SBen Skeggs }
1886b8bf04e1SBen Skeggs 
1887b8bf04e1SBen Skeggs static void
nv50_gr_construct_gene_vfetch(struct nvkm_grctx * ctx)1888e3c71eb2SBen Skeggs nv50_gr_construct_gene_vfetch(struct nvkm_grctx *ctx)
1889b8bf04e1SBen Skeggs {
1890e3c71eb2SBen Skeggs 	struct nvkm_device *device = ctx->device;
1891b8bf04e1SBen Skeggs 	int acnt = 0x10, rep, i;
1892b8bf04e1SBen Skeggs 	/* beginning of strand 1 on pre-NVA0, strand 3 on NVAx */
1893b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset))
1894b8bf04e1SBen Skeggs 		acnt = 0x20;
1895b8bf04e1SBen Skeggs 	/* SEEK */
1896b8bf04e1SBen Skeggs 	if (device->chipset >= 0xa0) {
1897b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* ffffffff tesla UNK13A4 */
1898b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 1);	/* 00000fff tesla UNK1318 */
1899b8bf04e1SBen Skeggs 	}
1900b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff VERTEX_BUFFER_FIRST */
1901b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 PRIMITIVE_RESTART_ENABLE */
1902b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 UNK0DE8 */
1903b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff PRIMITIVE_RESTART_INDEX */
1904b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0xf);		/* ffffffff VP_ATTR_EN */
1905b8bf04e1SBen Skeggs 	xf_emit(ctx, (acnt/8)-1, 0);	/* ffffffff VP_ATTR_EN */
1906b8bf04e1SBen Skeggs 	xf_emit(ctx, acnt/8, 0);	/* ffffffff VTX_ATR_MASK_UNK0DD0 */
1907b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000000f VP_GP_BUILTIN_ATTR_EN */
1908b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x20);		/* 0000ffff tesla UNK129C */
1909b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff turing UNK370??? */
1910b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000ffff turing USER_PARAM_COUNT */
1911b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff tesla UNK1A30 */
1912b8bf04e1SBen Skeggs 	/* SEEK */
1913b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset))
1914b8bf04e1SBen Skeggs 		xf_emit(ctx, 0xb, 0);	/* RO */
1915b8bf04e1SBen Skeggs 	else if (device->chipset >= 0xa0)
1916b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x9, 0);	/* RO */
1917b8bf04e1SBen Skeggs 	else
1918b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x8, 0);	/* RO */
1919b8bf04e1SBen Skeggs 	/* SEEK */
1920b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 EDGE_FLAG */
1921b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 PROVOKING_VERTEX_LAST */
1922b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 GP_ENABLE */
1923b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x1a);		/* 0000001f POLYGON_MODE */
1924b8bf04e1SBen Skeggs 	/* SEEK */
1925b8bf04e1SBen Skeggs 	xf_emit(ctx, 0xc, 0);		/* RO */
1926b8bf04e1SBen Skeggs 	/* SEEK */
1927b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 7f/ff */
1928b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 7f/ff VP_REG_ALLOC_RESULT */
1929b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 7f/ff VP_RESULT_MAP_SIZE */
1930b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000000f VP_GP_BUILTIN_ATTR_EN */
1931b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 000001ff UNK1A28 */
1932b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 8);		/* 000001ff UNK0DF0 */
1933b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 GP_ENABLE */
1934b8bf04e1SBen Skeggs 	if (device->chipset == 0x50)
1935b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0x3ff);	/* 3ff tesla UNK0D68 */
1936b8bf04e1SBen Skeggs 	else
1937b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0x7ff);	/* 7ff tesla UNK0D68 */
1938b8bf04e1SBen Skeggs 	if (device->chipset == 0xa8)
1939b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0x1e00);	/* 7fff */
1940b8bf04e1SBen Skeggs 	/* SEEK */
1941b8bf04e1SBen Skeggs 	xf_emit(ctx, 0xc, 0);		/* RO or close */
1942b8bf04e1SBen Skeggs 	/* SEEK */
1943b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0xf);		/* ffffffff VP_ATTR_EN */
1944b8bf04e1SBen Skeggs 	xf_emit(ctx, (acnt/8)-1, 0);	/* ffffffff VP_ATTR_EN */
1945b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000000f VP_GP_BUILTIN_ATTR_EN */
1946b8bf04e1SBen Skeggs 	if (device->chipset > 0x50 && device->chipset < 0xa0)
1947b8bf04e1SBen Skeggs 		xf_emit(ctx, 2, 0);	/* ffffffff */
1948b8bf04e1SBen Skeggs 	else
1949b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* ffffffff */
1950b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000003 tesla UNK0FD8 */
1951b8bf04e1SBen Skeggs 	/* SEEK */
1952b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset)) {
1953b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x10, 0);	/* 0? */
1954b8bf04e1SBen Skeggs 		xf_emit(ctx, 2, 0);	/* weird... */
1955b8bf04e1SBen Skeggs 		xf_emit(ctx, 2, 0);	/* RO */
1956b8bf04e1SBen Skeggs 	} else {
1957b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 0);	/* 0? */
1958b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* weird... */
1959b8bf04e1SBen Skeggs 		xf_emit(ctx, 2, 0);	/* RO */
1960b8bf04e1SBen Skeggs 	}
1961b8bf04e1SBen Skeggs 	/* SEEK */
1962b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff VB_ELEMENT_BASE */
1963b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff UNK1438 */
1964b8bf04e1SBen Skeggs 	xf_emit(ctx, acnt, 0);		/* 1 tesla UNK1000 */
1965b8bf04e1SBen Skeggs 	if (device->chipset >= 0xa0)
1966b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* ffffffff tesla UNK1118? */
1967b8bf04e1SBen Skeggs 	/* SEEK */
1968b8bf04e1SBen Skeggs 	xf_emit(ctx, acnt, 0);		/* ffffffff VERTEX_ARRAY_UNK90C */
1969b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* f/1f */
1970b8bf04e1SBen Skeggs 	/* SEEK */
1971b8bf04e1SBen Skeggs 	xf_emit(ctx, acnt, 0);		/* ffffffff VERTEX_ARRAY_UNK90C */
1972b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* f/1f */
1973b8bf04e1SBen Skeggs 	/* SEEK */
1974b8bf04e1SBen Skeggs 	xf_emit(ctx, acnt, 0);		/* RO */
1975b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);		/* RO */
1976b8bf04e1SBen Skeggs 	/* SEEK */
1977b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff tesla UNK111C? */
1978b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* RO */
1979b8bf04e1SBen Skeggs 	/* SEEK */
1980b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff UNK15F4_ADDRESS_HIGH */
1981b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff UNK15F4_ADDRESS_LOW */
1982b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff UNK0F84_ADDRESS_HIGH */
1983b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff UNK0F84_ADDRESS_LOW */
1984b8bf04e1SBen Skeggs 	/* SEEK */
1985b8bf04e1SBen Skeggs 	xf_emit(ctx, acnt, 0);		/* 00003fff VERTEX_ARRAY_ATTRIB_OFFSET */
1986b8bf04e1SBen Skeggs 	xf_emit(ctx, 3, 0);		/* f/1f */
1987b8bf04e1SBen Skeggs 	/* SEEK */
1988b8bf04e1SBen Skeggs 	xf_emit(ctx, acnt, 0);		/* 00000fff VERTEX_ARRAY_STRIDE */
1989b8bf04e1SBen Skeggs 	xf_emit(ctx, 3, 0);		/* f/1f */
1990b8bf04e1SBen Skeggs 	/* SEEK */
1991b8bf04e1SBen Skeggs 	xf_emit(ctx, acnt, 0);		/* ffffffff VERTEX_ARRAY_LOW */
1992b8bf04e1SBen Skeggs 	xf_emit(ctx, 3, 0);		/* f/1f */
1993b8bf04e1SBen Skeggs 	/* SEEK */
1994b8bf04e1SBen Skeggs 	xf_emit(ctx, acnt, 0);		/* 000000ff VERTEX_ARRAY_HIGH */
1995b8bf04e1SBen Skeggs 	xf_emit(ctx, 3, 0);		/* f/1f */
1996b8bf04e1SBen Skeggs 	/* SEEK */
1997b8bf04e1SBen Skeggs 	xf_emit(ctx, acnt, 0);		/* ffffffff VERTEX_LIMIT_LOW */
1998b8bf04e1SBen Skeggs 	xf_emit(ctx, 3, 0);		/* f/1f */
1999b8bf04e1SBen Skeggs 	/* SEEK */
2000b8bf04e1SBen Skeggs 	xf_emit(ctx, acnt, 0);		/* 000000ff VERTEX_LIMIT_HIGH */
2001b8bf04e1SBen Skeggs 	xf_emit(ctx, 3, 0);		/* f/1f */
2002b8bf04e1SBen Skeggs 	/* SEEK */
2003b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset)) {
2004b8bf04e1SBen Skeggs 		xf_emit(ctx, acnt, 0);		/* f */
2005b8bf04e1SBen Skeggs 		xf_emit(ctx, 3, 0);		/* f/1f */
2006b8bf04e1SBen Skeggs 	}
2007b8bf04e1SBen Skeggs 	/* SEEK */
2008b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset))
2009b8bf04e1SBen Skeggs 		xf_emit(ctx, 2, 0);	/* RO */
2010b8bf04e1SBen Skeggs 	else
2011b8bf04e1SBen Skeggs 		xf_emit(ctx, 5, 0);	/* RO */
2012b8bf04e1SBen Skeggs 	/* SEEK */
2013b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffff DMA_VTXBUF */
2014b8bf04e1SBen Skeggs 	/* SEEK */
2015b8bf04e1SBen Skeggs 	if (device->chipset < 0xa0) {
2016b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x41, 0);	/* RO */
2017b8bf04e1SBen Skeggs 		/* SEEK */
2018b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x11, 0);	/* RO */
2019b8bf04e1SBen Skeggs 	} else if (!IS_NVA3F(device->chipset))
2020b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x50, 0);	/* RO */
2021b8bf04e1SBen Skeggs 	else
2022b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x58, 0);	/* RO */
2023b8bf04e1SBen Skeggs 	/* SEEK */
2024b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0xf);		/* ffffffff VP_ATTR_EN */
2025b8bf04e1SBen Skeggs 	xf_emit(ctx, (acnt/8)-1, 0);	/* ffffffff VP_ATTR_EN */
2026b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 1 UNK0DEC */
2027b8bf04e1SBen Skeggs 	/* SEEK */
2028b8bf04e1SBen Skeggs 	xf_emit(ctx, acnt*4, 0);	/* ffffffff VTX_ATTR */
2029b8bf04e1SBen Skeggs 	xf_emit(ctx, 4, 0);		/* f/1f, 0, 0, 0 */
2030b8bf04e1SBen Skeggs 	/* SEEK */
2031b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset))
2032b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x1d, 0);	/* RO */
2033b8bf04e1SBen Skeggs 	else
2034b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x16, 0);	/* RO */
2035b8bf04e1SBen Skeggs 	/* SEEK */
2036b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0xf);		/* ffffffff VP_ATTR_EN */
2037b8bf04e1SBen Skeggs 	xf_emit(ctx, (acnt/8)-1, 0);	/* ffffffff VP_ATTR_EN */
2038b8bf04e1SBen Skeggs 	/* SEEK */
2039b8bf04e1SBen Skeggs 	if (device->chipset < 0xa0)
2040b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 0);	/* RO */
2041b8bf04e1SBen Skeggs 	else if (IS_NVA3F(device->chipset))
2042b8bf04e1SBen Skeggs 		xf_emit(ctx, 0xc, 0);	/* RO */
2043b8bf04e1SBen Skeggs 	else
2044b8bf04e1SBen Skeggs 		xf_emit(ctx, 7, 0);	/* RO */
2045b8bf04e1SBen Skeggs 	/* SEEK */
2046b8bf04e1SBen Skeggs 	xf_emit(ctx, 0xa, 0);		/* RO */
2047b8bf04e1SBen Skeggs 	if (device->chipset == 0xa0)
2048b8bf04e1SBen Skeggs 		rep = 0xc;
2049b8bf04e1SBen Skeggs 	else
2050b8bf04e1SBen Skeggs 		rep = 4;
2051b8bf04e1SBen Skeggs 	for (i = 0; i < rep; i++) {
2052b8bf04e1SBen Skeggs 		/* SEEK */
2053b8bf04e1SBen Skeggs 		if (IS_NVA3F(device->chipset))
2054b8bf04e1SBen Skeggs 			xf_emit(ctx, 0x20, 0);	/* ffffffff */
2055b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x200, 0);	/* ffffffff */
2056b8bf04e1SBen Skeggs 		xf_emit(ctx, 4, 0);	/* 7f/ff, 0, 0, 0 */
2057b8bf04e1SBen Skeggs 		xf_emit(ctx, 4, 0);	/* ffffffff */
2058b8bf04e1SBen Skeggs 	}
2059b8bf04e1SBen Skeggs 	/* SEEK */
2060b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 113/111 */
2061b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0xf);		/* ffffffff VP_ATTR_EN */
2062b8bf04e1SBen Skeggs 	xf_emit(ctx, (acnt/8)-1, 0);	/* ffffffff VP_ATTR_EN */
2063b8bf04e1SBen Skeggs 	xf_emit(ctx, acnt/8, 0);	/* ffffffff VTX_ATTR_MASK_UNK0DD0 */
2064b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000000f VP_GP_BUILTIN_ATTR_EN */
2065b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff tesla UNK1A30 */
2066b8bf04e1SBen Skeggs 	/* SEEK */
2067b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset))
2068b8bf04e1SBen Skeggs 		xf_emit(ctx, 7, 0);	/* weird... */
2069b8bf04e1SBen Skeggs 	else
2070b8bf04e1SBen Skeggs 		xf_emit(ctx, 5, 0);	/* weird... */
2071b8bf04e1SBen Skeggs }
2072b8bf04e1SBen Skeggs 
2073b8bf04e1SBen Skeggs static void
nv50_gr_construct_gene_eng2d(struct nvkm_grctx * ctx)2074e3c71eb2SBen Skeggs nv50_gr_construct_gene_eng2d(struct nvkm_grctx *ctx)
2075b8bf04e1SBen Skeggs {
2076e3c71eb2SBen Skeggs 	struct nvkm_device *device = ctx->device;
2077b8bf04e1SBen Skeggs 	/* middle of strand 1 on pre-NVA0 [after vfetch], middle of strand 6 on NVAx */
2078b8bf04e1SBen Skeggs 	/* SEEK */
2079b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);		/* 0001ffff CLIP_X, CLIP_Y */
2080b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);		/* 0000ffff CLIP_W, CLIP_H */
2081b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 CLIP_ENABLE */
2082b8bf04e1SBen Skeggs 	if (device->chipset < 0xa0) {
2083b8bf04e1SBen Skeggs 		/* this is useless on everything but the original NV50,
2084b8bf04e1SBen Skeggs 		 * guess they forgot to nuke it. Or just didn't bother. */
2085b8bf04e1SBen Skeggs 		xf_emit(ctx, 2, 0);	/* 0000ffff IFC_CLIP_X, Y */
2086b8bf04e1SBen Skeggs 		xf_emit(ctx, 2, 1);	/* 0000ffff IFC_CLIP_W, H */
2087b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000001 IFC_CLIP_ENABLE */
2088b8bf04e1SBen Skeggs 	}
2089b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 DST_LINEAR */
2090b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x100);		/* 0001ffff DST_WIDTH */
2091b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x100);		/* 0001ffff DST_HEIGHT */
2092b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x11);		/* 3f[NV50]/7f[NV84+] DST_FORMAT */
2093b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0001ffff DRAW_POINT_X */
2094b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 8);		/* 0000000f DRAW_UNK58C */
2095b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000fffff SIFC_DST_X_FRACT */
2096b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0001ffff SIFC_DST_X_INT */
2097b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000fffff SIFC_DST_Y_FRACT */
2098b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0001ffff SIFC_DST_Y_INT */
2099b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000fffff SIFC_DX_DU_FRACT */
2100b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 0001ffff SIFC_DX_DU_INT */
2101b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000fffff SIFC_DY_DV_FRACT */
2102b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 0001ffff SIFC_DY_DV_INT */
2103b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 0000ffff SIFC_WIDTH */
2104b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 0000ffff SIFC_HEIGHT */
2105b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0xcf);		/* 000000ff SIFC_FORMAT */
2106b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 2);		/* 00000003 SIFC_BITMAP_UNK808 */
2107b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000003 SIFC_BITMAP_LINE_PACK_MODE */
2108b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 SIFC_BITMAP_LSB_FIRST */
2109b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 SIFC_BITMAP_ENABLE */
2110b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000ffff BLIT_DST_X */
2111b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000ffff BLIT_DST_Y */
2112b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000fffff BLIT_DU_DX_FRACT */
2113b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 0001ffff BLIT_DU_DX_INT */
2114b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000fffff BLIT_DV_DY_FRACT */
2115b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 0001ffff BLIT_DV_DY_INT */
2116b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 0000ffff BLIT_DST_W */
2117b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 0000ffff BLIT_DST_H */
2118b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000fffff BLIT_SRC_X_FRACT */
2119b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0001ffff BLIT_SRC_X_INT */
2120b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000fffff BLIT_SRC_Y_FRACT */
2121b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 UNK888 */
2122b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 0000003f UNK884 */
2123b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 UNK880 */
2124b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 0000001f tesla UNK0FB8 */
2125b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x15);		/* 000000ff tesla UNK128C */
2126b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);		/* 00000007, ffff0ff3 */
2127b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 UNK260 */
2128b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x4444480);	/* 1fffffff UNK870 */
2129b8bf04e1SBen Skeggs 	/* SEEK */
2130b8bf04e1SBen Skeggs 	xf_emit(ctx, 0x10, 0);
2131b8bf04e1SBen Skeggs 	/* SEEK */
2132b8bf04e1SBen Skeggs 	xf_emit(ctx, 0x27, 0);
2133b8bf04e1SBen Skeggs }
2134b8bf04e1SBen Skeggs 
2135b8bf04e1SBen Skeggs static void
nv50_gr_construct_gene_csched(struct nvkm_grctx * ctx)2136e3c71eb2SBen Skeggs nv50_gr_construct_gene_csched(struct nvkm_grctx *ctx)
2137b8bf04e1SBen Skeggs {
2138e3c71eb2SBen Skeggs 	struct nvkm_device *device = ctx->device;
2139b8bf04e1SBen Skeggs 	/* middle of strand 1 on pre-NVA0 [after eng2d], middle of strand 0 on NVAx */
2140b8bf04e1SBen Skeggs 	/* SEEK */
2141b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);		/* 00007fff WINDOW_OFFSET_XY... what is it doing here??? */
2142b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 tesla UNK1924 */
2143b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000003 WINDOW_ORIGIN */
2144b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x8100c12);	/* 1fffffff FP_INTERPOLANT_CTRL */
2145b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000003ff */
2146b8bf04e1SBen Skeggs 	/* SEEK */
2147b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff turing UNK364 */
2148b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000000f turing UNK36C */
2149b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000ffff USER_PARAM_COUNT */
2150b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x100);		/* 00ffffff turing UNK384 */
2151b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000000f turing UNK2A0 */
2152b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000ffff GRIDID */
2153b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x10001);	/* ffffffff GRIDDIM_XY */
2154b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff */
2155b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x10001);	/* ffffffff BLOCKDIM_XY */
2156b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 0000ffff BLOCKDIM_Z */
2157b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x10001);	/* 00ffffff BLOCK_ALLOC */
2158b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 LANES32 */
2159b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 000000ff FP_REG_ALLOC_TEMP */
2160b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 2);		/* 00000003 REG_MODE */
2161b8bf04e1SBen Skeggs 	/* SEEK */
2162b8bf04e1SBen Skeggs 	xf_emit(ctx, 0x40, 0);		/* ffffffff USER_PARAM */
2163b8bf04e1SBen Skeggs 	switch (device->chipset) {
2164b8bf04e1SBen Skeggs 	case 0x50:
2165b8bf04e1SBen Skeggs 	case 0x92:
2166b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 0);	/* 7, 0, 0, 0, ... */
2167b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x80, 0);	/* fff */
2168b8bf04e1SBen Skeggs 		xf_emit(ctx, 2, 0);	/* ff, fff */
2169b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x10*2, 0);	/* ffffffff, 1f */
2170b8bf04e1SBen Skeggs 		break;
2171b8bf04e1SBen Skeggs 	case 0x84:
2172b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 0);	/* 7, 0, 0, 0, ... */
2173b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x60, 0);	/* fff */
2174b8bf04e1SBen Skeggs 		xf_emit(ctx, 2, 0);	/* ff, fff */
2175b8bf04e1SBen Skeggs 		xf_emit(ctx, 0xc*2, 0);	/* ffffffff, 1f */
2176b8bf04e1SBen Skeggs 		break;
2177b8bf04e1SBen Skeggs 	case 0x94:
2178b8bf04e1SBen Skeggs 	case 0x96:
2179b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 0);	/* 7, 0, 0, 0, ... */
2180b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x40, 0);	/* fff */
2181b8bf04e1SBen Skeggs 		xf_emit(ctx, 2, 0);	/* ff, fff */
2182b8bf04e1SBen Skeggs 		xf_emit(ctx, 8*2, 0);	/* ffffffff, 1f */
2183b8bf04e1SBen Skeggs 		break;
2184b8bf04e1SBen Skeggs 	case 0x86:
2185b8bf04e1SBen Skeggs 	case 0x98:
2186b8bf04e1SBen Skeggs 		xf_emit(ctx, 4, 0);	/* f, 0, 0, 0 */
2187b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x10, 0);	/* fff */
2188b8bf04e1SBen Skeggs 		xf_emit(ctx, 2, 0);	/* ff, fff */
2189b8bf04e1SBen Skeggs 		xf_emit(ctx, 2*2, 0);	/* ffffffff, 1f */
2190b8bf04e1SBen Skeggs 		break;
2191b8bf04e1SBen Skeggs 	case 0xa0:
2192b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 0);	/* 7, 0, 0, 0, ... */
2193b8bf04e1SBen Skeggs 		xf_emit(ctx, 0xf0, 0);	/* fff */
2194b8bf04e1SBen Skeggs 		xf_emit(ctx, 2, 0);	/* ff, fff */
2195b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x1e*2, 0);	/* ffffffff, 1f */
2196b8bf04e1SBen Skeggs 		break;
2197b8bf04e1SBen Skeggs 	case 0xa3:
2198b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 0);	/* 7, 0, 0, 0, ... */
2199b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x60, 0);	/* fff */
2200b8bf04e1SBen Skeggs 		xf_emit(ctx, 2, 0);	/* ff, fff */
2201b8bf04e1SBen Skeggs 		xf_emit(ctx, 0xc*2, 0);	/* ffffffff, 1f */
2202b8bf04e1SBen Skeggs 		break;
2203b8bf04e1SBen Skeggs 	case 0xa5:
2204b8bf04e1SBen Skeggs 	case 0xaf:
2205b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 0);	/* 7, 0, 0, 0, ... */
2206b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x30, 0);	/* fff */
2207b8bf04e1SBen Skeggs 		xf_emit(ctx, 2, 0);	/* ff, fff */
2208b8bf04e1SBen Skeggs 		xf_emit(ctx, 6*2, 0);	/* ffffffff, 1f */
2209b8bf04e1SBen Skeggs 		break;
2210b8bf04e1SBen Skeggs 	case 0xaa:
2211b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x12, 0);
2212b8bf04e1SBen Skeggs 		break;
2213b8bf04e1SBen Skeggs 	case 0xa8:
2214b8bf04e1SBen Skeggs 	case 0xac:
2215b8bf04e1SBen Skeggs 		xf_emit(ctx, 4, 0);	/* f, 0, 0, 0 */
2216b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x10, 0);	/* fff */
2217b8bf04e1SBen Skeggs 		xf_emit(ctx, 2, 0);	/* ff, fff */
2218b8bf04e1SBen Skeggs 		xf_emit(ctx, 2*2, 0);	/* ffffffff, 1f */
2219b8bf04e1SBen Skeggs 		break;
2220b8bf04e1SBen Skeggs 	}
2221b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000000f */
2222b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000000 */
2223b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff */
2224b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000001f */
2225b8bf04e1SBen Skeggs 	xf_emit(ctx, 4, 0);		/* ffffffff */
2226b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000003 turing UNK35C */
2227b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff */
2228b8bf04e1SBen Skeggs 	xf_emit(ctx, 4, 0);		/* ffffffff */
2229b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000003 turing UNK35C */
2230b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff */
2231b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff */
2232b8bf04e1SBen Skeggs }
2233b8bf04e1SBen Skeggs 
2234b8bf04e1SBen Skeggs static void
nv50_gr_construct_gene_unk1cxx(struct nvkm_grctx * ctx)2235e3c71eb2SBen Skeggs nv50_gr_construct_gene_unk1cxx(struct nvkm_grctx *ctx)
2236b8bf04e1SBen Skeggs {
2237e3c71eb2SBen Skeggs 	struct nvkm_device *device = ctx->device;
2238b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);		/* 00007fff WINDOW_OFFSET_XY */
2239b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x3f800000);	/* ffffffff LINE_WIDTH */
2240b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 LINE_SMOOTH_ENABLE */
2241b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 tesla UNK1658 */
2242b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 POLYGON_SMOOTH_ENABLE */
2243b8bf04e1SBen Skeggs 	xf_emit(ctx, 3, 0);		/* 00000001 POLYGON_OFFSET_*_ENABLE */
2244b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 0000000f CULL_MODE */
2245b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x1a);		/* 0000001f POLYGON_MODE */
2246b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000000f ZETA_FORMAT */
2247b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 POINT_SPRITE_ENABLE */
2248b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 tesla UNK165C */
2249b8bf04e1SBen Skeggs 	xf_emit(ctx, 0x10, 0);		/* 00000001 SCISSOR_ENABLE */
2250b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 tesla UNK1534 */
2251b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 LINE_STIPPLE_ENABLE */
2252b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x00ffff00);	/* 00ffffff LINE_STIPPLE_PATTERN */
2253b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff POLYGON_OFFSET_UNITS */
2254b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff POLYGON_OFFSET_FACTOR */
2255b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000003 tesla UNK1668 */
2256b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);		/* 07ffffff SCREEN_SCISSOR */
2257b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 tesla UNK1900 */
2258b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0xf);		/* 0000000f COLOR_MASK */
2259b8bf04e1SBen Skeggs 	xf_emit(ctx, 7, 0);		/* 0000000f COLOR_MASK */
2260b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x0fac6881);	/* 0fffffff RT_CONTROL */
2261b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x11);		/* 0000007f RT_FORMAT */
2262b8bf04e1SBen Skeggs 	xf_emit(ctx, 7, 0);		/* 0000007f RT_FORMAT */
2263b8bf04e1SBen Skeggs 	xf_emit(ctx, 8, 0);		/* 00000001 RT_HORIZ_LINEAR */
2264b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 00000007 FP_CONTROL */
2265b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 ALPHA_TEST_ENABLE */
2266b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 ALPHA_TEST_FUNC */
2267b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset))
2268b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 3);	/* 00000003 UNK16B4 */
2269b8bf04e1SBen Skeggs 	else if (device->chipset >= 0xa0)
2270b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 1);	/* 00000001 UNK16B4 */
2271b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000003 MULTISAMPLE_CTRL */
2272b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000003 tesla UNK0F90 */
2273b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 2);		/* 00000003 tesla UNK143C */
2274b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0x04000000);	/* 07ffffff tesla UNK0D6C */
2275b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff STENCIL_FRONT_MASK */
2276b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 DEPTH_WRITE_ENABLE */
2277b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 SAMPLECNT_ENABLE */
2278b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 5);		/* 0000000f UNK1408 */
2279b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x52);		/* 000001ff SEMANTIC_PTSZ */
2280b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff POINT_SIZE */
2281b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 */
2282b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 tesla UNK0FB4 */
2283b8bf04e1SBen Skeggs 	if (device->chipset != 0x50) {
2284b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 3ff */
2285b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 1);	/* 00000001 tesla UNK1110 */
2286b8bf04e1SBen Skeggs 	}
2287b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset))
2288b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000003 tesla UNK1928 */
2289b8bf04e1SBen Skeggs 	xf_emit(ctx, 0x10, 0);		/* ffffffff DEPTH_RANGE_NEAR */
2290b8bf04e1SBen Skeggs 	xf_emit(ctx, 0x10, 0x3f800000);	/* ffffffff DEPTH_RANGE_FAR */
2291b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x10);		/* 000000ff VIEW_VOLUME_CLIP_CTRL */
2292b8bf04e1SBen Skeggs 	xf_emit(ctx, 0x20, 0);		/* 07ffffff VIEWPORT_HORIZ, then VIEWPORT_VERT. (W&0x3fff)<<13 | (X&0x1fff). */
2293b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff tesla UNK187C */
2294b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000003 WINDOW_ORIGIN */
2295b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 STENCIL_FRONT_ENABLE */
2296b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 DEPTH_TEST_ENABLE */
2297b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 STENCIL_BACK_ENABLE */
2298b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff STENCIL_BACK_MASK */
2299b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x8100c12);	/* 1fffffff FP_INTERPOLANT_CTRL */
2300b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 5);		/* 0000000f tesla UNK1220 */
2301b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 MULTISAMPLE_SAMPLES_LOG2 */
2302b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff tesla UNK1A20 */
2303b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 ZETA_ENABLE */
2304b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 VERTEX_TWO_SIDE_ENABLE */
2305b8bf04e1SBen Skeggs 	xf_emit(ctx, 4, 0xffff);	/* 0000ffff MSAA_MASK */
2306b8bf04e1SBen Skeggs 	if (device->chipset != 0x50)
2307b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 3);	/* 00000003 tesla UNK1100 */
2308b8bf04e1SBen Skeggs 	if (device->chipset < 0xa0)
2309b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x1c, 0);	/* RO */
2310b8bf04e1SBen Skeggs 	else if (IS_NVA3F(device->chipset))
2311b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x9, 0);
2312b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 UNK1534 */
2313b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 LINE_SMOOTH_ENABLE */
2314b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 LINE_STIPPLE_ENABLE */
2315b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x00ffff00);	/* 00ffffff LINE_STIPPLE_PATTERN */
2316b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x1a);		/* 0000001f POLYGON_MODE */
2317b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000003 WINDOW_ORIGIN */
2318b8bf04e1SBen Skeggs 	if (device->chipset != 0x50) {
2319b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 3);	/* 00000003 tesla UNK1100 */
2320b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 3ff */
2321b8bf04e1SBen Skeggs 	}
2322b8bf04e1SBen Skeggs 	/* XXX: the following block could belong either to unk1cxx, or
2323b8bf04e1SBen Skeggs 	 * to STRMOUT. Rather hard to tell. */
2324b8bf04e1SBen Skeggs 	if (device->chipset < 0xa0)
2325b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x25, 0);
2326b8bf04e1SBen Skeggs 	else
2327b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x3b, 0);
2328b8bf04e1SBen Skeggs }
2329b8bf04e1SBen Skeggs 
2330b8bf04e1SBen Skeggs static void
nv50_gr_construct_gene_strmout(struct nvkm_grctx * ctx)2331e3c71eb2SBen Skeggs nv50_gr_construct_gene_strmout(struct nvkm_grctx *ctx)
2332b8bf04e1SBen Skeggs {
2333e3c71eb2SBen Skeggs 	struct nvkm_device *device = ctx->device;
2334b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x102);		/* 0000ffff STRMOUT_BUFFER_CTRL */
2335b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff STRMOUT_PRIMITIVE_COUNT */
2336b8bf04e1SBen Skeggs 	xf_emit(ctx, 4, 4);		/* 000000ff STRMOUT_NUM_ATTRIBS */
2337b8bf04e1SBen Skeggs 	if (device->chipset >= 0xa0) {
2338b8bf04e1SBen Skeggs 		xf_emit(ctx, 4, 0);	/* ffffffff UNK1A8C */
2339b8bf04e1SBen Skeggs 		xf_emit(ctx, 4, 0);	/* ffffffff UNK1780 */
2340b8bf04e1SBen Skeggs 	}
2341b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 000000ff GP_RESULT_MAP_SIZE */
2342b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 0000007f VP_RESULT_MAP_SIZE */
2343b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 GP_ENABLE */
2344b8bf04e1SBen Skeggs 	if (device->chipset == 0x50)
2345b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0x3ff);	/* 000003ff tesla UNK0D68 */
2346b8bf04e1SBen Skeggs 	else
2347b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0x7ff);	/* 000007ff tesla UNK0D68 */
2348b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff tesla UNK1A30 */
2349b8bf04e1SBen Skeggs 	/* SEEK */
2350b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x102);		/* 0000ffff STRMOUT_BUFFER_CTRL */
2351b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff STRMOUT_PRIMITIVE_COUNT */
2352b8bf04e1SBen Skeggs 	xf_emit(ctx, 4, 0);		/* 000000ff STRMOUT_ADDRESS_HIGH */
2353b8bf04e1SBen Skeggs 	xf_emit(ctx, 4, 0);		/* ffffffff STRMOUT_ADDRESS_LOW */
2354b8bf04e1SBen Skeggs 	xf_emit(ctx, 4, 4);		/* 000000ff STRMOUT_NUM_ATTRIBS */
2355b8bf04e1SBen Skeggs 	if (device->chipset >= 0xa0) {
2356b8bf04e1SBen Skeggs 		xf_emit(ctx, 4, 0);	/* ffffffff UNK1A8C */
2357b8bf04e1SBen Skeggs 		xf_emit(ctx, 4, 0);	/* ffffffff UNK1780 */
2358b8bf04e1SBen Skeggs 	}
2359b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000ffff DMA_STRMOUT */
2360b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000ffff DMA_QUERY */
2361b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff QUERY_ADDRESS_HIGH */
2362b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);		/* ffffffff QUERY_ADDRESS_LOW QUERY_COUNTER */
2363b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);		/* ffffffff */
2364b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff tesla UNK1A30 */
2365b8bf04e1SBen Skeggs 	/* SEEK */
2366b8bf04e1SBen Skeggs 	xf_emit(ctx, 0x20, 0);		/* ffffffff STRMOUT_MAP */
2367b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000000f */
2368b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000000? */
2369b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);		/* ffffffff */
2370b8bf04e1SBen Skeggs }
2371b8bf04e1SBen Skeggs 
2372b8bf04e1SBen Skeggs static void
nv50_gr_construct_gene_ropm1(struct nvkm_grctx * ctx)2373e3c71eb2SBen Skeggs nv50_gr_construct_gene_ropm1(struct nvkm_grctx *ctx)
2374b8bf04e1SBen Skeggs {
2375e3c71eb2SBen Skeggs 	struct nvkm_device *device = ctx->device;
2376b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x4e3bfdf);	/* ffffffff UNK0D64 */
2377b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x4e3bfdf);	/* ffffffff UNK0DF4 */
2378b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 */
2379b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000003ff */
2380b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset))
2381b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0x11);	/* 000000ff tesla UNK1968 */
2382b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff tesla UNK1A3C */
2383b8bf04e1SBen Skeggs }
2384b8bf04e1SBen Skeggs 
2385b8bf04e1SBen Skeggs static void
nv50_gr_construct_gene_ropm2(struct nvkm_grctx * ctx)2386e3c71eb2SBen Skeggs nv50_gr_construct_gene_ropm2(struct nvkm_grctx *ctx)
2387b8bf04e1SBen Skeggs {
2388e3c71eb2SBen Skeggs 	struct nvkm_device *device = ctx->device;
2389b8bf04e1SBen Skeggs 	/* SEEK */
2390b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000ffff DMA_QUERY */
2391b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x0fac6881);	/* 0fffffff RT_CONTROL */
2392b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);		/* ffffffff */
2393b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff QUERY_ADDRESS_HIGH */
2394b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);		/* ffffffff QUERY_ADDRESS_LOW, COUNTER */
2395b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 SAMPLECNT_ENABLE */
2396b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 7 */
2397b8bf04e1SBen Skeggs 	/* SEEK */
2398b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000ffff DMA_QUERY */
2399b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff QUERY_ADDRESS_HIGH */
2400b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);		/* ffffffff QUERY_ADDRESS_LOW, COUNTER */
2401b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x4e3bfdf);	/* ffffffff UNK0D64 */
2402b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x4e3bfdf);	/* ffffffff UNK0DF4 */
2403b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 eng2d UNK260 */
2404b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ff/3ff */
2405b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 */
2406b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset))
2407b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0x11);	/* 000000ff tesla UNK1968 */
2408b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff tesla UNK1A3C */
2409b8bf04e1SBen Skeggs }
2410b8bf04e1SBen Skeggs 
2411b8bf04e1SBen Skeggs static void
nv50_gr_construct_gene_ropc(struct nvkm_grctx * ctx)2412e3c71eb2SBen Skeggs nv50_gr_construct_gene_ropc(struct nvkm_grctx *ctx)
2413b8bf04e1SBen Skeggs {
2414e3c71eb2SBen Skeggs 	struct nvkm_device *device = ctx->device;
2415b8bf04e1SBen Skeggs 	int magic2;
2416b8bf04e1SBen Skeggs 	if (device->chipset == 0x50) {
2417b8bf04e1SBen Skeggs 		magic2 = 0x00003e60;
2418b8bf04e1SBen Skeggs 	} else if (!IS_NVA3F(device->chipset)) {
2419b8bf04e1SBen Skeggs 		magic2 = 0x001ffe67;
2420b8bf04e1SBen Skeggs 	} else {
2421b8bf04e1SBen Skeggs 		magic2 = 0x00087e67;
2422b8bf04e1SBen Skeggs 	}
2423b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* f/7 MUTISAMPLE_SAMPLES_LOG2 */
2424b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 tesla UNK1534 */
2425b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 STENCIL_BACK_FUNC_FUNC */
2426b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff STENCIL_BACK_FUNC_MASK */
2427b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff STENCIL_BACK_MASK */
2428b8bf04e1SBen Skeggs 	xf_emit(ctx, 3, 0);		/* 00000007 STENCIL_BACK_OP_FAIL, ZFAIL, ZPASS */
2429b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 2);		/* 00000003 tesla UNK143C */
2430b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffff0ff3 */
2431b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, magic2);	/* 001fffff tesla UNK0F78 */
2432b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 DEPTH_BOUNDS_EN */
2433b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 DEPTH_TEST_FUNC */
2434b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 DEPTH_TEST_ENABLE */
2435b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 DEPTH_WRITE_ENABLE */
2436b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset))
2437b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 1);	/* 0000001f tesla UNK169C */
2438b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 STENCIL_FRONT_FUNC_FUNC */
2439b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff STENCIL_FRONT_FUNC_MASK */
2440b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff STENCIL_FRONT_MASK */
2441b8bf04e1SBen Skeggs 	xf_emit(ctx, 3, 0);		/* 00000007 STENCIL_FRONT_OP_FAIL, ZFAIL, ZPASS */
2442b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 STENCIL_FRONT_ENABLE */
2443b8bf04e1SBen Skeggs 	if (device->chipset >= 0xa0 && !IS_NVAAF(device->chipset))
2444b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0x15);	/* 000000ff */
2445b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 STENCIL_BACK_ENABLE */
2446b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 tesla UNK15B4 */
2447b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x10);		/* 3ff/ff VIEW_VOLUME_CLIP_CTRL */
2448b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff CLEAR_DEPTH */
2449b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000000f ZETA_FORMAT */
2450b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 ZETA_ENABLE */
2451b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff tesla UNK1A3C */
2452b8bf04e1SBen Skeggs 	if (device->chipset == 0x86 || device->chipset == 0x92 || device->chipset == 0x98 || device->chipset >= 0xa0) {
2453b8bf04e1SBen Skeggs 		xf_emit(ctx, 3, 0);	/* ff, ffffffff, ffffffff */
2454b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 4);	/* 7 */
2455b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0x400);	/* fffffff */
2456b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0x300);	/* ffff */
2457b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0x1001);	/* 1fff */
2458b8bf04e1SBen Skeggs 		if (device->chipset != 0xa0) {
2459b8bf04e1SBen Skeggs 			if (IS_NVA3F(device->chipset))
2460b8bf04e1SBen Skeggs 				xf_emit(ctx, 1, 0);	/* 0000000f UNK15C8 */
2461b8bf04e1SBen Skeggs 			else
2462b8bf04e1SBen Skeggs 				xf_emit(ctx, 1, 0x15);	/* ff */
2463b8bf04e1SBen Skeggs 		}
2464b8bf04e1SBen Skeggs 	}
2465b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 MULTISAMPLE_SAMPLES_LOG2 */
2466b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 tesla UNK1534 */
2467b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 STENCIL_BACK_FUNC_FUNC */
2468b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff STENCIL_BACK_FUNC_MASK */
2469b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffff0ff3 */
2470b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 2);		/* 00000003 tesla UNK143C */
2471b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 DEPTH_BOUNDS_EN */
2472b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 DEPTH_TEST_FUNC */
2473b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 DEPTH_TEST_ENABLE */
2474b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 DEPTH_WRITE_ENABLE */
2475b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 STENCIL_FRONT_FUNC_FUNC */
2476b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff STENCIL_FRONT_FUNC_MASK */
2477b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 STENCIL_FRONT_ENABLE */
2478b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 STENCIL_BACK_ENABLE */
2479b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 tesla UNK15B4 */
2480b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x10);		/* 7f/ff VIEW_VOLUME_CLIP_CTRL */
2481b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000000f ZETA_FORMAT */
2482b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 ZETA_ENABLE */
2483b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff tesla UNK1A3C */
2484b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 tesla UNK1534 */
2485b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 tesla UNK1900 */
2486b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 STENCIL_BACK_FUNC_FUNC */
2487b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff STENCIL_BACK_FUNC_MASK */
2488b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff STENCIL_BACK_FUNC_REF */
2489b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);		/* ffffffff DEPTH_BOUNDS */
2490b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 DEPTH_BOUNDS_EN */
2491b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 DEPTH_TEST_FUNC */
2492b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 DEPTH_TEST_ENABLE */
2493b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 DEPTH_WRITE_ENABLE */
2494b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000000f */
2495b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 tesla UNK0FB0 */
2496b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 STENCIL_FRONT_FUNC_FUNC */
2497b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff STENCIL_FRONT_FUNC_MASK */
2498b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff STENCIL_FRONT_FUNC_REF */
2499b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 STENCIL_FRONT_ENABLE */
2500b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 STENCIL_BACK_ENABLE */
2501b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x10);		/* 7f/ff VIEW_VOLUME_CLIP_CTRL */
2502b8bf04e1SBen Skeggs 	xf_emit(ctx, 0x10, 0);		/* ffffffff DEPTH_RANGE_NEAR */
2503b8bf04e1SBen Skeggs 	xf_emit(ctx, 0x10, 0x3f800000);	/* ffffffff DEPTH_RANGE_FAR */
2504b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000000f ZETA_FORMAT */
2505b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 MULTISAMPLE_SAMPLES_LOG2 */
2506b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 STENCIL_BACK_FUNC_FUNC */
2507b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff STENCIL_BACK_FUNC_MASK */
2508b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff STENCIL_BACK_FUNC_REF */
2509b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff STENCIL_BACK_MASK */
2510b8bf04e1SBen Skeggs 	xf_emit(ctx, 3, 0);		/* 00000007 STENCIL_BACK_OP_FAIL, ZFAIL, ZPASS */
2511b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);		/* ffffffff DEPTH_BOUNDS */
2512b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 DEPTH_BOUNDS_EN */
2513b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 DEPTH_TEST_FUNC */
2514b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 DEPTH_TEST_ENABLE */
2515b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 DEPTH_WRITE_ENABLE */
2516b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff CLEAR_STENCIL */
2517b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 STENCIL_FRONT_FUNC_FUNC */
2518b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff STENCIL_FRONT_FUNC_MASK */
2519b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff STENCIL_FRONT_FUNC_REF */
2520b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff STENCIL_FRONT_MASK */
2521b8bf04e1SBen Skeggs 	xf_emit(ctx, 3, 0);		/* 00000007 STENCIL_FRONT_OP_FAIL, ZFAIL, ZPASS */
2522b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 STENCIL_FRONT_ENABLE */
2523b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 STENCIL_BACK_ENABLE */
2524b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x10);		/* 7f/ff VIEW_VOLUME_CLIP_CTRL */
2525b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000000f ZETA_FORMAT */
2526b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x3f);		/* 0000003f UNK1590 */
2527b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 MULTISAMPLE_SAMPLES_LOG2 */
2528b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 tesla UNK1534 */
2529b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);		/* ffff0ff3, ffff */
2530b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 tesla UNK0FB0 */
2531b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0001ffff GP_BUILTIN_RESULT_EN */
2532b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 tesla UNK15B4 */
2533b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000000f ZETA_FORMAT */
2534b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 ZETA_ENABLE */
2535b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff CLEAR_DEPTH */
2536b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 tesla UNK19CC */
2537b8bf04e1SBen Skeggs 	if (device->chipset >= 0xa0) {
2538b8bf04e1SBen Skeggs 		xf_emit(ctx, 2, 0);
2539b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0x1001);
2540b8bf04e1SBen Skeggs 		xf_emit(ctx, 0xb, 0);
2541b8bf04e1SBen Skeggs 	} else {
2542b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000007 */
2543b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000001 tesla UNK1534 */
2544b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000007 MULTISAMPLE_SAMPLES_LOG2 */
2545b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 0);	/* 00000001 BLEND_ENABLE */
2546b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* ffff0ff3 */
2547b8bf04e1SBen Skeggs 	}
2548b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x11);		/* 3f/7f RT_FORMAT */
2549b8bf04e1SBen Skeggs 	xf_emit(ctx, 7, 0);		/* 3f/7f RT_FORMAT */
2550b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0xf);		/* 0000000f COLOR_MASK */
2551b8bf04e1SBen Skeggs 	xf_emit(ctx, 7, 0);		/* 0000000f COLOR_MASK */
2552b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x11);		/* 3f/7f */
2553b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 LOGIC_OP_ENABLE */
2554b8bf04e1SBen Skeggs 	if (device->chipset != 0x50) {
2555b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 0000000f LOGIC_OP */
2556b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 000000ff */
2557b8bf04e1SBen Skeggs 	}
2558b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 OPERATION */
2559b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ff/3ff */
2560b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000003 UNK0F90 */
2561b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 1);		/* 00000007 BLEND_EQUATION_RGB, ALPHA */
2562b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 UNK133C */
2563b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 2);		/* 0000001f BLEND_FUNC_SRC_RGB */
2564b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 0000001f BLEND_FUNC_DST_RGB */
2565b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 2);		/* 0000001f BLEND_FUNC_SRC_ALPHA */
2566b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 0000001f BLEND_FUNC_DST_ALPHA */
2567b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 */
2568b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, magic2);	/* 001fffff tesla UNK0F78 */
2569b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff tesla UNK1A3C */
2570b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x0fac6881);	/* 0fffffff RT_CONTROL */
2571b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset)) {
2572b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000001 tesla UNK12E4 */
2573b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 1);	/* 00000007 IBLEND_EQUATION_RGB */
2574b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 1);	/* 00000007 IBLEND_EQUATION_ALPHA */
2575b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 1);	/* 00000001 IBLEND_UNK00 */
2576b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 2);	/* 0000001f IBLEND_FUNC_SRC_RGB */
2577b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 1);	/* 0000001f IBLEND_FUNC_DST_RGB */
2578b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 2);	/* 0000001f IBLEND_FUNC_SRC_ALPHA */
2579b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 1);	/* 0000001f IBLEND_FUNC_DST_ALPHA */
2580b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000001 tesla UNK1140 */
2581b8bf04e1SBen Skeggs 		xf_emit(ctx, 2, 0);	/* 00000001 */
2582b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 1);	/* 0000001f tesla UNK169C */
2583b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 0000000f */
2584b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000003 */
2585b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* ffffffff */
2586b8bf04e1SBen Skeggs 		xf_emit(ctx, 2, 0);	/* 00000001 */
2587b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 1);	/* 0000001f tesla UNK169C */
2588b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000001 */
2589b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 000003ff */
2590b8bf04e1SBen Skeggs 	} else if (device->chipset >= 0xa0) {
2591b8bf04e1SBen Skeggs 		xf_emit(ctx, 2, 0);	/* 00000001 */
2592b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000007 */
2593b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000003 */
2594b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* ffffffff */
2595b8bf04e1SBen Skeggs 		xf_emit(ctx, 2, 0);	/* 00000001 */
2596b8bf04e1SBen Skeggs 	} else {
2597b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000007 MULTISAMPLE_SAMPLES_LOG2 */
2598b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000003 tesla UNK1430 */
2599b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* ffffffff tesla UNK1A3C */
2600b8bf04e1SBen Skeggs 	}
2601b8bf04e1SBen Skeggs 	xf_emit(ctx, 4, 0);		/* ffffffff CLEAR_COLOR */
2602b8bf04e1SBen Skeggs 	xf_emit(ctx, 4, 0);		/* ffffffff BLEND_COLOR A R G B */
2603b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000fff eng2d UNK2B0 */
2604b8bf04e1SBen Skeggs 	if (device->chipset >= 0xa0)
2605b8bf04e1SBen Skeggs 		xf_emit(ctx, 2, 0);	/* 00000001 */
2606b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000003ff */
2607b8bf04e1SBen Skeggs 	xf_emit(ctx, 8, 0);		/* 00000001 BLEND_ENABLE */
2608b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 UNK133C */
2609b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 2);		/* 0000001f BLEND_FUNC_SRC_RGB */
2610b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 0000001f BLEND_FUNC_DST_RGB */
2611b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000007 BLEND_EQUATION_RGB */
2612b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 2);		/* 0000001f BLEND_FUNC_SRC_ALPHA */
2613b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 0000001f BLEND_FUNC_DST_ALPHA */
2614b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000007 BLEND_EQUATION_ALPHA */
2615b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 UNK19C0 */
2616b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 LOGIC_OP_ENABLE */
2617b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000000f LOGIC_OP */
2618b8bf04e1SBen Skeggs 	if (device->chipset >= 0xa0)
2619b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000001 UNK12E4? NVA3+ only? */
2620b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset)) {
2621b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 1);	/* 00000001 IBLEND_UNK00 */
2622b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 1);	/* 00000007 IBLEND_EQUATION_RGB */
2623b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 2);	/* 0000001f IBLEND_FUNC_SRC_RGB */
2624b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 1);	/* 0000001f IBLEND_FUNC_DST_RGB */
2625b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 1);	/* 00000007 IBLEND_EQUATION_ALPHA */
2626b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 2);	/* 0000001f IBLEND_FUNC_SRC_ALPHA */
2627b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 1);	/* 0000001f IBLEND_FUNC_DST_ALPHA */
2628b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000001 tesla UNK15C4 */
2629b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000001 */
2630b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000001 tesla UNK1140 */
2631b8bf04e1SBen Skeggs 	}
2632b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x11);		/* 3f/7f DST_FORMAT */
2633b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 DST_LINEAR */
2634b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 PATTERN_COLOR_FORMAT */
2635b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);		/* ffffffff PATTERN_MONO_COLOR */
2636b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 PATTERN_MONO_FORMAT */
2637b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);		/* ffffffff PATTERN_MONO_BITMAP */
2638b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000003 PATTERN_SELECT */
2639b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff ROP */
2640b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff BETA1 */
2641b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff BETA4 */
2642b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 OPERATION */
2643b8bf04e1SBen Skeggs 	xf_emit(ctx, 0x50, 0);		/* 10x ffffff, ffffff, ffffff, ffffff, 3 PATTERN */
2644b8bf04e1SBen Skeggs }
2645b8bf04e1SBen Skeggs 
2646b8bf04e1SBen Skeggs static void
nv50_gr_construct_xfer_unk84xx(struct nvkm_grctx * ctx)2647e3c71eb2SBen Skeggs nv50_gr_construct_xfer_unk84xx(struct nvkm_grctx *ctx)
2648b8bf04e1SBen Skeggs {
2649e3c71eb2SBen Skeggs 	struct nvkm_device *device = ctx->device;
2650b8bf04e1SBen Skeggs 	int magic3;
2651b8bf04e1SBen Skeggs 	switch (device->chipset) {
2652b8bf04e1SBen Skeggs 	case 0x50:
2653b8bf04e1SBen Skeggs 		magic3 = 0x1000;
2654b8bf04e1SBen Skeggs 		break;
2655b8bf04e1SBen Skeggs 	case 0x86:
2656b8bf04e1SBen Skeggs 	case 0x98:
2657b8bf04e1SBen Skeggs 	case 0xa8:
2658b8bf04e1SBen Skeggs 	case 0xaa:
2659b8bf04e1SBen Skeggs 	case 0xac:
2660b8bf04e1SBen Skeggs 	case 0xaf:
2661b8bf04e1SBen Skeggs 		magic3 = 0x1e00;
2662b8bf04e1SBen Skeggs 		break;
2663b8bf04e1SBen Skeggs 	default:
2664b8bf04e1SBen Skeggs 		magic3 = 0;
2665b8bf04e1SBen Skeggs 	}
2666b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 GP_ENABLE */
2667b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 7f/ff[NVA0+] VP_REG_ALLOC_RESULT */
2668b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 GP_ENABLE */
2669b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff tesla UNK1A30 */
2670b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 111/113[NVA0+] */
2671b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset))
2672b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x1f, 0);	/* ffffffff */
2673b8bf04e1SBen Skeggs 	else if (device->chipset >= 0xa0)
2674b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x0f, 0);	/* ffffffff */
2675b8bf04e1SBen Skeggs 	else
2676b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x10, 0);	/* fffffff VP_RESULT_MAP_1 up */
2677b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);		/* f/1f[NVA3], fffffff/ffffffff[NVA0+] */
2678b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 7f/ff VP_REG_ALLOC_RESULT */
2679b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 7f/ff VP_RESULT_MAP_SIZE */
2680b8bf04e1SBen Skeggs 	if (device->chipset >= 0xa0)
2681b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0x03020100);	/* ffffffff */
2682b8bf04e1SBen Skeggs 	else
2683b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0x00608080);	/* fffffff VP_RESULT_MAP_0 */
2684b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 GP_ENABLE */
2685b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff tesla UNK1A30 */
2686b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);		/* 111/113, 7f/ff */
2687b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 7f/ff VP_RESULT_MAP_SIZE */
2688b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff tesla UNK1A30 */
2689b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 GP_ENABLE */
2690b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 000000ff GP_REG_ALLOC_RESULT */
2691b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 000000ff GP_RESULT_MAP_SIZE */
2692b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x80);		/* 0000ffff GP_VERTEX_OUTPUT_COUNT */
2693b8bf04e1SBen Skeggs 	if (magic3)
2694b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, magic3);	/* 00007fff tesla UNK141C */
2695b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 7f/ff VP_RESULT_MAP_SIZE */
2696b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff tesla UNK1A30 */
2697b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 111/113 */
2698b8bf04e1SBen Skeggs 	xf_emit(ctx, 0x1f, 0);		/* ffffffff GP_RESULT_MAP_1 up */
2699b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000001f */
2700b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff */
2701b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 GP_ENABLE */
2702b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 000000ff GP_REG_ALLOC_RESULT */
2703b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x80);		/* 0000ffff GP_VERTEX_OUTPUT_COUNT */
2704b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 000000ff GP_RESULT_MAP_SIZE */
2705b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x03020100);	/* ffffffff GP_RESULT_MAP_0 */
2706b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 3);		/* 00000003 GP_OUTPUT_PRIMITIVE_TYPE */
2707b8bf04e1SBen Skeggs 	if (magic3)
2708b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, magic3);	/* 7fff tesla UNK141C */
2709b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 7f/ff VP_RESULT_MAP_SIZE */
2710b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 PROVOKING_VERTEX_LAST */
2711b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff tesla UNK1A30 */
2712b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 111/113 */
2713b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 GP_ENABLE */
2714b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 000000ff GP_RESULT_MAP_SIZE */
2715b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 3);		/* 00000003 GP_OUTPUT_PRIMITIVE_TYPE */
2716b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 PROVOKING_VERTEX_LAST */
2717b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff tesla UNK1A30 */
2718b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000003 tesla UNK13A0 */
2719b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 7f/ff VP_REG_ALLOC_RESULT */
2720b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 GP_ENABLE */
2721b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff tesla UNK1A30 */
2722b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 111/113 */
2723b8bf04e1SBen Skeggs 	if (device->chipset == 0x94 || device->chipset == 0x96)
2724b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x1020, 0);	/* 4 x (0x400 x 0xffffffff, ff, 0, 0, 0, 4 x ffffffff) */
2725b8bf04e1SBen Skeggs 	else if (device->chipset < 0xa0)
2726b8bf04e1SBen Skeggs 		xf_emit(ctx, 0xa20, 0);	/* 4 x (0x280 x 0xffffffff, ff, 0, 0, 0, 4 x ffffffff) */
2727b8bf04e1SBen Skeggs 	else if (!IS_NVA3F(device->chipset))
2728b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x210, 0);	/* ffffffff */
2729b8bf04e1SBen Skeggs 	else
2730b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x410, 0);	/* ffffffff */
2731b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 GP_ENABLE */
2732b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 000000ff GP_RESULT_MAP_SIZE */
2733b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 3);		/* 00000003 GP_OUTPUT_PRIMITIVE_TYPE */
2734b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 PROVOKING_VERTEX_LAST */
2735b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff tesla UNK1A30 */
2736b8bf04e1SBen Skeggs }
2737b8bf04e1SBen Skeggs 
2738b8bf04e1SBen Skeggs static void
nv50_gr_construct_xfer_tprop(struct nvkm_grctx * ctx)2739e3c71eb2SBen Skeggs nv50_gr_construct_xfer_tprop(struct nvkm_grctx *ctx)
2740b8bf04e1SBen Skeggs {
2741e3c71eb2SBen Skeggs 	struct nvkm_device *device = ctx->device;
2742b8bf04e1SBen Skeggs 	int magic1, magic2;
2743b8bf04e1SBen Skeggs 	if (device->chipset == 0x50) {
2744b8bf04e1SBen Skeggs 		magic1 = 0x3ff;
2745b8bf04e1SBen Skeggs 		magic2 = 0x00003e60;
2746b8bf04e1SBen Skeggs 	} else if (!IS_NVA3F(device->chipset)) {
2747b8bf04e1SBen Skeggs 		magic1 = 0x7ff;
2748b8bf04e1SBen Skeggs 		magic2 = 0x001ffe67;
2749b8bf04e1SBen Skeggs 	} else {
2750b8bf04e1SBen Skeggs 		magic1 = 0x7ff;
2751b8bf04e1SBen Skeggs 		magic2 = 0x00087e67;
2752b8bf04e1SBen Skeggs 	}
2753b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 ALPHA_TEST_FUNC */
2754b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff ALPHA_TEST_REF */
2755b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 ALPHA_TEST_ENABLE */
2756b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset))
2757b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 1);	/* 0000000f UNK16A0 */
2758b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 7/f MULTISAMPLE_SAMPLES_LOG2 */
2759b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 tesla UNK1534 */
2760b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff STENCIL_BACK_MASK */
2761b8bf04e1SBen Skeggs 	xf_emit(ctx, 3, 0);		/* 00000007 STENCIL_BACK_OP_FAIL, ZFAIL, ZPASS */
2762b8bf04e1SBen Skeggs 	xf_emit(ctx, 4, 0);		/* ffffffff BLEND_COLOR */
2763b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 UNK19C0 */
2764b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 UNK0FDC */
2765b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0xf);		/* 0000000f COLOR_MASK */
2766b8bf04e1SBen Skeggs 	xf_emit(ctx, 7, 0);		/* 0000000f COLOR_MASK */
2767b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 DEPTH_TEST_ENABLE */
2768b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 DEPTH_WRITE_ENABLE */
2769b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 LOGIC_OP_ENABLE */
2770b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ff[NV50]/3ff[NV84+] */
2771b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 00000007 FP_CONTROL */
2772b8bf04e1SBen Skeggs 	xf_emit(ctx, 4, 0xffff);	/* 0000ffff MSAA_MASK */
2773b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff STENCIL_FRONT_MASK */
2774b8bf04e1SBen Skeggs 	xf_emit(ctx, 3, 0);		/* 00000007 STENCIL_FRONT_OP_FAIL, ZFAIL, ZPASS */
2775b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 STENCIL_FRONT_ENABLE */
2776b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 STENCIL_BACK_ENABLE */
2777b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);		/* 00007fff WINDOW_OFFSET_XY */
2778b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 tesla UNK19CC */
2779b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 7 */
2780b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 SAMPLECNT_ENABLE */
2781b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000000f ZETA_FORMAT */
2782b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 ZETA_ENABLE */
2783b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff COLOR_KEY */
2784b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 COLOR_KEY_ENABLE */
2785b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 COLOR_KEY_FORMAT */
2786b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);		/* ffffffff SIFC_BITMAP_COLOR */
2787b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 SIFC_BITMAP_WRITE_BIT0_ENABLE */
2788b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 ALPHA_TEST_FUNC */
2789b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 ALPHA_TEST_ENABLE */
2790b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset)) {
2791b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 3);	/* 00000003 tesla UNK16B4 */
2792b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000003 */
2793b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000003 tesla UNK1298 */
2794b8bf04e1SBen Skeggs 	} else if (device->chipset >= 0xa0) {
2795b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 1);	/* 00000001 tesla UNK16B4 */
2796b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000003 */
2797b8bf04e1SBen Skeggs 	} else {
2798b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000003 MULTISAMPLE_CTRL */
2799b8bf04e1SBen Skeggs 	}
2800b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 tesla UNK1534 */
2801b8bf04e1SBen Skeggs 	xf_emit(ctx, 8, 0);		/* 00000001 BLEND_ENABLE */
2802b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 0000001f BLEND_FUNC_DST_ALPHA */
2803b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000007 BLEND_EQUATION_ALPHA */
2804b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 2);		/* 0000001f BLEND_FUNC_SRC_ALPHA */
2805b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 0000001f BLEND_FUNC_DST_RGB */
2806b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000007 BLEND_EQUATION_RGB */
2807b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 2);		/* 0000001f BLEND_FUNC_SRC_RGB */
2808b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset)) {
2809b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000001 UNK12E4 */
2810b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 1);	/* 00000007 IBLEND_EQUATION_RGB */
2811b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 1);	/* 00000007 IBLEND_EQUATION_ALPHA */
2812b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 1);	/* 00000001 IBLEND_UNK00 */
2813b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 2);	/* 0000001f IBLEND_SRC_RGB */
2814b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 1);	/* 0000001f IBLEND_DST_RGB */
2815b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 2);	/* 0000001f IBLEND_SRC_ALPHA */
2816b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 1);	/* 0000001f IBLEND_DST_ALPHA */
2817b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000001 UNK1140 */
2818b8bf04e1SBen Skeggs 	}
2819b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 UNK133C */
2820b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffff0ff3 */
2821b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x11);		/* 3f/7f RT_FORMAT */
2822b8bf04e1SBen Skeggs 	xf_emit(ctx, 7, 0);		/* 3f/7f RT_FORMAT */
2823b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x0fac6881);	/* 0fffffff RT_CONTROL */
2824b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 LOGIC_OP_ENABLE */
2825b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ff/3ff */
2826b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 00000007 FP_CONTROL */
2827b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000003 UNK0F90 */
2828b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 FRAMEBUFFER_SRGB */
2829b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 7 */
2830b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x11);		/* 3f/7f DST_FORMAT */
2831b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 DST_LINEAR */
2832b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 OPERATION */
2833b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0xcf);		/* 000000ff SIFC_FORMAT */
2834b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0xcf);		/* 000000ff DRAW_COLOR_FORMAT */
2835b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0xcf);		/* 000000ff SRC_FORMAT */
2836b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset))
2837b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 1);	/* 0000001f tesla UNK169C */
2838b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff tesla UNK1A3C */
2839b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 7/f[NVA3] MULTISAMPLE_SAMPLES_LOG2 */
2840b8bf04e1SBen Skeggs 	xf_emit(ctx, 8, 0);		/* 00000001 BLEND_ENABLE */
2841b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 0000001f BLEND_FUNC_DST_ALPHA */
2842b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000007 BLEND_EQUATION_ALPHA */
2843b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 2);		/* 0000001f BLEND_FUNC_SRC_ALPHA */
2844b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 0000001f BLEND_FUNC_DST_RGB */
2845b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000007 BLEND_EQUATION_RGB */
2846b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 2);		/* 0000001f BLEND_FUNC_SRC_RGB */
2847b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 UNK133C */
2848b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffff0ff3 */
2849b8bf04e1SBen Skeggs 	xf_emit(ctx, 8, 1);		/* 00000001 UNK19E0 */
2850b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x11);		/* 3f/7f RT_FORMAT */
2851b8bf04e1SBen Skeggs 	xf_emit(ctx, 7, 0);		/* 3f/7f RT_FORMAT */
2852b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x0fac6881);	/* 0fffffff RT_CONTROL */
2853b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0xf);		/* 0000000f COLOR_MASK */
2854b8bf04e1SBen Skeggs 	xf_emit(ctx, 7, 0);		/* 0000000f COLOR_MASK */
2855b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, magic2);	/* 001fffff tesla UNK0F78 */
2856b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 DEPTH_BOUNDS_EN */
2857b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 DEPTH_TEST_ENABLE */
2858b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x11);		/* 3f/7f DST_FORMAT */
2859b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 DST_LINEAR */
2860b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset))
2861b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 1);	/* 0000001f tesla UNK169C */
2862b8bf04e1SBen Skeggs 	if (device->chipset == 0x50)
2863b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* ff */
2864b8bf04e1SBen Skeggs 	else
2865b8bf04e1SBen Skeggs 		xf_emit(ctx, 3, 0);	/* 1, 7, 3ff */
2866b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 00000007 FP_CONTROL */
2867b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000003 UNK0F90 */
2868b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 STENCIL_FRONT_ENABLE */
2869b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 */
2870b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 SAMPLECNT_ENABLE */
2871b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000000f ZETA_FORMAT */
2872b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 ZETA_ENABLE */
2873b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff tesla UNK1A3C */
2874b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 7/f MULTISAMPLE_SAMPLES_LOG2 */
2875b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 tesla UNK1534 */
2876b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffff0ff3 */
2877b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x11);		/* 3f/7f RT_FORMAT */
2878b8bf04e1SBen Skeggs 	xf_emit(ctx, 7, 0);		/* 3f/7f RT_FORMAT */
2879b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x0fac6881);	/* 0fffffff RT_CONTROL */
2880b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 DEPTH_BOUNDS_EN */
2881b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 DEPTH_TEST_ENABLE */
2882b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 DEPTH_WRITE_ENABLE */
2883b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x11);		/* 3f/7f DST_FORMAT */
2884b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 DST_LINEAR */
2885b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000fffff BLIT_DU_DX_FRACT */
2886b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 0001ffff BLIT_DU_DX_INT */
2887b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000fffff BLIT_DV_DY_FRACT */
2888b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 0001ffff BLIT_DV_DY_INT */
2889b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ff/3ff */
2890b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, magic1);	/* 3ff/7ff tesla UNK0D68 */
2891b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 STENCIL_FRONT_ENABLE */
2892b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 tesla UNK15B4 */
2893b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000000f ZETA_FORMAT */
2894b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 ZETA_ENABLE */
2895b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 */
2896b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff tesla UNK1A3C */
2897b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset))
2898b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 1);	/* 0000001f tesla UNK169C */
2899b8bf04e1SBen Skeggs 	xf_emit(ctx, 8, 0);		/* 0000ffff DMA_COLOR */
2900b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000ffff DMA_GLOBAL */
2901b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000ffff DMA_LOCAL */
2902b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000ffff DMA_STACK */
2903b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ff/3ff */
2904b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000ffff DMA_DST */
2905b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 7 */
2906b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 7/f MULTISAMPLE_SAMPLES_LOG2 */
2907b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffff0ff3 */
2908b8bf04e1SBen Skeggs 	xf_emit(ctx, 8, 0);		/* 000000ff RT_ADDRESS_HIGH */
2909b8bf04e1SBen Skeggs 	xf_emit(ctx, 8, 0);		/* ffffffff RT_LAYER_STRIDE */
2910b8bf04e1SBen Skeggs 	xf_emit(ctx, 8, 0);		/* ffffffff RT_ADDRESS_LOW */
2911b8bf04e1SBen Skeggs 	xf_emit(ctx, 8, 8);		/* 0000007f RT_TILE_MODE */
2912b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x11);		/* 3f/7f RT_FORMAT */
2913b8bf04e1SBen Skeggs 	xf_emit(ctx, 7, 0);		/* 3f/7f RT_FORMAT */
2914b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x0fac6881);	/* 0fffffff RT_CONTROL */
2915b8bf04e1SBen Skeggs 	xf_emit(ctx, 8, 0x400);		/* 0fffffff RT_HORIZ */
2916b8bf04e1SBen Skeggs 	xf_emit(ctx, 8, 0x300);		/* 0000ffff RT_VERT */
2917b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00001fff RT_ARRAY_MODE */
2918b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0xf);		/* 0000000f COLOR_MASK */
2919b8bf04e1SBen Skeggs 	xf_emit(ctx, 7, 0);		/* 0000000f COLOR_MASK */
2920b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x20);		/* 00000fff DST_TILE_MODE */
2921b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x11);		/* 3f/7f DST_FORMAT */
2922b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x100);		/* 0001ffff DST_HEIGHT */
2923b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000007ff DST_LAYER */
2924b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 DST_LINEAR */
2925b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff DST_ADDRESS_LOW */
2926b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff DST_ADDRESS_HIGH */
2927b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x40);		/* 0007ffff DST_PITCH */
2928b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x100);		/* 0001ffff DST_WIDTH */
2929b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000ffff */
2930b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 3);		/* 00000003 tesla UNK15AC */
2931b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ff/3ff */
2932b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0001ffff GP_BUILTIN_RESULT_EN */
2933b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000003 UNK0F90 */
2934b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 */
2935b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset))
2936b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 1);	/* 0000001f tesla UNK169C */
2937b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, magic2);	/* 001fffff tesla UNK0F78 */
2938b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 7/f MULTISAMPLE_SAMPLES_LOG2 */
2939b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 tesla UNK1534 */
2940b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffff0ff3 */
2941b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 2);		/* 00000003 tesla UNK143C */
2942b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x0fac6881);	/* 0fffffff RT_CONTROL */
2943b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000ffff DMA_ZETA */
2944b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 DEPTH_BOUNDS_EN */
2945b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 DEPTH_TEST_ENABLE */
2946b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 DEPTH_WRITE_ENABLE */
2947b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);		/* ffff, ff/3ff */
2948b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0001ffff GP_BUILTIN_RESULT_EN */
2949b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 STENCIL_FRONT_ENABLE */
2950b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff STENCIL_FRONT_MASK */
2951b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 tesla UNK15B4 */
2952b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 */
2953b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff ZETA_LAYER_STRIDE */
2954b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 000000ff ZETA_ADDRESS_HIGH */
2955b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff ZETA_ADDRESS_LOW */
2956b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 00000007 ZETA_TILE_MODE */
2957b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000000f ZETA_FORMAT */
2958b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 ZETA_ENABLE */
2959b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x400);		/* 0fffffff ZETA_HORIZ */
2960b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x300);		/* 0000ffff ZETA_VERT */
2961b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x1001);	/* 00001fff ZETA_ARRAY_MODE */
2962b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff tesla UNK1A3C */
2963b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 7/f MULTISAMPLE_SAMPLES_LOG2 */
2964b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset))
2965b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000001 */
2966b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffff0ff3 */
2967b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x11);		/* 3f/7f RT_FORMAT */
2968b8bf04e1SBen Skeggs 	xf_emit(ctx, 7, 0);		/* 3f/7f RT_FORMAT */
2969b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x0fac6881);	/* 0fffffff RT_CONTROL */
2970b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0xf);		/* 0000000f COLOR_MASK */
2971b8bf04e1SBen Skeggs 	xf_emit(ctx, 7, 0);		/* 0000000f COLOR_MASK */
2972b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ff/3ff */
2973b8bf04e1SBen Skeggs 	xf_emit(ctx, 8, 0);		/* 00000001 BLEND_ENABLE */
2974b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000003 UNK0F90 */
2975b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 FRAMEBUFFER_SRGB */
2976b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 7 */
2977b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 LOGIC_OP_ENABLE */
2978b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset)) {
2979b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000001 UNK1140 */
2980b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 1);	/* 0000001f tesla UNK169C */
2981b8bf04e1SBen Skeggs 	}
2982b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 7/f MULTISAMPLE_SAMPLES_LOG2 */
2983b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 UNK1534 */
2984b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffff0ff3 */
2985b8bf04e1SBen Skeggs 	if (device->chipset >= 0xa0)
2986b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0x0fac6881);	/* fffffff */
2987b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, magic2);	/* 001fffff tesla UNK0F78 */
2988b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 DEPTH_BOUNDS_EN */
2989b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 DEPTH_TEST_ENABLE */
2990b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 DEPTH_WRITE_ENABLE */
2991b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x11);		/* 3f/7f DST_FORMAT */
2992b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 tesla UNK0FB0 */
2993b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ff/3ff */
2994b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);		/* 00000007 FP_CONTROL */
2995b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 STENCIL_FRONT_ENABLE */
2996b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 tesla UNK15B4 */
2997b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 tesla UNK19CC */
2998b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000007 */
2999b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 SAMPLECNT_ENABLE */
3000b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000000f ZETA_FORMAT */
3001b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 ZETA_ENABLE */
3002b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset)) {
3003b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 1);	/* 0000001f tesla UNK169C */
3004b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 0000000f tesla UNK15C8 */
3005b8bf04e1SBen Skeggs 	}
3006b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff tesla UNK1A3C */
3007b8bf04e1SBen Skeggs 	if (device->chipset >= 0xa0) {
3008b8bf04e1SBen Skeggs 		xf_emit(ctx, 3, 0);		/* 7/f, 1, ffff0ff3 */
3009b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0xfac6881);	/* fffffff */
3010b8bf04e1SBen Skeggs 		xf_emit(ctx, 4, 0);		/* 1, 1, 1, 3ff */
3011b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 4);		/* 7 */
3012b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);		/* 1 */
3013b8bf04e1SBen Skeggs 		xf_emit(ctx, 2, 1);		/* 1 */
3014b8bf04e1SBen Skeggs 		xf_emit(ctx, 2, 0);		/* 7, f */
3015b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 1);		/* 1 */
3016b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);		/* 7/f */
3017b8bf04e1SBen Skeggs 		if (IS_NVA3F(device->chipset))
3018b8bf04e1SBen Skeggs 			xf_emit(ctx, 0x9, 0);	/* 1 */
3019b8bf04e1SBen Skeggs 		else
3020b8bf04e1SBen Skeggs 			xf_emit(ctx, 0x8, 0);	/* 1 */
3021b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);		/* ffff0ff3 */
3022b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 1);		/* 1 */
3023b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0x11);		/* 7f */
3024b8bf04e1SBen Skeggs 		xf_emit(ctx, 7, 0);		/* 7f */
3025b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0xfac6881);	/* fffffff */
3026b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0xf);		/* f */
3027b8bf04e1SBen Skeggs 		xf_emit(ctx, 7, 0);		/* f */
3028b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0x11);		/* 7f */
3029b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 1);		/* 1 */
3030b8bf04e1SBen Skeggs 		xf_emit(ctx, 5, 0);		/* 1, 7, 3ff, 3, 7 */
3031b8bf04e1SBen Skeggs 		if (IS_NVA3F(device->chipset)) {
3032b8bf04e1SBen Skeggs 			xf_emit(ctx, 1, 0);	/* 00000001 UNK1140 */
3033b8bf04e1SBen Skeggs 			xf_emit(ctx, 1, 1);	/* 0000001f tesla UNK169C */
3034b8bf04e1SBen Skeggs 		}
3035b8bf04e1SBen Skeggs 	}
3036b8bf04e1SBen Skeggs }
3037b8bf04e1SBen Skeggs 
3038b8bf04e1SBen Skeggs static void
nv50_gr_construct_xfer_tex(struct nvkm_grctx * ctx)3039e3c71eb2SBen Skeggs nv50_gr_construct_xfer_tex(struct nvkm_grctx *ctx)
3040b8bf04e1SBen Skeggs {
3041e3c71eb2SBen Skeggs 	struct nvkm_device *device = ctx->device;
3042b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);		/* 1 LINKED_TSC. yes, 2. */
3043b8bf04e1SBen Skeggs 	if (device->chipset != 0x50)
3044b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 3 */
3045b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 1ffff BLIT_DU_DX_INT */
3046b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* fffff BLIT_DU_DX_FRACT */
3047b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 1ffff BLIT_DV_DY_INT */
3048b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* fffff BLIT_DV_DY_FRACT */
3049b8bf04e1SBen Skeggs 	if (device->chipset == 0x50)
3050b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 3 BLIT_CONTROL */
3051b8bf04e1SBen Skeggs 	else
3052b8bf04e1SBen Skeggs 		xf_emit(ctx, 2, 0);	/* 3ff, 1 */
3053b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x2a712488);	/* ffffffff SRC_TIC_0 */
3054b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff SRC_TIC_1 */
3055b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x4085c000);	/* ffffffff SRC_TIC_2 */
3056b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x40);		/* ffffffff SRC_TIC_3 */
3057b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x100);		/* ffffffff SRC_TIC_4 */
3058b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x10100);	/* ffffffff SRC_TIC_5 */
3059b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x02800000);	/* ffffffff SRC_TIC_6 */
3060b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff SRC_TIC_7 */
3061b8bf04e1SBen Skeggs 	if (device->chipset == 0x50) {
3062b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000001 turing UNK358 */
3063b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* ffffffff tesla UNK1A34? */
3064b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000003 turing UNK37C tesla UNK1690 */
3065b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000003 BLIT_CONTROL */
3066b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000001 turing UNK32C tesla UNK0F94 */
3067b8bf04e1SBen Skeggs 	} else if (!IS_NVAAF(device->chipset)) {
3068b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* ffffffff tesla UNK1A34? */
3069b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000003 */
3070b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 000003ff */
3071b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000003 */
3072b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 000003ff */
3073b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000003 tesla UNK1664 / turing UNK03E8 */
3074b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 00000003 */
3075b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);	/* 000003ff */
3076b8bf04e1SBen Skeggs 	} else {
3077b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x6, 0);
3078b8bf04e1SBen Skeggs 	}
3079b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffffffff tesla UNK1A34 */
3080b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000ffff DMA_TEXTURE */
3081b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 0000ffff DMA_SRC */
3082b8bf04e1SBen Skeggs }
3083b8bf04e1SBen Skeggs 
3084b8bf04e1SBen Skeggs static void
nv50_gr_construct_xfer_unk8cxx(struct nvkm_grctx * ctx)3085e3c71eb2SBen Skeggs nv50_gr_construct_xfer_unk8cxx(struct nvkm_grctx *ctx)
3086b8bf04e1SBen Skeggs {
3087e3c71eb2SBen Skeggs 	struct nvkm_device *device = ctx->device;
3088b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 UNK1534 */
3089b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 7/f MULTISAMPLE_SAMPLES_LOG2 */
3090b8bf04e1SBen Skeggs 	xf_emit(ctx, 2, 0);		/* 7, ffff0ff3 */
3091b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 DEPTH_TEST_ENABLE */
3092b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 DEPTH_WRITE */
3093b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x04e3bfdf);	/* ffffffff UNK0D64 */
3094b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x04e3bfdf);	/* ffffffff UNK0DF4 */
3095b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 UNK15B4 */
3096b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 LINE_STIPPLE_ENABLE */
3097b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x00ffff00);	/* 00ffffff LINE_STIPPLE_PATTERN */
3098b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 tesla UNK0F98 */
3099b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset))
3100b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 1);	/* 0000001f tesla UNK169C */
3101b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000003 tesla UNK1668 */
3102b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 LINE_STIPPLE_ENABLE */
3103b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x00ffff00);	/* 00ffffff LINE_STIPPLE_PATTERN */
3104b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 POLYGON_SMOOTH_ENABLE */
3105b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 UNK1534 */
3106b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 7/f MULTISAMPLE_SAMPLES_LOG2 */
3107b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 tesla UNK1658 */
3108b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 LINE_SMOOTH_ENABLE */
3109b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* ffff0ff3 */
3110b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 DEPTH_TEST_ENABLE */
3111b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 DEPTH_WRITE */
3112b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 UNK15B4 */
3113b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 POINT_SPRITE_ENABLE */
3114b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);		/* 00000001 tesla UNK165C */
3115b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x30201000);	/* ffffffff tesla UNK1670 */
3116b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x70605040);	/* ffffffff tesla UNK1670 */
3117b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0xb8a89888);	/* ffffffff tesla UNK1670 */
3118b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0xf8e8d8c8);	/* ffffffff tesla UNK1670 */
3119b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);		/* 00000001 VERTEX_TWO_SIDE_ENABLE */
3120b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x1a);		/* 0000001f POLYGON_MODE */
3121b8bf04e1SBen Skeggs }
3122b8bf04e1SBen Skeggs 
3123b8bf04e1SBen Skeggs static void
nv50_gr_construct_xfer_tp(struct nvkm_grctx * ctx)3124e3c71eb2SBen Skeggs nv50_gr_construct_xfer_tp(struct nvkm_grctx *ctx)
3125b8bf04e1SBen Skeggs {
3126e3c71eb2SBen Skeggs 	struct nvkm_device *device = ctx->device;
3127b8bf04e1SBen Skeggs 	if (device->chipset < 0xa0) {
3128b8bf04e1SBen Skeggs 		nv50_gr_construct_xfer_unk84xx(ctx);
3129b8bf04e1SBen Skeggs 		nv50_gr_construct_xfer_tprop(ctx);
3130b8bf04e1SBen Skeggs 		nv50_gr_construct_xfer_tex(ctx);
3131b8bf04e1SBen Skeggs 		nv50_gr_construct_xfer_unk8cxx(ctx);
3132b8bf04e1SBen Skeggs 	} else {
3133b8bf04e1SBen Skeggs 		nv50_gr_construct_xfer_tex(ctx);
3134b8bf04e1SBen Skeggs 		nv50_gr_construct_xfer_tprop(ctx);
3135b8bf04e1SBen Skeggs 		nv50_gr_construct_xfer_unk8cxx(ctx);
3136b8bf04e1SBen Skeggs 		nv50_gr_construct_xfer_unk84xx(ctx);
3137b8bf04e1SBen Skeggs 	}
3138b8bf04e1SBen Skeggs }
3139b8bf04e1SBen Skeggs 
3140b8bf04e1SBen Skeggs static void
nv50_gr_construct_xfer_mpc(struct nvkm_grctx * ctx)3141e3c71eb2SBen Skeggs nv50_gr_construct_xfer_mpc(struct nvkm_grctx *ctx)
3142b8bf04e1SBen Skeggs {
3143e3c71eb2SBen Skeggs 	struct nvkm_device *device = ctx->device;
3144b8bf04e1SBen Skeggs 	int i, mpcnt = 2;
3145b8bf04e1SBen Skeggs 	switch (device->chipset) {
3146b8bf04e1SBen Skeggs 		case 0x98:
3147b8bf04e1SBen Skeggs 		case 0xaa:
3148b8bf04e1SBen Skeggs 			mpcnt = 1;
3149b8bf04e1SBen Skeggs 			break;
3150b8bf04e1SBen Skeggs 		case 0x50:
3151b8bf04e1SBen Skeggs 		case 0x84:
3152b8bf04e1SBen Skeggs 		case 0x86:
3153b8bf04e1SBen Skeggs 		case 0x92:
3154b8bf04e1SBen Skeggs 		case 0x94:
3155b8bf04e1SBen Skeggs 		case 0x96:
3156b8bf04e1SBen Skeggs 		case 0xa8:
3157b8bf04e1SBen Skeggs 		case 0xac:
3158b8bf04e1SBen Skeggs 			mpcnt = 2;
3159b8bf04e1SBen Skeggs 			break;
3160b8bf04e1SBen Skeggs 		case 0xa0:
3161b8bf04e1SBen Skeggs 		case 0xa3:
3162b8bf04e1SBen Skeggs 		case 0xa5:
3163b8bf04e1SBen Skeggs 		case 0xaf:
3164b8bf04e1SBen Skeggs 			mpcnt = 3;
3165b8bf04e1SBen Skeggs 			break;
3166b8bf04e1SBen Skeggs 	}
3167b8bf04e1SBen Skeggs 	for (i = 0; i < mpcnt; i++) {
3168b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);		/* ff */
3169b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0x80);		/* ffffffff tesla UNK1404 */
3170b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0x80007004);	/* ffffffff tesla UNK12B0 */
3171b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0x04000400);	/* ffffffff */
3172b8bf04e1SBen Skeggs 		if (device->chipset >= 0xa0)
3173b8bf04e1SBen Skeggs 			xf_emit(ctx, 1, 0xc0);	/* 00007fff tesla UNK152C */
3174b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0x1000);	/* 0000ffff tesla UNK0D60 */
3175b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);		/* ff/3ff */
3176b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);		/* ffffffff tesla UNK1A30 */
3177b8bf04e1SBen Skeggs 		if (device->chipset == 0x86 || device->chipset == 0x98 || device->chipset == 0xa8 || IS_NVAAF(device->chipset)) {
3178b8bf04e1SBen Skeggs 			xf_emit(ctx, 1, 0xe00);		/* 7fff */
3179b8bf04e1SBen Skeggs 			xf_emit(ctx, 1, 0x1e00);	/* 7fff */
3180b8bf04e1SBen Skeggs 		}
3181b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 1);		/* 000000ff VP_REG_ALLOC_TEMP */
3182b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);		/* 00000001 LINKED_TSC */
3183b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);		/* 00000001 GP_ENABLE */
3184b8bf04e1SBen Skeggs 		if (device->chipset == 0x50)
3185b8bf04e1SBen Skeggs 			xf_emit(ctx, 2, 0x1000);	/* 7fff tesla UNK141C */
3186b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 1);		/* 000000ff GP_REG_ALLOC_TEMP */
3187b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);		/* 00000001 GP_ENABLE */
3188b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 4);		/* 000000ff FP_REG_ALLOC_TEMP */
3189b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 2);		/* 00000003 REG_MODE */
3190b8bf04e1SBen Skeggs 		if (IS_NVAAF(device->chipset))
3191b8bf04e1SBen Skeggs 			xf_emit(ctx, 0xb, 0);	/* RO */
3192b8bf04e1SBen Skeggs 		else if (device->chipset >= 0xa0)
3193b8bf04e1SBen Skeggs 			xf_emit(ctx, 0xc, 0);	/* RO */
3194b8bf04e1SBen Skeggs 		else
3195b8bf04e1SBen Skeggs 			xf_emit(ctx, 0xa, 0);	/* RO */
3196b8bf04e1SBen Skeggs 	}
3197b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x08100c12);		/* 1fffffff FP_INTERPOLANT_CTRL */
3198b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* ff/3ff */
3199b8bf04e1SBen Skeggs 	if (device->chipset >= 0xa0) {
3200b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0x1fe21);	/* 0003ffff tesla UNK0FAC */
3201b8bf04e1SBen Skeggs 	}
3202b8bf04e1SBen Skeggs 	xf_emit(ctx, 3, 0);			/* 7fff, 0, 0 */
3203b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 00000001 tesla UNK1534 */
3204b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 7/f MULTISAMPLE_SAMPLES_LOG2 */
3205b8bf04e1SBen Skeggs 	xf_emit(ctx, 4, 0xffff);		/* 0000ffff MSAA_MASK */
3206b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);			/* 00000001 LANES32 */
3207b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x10001);		/* 00ffffff BLOCK_ALLOC */
3208b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x10001);		/* ffffffff BLOCKDIM_XY */
3209b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);			/* 0000ffff BLOCKDIM_Z */
3210b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* ffffffff SHARED_SIZE */
3211b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x1fe21);		/* 1ffff/3ffff[NVA0+] tesla UNk0FAC */
3212b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* ffffffff tesla UNK1A34 */
3213b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset))
3214b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 1);		/* 0000001f tesla UNK169C */
3215b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* ff/3ff */
3216b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 1 LINKED_TSC */
3217b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* ff FP_ADDRESS_HIGH */
3218b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* ffffffff FP_ADDRESS_LOW */
3219b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x08100c12);		/* 1fffffff FP_INTERPOLANT_CTRL */
3220b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);			/* 00000007 FP_CONTROL */
3221b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 000000ff FRAG_COLOR_CLAMP_EN */
3222b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 2);			/* 00000003 REG_MODE */
3223b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x11);			/* 0000007f RT_FORMAT */
3224b8bf04e1SBen Skeggs 	xf_emit(ctx, 7, 0);			/* 0000007f RT_FORMAT */
3225b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 00000007 */
3226b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0xfac6881);		/* 0fffffff RT_CONTROL */
3227b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 00000003 MULTISAMPLE_CTRL */
3228b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset))
3229b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 3);		/* 00000003 tesla UNK16B4 */
3230b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 00000001 ALPHA_TEST_ENABLE */
3231b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 00000007 ALPHA_TEST_FUNC */
3232b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 00000001 FRAMEBUFFER_SRGB */
3233b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);			/* ffffffff tesla UNK1400 */
3234b8bf04e1SBen Skeggs 	xf_emit(ctx, 8, 0);			/* 00000001 BLEND_ENABLE */
3235b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 00000001 LOGIC_OP_ENABLE */
3236b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 2);			/* 0000001f BLEND_FUNC_SRC_RGB */
3237b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);			/* 0000001f BLEND_FUNC_DST_RGB */
3238b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);			/* 00000007 BLEND_EQUATION_RGB */
3239b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 2);			/* 0000001f BLEND_FUNC_SRC_ALPHA */
3240b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);			/* 0000001f BLEND_FUNC_DST_ALPHA */
3241b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);			/* 00000007 BLEND_EQUATION_ALPHA */
3242b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);			/* 00000001 UNK133C */
3243b8bf04e1SBen Skeggs 	if (IS_NVA3F(device->chipset)) {
3244b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);		/* 00000001 UNK12E4 */
3245b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 2);		/* 0000001f IBLEND_FUNC_SRC_RGB */
3246b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 1);		/* 0000001f IBLEND_FUNC_DST_RGB */
3247b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 1);		/* 00000007 IBLEND_EQUATION_RGB */
3248b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 2);		/* 0000001f IBLEND_FUNC_SRC_ALPHA */
3249b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 1);		/* 0000001f IBLEND_FUNC_DST_ALPHA */
3250b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 1);		/* 00000007 IBLEND_EQUATION_ALPHA */
3251b8bf04e1SBen Skeggs 		xf_emit(ctx, 8, 1);		/* 00000001 IBLEND_UNK00 */
3252b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);		/* 00000003 tesla UNK1928 */
3253b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0);		/* 00000001 UNK1140 */
3254b8bf04e1SBen Skeggs 	}
3255b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 00000003 tesla UNK0F90 */
3256b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 4);			/* 000000ff FP_RESULT_COUNT */
3257b8bf04e1SBen Skeggs 	/* XXX: demagic this part some day */
3258b8bf04e1SBen Skeggs 	if (device->chipset == 0x50)
3259b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x3a0, 0);
3260b8bf04e1SBen Skeggs 	else if (device->chipset < 0x94)
3261b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x3a2, 0);
3262b8bf04e1SBen Skeggs 	else if (device->chipset == 0x98 || device->chipset == 0xaa)
3263b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x39f, 0);
3264b8bf04e1SBen Skeggs 	else
3265b8bf04e1SBen Skeggs 		xf_emit(ctx, 0x3a3, 0);
3266b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0x11);			/* 3f/7f DST_FORMAT */
3267b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 0);			/* 7 OPERATION */
3268b8bf04e1SBen Skeggs 	xf_emit(ctx, 1, 1);			/* 1 DST_LINEAR */
3269b8bf04e1SBen Skeggs 	xf_emit(ctx, 0x2d, 0);
3270b8bf04e1SBen Skeggs }
3271b8bf04e1SBen Skeggs 
3272b8bf04e1SBen Skeggs static void
nv50_gr_construct_xfer2(struct nvkm_grctx * ctx)3273e3c71eb2SBen Skeggs nv50_gr_construct_xfer2(struct nvkm_grctx *ctx)
3274b8bf04e1SBen Skeggs {
3275e3c71eb2SBen Skeggs 	struct nvkm_device *device = ctx->device;
3276b8bf04e1SBen Skeggs 	int i;
3277b8bf04e1SBen Skeggs 	u32 offset;
3278276836d4SBen Skeggs 	u32 units = nvkm_rd32(device, 0x1540);
3279b8bf04e1SBen Skeggs 	int size = 0;
3280b8bf04e1SBen Skeggs 
3281b8bf04e1SBen Skeggs 	offset = (ctx->ctxvals_pos+0x3f)&~0x3f;
3282b8bf04e1SBen Skeggs 
3283b8bf04e1SBen Skeggs 	if (device->chipset < 0xa0) {
3284b8bf04e1SBen Skeggs 		for (i = 0; i < 8; i++) {
3285b8bf04e1SBen Skeggs 			ctx->ctxvals_pos = offset + i;
3286b8bf04e1SBen Skeggs 			/* that little bugger belongs to csched. No idea
3287b8bf04e1SBen Skeggs 			 * what it's doing here. */
3288b8bf04e1SBen Skeggs 			if (i == 0)
3289b8bf04e1SBen Skeggs 				xf_emit(ctx, 1, 0x08100c12); /* FP_INTERPOLANT_CTRL */
3290b8bf04e1SBen Skeggs 			if (units & (1 << i))
3291b8bf04e1SBen Skeggs 				nv50_gr_construct_xfer_mpc(ctx);
3292b8bf04e1SBen Skeggs 			if ((ctx->ctxvals_pos-offset)/8 > size)
3293b8bf04e1SBen Skeggs 				size = (ctx->ctxvals_pos-offset)/8;
3294b8bf04e1SBen Skeggs 		}
3295b8bf04e1SBen Skeggs 	} else {
3296b8bf04e1SBen Skeggs 		/* Strand 0: TPs 0, 1 */
3297b8bf04e1SBen Skeggs 		ctx->ctxvals_pos = offset;
3298b8bf04e1SBen Skeggs 		/* that little bugger belongs to csched. No idea
3299b8bf04e1SBen Skeggs 		 * what it's doing here. */
3300b8bf04e1SBen Skeggs 		xf_emit(ctx, 1, 0x08100c12); /* FP_INTERPOLANT_CTRL */
3301b8bf04e1SBen Skeggs 		if (units & (1 << 0))
3302b8bf04e1SBen Skeggs 			nv50_gr_construct_xfer_mpc(ctx);
3303b8bf04e1SBen Skeggs 		if (units & (1 << 1))
3304b8bf04e1SBen Skeggs 			nv50_gr_construct_xfer_mpc(ctx);
3305b8bf04e1SBen Skeggs 		if ((ctx->ctxvals_pos-offset)/8 > size)
3306b8bf04e1SBen Skeggs 			size = (ctx->ctxvals_pos-offset)/8;
3307b8bf04e1SBen Skeggs 
3308b8bf04e1SBen Skeggs 		/* Strand 1: TPs 2, 3 */
3309b8bf04e1SBen Skeggs 		ctx->ctxvals_pos = offset + 1;
3310b8bf04e1SBen Skeggs 		if (units & (1 << 2))
3311b8bf04e1SBen Skeggs 			nv50_gr_construct_xfer_mpc(ctx);
3312b8bf04e1SBen Skeggs 		if (units & (1 << 3))
3313b8bf04e1SBen Skeggs 			nv50_gr_construct_xfer_mpc(ctx);
3314b8bf04e1SBen Skeggs 		if ((ctx->ctxvals_pos-offset)/8 > size)
3315b8bf04e1SBen Skeggs 			size = (ctx->ctxvals_pos-offset)/8;
3316b8bf04e1SBen Skeggs 
3317b8bf04e1SBen Skeggs 		/* Strand 2: TPs 4, 5, 6 */
3318b8bf04e1SBen Skeggs 		ctx->ctxvals_pos = offset + 2;
3319b8bf04e1SBen Skeggs 		if (units & (1 << 4))
3320b8bf04e1SBen Skeggs 			nv50_gr_construct_xfer_mpc(ctx);
3321b8bf04e1SBen Skeggs 		if (units & (1 << 5))
3322b8bf04e1SBen Skeggs 			nv50_gr_construct_xfer_mpc(ctx);
3323b8bf04e1SBen Skeggs 		if (units & (1 << 6))
3324b8bf04e1SBen Skeggs 			nv50_gr_construct_xfer_mpc(ctx);
3325b8bf04e1SBen Skeggs 		if ((ctx->ctxvals_pos-offset)/8 > size)
3326b8bf04e1SBen Skeggs 			size = (ctx->ctxvals_pos-offset)/8;
3327b8bf04e1SBen Skeggs 
3328b8bf04e1SBen Skeggs 		/* Strand 3: TPs 7, 8, 9 */
3329b8bf04e1SBen Skeggs 		ctx->ctxvals_pos = offset + 3;
3330b8bf04e1SBen Skeggs 		if (units & (1 << 7))
3331b8bf04e1SBen Skeggs 			nv50_gr_construct_xfer_mpc(ctx);
3332b8bf04e1SBen Skeggs 		if (units & (1 << 8))
3333b8bf04e1SBen Skeggs 			nv50_gr_construct_xfer_mpc(ctx);
3334b8bf04e1SBen Skeggs 		if (units & (1 << 9))
3335b8bf04e1SBen Skeggs 			nv50_gr_construct_xfer_mpc(ctx);
3336b8bf04e1SBen Skeggs 		if ((ctx->ctxvals_pos-offset)/8 > size)
3337b8bf04e1SBen Skeggs 			size = (ctx->ctxvals_pos-offset)/8;
3338b8bf04e1SBen Skeggs 	}
3339b8bf04e1SBen Skeggs 	ctx->ctxvals_pos = offset + size * 8;
3340b8bf04e1SBen Skeggs 	ctx->ctxvals_pos = (ctx->ctxvals_pos+0x3f)&~0x3f;
3341b8bf04e1SBen Skeggs 	cp_lsr (ctx, offset);
3342b8bf04e1SBen Skeggs 	cp_out (ctx, CP_SET_XFER_POINTER);
3343b8bf04e1SBen Skeggs 	cp_lsr (ctx, size);
3344b8bf04e1SBen Skeggs 	cp_out (ctx, CP_SEEK_2);
3345b8bf04e1SBen Skeggs 	cp_out (ctx, CP_XFER_2);
3346b8bf04e1SBen Skeggs 	cp_wait(ctx, XFER, BUSY);
3347b8bf04e1SBen Skeggs }
3348