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