3 #include "nouveau_drv.h"
4 #include "nouveau_drm.h"
6 /* The sizes are taken from the difference between the start of two
7 * grctx addresses while running the nvidia driver. Probably slightly
8 * larger than they actually are, because of other objects being created
11 #define NV40_GRCTX_SIZE (175*1024)
12 #define NV43_GRCTX_SIZE (70*1024)
13 #define NV46_GRCTX_SIZE (70*1024) /* probably ~64KiB */
14 #define NV4A_GRCTX_SIZE (64*1024)
15 #define NV4C_GRCTX_SIZE (25*1024)
16 #define NV4E_GRCTX_SIZE (25*1024)
18 /*TODO: deciper what each offset in the context represents. The below
19 * contexts are taken from dumps just after the 3D object is
22 static void nv40_graph_context_init(drm_device_t *dev, struct mem_block *ctx)
24 drm_nouveau_private_t *dev_priv = dev->dev_private;
27 /* Always has the "instance address" of itself at offset 0 */
28 INSTANCE_WR(ctx, 0x00000/4, nouveau_chip_instance_get(dev, ctx));
30 INSTANCE_WR(ctx, 0x00024/4, 0x0000ffff);
31 INSTANCE_WR(ctx, 0x00028/4, 0x0000ffff);
32 INSTANCE_WR(ctx, 0x00030/4, 0x00000001);
33 INSTANCE_WR(ctx, 0x0011c/4, 0x20010001);
34 INSTANCE_WR(ctx, 0x00120/4, 0x0f73ef00);
35 INSTANCE_WR(ctx, 0x00128/4, 0x02008821);
36 INSTANCE_WR(ctx, 0x0016c/4, 0x00000040);
37 INSTANCE_WR(ctx, 0x00170/4, 0x00000040);
38 INSTANCE_WR(ctx, 0x00174/4, 0x00000040);
39 INSTANCE_WR(ctx, 0x0017c/4, 0x80000000);
40 INSTANCE_WR(ctx, 0x00180/4, 0x80000000);
41 INSTANCE_WR(ctx, 0x00184/4, 0x80000000);
42 INSTANCE_WR(ctx, 0x00188/4, 0x80000000);
43 INSTANCE_WR(ctx, 0x0018c/4, 0x80000000);
44 INSTANCE_WR(ctx, 0x0019c/4, 0x00000040);
45 INSTANCE_WR(ctx, 0x001a0/4, 0x80000000);
46 INSTANCE_WR(ctx, 0x001b0/4, 0x80000000);
47 INSTANCE_WR(ctx, 0x001c0/4, 0x80000000);
48 INSTANCE_WR(ctx, 0x001d0/4, 0x0b0b0b0c);
49 INSTANCE_WR(ctx, 0x00340/4, 0x00040000);
50 INSTANCE_WR(ctx, 0x00350/4, 0x55555555);
51 INSTANCE_WR(ctx, 0x00354/4, 0x55555555);
52 INSTANCE_WR(ctx, 0x00358/4, 0x55555555);
53 INSTANCE_WR(ctx, 0x0035c/4, 0x55555555);
54 INSTANCE_WR(ctx, 0x00388/4, 0x00000008);
55 INSTANCE_WR(ctx, 0x0039c/4, 0x00000010);
56 INSTANCE_WR(ctx, 0x00480/4, 0x00000100);
57 INSTANCE_WR(ctx, 0x00494/4, 0x00000111);
58 INSTANCE_WR(ctx, 0x00498/4, 0x00080060);
59 INSTANCE_WR(ctx, 0x004b4/4, 0x00000080);
60 INSTANCE_WR(ctx, 0x004b8/4, 0xffff0000);
61 INSTANCE_WR(ctx, 0x004bc/4, 0x00000001);
62 INSTANCE_WR(ctx, 0x004d0/4, 0x46400000);
63 INSTANCE_WR(ctx, 0x004ec/4, 0xffff0000);
64 INSTANCE_WR(ctx, 0x004f8/4, 0x0fff0000);
65 INSTANCE_WR(ctx, 0x004fc/4, 0x0fff0000);
66 INSTANCE_WR(ctx, 0x00504/4, 0x00011100);
67 for (i=0x00520; i<=0x0055c; i+=4)
68 INSTANCE_WR(ctx, i/4, 0x07ff0000);
69 INSTANCE_WR(ctx, 0x00568/4, 0x4b7fffff);
70 INSTANCE_WR(ctx, 0x00594/4, 0x30201000);
71 INSTANCE_WR(ctx, 0x00598/4, 0x70605040);
72 INSTANCE_WR(ctx, 0x0059c/4, 0xb8a89888);
73 INSTANCE_WR(ctx, 0x005a0/4, 0xf8e8d8c8);
74 INSTANCE_WR(ctx, 0x005b4/4, 0x40100000);
75 INSTANCE_WR(ctx, 0x005cc/4, 0x00000004);
76 INSTANCE_WR(ctx, 0x005d8/4, 0x0000ffff);
77 INSTANCE_WR(ctx, 0x0060c/4, 0x435185d6);
78 INSTANCE_WR(ctx, 0x00610/4, 0x2155b699);
79 INSTANCE_WR(ctx, 0x00614/4, 0xfedcba98);
80 INSTANCE_WR(ctx, 0x00618/4, 0x00000098);
81 INSTANCE_WR(ctx, 0x00628/4, 0xffffffff);
82 INSTANCE_WR(ctx, 0x0062c/4, 0x00ff7000);
83 INSTANCE_WR(ctx, 0x00630/4, 0x0000ffff);
84 INSTANCE_WR(ctx, 0x00640/4, 0x00ff0000);
85 INSTANCE_WR(ctx, 0x0067c/4, 0x00ffff00);
86 /* 0x680-0x6BC - NV30_TCL_PRIMITIVE_3D_TX_ADDRESS_UNIT(0-15) */
87 /* 0x6C0-0x6FC - NV30_TCL_PRIMITIVE_3D_TX_FORMAT_UNIT(0-15) */
88 for (i=0x006C0; i<=0x006fc; i+=4)
89 INSTANCE_WR(ctx, i/4, 0x00018488);
90 /* 0x700-0x73C - NV30_TCL_PRIMITIVE_3D_TX_WRAP_UNIT(0-15) */
91 for (i=0x00700; i<=0x0073c; i+=4)
92 INSTANCE_WR(ctx, i/4, 0x00028202);
93 /* 0x740-0x77C - NV30_TCL_PRIMITIVE_3D_TX_ENABLE_UNIT(0-15) */
94 /* 0x780-0x7BC - NV30_TCL_PRIMITIVE_3D_TX_SWIZZLE_UNIT(0-15) */
95 for (i=0x00780; i<=0x007bc; i+=4)
96 INSTANCE_WR(ctx, i/4, 0x0000aae4);
97 /* 0x7C0-0x7FC - NV30_TCL_PRIMITIVE_3D_TX_FILTER_UNIT(0-15) */
98 for (i=0x007c0; i<=0x007fc; i+=4)
99 INSTANCE_WR(ctx, i/4, 0x01012000);
100 /* 0x800-0x83C - NV30_TCL_PRIMITIVE_3D_TX_XY_DIM_UNIT(0-15) */
101 for (i=0x00800; i<=0x0083c; i+=4)
102 INSTANCE_WR(ctx, i/4, 0x00080008);
103 /* 0x840-0x87C - NV30_TCL_PRIMITIVE_3D_TX_UNK07_UNIT(0-15) */
104 /* 0x880-0x8BC - NV30_TCL_PRIMITIVE_3D_TX_DEPTH_UNIT(0-15) */
105 for (i=0x00880; i<=0x008bc; i+=4)
106 INSTANCE_WR(ctx, i/4, 0x00100008);
108 for (i=0x00910; i<=0x0091c; i+=4)
109 INSTANCE_WR(ctx, i/4, 0x0001bc80);
110 for (i=0x00920; i<=0x0092c; i+=4)
111 INSTANCE_WR(ctx, i/4, 0x00000202);
112 for (i=0x00940; i<=0x0094c; i+=4)
113 INSTANCE_WR(ctx, i/4, 0x00000008);
114 for (i=0x00960; i<=0x0096c; i+=4)
115 INSTANCE_WR(ctx, i/4, 0x00080008);
116 INSTANCE_WR(ctx, 0x00980/4, 0x00000002);
117 INSTANCE_WR(ctx, 0x009b4/4, 0x00000001);
118 INSTANCE_WR(ctx, 0x009c0/4, 0x3e020200);
119 INSTANCE_WR(ctx, 0x009c4/4, 0x00ffffff);
120 INSTANCE_WR(ctx, 0x009c8/4, 0x60103f00);
121 INSTANCE_WR(ctx, 0x009d4/4, 0x00020000);
122 INSTANCE_WR(ctx, 0x00a08/4, 0x00008100);
123 INSTANCE_WR(ctx, 0x00aac/4, 0x00000001);
124 INSTANCE_WR(ctx, 0x00af0/4, 0x00000001);
125 INSTANCE_WR(ctx, 0x00af8/4, 0x80800001);
126 INSTANCE_WR(ctx, 0x00bcc/4, 0x00000005);
127 INSTANCE_WR(ctx, 0x00bf8/4, 0x00005555);
128 INSTANCE_WR(ctx, 0x00bfc/4, 0x00005555);
129 INSTANCE_WR(ctx, 0x00c00/4, 0x00005555);
130 INSTANCE_WR(ctx, 0x00c04/4, 0x00005555);
131 INSTANCE_WR(ctx, 0x00c08/4, 0x00005555);
132 INSTANCE_WR(ctx, 0x00c0c/4, 0x00005555);
133 INSTANCE_WR(ctx, 0x00c44/4, 0x00000001);
134 for (i=0x03008; i<=0x03080; i+=8)
135 INSTANCE_WR(ctx, i/4, 0x3f800000);
136 for (i=0x05288; i<=0x08570; i+=24)
137 INSTANCE_WR(ctx, i/4, 0x00000001);
138 for (i=0x08628; i<=0x08e18; i+=16)
139 INSTANCE_WR(ctx, i/4, 0x3f800000);
140 for (i=0x0bd28; i<=0x0f010; i+=24)
141 INSTANCE_WR(ctx, i/4, 0x00000001);
142 for (i=0x0f0c8; i<=0x0f8b8; i+=16)
143 INSTANCE_WR(ctx, i/4, 0x3f800000);
144 for (i=0x127c8; i<=0x15ab0; i+=24)
145 INSTANCE_WR(ctx, i/4, 0x00000001);
146 for (i=0x15b68; i<=0x16358; i+=16)
147 INSTANCE_WR(ctx, i/4, 0x3f800000);
148 for (i=0x19268; i<=0x1c550; i+=24)
149 INSTANCE_WR(ctx, i/4, 0x00000001);
150 for (i=0x1c608; i<=0x1cdf8; i+=16)
151 INSTANCE_WR(ctx, i/4, 0x3f800000);
152 for (i=0x1fd08; i<=0x22ff0; i+=24)
153 INSTANCE_WR(ctx, i/4, 0x00000001);
154 for (i=0x230a8; i<=0x23898; i+=16)
155 INSTANCE_WR(ctx, i/4, 0x3f800000);
156 for (i=0x267a8; i<=0x29a90; i+=24)
157 INSTANCE_WR(ctx, i/4, 0x00000001);
158 for (i=0x29b48; i<=0x2a338; i+=16)
159 INSTANCE_WR(ctx, i/4, 0x3f800000);
163 nv43_graph_context_init(drm_device_t *dev, struct mem_block *ctx)
165 drm_nouveau_private_t *dev_priv = dev->dev_private;
168 INSTANCE_WR(ctx, 0x00000/4, nouveau_chip_instance_get(dev, ctx));
169 INSTANCE_WR(ctx, 0x00024/4, 0x0000ffff);
170 INSTANCE_WR(ctx, 0x00028/4, 0x0000ffff);
171 INSTANCE_WR(ctx, 0x00030/4, 0x00000001);
172 INSTANCE_WR(ctx, 0x0011c/4, 0x20010001);
173 INSTANCE_WR(ctx, 0x00120/4, 0x0f73ef00);
174 INSTANCE_WR(ctx, 0x00128/4, 0x02008821);
175 INSTANCE_WR(ctx, 0x00178/4, 0x00000040);
176 INSTANCE_WR(ctx, 0x0017c/4, 0x00000040);
177 INSTANCE_WR(ctx, 0x00180/4, 0x00000040);
178 INSTANCE_WR(ctx, 0x00188/4, 0x00000040);
179 INSTANCE_WR(ctx, 0x00194/4, 0x80000000);
180 INSTANCE_WR(ctx, 0x00198/4, 0x80000000);
181 INSTANCE_WR(ctx, 0x0019c/4, 0x80000000);
182 INSTANCE_WR(ctx, 0x001a0/4, 0x80000000);
183 INSTANCE_WR(ctx, 0x001a4/4, 0x80000000);
184 INSTANCE_WR(ctx, 0x001a8/4, 0x80000000);
185 INSTANCE_WR(ctx, 0x001ac/4, 0x80000000);
186 INSTANCE_WR(ctx, 0x001b0/4, 0x80000000);
187 INSTANCE_WR(ctx, 0x001d0/4, 0x0b0b0b0c);
188 INSTANCE_WR(ctx, 0x00340/4, 0x00040000);
189 INSTANCE_WR(ctx, 0x00350/4, 0x55555555);
190 INSTANCE_WR(ctx, 0x00354/4, 0x55555555);
191 INSTANCE_WR(ctx, 0x00358/4, 0x55555555);
192 INSTANCE_WR(ctx, 0x0035c/4, 0x55555555);
193 INSTANCE_WR(ctx, 0x00388/4, 0x00000008);
194 INSTANCE_WR(ctx, 0x0039c/4, 0x00001010);
195 INSTANCE_WR(ctx, 0x003cc/4, 0x00000111);
196 INSTANCE_WR(ctx, 0x003d0/4, 0x00080060);
197 INSTANCE_WR(ctx, 0x003ec/4, 0x00000080);
198 INSTANCE_WR(ctx, 0x003f0/4, 0xffff0000);
199 INSTANCE_WR(ctx, 0x003f4/4, 0x00000001);
200 INSTANCE_WR(ctx, 0x00408/4, 0x46400000);
201 INSTANCE_WR(ctx, 0x00418/4, 0xffff0000);
202 INSTANCE_WR(ctx, 0x00424/4, 0x0fff0000);
203 INSTANCE_WR(ctx, 0x00428/4, 0x0fff0000);
204 INSTANCE_WR(ctx, 0x00430/4, 0x00011100);
205 for (i=0x0044c; i<=0x00488; i+=4)
206 INSTANCE_WR(ctx, i/4, 0x07ff0000);
207 INSTANCE_WR(ctx, 0x00494/4, 0x4b7fffff);
208 INSTANCE_WR(ctx, 0x004bc/4, 0x30201000);
209 INSTANCE_WR(ctx, 0x004c0/4, 0x70605040);
210 INSTANCE_WR(ctx, 0x004c4/4, 0xb8a89888);
211 INSTANCE_WR(ctx, 0x004c8/4, 0xf8e8d8c8);
212 INSTANCE_WR(ctx, 0x004dc/4, 0x40100000);
213 INSTANCE_WR(ctx, 0x004f8/4, 0x0000ffff);
214 INSTANCE_WR(ctx, 0x0052c/4, 0x435185d6);
215 INSTANCE_WR(ctx, 0x00530/4, 0x2155b699);
216 INSTANCE_WR(ctx, 0x00534/4, 0xfedcba98);
217 INSTANCE_WR(ctx, 0x00538/4, 0x00000098);
218 INSTANCE_WR(ctx, 0x00548/4, 0xffffffff);
219 INSTANCE_WR(ctx, 0x0054c/4, 0x00ff7000);
220 INSTANCE_WR(ctx, 0x00550/4, 0x0000ffff);
221 INSTANCE_WR(ctx, 0x00560/4, 0x00ff0000);
222 INSTANCE_WR(ctx, 0x00598/4, 0x00ffff00);
223 for (i=0x005dc; i<=0x00618; i+=4)
224 INSTANCE_WR(ctx, i/4, 0x00018488);
225 for (i=0x0061c; i<=0x00658; i+=4)
226 INSTANCE_WR(ctx, i/4, 0x00028202);
227 for (i=0x0069c; i<=0x006d8; i+=4)
228 INSTANCE_WR(ctx, i/4, 0x0000aae4);
229 for (i=0x006dc; i<=0x00718; i+=4)
230 INSTANCE_WR(ctx, i/4, 0x01012000);
231 for (i=0x0071c; i<=0x00758; i+=4)
232 INSTANCE_WR(ctx, i/4, 0x00080008);
233 for (i=0x0079c; i<=0x007d8; i+=4)
234 INSTANCE_WR(ctx, i/4, 0x00100008);
235 for (i=0x0082c; i<=0x00838; i+=4)
236 INSTANCE_WR(ctx, i/4, 0x0001bc80);
237 for (i=0x0083c; i<=0x00848; i+=4)
238 INSTANCE_WR(ctx, i/4, 0x00000202);
239 for (i=0x0085c; i<=0x00868; i+=4)
240 INSTANCE_WR(ctx, i/4, 0x00000008);
241 for (i=0x0087c; i<=0x00888; i+=4)
242 INSTANCE_WR(ctx, i/4, 0x00080008);
243 INSTANCE_WR(ctx, 0x0089c/4, 0x00000002);
244 INSTANCE_WR(ctx, 0x008d0/4, 0x00000021);
245 INSTANCE_WR(ctx, 0x008d4/4, 0x030c30c3);
246 INSTANCE_WR(ctx, 0x008e0/4, 0x3e020200);
247 INSTANCE_WR(ctx, 0x008e4/4, 0x00ffffff);
248 INSTANCE_WR(ctx, 0x008e8/4, 0x0c103f00);
249 INSTANCE_WR(ctx, 0x008f4/4, 0x00020000);
250 INSTANCE_WR(ctx, 0x0092c/4, 0x00008100);
251 INSTANCE_WR(ctx, 0x009b8/4, 0x00000001);
252 INSTANCE_WR(ctx, 0x009fc/4, 0x00001001);
253 INSTANCE_WR(ctx, 0x00a04/4, 0x00000003);
254 INSTANCE_WR(ctx, 0x00a08/4, 0x00888001);
255 INSTANCE_WR(ctx, 0x00a8c/4, 0x00000005);
256 INSTANCE_WR(ctx, 0x00a98/4, 0x0000ffff);
257 INSTANCE_WR(ctx, 0x00ab4/4, 0x00005555);
258 INSTANCE_WR(ctx, 0x00ab8/4, 0x00005555);
259 INSTANCE_WR(ctx, 0x00abc/4, 0x00005555);
260 INSTANCE_WR(ctx, 0x00ac0/4, 0x00000001);
261 INSTANCE_WR(ctx, 0x00af8/4, 0x00000001);
262 for (i=0x02ec0; i<=0x02f38; i+=8)
263 INSTANCE_WR(ctx, i/4, 0x3f800000);
264 for (i=0x04c80; i<=0x06e70; i+=24)
265 INSTANCE_WR(ctx, i/4, 0x00000001);
266 for (i=0x06e80; i<=0x07270; i+=16)
267 INSTANCE_WR(ctx, i/4, 0x3f800000);
268 for (i=0x096c0; i<=0x0b8b0; i+=24)
269 INSTANCE_WR(ctx, i/4, 0x00000001);
270 for (i=0x0b8c0; i<=0x0bcb0; i+=16)
271 INSTANCE_WR(ctx, i/4, 0x3f800000);
272 for (i=0x0e100; i<=0x102f0; i+=24)
273 INSTANCE_WR(ctx, i/4, 0x00000001);
274 for (i=0x10300; i<=0x106f0; i+=16)
275 INSTANCE_WR(ctx, i/4, 0x3f800000);
278 static void nv46_graph_context_init(drm_device_t *dev, struct mem_block *ctx)
280 drm_nouveau_private_t *dev_priv = dev->dev_private;
283 INSTANCE_WR(ctx, 0x00000/4, nouveau_chip_instance_get(dev, ctx));
284 INSTANCE_WR(ctx, 0x00040/4, 0x0000ffff);
285 INSTANCE_WR(ctx, 0x00044/4, 0x0000ffff);
286 INSTANCE_WR(ctx, 0x0004c/4, 0x00000001);
287 INSTANCE_WR(ctx, 0x00138/4, 0x20010001);
288 INSTANCE_WR(ctx, 0x0013c/4, 0x0f73ef00);
289 INSTANCE_WR(ctx, 0x00144/4, 0x02008821);
290 INSTANCE_WR(ctx, 0x00174/4, 0x00000001);
291 INSTANCE_WR(ctx, 0x00178/4, 0x00000001);
292 INSTANCE_WR(ctx, 0x0017c/4, 0x00000001);
293 INSTANCE_WR(ctx, 0x00180/4, 0x00000001);
294 INSTANCE_WR(ctx, 0x00184/4, 0x00000001);
295 INSTANCE_WR(ctx, 0x00188/4, 0x00000001);
296 INSTANCE_WR(ctx, 0x0018c/4, 0x00000001);
297 INSTANCE_WR(ctx, 0x00190/4, 0x00000001);
298 INSTANCE_WR(ctx, 0x00194/4, 0x00000040);
299 INSTANCE_WR(ctx, 0x00198/4, 0x00000040);
300 INSTANCE_WR(ctx, 0x0019c/4, 0x00000040);
301 INSTANCE_WR(ctx, 0x001a4/4, 0x00000040);
302 INSTANCE_WR(ctx, 0x001ec/4, 0x0b0b0b0c);
303 INSTANCE_WR(ctx, 0x0035c/4, 0x00040000);
304 INSTANCE_WR(ctx, 0x0036c/4, 0x55555555);
305 INSTANCE_WR(ctx, 0x00370/4, 0x55555555);
306 INSTANCE_WR(ctx, 0x00374/4, 0x55555555);
307 INSTANCE_WR(ctx, 0x00378/4, 0x55555555);
308 INSTANCE_WR(ctx, 0x003a4/4, 0x00000008);
309 INSTANCE_WR(ctx, 0x003b8/4, 0x00003010);
310 INSTANCE_WR(ctx, 0x003dc/4, 0x00000111);
311 INSTANCE_WR(ctx, 0x003e0/4, 0x00000111);
312 INSTANCE_WR(ctx, 0x003e4/4, 0x00000111);
313 INSTANCE_WR(ctx, 0x003e8/4, 0x00000111);
314 INSTANCE_WR(ctx, 0x003ec/4, 0x00000111);
315 INSTANCE_WR(ctx, 0x003f0/4, 0x00000111);
316 INSTANCE_WR(ctx, 0x003f4/4, 0x00000111);
317 INSTANCE_WR(ctx, 0x003f8/4, 0x00000111);
318 INSTANCE_WR(ctx, 0x003fc/4, 0x00000111);
319 INSTANCE_WR(ctx, 0x00400/4, 0x00000111);
320 INSTANCE_WR(ctx, 0x00404/4, 0x00000111);
321 INSTANCE_WR(ctx, 0x00408/4, 0x00000111);
322 INSTANCE_WR(ctx, 0x0040c/4, 0x00000111);
323 INSTANCE_WR(ctx, 0x00410/4, 0x00000111);
324 INSTANCE_WR(ctx, 0x00414/4, 0x00000111);
325 INSTANCE_WR(ctx, 0x00418/4, 0x00000111);
326 INSTANCE_WR(ctx, 0x004b0/4, 0x00000111);
327 INSTANCE_WR(ctx, 0x004b4/4, 0x00080060);
328 INSTANCE_WR(ctx, 0x004d0/4, 0x00000080);
329 INSTANCE_WR(ctx, 0x004d4/4, 0xffff0000);
330 INSTANCE_WR(ctx, 0x004d8/4, 0x00000001);
331 INSTANCE_WR(ctx, 0x004ec/4, 0x46400000);
332 INSTANCE_WR(ctx, 0x004fc/4, 0xffff0000);
333 INSTANCE_WR(ctx, 0x00500/4, 0x88888888);
334 INSTANCE_WR(ctx, 0x00504/4, 0x88888888);
335 INSTANCE_WR(ctx, 0x00508/4, 0x88888888);
336 INSTANCE_WR(ctx, 0x0050c/4, 0x88888888);
337 INSTANCE_WR(ctx, 0x00510/4, 0x88888888);
338 INSTANCE_WR(ctx, 0x00514/4, 0x88888888);
339 INSTANCE_WR(ctx, 0x00518/4, 0x88888888);
340 INSTANCE_WR(ctx, 0x0051c/4, 0x88888888);
341 INSTANCE_WR(ctx, 0x00520/4, 0x88888888);
342 INSTANCE_WR(ctx, 0x00524/4, 0x88888888);
343 INSTANCE_WR(ctx, 0x00528/4, 0x88888888);
344 INSTANCE_WR(ctx, 0x0052c/4, 0x88888888);
345 INSTANCE_WR(ctx, 0x00530/4, 0x88888888);
346 INSTANCE_WR(ctx, 0x00534/4, 0x88888888);
347 INSTANCE_WR(ctx, 0x00538/4, 0x88888888);
348 INSTANCE_WR(ctx, 0x0053c/4, 0x88888888);
349 INSTANCE_WR(ctx, 0x00550/4, 0x0fff0000);
350 INSTANCE_WR(ctx, 0x00554/4, 0x0fff0000);
351 INSTANCE_WR(ctx, 0x0055c/4, 0x00011100);
352 for (i=0x00578; i<0x005b4; i+=4)
353 INSTANCE_WR(ctx, i/4, 0x07ff0000);
354 INSTANCE_WR(ctx, 0x005c0/4, 0x4b7fffff);
355 INSTANCE_WR(ctx, 0x005e8/4, 0x30201000);
356 INSTANCE_WR(ctx, 0x005ec/4, 0x70605040);
357 INSTANCE_WR(ctx, 0x005f0/4, 0xb8a89888);
358 INSTANCE_WR(ctx, 0x005f4/4, 0xf8e8d8c8);
359 INSTANCE_WR(ctx, 0x00608/4, 0x40100000);
360 INSTANCE_WR(ctx, 0x00624/4, 0x0000ffff);
361 INSTANCE_WR(ctx, 0x00658/4, 0x435185d6);
362 INSTANCE_WR(ctx, 0x0065c/4, 0x2155b699);
363 INSTANCE_WR(ctx, 0x00660/4, 0xfedcba98);
364 INSTANCE_WR(ctx, 0x00664/4, 0x00000098);
365 INSTANCE_WR(ctx, 0x00674/4, 0xffffffff);
366 INSTANCE_WR(ctx, 0x00678/4, 0x00ff7000);
367 INSTANCE_WR(ctx, 0x0067c/4, 0x0000ffff);
368 INSTANCE_WR(ctx, 0x0068c/4, 0x00ff0000);
369 INSTANCE_WR(ctx, 0x006c8/4, 0x00ffff00);
370 for (i=0x0070c; i<=0x00748; i+=4)
371 INSTANCE_WR(ctx, i/4, 0x00018488);
372 for (i=0x0074c; i<=0x00788; i+=4)
373 INSTANCE_WR(ctx, i/4, 0x00028202);
374 for (i=0x007cc; i<=0x00808; i+=4)
375 INSTANCE_WR(ctx, i/4, 0x0000aae4);
376 for (i=0x0080c; i<=0x00848; i+=4)
377 INSTANCE_WR(ctx, i/4, 0x01012000);
378 for (i=0x0084c; i<=0x00888; i+=4)
379 INSTANCE_WR(ctx, i/4, 0x00080008);
380 for (i=0x008cc; i<=0x00908; i+=4)
381 INSTANCE_WR(ctx, i/4, 0x00100008);
382 for (i=0x0095c; i<=0x00968; i+=4)
383 INSTANCE_WR(ctx, i/4, 0x0001bc80);
384 for (i=0x0096c; i<=0x00978; i+=4)
385 INSTANCE_WR(ctx, i/4, 0x00000202);
386 for (i=0x0098c; i<=0x00998; i+=4)
387 INSTANCE_WR(ctx, i/4, 0x00000008);
388 for (i=0x009ac; i<=0x009b8; i+=4)
389 INSTANCE_WR(ctx, i/4, 0x00080008);
390 INSTANCE_WR(ctx, 0x009cc/4, 0x00000002);
391 INSTANCE_WR(ctx, 0x00a00/4, 0x00000421);
392 INSTANCE_WR(ctx, 0x00a04/4, 0x030c30c3);
393 INSTANCE_WR(ctx, 0x00a08/4, 0x00011001);
394 INSTANCE_WR(ctx, 0x00a14/4, 0x3e020200);
395 INSTANCE_WR(ctx, 0x00a18/4, 0x00ffffff);
396 INSTANCE_WR(ctx, 0x00a1c/4, 0x0c103f00);
397 INSTANCE_WR(ctx, 0x00a28/4, 0x00040000);
398 INSTANCE_WR(ctx, 0x00a60/4, 0x00008100);
399 INSTANCE_WR(ctx, 0x00aec/4, 0x00000001);
400 INSTANCE_WR(ctx, 0x00b30/4, 0x00001001);
401 INSTANCE_WR(ctx, 0x00b38/4, 0x00000003);
402 INSTANCE_WR(ctx, 0x00b3c/4, 0x00888001);
403 INSTANCE_WR(ctx, 0x00bc0/4, 0x00000005);
404 INSTANCE_WR(ctx, 0x00bcc/4, 0x0000ffff);
405 INSTANCE_WR(ctx, 0x00be8/4, 0x00005555);
406 INSTANCE_WR(ctx, 0x00bec/4, 0x00005555);
407 INSTANCE_WR(ctx, 0x00bf0/4, 0x00005555);
408 INSTANCE_WR(ctx, 0x00bf4/4, 0x00000001);
409 INSTANCE_WR(ctx, 0x00c2c/4, 0x00000001);
410 INSTANCE_WR(ctx, 0x00c30/4, 0x08e00001);
411 INSTANCE_WR(ctx, 0x00c34/4, 0x000e3000);
412 for (i=0x017f8; i<=0x01870; i+=8)
413 INSTANCE_WR(ctx, i/4, 0x3f800000);
414 for (i=0x035b8; i<=0x057a8; i+=24)
415 INSTANCE_WR(ctx, i/4, 0x00000001);
416 for (i=0x057b8; i<=0x05ba8; i+=16)
417 INSTANCE_WR(ctx, i/4, 0x3f800000);
418 for (i=0x07f38; i<=0x0a128; i+=24)
419 INSTANCE_WR(ctx, i/4, 0x00000001);
420 for (i=0x0a138; i<=0x0a528; i+=16)
421 INSTANCE_WR(ctx, i/4, 0x3f800000);
422 for (i=0x0c8b8; i<=0x0eaa8; i+=24)
423 INSTANCE_WR(ctx, i/4, 0x00000001);
424 for (i=0x0eab8; i<=0x0eea8; i+=16)
425 INSTANCE_WR(ctx, i/4, 0x3f800000);
428 static void nv4a_graph_context_init(drm_device_t *dev, struct mem_block *ctx)
430 drm_nouveau_private_t *dev_priv = dev->dev_private;
433 INSTANCE_WR(ctx, 0x00000/4, nouveau_chip_instance_get(dev, ctx));
434 INSTANCE_WR(ctx, 0x00024/4, 0x0000ffff);
435 INSTANCE_WR(ctx, 0x00028/4, 0x0000ffff);
436 INSTANCE_WR(ctx, 0x00030/4, 0x00000001);
437 INSTANCE_WR(ctx, 0x0011c/4, 0x20010001);
438 INSTANCE_WR(ctx, 0x00120/4, 0x0f73ef00);
439 INSTANCE_WR(ctx, 0x00128/4, 0x02008821);
440 INSTANCE_WR(ctx, 0x00158/4, 0x00000001);
441 INSTANCE_WR(ctx, 0x0015c/4, 0x00000001);
442 INSTANCE_WR(ctx, 0x00160/4, 0x00000001);
443 INSTANCE_WR(ctx, 0x00164/4, 0x00000001);
444 INSTANCE_WR(ctx, 0x00168/4, 0x00000001);
445 INSTANCE_WR(ctx, 0x0016c/4, 0x00000001);
446 INSTANCE_WR(ctx, 0x00170/4, 0x00000001);
447 INSTANCE_WR(ctx, 0x00174/4, 0x00000001);
448 INSTANCE_WR(ctx, 0x00178/4, 0x00000040);
449 INSTANCE_WR(ctx, 0x0017c/4, 0x00000040);
450 INSTANCE_WR(ctx, 0x00180/4, 0x00000040);
451 INSTANCE_WR(ctx, 0x00188/4, 0x00000040);
452 INSTANCE_WR(ctx, 0x001d0/4, 0x0b0b0b0c);
453 INSTANCE_WR(ctx, 0x00340/4, 0x00040000);
454 INSTANCE_WR(ctx, 0x00350/4, 0x55555555);
455 INSTANCE_WR(ctx, 0x00354/4, 0x55555555);
456 INSTANCE_WR(ctx, 0x00358/4, 0x55555555);
457 INSTANCE_WR(ctx, 0x0035c/4, 0x55555555);
458 INSTANCE_WR(ctx, 0x00388/4, 0x00000008);
459 INSTANCE_WR(ctx, 0x0039c/4, 0x00003010);
460 INSTANCE_WR(ctx, 0x003cc/4, 0x00000111);
461 INSTANCE_WR(ctx, 0x003d0/4, 0x00080060);
462 INSTANCE_WR(ctx, 0x003ec/4, 0x00000080);
463 INSTANCE_WR(ctx, 0x003f0/4, 0xffff0000);
464 INSTANCE_WR(ctx, 0x003f4/4, 0x00000001);
465 INSTANCE_WR(ctx, 0x00408/4, 0x46400000);
466 INSTANCE_WR(ctx, 0x00418/4, 0xffff0000);
467 INSTANCE_WR(ctx, 0x00424/4, 0x0fff0000);
468 INSTANCE_WR(ctx, 0x00428/4, 0x0fff0000);
469 INSTANCE_WR(ctx, 0x00430/4, 0x00011100);
470 for (i=0x0044c; i<=0x00488; i+=4)
471 INSTANCE_WR(ctx, i/4, 0x07ff0000);
472 INSTANCE_WR(ctx, 0x00494/4, 0x4b7fffff);
473 INSTANCE_WR(ctx, 0x004bc/4, 0x30201000);
474 INSTANCE_WR(ctx, 0x004c0/4, 0x70605040);
475 INSTANCE_WR(ctx, 0x004c4/4, 0xb8a89888);
476 INSTANCE_WR(ctx, 0x004c8/4, 0xf8e8d8c8);
477 INSTANCE_WR(ctx, 0x004dc/4, 0x40100000);
478 INSTANCE_WR(ctx, 0x004f8/4, 0x0000ffff);
479 INSTANCE_WR(ctx, 0x0052c/4, 0x435185d6);
480 INSTANCE_WR(ctx, 0x00530/4, 0x2155b699);
481 INSTANCE_WR(ctx, 0x00534/4, 0xfedcba98);
482 INSTANCE_WR(ctx, 0x00538/4, 0x00000098);
483 INSTANCE_WR(ctx, 0x00548/4, 0xffffffff);
484 INSTANCE_WR(ctx, 0x0054c/4, 0x00ff7000);
485 INSTANCE_WR(ctx, 0x00550/4, 0x0000ffff);
486 INSTANCE_WR(ctx, 0x0055c/4, 0x00ff0000);
487 INSTANCE_WR(ctx, 0x00594/4, 0x00ffff00);
488 for (i=0x005d8; i<=0x00614; i+=4)
489 INSTANCE_WR(ctx, i/4, 0x00018488);
490 for (i=0x00618; i<=0x00654; i+=4)
491 INSTANCE_WR(ctx, i/4, 0x00028202);
492 for (i=0x00698; i<=0x006d4; i+=4)
493 INSTANCE_WR(ctx, i/4, 0x0000aae4);
494 for (i=0x006d8; i<=0x00714; i+=4)
495 INSTANCE_WR(ctx, i/4, 0x01012000);
496 for (i=0x00718; i<=0x00754; i+=4)
497 INSTANCE_WR(ctx, i/4, 0x00080008);
498 for (i=0x00798; i<=0x007d4; i+=4)
499 INSTANCE_WR(ctx, i/4, 0x00100008);
500 for (i=0x00828; i<=0x00834; i+=4)
501 INSTANCE_WR(ctx, i/4, 0x0001bc80);
502 for (i=0x00838; i<=0x00844; i+=4)
503 INSTANCE_WR(ctx, i/4, 0x00000202);
504 for (i=0x00858; i<=0x00864; i+=4)
505 INSTANCE_WR(ctx, i/4, 0x00000008);
506 for (i=0x00878; i<=0x00884; i+=4)
507 INSTANCE_WR(ctx, i/4, 0x00080008);
508 INSTANCE_WR(ctx, 0x00898/4, 0x00000002);
509 INSTANCE_WR(ctx, 0x008cc/4, 0x00000021);
510 INSTANCE_WR(ctx, 0x008d0/4, 0x030c30c3);
511 INSTANCE_WR(ctx, 0x008d4/4, 0x00011001);
512 INSTANCE_WR(ctx, 0x008e0/4, 0x3e020200);
513 INSTANCE_WR(ctx, 0x008e4/4, 0x00ffffff);
514 INSTANCE_WR(ctx, 0x008e8/4, 0x0c103f00);
515 INSTANCE_WR(ctx, 0x008f4/4, 0x00040000);
516 INSTANCE_WR(ctx, 0x0092c/4, 0x00008100);
517 INSTANCE_WR(ctx, 0x009b8/4, 0x00000001);
518 INSTANCE_WR(ctx, 0x009fc/4, 0x00001001);
519 INSTANCE_WR(ctx, 0x00a04/4, 0x00000003);
520 INSTANCE_WR(ctx, 0x00a08/4, 0x00888001);
521 INSTANCE_WR(ctx, 0x00a8c/4, 0x00000005);
522 INSTANCE_WR(ctx, 0x00a98/4, 0x0000ffff);
523 INSTANCE_WR(ctx, 0x00ab4/4, 0x00005555);
524 INSTANCE_WR(ctx, 0x00ab8/4, 0x00005555);
525 INSTANCE_WR(ctx, 0x00abc/4, 0x00005555);
526 INSTANCE_WR(ctx, 0x00ac0/4, 0x00000001);
527 INSTANCE_WR(ctx, 0x00af8/4, 0x00000001);
528 for (i=0x016c0; i<=0x01738; i+=8)
529 INSTANCE_WR(ctx, i/4, 0x3f800000);
530 for (i=0x03840; i<=0x05670; i+=24)
531 INSTANCE_WR(ctx, i/4, 0x00000001);
532 for (i=0x05680; i<=0x05a70; i+=16)
533 INSTANCE_WR(ctx, i/4, 0x3f800000);
534 for (i=0x07e00; i<=0x09ff0; i+=24)
535 INSTANCE_WR(ctx, i/4, 0x00000001);
536 for (i=0x0a000; i<=0x0a3f0; i+=16)
537 INSTANCE_WR(ctx, i/4, 0x3f800000);
538 for (i=0x0c780; i<=0x0e970; i+=24)
539 INSTANCE_WR(ctx, i/4, 0x00000001);
540 for (i=0x0e980; i<=0x0ed70; i+=16)
541 INSTANCE_WR(ctx, i/4, 0x3f800000);
545 static void nv4c_graph_context_init(drm_device_t *dev, struct mem_block *ctx)
547 drm_nouveau_private_t *dev_priv = dev->dev_private;
550 INSTANCE_WR(ctx, 0x00000/4, nouveau_chip_instance_get(dev, ctx));
551 INSTANCE_WR(ctx, 0x00024/4, 0x0000ffff);
552 INSTANCE_WR(ctx, 0x00028/4, 0x0000ffff);
553 INSTANCE_WR(ctx, 0x00030/4, 0x00000001);
554 INSTANCE_WR(ctx, 0x0011c/4, 0x20010001);
555 INSTANCE_WR(ctx, 0x00120/4, 0x0f73ef00);
556 INSTANCE_WR(ctx, 0x00128/4, 0x02008821);
557 INSTANCE_WR(ctx, 0x00158/4, 0x00000001);
558 INSTANCE_WR(ctx, 0x0015c/4, 0x00000001);
559 INSTANCE_WR(ctx, 0x00160/4, 0x00000001);
560 INSTANCE_WR(ctx, 0x00164/4, 0x00000001);
561 INSTANCE_WR(ctx, 0x00168/4, 0x00000001);
562 INSTANCE_WR(ctx, 0x0016c/4, 0x00000001);
563 INSTANCE_WR(ctx, 0x00170/4, 0x00000001);
564 INSTANCE_WR(ctx, 0x00174/4, 0x00000001);
565 INSTANCE_WR(ctx, 0x00178/4, 0x00000040);
566 INSTANCE_WR(ctx, 0x0017c/4, 0x00000040);
567 INSTANCE_WR(ctx, 0x00180/4, 0x00000040);
568 INSTANCE_WR(ctx, 0x00188/4, 0x00000040);
569 INSTANCE_WR(ctx, 0x001d0/4, 0x0b0b0b0c);
570 INSTANCE_WR(ctx, 0x00340/4, 0x00040000);
571 INSTANCE_WR(ctx, 0x00350/4, 0x55555555);
572 INSTANCE_WR(ctx, 0x00354/4, 0x55555555);
573 INSTANCE_WR(ctx, 0x00358/4, 0x55555555);
574 INSTANCE_WR(ctx, 0x0035c/4, 0x55555555);
575 INSTANCE_WR(ctx, 0x00388/4, 0x00000008);
576 INSTANCE_WR(ctx, 0x0039c/4, 0x00001010);
577 INSTANCE_WR(ctx, 0x003d0/4, 0x00000111);
578 INSTANCE_WR(ctx, 0x003d4/4, 0x00080060);
579 INSTANCE_WR(ctx, 0x003f0/4, 0x00000080);
580 INSTANCE_WR(ctx, 0x003f4/4, 0xffff0000);
581 INSTANCE_WR(ctx, 0x003f8/4, 0x00000001);
582 INSTANCE_WR(ctx, 0x0040c/4, 0x46400000);
583 INSTANCE_WR(ctx, 0x0041c/4, 0xffff0000);
584 INSTANCE_WR(ctx, 0x00428/4, 0x0fff0000);
585 INSTANCE_WR(ctx, 0x0042c/4, 0x0fff0000);
586 INSTANCE_WR(ctx, 0x00434/4, 0x00011100);
587 for (i=0x00450; i<0x0048c; i+=4)
588 INSTANCE_WR(ctx, i/4, 0x07ff0000);
589 INSTANCE_WR(ctx, 0x00498/4, 0x4b7fffff);
590 INSTANCE_WR(ctx, 0x004c0/4, 0x30201000);
591 INSTANCE_WR(ctx, 0x004c4/4, 0x70605040);
592 INSTANCE_WR(ctx, 0x004c8/4, 0xb8a89888);
593 INSTANCE_WR(ctx, 0x004cc/4, 0xf8e8d8c8);
594 INSTANCE_WR(ctx, 0x004e0/4, 0x40100000);
595 INSTANCE_WR(ctx, 0x004fc/4, 0x0000ffff);
596 INSTANCE_WR(ctx, 0x00530/4, 0x435185d6);
597 INSTANCE_WR(ctx, 0x00534/4, 0x2155b699);
598 INSTANCE_WR(ctx, 0x00538/4, 0xfedcba98);
599 INSTANCE_WR(ctx, 0x0053c/4, 0x00000098);
600 INSTANCE_WR(ctx, 0x0054c/4, 0xffffffff);
601 INSTANCE_WR(ctx, 0x00550/4, 0x00ff7000);
602 INSTANCE_WR(ctx, 0x00554/4, 0x0000ffff);
603 INSTANCE_WR(ctx, 0x00564/4, 0x00ff0000);
604 INSTANCE_WR(ctx, 0x0059c/4, 0x00ffff00);
605 for (i=0x005e0; i<=0x0061c; i+=4)
606 INSTANCE_WR(ctx, i/4, 0x00018488);
607 for (i=0x00620; i<=0x0065c; i+=4)
608 INSTANCE_WR(ctx, i/4, 0x00028202);
609 for (i=0x006a0; i<=0x006dc; i+=4)
610 INSTANCE_WR(ctx, i/4, 0x0000aae4);
611 for (i=0x006e0; i<=0x0071c; i+=4)
612 INSTANCE_WR(ctx, i/4, 0x01012000);
613 for (i=0x00720; i<=0x0075c; i+=4)
614 INSTANCE_WR(ctx, i/4, 0x00080008);
615 for (i=0x007a0; i<=0x007dc; i+=4)
616 INSTANCE_WR(ctx, i/4, 0x00100008);
617 for (i=0x00830; i<=0x0083c; i+=4)
618 INSTANCE_WR(ctx, i/4, 0x0001bc80);
619 for (i=0x00840; i<=0x0084c; i+=4)
620 INSTANCE_WR(ctx, i/4, 0x00000202);
621 for (i=0x00860; i<=0x0086c; i+=4)
622 INSTANCE_WR(ctx, i/4, 0x00000008);
623 for (i=0x00880; i<=0x0088c; i+=4)
624 INSTANCE_WR(ctx, i/4, 0x00080008);
625 INSTANCE_WR(ctx, 0x008a0/4, 0x00000002);
626 INSTANCE_WR(ctx, 0x008d4/4, 0x00000020);
627 INSTANCE_WR(ctx, 0x008d8/4, 0x030c30c3);
628 INSTANCE_WR(ctx, 0x008dc/4, 0x00011001);
629 INSTANCE_WR(ctx, 0x008e8/4, 0x3e020200);
630 INSTANCE_WR(ctx, 0x008ec/4, 0x00ffffff);
631 INSTANCE_WR(ctx, 0x008f0/4, 0x0c103f00);
632 INSTANCE_WR(ctx, 0x008fc/4, 0x00040000);
633 INSTANCE_WR(ctx, 0x00934/4, 0x00008100);
634 INSTANCE_WR(ctx, 0x009c0/4, 0x00000001);
635 INSTANCE_WR(ctx, 0x00a04/4, 0x00001001);
636 INSTANCE_WR(ctx, 0x00a0c/4, 0x00000003);
637 INSTANCE_WR(ctx, 0x00a10/4, 0x00888001);
638 INSTANCE_WR(ctx, 0x00a74/4, 0x00000005);
639 INSTANCE_WR(ctx, 0x00a80/4, 0x0000ffff);
640 INSTANCE_WR(ctx, 0x00a9c/4, 0x00005555);
641 INSTANCE_WR(ctx, 0x00aa0/4, 0x00000001);
642 INSTANCE_WR(ctx, 0x00ad8/4, 0x00000001);
643 for (i=0x016a0; i<0x01718; i+=8)
644 INSTANCE_WR(ctx, i/4, 0x3f800000);
645 for (i=0x03460; i<0x05650; i+=24)
646 INSTANCE_WR(ctx, i/4, 0x00000001);
647 for (i=0x05660; i<0x05a50; i+=16)
648 INSTANCE_WR(ctx, i/4, 0x3f800000);
651 static void nv4e_graph_context_init(drm_device_t *dev, struct mem_block *ctx)
653 drm_nouveau_private_t *dev_priv = dev->dev_private;
656 INSTANCE_WR(ctx, 0x00000/4, nouveau_chip_instance_get(dev, ctx));
657 INSTANCE_WR(ctx, 0x00024/4, 0x0000ffff);
658 INSTANCE_WR(ctx, 0x00028/4, 0x0000ffff);
659 INSTANCE_WR(ctx, 0x00030/4, 0x00000001);
660 INSTANCE_WR(ctx, 0x0011c/4, 0x20010001);
661 INSTANCE_WR(ctx, 0x00120/4, 0x0f73ef00);
662 INSTANCE_WR(ctx, 0x00128/4, 0x02008821);
663 INSTANCE_WR(ctx, 0x00158/4, 0x00000001);
664 INSTANCE_WR(ctx, 0x0015c/4, 0x00000001);
665 INSTANCE_WR(ctx, 0x00160/4, 0x00000001);
666 INSTANCE_WR(ctx, 0x00164/4, 0x00000001);
667 INSTANCE_WR(ctx, 0x00168/4, 0x00000001);
668 INSTANCE_WR(ctx, 0x0016c/4, 0x00000001);
669 INSTANCE_WR(ctx, 0x00170/4, 0x00000001);
670 INSTANCE_WR(ctx, 0x00174/4, 0x00000001);
671 INSTANCE_WR(ctx, 0x00178/4, 0x00000040);
672 INSTANCE_WR(ctx, 0x0017c/4, 0x00000040);
673 INSTANCE_WR(ctx, 0x00180/4, 0x00000040);
674 INSTANCE_WR(ctx, 0x00188/4, 0x00000040);
675 INSTANCE_WR(ctx, 0x001d0/4, 0x0b0b0b0c);
676 INSTANCE_WR(ctx, 0x00340/4, 0x00040000);
677 INSTANCE_WR(ctx, 0x00350/4, 0x55555555);
678 INSTANCE_WR(ctx, 0x00354/4, 0x55555555);
679 INSTANCE_WR(ctx, 0x00358/4, 0x55555555);
680 INSTANCE_WR(ctx, 0x0035c/4, 0x55555555);
681 INSTANCE_WR(ctx, 0x00388/4, 0x00000008);
682 INSTANCE_WR(ctx, 0x0039c/4, 0x00001010);
683 INSTANCE_WR(ctx, 0x003cc/4, 0x00000111);
684 INSTANCE_WR(ctx, 0x003d0/4, 0x00080060);
685 INSTANCE_WR(ctx, 0x003ec/4, 0x00000080);
686 INSTANCE_WR(ctx, 0x003f0/4, 0xffff0000);
687 INSTANCE_WR(ctx, 0x003f4/4, 0x00000001);
688 INSTANCE_WR(ctx, 0x00408/4, 0x46400000);
689 INSTANCE_WR(ctx, 0x00418/4, 0xffff0000);
690 INSTANCE_WR(ctx, 0x00424/4, 0x0fff0000);
691 INSTANCE_WR(ctx, 0x00428/4, 0x0fff0000);
692 INSTANCE_WR(ctx, 0x00430/4, 0x00011100);
693 for (i=0x0044c; i<=0x00488; i+=4)
694 INSTANCE_WR(ctx, i/4, 0x07ff0000);
695 INSTANCE_WR(ctx, 0x00494/4, 0x4b7fffff);
696 INSTANCE_WR(ctx, 0x004bc/4, 0x30201000);
697 INSTANCE_WR(ctx, 0x004c0/4, 0x70605040);
698 INSTANCE_WR(ctx, 0x004c4/4, 0xb8a89888);
699 INSTANCE_WR(ctx, 0x004c8/4, 0xf8e8d8c8);
700 INSTANCE_WR(ctx, 0x004dc/4, 0x40100000);
701 INSTANCE_WR(ctx, 0x004f8/4, 0x0000ffff);
702 INSTANCE_WR(ctx, 0x0052c/4, 0x435185d6);
703 INSTANCE_WR(ctx, 0x00530/4, 0x2155b699);
704 INSTANCE_WR(ctx, 0x00534/4, 0xfedcba98);
705 INSTANCE_WR(ctx, 0x00538/4, 0x00000098);
706 INSTANCE_WR(ctx, 0x00548/4, 0xffffffff);
707 INSTANCE_WR(ctx, 0x0054c/4, 0x00ff7000);
708 INSTANCE_WR(ctx, 0x00550/4, 0x0000ffff);
709 INSTANCE_WR(ctx, 0x0055c/4, 0x00ff0000);
710 INSTANCE_WR(ctx, 0x00594/4, 0x00ffff00);
711 for (i=0x005d8; i<=0x00614; i+=4)
712 INSTANCE_WR(ctx, i/4, 0x00018488);
713 for (i=0x00618; i<=0x00654; i+=4)
714 INSTANCE_WR(ctx, i/4, 0x00028202);
715 for (i=0x00698; i<=0x006d4; i+=4)
716 INSTANCE_WR(ctx, i/4, 0x0000aae4);
717 for (i=0x006d8; i<=0x00714; i+=4)
718 INSTANCE_WR(ctx, i/4, 0x01012000);
719 for (i=0x00718; i<=0x00754; i+=4)
720 INSTANCE_WR(ctx, i/4, 0x00080008);
721 for (i=0x00798; i<=0x007d4; i+=4)
722 INSTANCE_WR(ctx, i/4, 0x00100008);
723 for (i=0x00828; i<=0x00834; i+=4)
724 INSTANCE_WR(ctx, i/4, 0x0001bc80);
725 for (i=0x00838; i<=0x00844; i+=4)
726 INSTANCE_WR(ctx, i/4, 0x00000202);
727 for (i=0x00858; i<=0x00864; i+=4)
728 INSTANCE_WR(ctx, i/4, 0x00000008);
729 for (i=0x00878; i<=0x00884; i+=4)
730 INSTANCE_WR(ctx, i/4, 0x00080008);
731 INSTANCE_WR(ctx, 0x00898/4, 0x00000002);
732 INSTANCE_WR(ctx, 0x008cc/4, 0x00000020);
733 INSTANCE_WR(ctx, 0x008d0/4, 0x030c30c3);
734 INSTANCE_WR(ctx, 0x008d4/4, 0x00011001);
735 INSTANCE_WR(ctx, 0x008e0/4, 0x3e020200);
736 INSTANCE_WR(ctx, 0x008e4/4, 0x00ffffff);
737 INSTANCE_WR(ctx, 0x008e8/4, 0x0c103f00);
738 INSTANCE_WR(ctx, 0x008f4/4, 0x00040000);
739 INSTANCE_WR(ctx, 0x0092c/4, 0x00008100);
740 INSTANCE_WR(ctx, 0x009b8/4, 0x00000001);
741 INSTANCE_WR(ctx, 0x009fc/4, 0x00001001);
742 INSTANCE_WR(ctx, 0x00a04/4, 0x00000003);
743 INSTANCE_WR(ctx, 0x00a08/4, 0x00888001);
744 INSTANCE_WR(ctx, 0x00a6c/4, 0x00000005);
745 INSTANCE_WR(ctx, 0x00a78/4, 0x0000ffff);
746 INSTANCE_WR(ctx, 0x00a94/4, 0x00005555);
747 INSTANCE_WR(ctx, 0x00a98/4, 0x00000001);
748 INSTANCE_WR(ctx, 0x00aa4/4, 0x00000001);
749 for (i=0x01668; i<=0x016e0; i+=8)
750 INSTANCE_WR(ctx, i/4, 0x3f800000);
751 for (i=0x03428; i<=0x05618; i+=24)
752 INSTANCE_WR(ctx, i/4, 0x00000001);
753 for (i=0x05628; i<=0x05a18; i+=16)
754 INSTANCE_WR(ctx, i/4, 0x3f800000);
758 nv40_graph_context_create(drm_device_t *dev, int channel)
760 drm_nouveau_private_t *dev_priv =
761 (drm_nouveau_private_t *)dev->dev_private;
762 struct nouveau_fifo *chan = &dev_priv->fifos[channel];
763 void (*ctx_init)(drm_device_t *, struct mem_block *);
764 unsigned int ctx_size;
767 switch (dev_priv->chipset) {
769 ctx_size = NV40_GRCTX_SIZE;
770 ctx_init = nv40_graph_context_init;
773 ctx_size = NV43_GRCTX_SIZE;
774 ctx_init = nv43_graph_context_init;
777 ctx_size = NV46_GRCTX_SIZE;
778 ctx_init = nv46_graph_context_init;
781 ctx_size = NV4A_GRCTX_SIZE;
782 ctx_init = nv4a_graph_context_init;
785 ctx_size = NV4C_GRCTX_SIZE;
786 ctx_init = nv4c_graph_context_init;
789 ctx_size = NV4E_GRCTX_SIZE;
790 ctx_init = nv4e_graph_context_init;
793 ctx_size = NV40_GRCTX_SIZE;
794 ctx_init = nv40_graph_context_init;
798 /* Alloc and clear RAMIN to store the context */
799 chan->ramin_grctx = nouveau_instmem_alloc(dev, ctx_size, 4);
800 if (!chan->ramin_grctx)
801 return DRM_ERR(ENOMEM);
802 for (i=0; i<ctx_size; i+=4)
803 INSTANCE_WR(chan->ramin_grctx, i/4, 0x00000000);
805 /* Initialise default context values */
806 ctx_init(dev, chan->ramin_grctx);
811 /* Save current context (from PGRAPH) into the channel's context
812 *XXX: fails sometimes, not sure why..
815 nv40_graph_context_save_current(drm_device_t *dev)
817 drm_nouveau_private_t *dev_priv =
818 (drm_nouveau_private_t *)dev->dev_private;
822 NV_WRITE(NV04_PGRAPH_FIFO, 0);
824 instance = NV_READ(0x40032C) & 0xFFFFF;
826 NV_WRITE(NV04_PGRAPH_FIFO, 1);
830 NV_WRITE(0x400784, instance);
831 NV_WRITE(0x400310, NV_READ(0x400310) | 0x20);
832 NV_WRITE(0x400304, 1);
833 /* just in case, we don't want to spin in-kernel forever */
834 for (i=0; i<1000; i++) {
835 if (NV_READ(0x40030C) == 0)
839 DRM_ERROR("failed to save current grctx to ramin\n");
840 DRM_ERROR("instance = 0x%08x\n", NV_READ(0x40032C));
841 DRM_ERROR("0x40030C = 0x%08x\n", NV_READ(0x40030C));
842 NV_WRITE(NV04_PGRAPH_FIFO, 1);
846 NV_WRITE(NV04_PGRAPH_FIFO, 1);
849 /* Restore the context for a specific channel into PGRAPH
850 * XXX: fails sometimes.. not sure why
853 nv40_graph_context_restore(drm_device_t *dev, int channel)
855 drm_nouveau_private_t *dev_priv =
856 (drm_nouveau_private_t *)dev->dev_private;
857 struct nouveau_fifo *chan = &dev_priv->fifos[channel];
861 instance = nouveau_chip_instance_get(dev, chan->ramin_grctx);
863 NV_WRITE(NV04_PGRAPH_FIFO, 0);
864 NV_WRITE(0x400784, instance);
865 NV_WRITE(0x400310, NV_READ(0x400310) | 0x40);
866 NV_WRITE(0x400304, 1);
867 /* just in case, we don't want to spin in-kernel forever */
868 for (i=0; i<1000; i++) {
869 if (NV_READ(0x40030C) == 0)
873 DRM_ERROR("failed to restore grctx for ch%d to PGRAPH\n",
875 DRM_ERROR("instance = 0x%08x\n", instance);
876 DRM_ERROR("0x40030C = 0x%08x\n", NV_READ(0x40030C));
877 NV_WRITE(NV04_PGRAPH_FIFO, 1);
882 /* 0x40032C, no idea of it's exact function. Could simply be a
883 * record of the currently active PGRAPH context. It's currently
884 * unknown as to what bit 24 does. The nv ddx has it set, so we will
887 NV_WRITE(0x40032C, instance | 0x01000000);
888 /* 0x32E0 records the instance address of the active FIFO's PGRAPH
889 * context. If at any time this doesn't match 0x40032C, you will
890 * recieve PGRAPH_INTR_CONTEXT_SWITCH
892 NV_WRITE(NV40_PFIFO_GRCTX_INSTANCE, instance);
893 NV_WRITE(NV04_PGRAPH_FIFO, 1);
896 /* Some voodoo that makes context switching work without the binary driver
897 * initialising the card first.
899 * It is possible to effect how the context is saved from PGRAPH into a block
900 * of instance memory by altering the values in these tables. This may mean
901 * that the context layout of each chipset is slightly different (at least
902 * NV40 and C51 are different). It would also be possible for chipsets to
903 * have an identical context layout, but pull the data from different PGRAPH
906 * TODO: decode the meaning of the magic values, may provide clues about the
907 * differences between the various NV40 chipsets.
908 * TODO: one we have a better idea of how each chipset differs, perhaps think
909 * about unifying these instead of providing a separate table for each
912 * mmio-trace dumps from other nv4x/g7x/c5x cards very welcome :)
914 static uint32_t nv40_ctx_voodoo[] = {
915 0x00400889, 0x00200000, 0x0060000a, 0x00200000, 0x00300000, 0x00800001,
916 0x00700009, 0x0060000e, 0x00400d64, 0x00400d05, 0x00408f65, 0x00409406,
917 0x0040a268, 0x00200000, 0x0060000a, 0x00700000, 0x00106000, 0x00700080,
918 0x004014e6, 0x007000a0, 0x00401a84, 0x00700082, 0x00600001, 0x00500061,
919 0x00600002, 0x00401b68, 0x00500060, 0x00200001, 0x0060000a, 0x0011814d,
920 0x00110158, 0x00105401, 0x0020003a, 0x00100051, 0x001040c5, 0x0010c1c4,
921 0x001041c9, 0x0010c1dc, 0x00110205, 0x0011420a, 0x00114210, 0x00110216,
922 0x0012421b, 0x00120270, 0x001242c0, 0x00200040, 0x00100280, 0x00128100,
923 0x00128120, 0x00128143, 0x0011415f, 0x0010815c, 0x0010c140, 0x00104029,
924 0x00110400, 0x00104d10, 0x00500060, 0x00403b87, 0x0060000d, 0x004076e6,
925 0x002000f0, 0x0060000a, 0x00200045, 0x00100620, 0x00108668, 0x0011466b,
926 0x00120682, 0x0011068b, 0x00168691, 0x0010c6ae, 0x001206b4, 0x0020002a,
927 0x001006c4, 0x001246f0, 0x002000c0, 0x00100700, 0x0010c3d7, 0x001043e1,
928 0x00500060, 0x00405600, 0x00405684, 0x00600003, 0x00500067, 0x00600008,
929 0x00500060, 0x00700082, 0x0020026c, 0x0060000a, 0x00104800, 0x00104901,
930 0x00120920, 0x00200035, 0x00100940, 0x00148a00, 0x00104a14, 0x00200038,
931 0x00100b00, 0x00138d00, 0x00104e00, 0x0012d600, 0x00105c00, 0x00104f06,
932 0x0020031a, 0x0060000a, 0x00300000, 0x00200680, 0x00406c00, 0x00200684,
933 0x00800001, 0x00200b62, 0x0060000a, 0x0020a0b0, 0x0040728a, 0x00201b68,
934 0x00800041, 0x00407684, 0x00203e60, 0x00800002, 0x00408700, 0x00600006,
935 0x00700003, 0x004080e6, 0x00700080, 0x0020031a, 0x0060000a, 0x00200004,
936 0x00800001, 0x00700000, 0x00200000, 0x0060000a, 0x00106002, 0x0040a284,
937 0x00700002, 0x00600004, 0x0040a268, 0x00700000, 0x00200000, 0x0060000a,
938 0x00106002, 0x00700080, 0x00400a84, 0x00700002, 0x00400a68, 0x00500060,
939 0x00600007, 0x00409388, 0x0060000f, 0x00000000, 0x00500060, 0x00200000,
940 0x0060000a, 0x00700000, 0x00106001, 0x00700083, 0x00910880, 0x00901ffe,
941 0x00940400, 0x00200020, 0x0060000b, 0x00500069, 0x0060000c, 0x00401b68,
942 0x0040a406, 0x0040a505, 0x00600009, 0x00700005, 0x00700006, 0x0060000e,
946 static uint32_t nv43_ctx_voodoo[] = {
947 0x00400889, 0x00200000, 0x0060000a, 0x00200000, 0x00300000, 0x00800001,
948 0x00700009, 0x0060000e, 0x00400d64, 0x00400d05, 0x00409565, 0x00409a06,
949 0x0040a868, 0x00200000, 0x0060000a, 0x00700000, 0x00106000, 0x00700080,
950 0x004014e6, 0x007000a0, 0x00401a84, 0x00700082, 0x00600001, 0x00500061,
951 0x00600002, 0x00401b68, 0x00500060, 0x00200001, 0x0060000a, 0x0011814d,
952 0x00110158, 0x00105401, 0x0020003a, 0x00100051, 0x001040c5, 0x0010c1c4,
953 0x001041c9, 0x0010c1dc, 0x00150210, 0x0012c225, 0x00108238, 0x0010823e,
954 0x001242c0, 0x00200040, 0x00100280, 0x00128100, 0x00128120, 0x00128143,
955 0x0011415f, 0x0010815c, 0x0010c140, 0x00104029, 0x00110400, 0x00104d10,
956 0x001046ec, 0x00500060, 0x00403a87, 0x0060000d, 0x00407ce6, 0x002000f1,
957 0x0060000a, 0x00148653, 0x00104668, 0x0010c66d, 0x00120682, 0x0011068b,
958 0x00168691, 0x001046ae, 0x001046b0, 0x001206b4, 0x001046c4, 0x001146c6,
959 0x00200020, 0x001006cc, 0x001046ed, 0x001246f0, 0x002000c0, 0x00100700,
960 0x0010c3d7, 0x001043e1, 0x00500060, 0x00405800, 0x00405884, 0x00600003,
961 0x00500067, 0x00600008, 0x00500060, 0x00700082, 0x00200233, 0x0060000a,
962 0x00104800, 0x00108901, 0x00124920, 0x0020001f, 0x00100940, 0x00140965,
963 0x00148a00, 0x00108a14, 0x00160b00, 0x00134b2c, 0x0010cd00, 0x0010cd04,
964 0x0010cd08, 0x00104d80, 0x00104e00, 0x0012d600, 0x00105c00, 0x00104f06,
965 0x002002c8, 0x0060000a, 0x00300000, 0x00200680, 0x00407200, 0x00200684,
966 0x00800001, 0x00200b10, 0x0060000a, 0x00203870, 0x0040788a, 0x00201350,
967 0x00800041, 0x00407c84, 0x00201560, 0x00800002, 0x00408d00, 0x00600006,
968 0x00700003, 0x004086e6, 0x00700080, 0x002002c8, 0x0060000a, 0x00200004,
969 0x00800001, 0x00700000, 0x00200000, 0x0060000a, 0x00106002, 0x0040a884,
970 0x00700002, 0x00600004, 0x0040a868, 0x00700000, 0x00200000, 0x0060000a,
971 0x00106002, 0x00700080, 0x00400a84, 0x00700002, 0x00400a68, 0x00500060,
972 0x00600007, 0x00409988, 0x0060000f, 0x00000000, 0x00500060, 0x00200000,
973 0x0060000a, 0x00700000, 0x00106001, 0x00700083, 0x00910880, 0x00901ffe,
974 0x00940400, 0x00200020, 0x0060000b, 0x00500069, 0x0060000c, 0x00401b68,
975 0x0040aa06, 0x0040ab05, 0x00600009, 0x00700005, 0x00700006, 0x0060000e,
979 static uint32_t nv46_ctx_voodoo[] = {
980 0x00400889, 0x00200000, 0x0060000a, 0x00200000, 0x00300000, 0x00800001,
981 0x00700009, 0x0060000e, 0x00400d64, 0x00400d05, 0x00408f65, 0x00409306,
982 0x0040a068, 0x0040198f, 0x00200001, 0x0060000a, 0x00700080, 0x00104042,
983 0x00200001, 0x0060000a, 0x00700000, 0x001040c5, 0x00401826, 0x00401968,
984 0x0060000d, 0x00200000, 0x0060000a, 0x00700000, 0x00106000, 0x00700080,
985 0x004020e6, 0x007000a0, 0x00500060, 0x00200008, 0x0060000a, 0x0011814d,
986 0x00110158, 0x00105401, 0x0020003a, 0x00100051, 0x001040c5, 0x0010c1c4,
987 0x001041c9, 0x0010c1dc, 0x00150210, 0x0012c225, 0x00108238, 0x0010823e,
988 0x001242c0, 0x00200040, 0x00100280, 0x00128100, 0x00128120, 0x00128143,
989 0x0011415f, 0x0010815c, 0x0010c140, 0x00104029, 0x00110400, 0x00104d10,
990 0x00500060, 0x00403f87, 0x0060000d, 0x004079e6, 0x002000f7, 0x0060000a,
991 0x00200045, 0x00100620, 0x00104668, 0x0017466d, 0x0011068b, 0x00168691,
992 0x001046ae, 0x001046b0, 0x001206b4, 0x001046c4, 0x001146c6, 0x00200022,
993 0x001006cc, 0x001246f0, 0x002000c0, 0x00100700, 0x0010c3d7, 0x001043e1,
994 0x00500060, 0x0020027f, 0x0060000a, 0x00104800, 0x00108901, 0x00104910,
995 0x00124920, 0x0020001f, 0x00100940, 0x00140965, 0x00148a00, 0x00108a14,
996 0x00160b00, 0x00134b2c, 0x0010cd00, 0x0010cd04, 0x0010cd08, 0x00104d80,
997 0x00104e00, 0x0012d600, 0x00105c00, 0x00104f06, 0x00105406, 0x00105709,
998 0x00200316, 0x0060000a, 0x00300000, 0x00200080, 0x00407200, 0x00200084,
999 0x00800001, 0x0020055e, 0x0060000a, 0x002037e0, 0x0040788a, 0x00201320,
1000 0x00800029, 0x00408900, 0x00600006, 0x004085e6, 0x00700080, 0x00200081,
1001 0x0060000a, 0x00104280, 0x00200316, 0x0060000a, 0x00200004, 0x00800001,
1002 0x00700000, 0x00200000, 0x0060000a, 0x00106002, 0x0040a068, 0x00700000,
1003 0x00200000, 0x0060000a, 0x00106002, 0x00700080, 0x00400a68, 0x00500060,
1004 0x00600007, 0x00409388, 0x0060000f, 0x00500060, 0x00200000, 0x0060000a,
1005 0x00700000, 0x00106001, 0x00910880, 0x00901ffe, 0x01940000, 0x00200020,
1006 0x0060000b, 0x00500069, 0x0060000c, 0x00402168, 0x0040a206, 0x0040a305,
1007 0x00600009, 0x00700005, 0x00700006, 0x0060000e, ~0
1010 static uint32_t nv4a_ctx_voodoo[] = {
1011 0x00400889, 0x00200000, 0x0060000a, 0x00200000, 0x00300000, 0x00800001,
1012 0x00700009, 0x0060000e, 0x00400d64, 0x00400d05, 0x00409965, 0x00409e06,
1013 0x0040ac68, 0x00200000, 0x0060000a, 0x00700000, 0x00106000, 0x00700080,
1014 0x004014e6, 0x007000a0, 0x00401a84, 0x00700082, 0x00600001, 0x00500061,
1015 0x00600002, 0x00401b68, 0x00500060, 0x00200001, 0x0060000a, 0x0011814d,
1016 0x00110158, 0x00105401, 0x0020003a, 0x00100051, 0x001040c5, 0x0010c1c4,
1017 0x001041c9, 0x0010c1dc, 0x00150210, 0x0012c225, 0x00108238, 0x0010823e,
1018 0x001242c0, 0x00200040, 0x00100280, 0x00128100, 0x00128120, 0x00128143,
1019 0x0011415f, 0x0010815c, 0x0010c140, 0x00104029, 0x00110400, 0x00104d10,
1020 0x001046ec, 0x00500060, 0x00403a87, 0x0060000d, 0x00407de6, 0x002000f1,
1021 0x0060000a, 0x00148653, 0x00104668, 0x0010c66d, 0x00120682, 0x0011068b,
1022 0x00168691, 0x001046ae, 0x001046b0, 0x001206b4, 0x001046c4, 0x001146c6,
1023 0x001646cc, 0x001186e6, 0x001046ed, 0x001246f0, 0x002000c0, 0x00100700,
1024 0x0010c3d7, 0x001043e1, 0x00500060, 0x00405800, 0x00405884, 0x00600003,
1025 0x00500067, 0x00600008, 0x00500060, 0x00700082, 0x00200232, 0x0060000a,
1026 0x00104800, 0x00108901, 0x00104910, 0x00124920, 0x0020001f, 0x00100940,
1027 0x00140965, 0x00148a00, 0x00108a14, 0x00160b00, 0x00134b2c, 0x0010cd00,
1028 0x0010cd04, 0x0010cd08, 0x00104d80, 0x00104e00, 0x0012d600, 0x00105c00,
1029 0x00104f06, 0x002002c8, 0x0060000a, 0x00300000, 0x00200080, 0x00407300,
1030 0x00200084, 0x00800001, 0x00200510, 0x0060000a, 0x002037e0, 0x0040798a,
1031 0x00201320, 0x00800029, 0x00407d84, 0x00201560, 0x00800002, 0x00409100,
1032 0x00600006, 0x00700003, 0x00408ae6, 0x00700080, 0x0020007a, 0x0060000a,
1033 0x00104280, 0x002002c8, 0x0060000a, 0x00200004, 0x00800001, 0x00700000,
1034 0x00200000, 0x0060000a, 0x00106002, 0x0040ac84, 0x00700002, 0x00600004,
1035 0x0040ac68, 0x00700000, 0x00200000, 0x0060000a, 0x00106002, 0x00700080,
1036 0x00400a84, 0x00700002, 0x00400a68, 0x00500060, 0x00600007, 0x00409d88,
1037 0x0060000f, 0x00000000, 0x00500060, 0x00200000, 0x0060000a, 0x00700000,
1038 0x00106001, 0x00700083, 0x00910880, 0x00901ffe, 0x01940000, 0x00200020,
1039 0x0060000b, 0x00500069, 0x0060000c, 0x00401b68, 0x0040ae06, 0x0040af05,
1040 0x00600009, 0x00700005, 0x00700006, 0x0060000e, ~0
1043 static uint32_t nv4e_ctx_voodoo[] = {
1044 0x00400889, 0x00200000, 0x0060000a, 0x00200000, 0x00300000, 0x00800001,
1045 0x00700009, 0x0060000e, 0x00400d64, 0x00400d05, 0x00409565, 0x00409a06,
1046 0x0040a868, 0x00200000, 0x0060000a, 0x00700000, 0x00106000, 0x00700080,
1047 0x004014e6, 0x007000a0, 0x00401a84, 0x00700082, 0x00600001, 0x00500061,
1048 0x00600002, 0x00401b68, 0x00500060, 0x00200001, 0x0060000a, 0x0011814d,
1049 0x00110158, 0x00105401, 0x0020003a, 0x00100051, 0x001040c5, 0x0010c1c4,
1050 0x001041c9, 0x0010c1dc, 0x00150210, 0x0012c225, 0x00108238, 0x0010823e,
1051 0x001242c0, 0x00200040, 0x00100280, 0x00128100, 0x00128120, 0x00128143,
1052 0x0011415f, 0x0010815c, 0x0010c140, 0x00104029, 0x00110400, 0x00104d10,
1053 0x001046ec, 0x00500060, 0x00403a87, 0x0060000d, 0x00407ce6, 0x002000f1,
1054 0x0060000a, 0x00148653, 0x00104668, 0x0010c66d, 0x00120682, 0x0011068b,
1055 0x00168691, 0x001046ae, 0x001046b0, 0x001206b4, 0x001046c4, 0x001146c6,
1056 0x001646cc, 0x001186e6, 0x001046ed, 0x001246f0, 0x002000c0, 0x00100700,
1057 0x0010c3d7, 0x001043e1, 0x00500060, 0x00405800, 0x00405884, 0x00600003,
1058 0x00500067, 0x00600008, 0x00500060, 0x00700082, 0x00200232, 0x0060000a,
1059 0x00104800, 0x00108901, 0x00104910, 0x00124920, 0x0020001f, 0x00100940,
1060 0x00140965, 0x00148a00, 0x00108a14, 0x00140b00, 0x00134b2c, 0x0010cd00,
1061 0x0010cd04, 0x00104d08, 0x00104d80, 0x00104e00, 0x00105c00, 0x00104f06,
1062 0x002002b2, 0x0060000a, 0x00300000, 0x00200080, 0x00407200, 0x00200084,
1063 0x00800001, 0x002004fa, 0x0060000a, 0x00201320, 0x0040788a, 0xfffffb06,
1064 0x00800029, 0x00407c84, 0x00200b20, 0x00800002, 0x00408d00, 0x00600006,
1065 0x00700003, 0x004086e6, 0x00700080, 0x002002b2, 0x0060000a, 0x00200004,
1066 0x00800001, 0x00700000, 0x00200000, 0x0060000a, 0x00106002, 0x0040a884,
1067 0x00700002, 0x00600004, 0x0040a868, 0x00700000, 0x00200000, 0x0060000a,
1068 0x00106002, 0x00700080, 0x00400a84, 0x00700002, 0x00400a68, 0x00500060,
1069 0x00600007, 0x00409988, 0x0060000f, 0x00000000, 0x00500060, 0x00200000,
1070 0x0060000a, 0x00700000, 0x00106001, 0x00700083, 0x00910880, 0x00901ffe,
1071 0x01940000, 0x00200020, 0x0060000b, 0x00500069, 0x0060000c, 0x00401b68,
1072 0x0040aa06, 0x0040ab05, 0x00600009, 0x00700005, 0x00700006, 0x0060000e,
1086 nv40_graph_init(drm_device_t *dev)
1088 drm_nouveau_private_t *dev_priv =
1089 (drm_nouveau_private_t *)dev->dev_private;
1090 uint32_t *ctx_voodoo;
1091 uint32_t vramsz, tmp;
1094 NV_WRITE(NV03_PMC_ENABLE, NV_READ(NV03_PMC_ENABLE) &
1095 ~NV_PMC_ENABLE_PGRAPH);
1096 NV_WRITE(NV03_PMC_ENABLE, NV_READ(NV03_PMC_ENABLE) |
1097 NV_PMC_ENABLE_PGRAPH);
1099 switch (dev_priv->chipset) {
1100 case 0x40: ctx_voodoo = nv40_ctx_voodoo; break;
1101 case 0x43: ctx_voodoo = nv43_ctx_voodoo; break;
1102 case 0x46: ctx_voodoo = nv46_ctx_voodoo; break;
1103 case 0x4a: ctx_voodoo = nv4a_ctx_voodoo; break;
1104 case 0x4e: ctx_voodoo = nv4e_ctx_voodoo; break;
1106 DRM_ERROR("Unknown ctx_voodoo for chipset 0x%02x\n",
1112 /* Load the context voodoo onto the card */
1114 DRM_DEBUG("Loading context-switch voodoo\n");
1117 NV_WRITE(0x400324, 0);
1118 while (ctx_voodoo[i] != ~0) {
1119 NV_WRITE(0x400328, ctx_voodoo[i]);
1124 /* No context present currently */
1125 NV_WRITE(0x40032C, 0x00000000);
1127 NV_WRITE(NV03_PGRAPH_INTR_EN, 0x00000000);
1128 NV_WRITE(NV03_PGRAPH_INTR , 0xFFFFFFFF);
1130 NV_WRITE(NV04_PGRAPH_DEBUG_0, 0xFFFFFFFF);
1131 NV_WRITE(NV04_PGRAPH_DEBUG_0, 0x00000000);
1132 NV_WRITE(NV04_PGRAPH_DEBUG_1, 0x401287c0);
1133 NV_WRITE(NV04_PGRAPH_DEBUG_3, 0xe0de8055);
1134 NV_WRITE(NV10_PGRAPH_DEBUG_4, 0x00008000);
1135 NV_WRITE(NV04_PGRAPH_LIMIT_VIOL_PIX, 0x00be3c5f);
1137 NV_WRITE(NV10_PGRAPH_CTX_CONTROL, 0x10010100);
1138 NV_WRITE(NV10_PGRAPH_STATE , 0xFFFFFFFF);
1139 NV_WRITE(NV04_PGRAPH_FIFO , 0x00000001);
1141 j = NV_READ(0x1540) & 0xff;
1143 for (i=0; !(j&1); j>>=1, i++);
1144 NV_WRITE(0x405000, i);
1147 if (dev_priv->chipset == 0x40) {
1148 NV_WRITE(0x4009b0, 0x83280fff);
1149 NV_WRITE(0x4009b4, 0x000000a0);
1151 NV_WRITE(0x400820, 0x83280eff);
1152 NV_WRITE(0x400824, 0x000000a0);
1155 switch (dev_priv->chipset) {
1158 NV_WRITE(0x4009b8, 0x0078e366);
1159 NV_WRITE(0x4009bc, 0x0000014c);
1162 case 0x42: /* pciid also 0x00Cx */
1163 // case 0x0120: //XXX (pciid)
1164 NV_WRITE(0x400828, 0x007596ff);
1165 NV_WRITE(0x40082c, 0x00000108);
1168 NV_WRITE(0x400828, 0x0072cb77);
1169 NV_WRITE(0x40082c, 0x00000108);
1172 case 0x46: /* G72 */
1174 case 0x4c: /* G7x-based C51 */
1176 NV_WRITE(0x400860, 0);
1177 NV_WRITE(0x400864, 0);
1179 case 0x47: /* G70 */
1180 case 0x49: /* G71 */
1181 case 0x4b: /* G73 */
1182 NV_WRITE(0x400828, 0x07830610);
1183 NV_WRITE(0x40082c, 0x0000016A);
1189 NV_WRITE(0x400b38, 0x2ffff800);
1190 NV_WRITE(0x400b3c, 0x00006000);
1192 /* copy tile info from PFB */
1193 switch (dev_priv->chipset) {
1194 case 0x40: /* vanilla NV40 */
1195 for (i=0; i<NV10_PFB_TILE__SIZE; i++) {
1196 tmp = NV_READ(NV10_PFB_TILE(i));
1197 NV_WRITE(NV40_PGRAPH_TILE0(i), tmp);
1198 NV_WRITE(NV40_PGRAPH_TILE1(i), tmp);
1199 tmp = NV_READ(NV10_PFB_TLIMIT(i));
1200 NV_WRITE(NV40_PGRAPH_TLIMIT0(i), tmp);
1201 NV_WRITE(NV40_PGRAPH_TLIMIT1(i), tmp);
1202 tmp = NV_READ(NV10_PFB_TSIZE(i));
1203 NV_WRITE(NV40_PGRAPH_TSIZE0(i), tmp);
1204 NV_WRITE(NV40_PGRAPH_TSIZE1(i), tmp);
1205 tmp = NV_READ(NV10_PFB_TSTATUS(i));
1206 NV_WRITE(NV40_PGRAPH_TSTATUS0(i), tmp);
1207 NV_WRITE(NV40_PGRAPH_TSTATUS1(i), tmp);
1212 case 0x4e: /* NV44-based cores don't have 0x406900? */
1213 for (i=0; i<NV40_PFB_TILE__SIZE_0; i++) {
1214 tmp = NV_READ(NV40_PFB_TILE(i));
1215 NV_WRITE(NV40_PGRAPH_TILE0(i), tmp);
1216 tmp = NV_READ(NV40_PFB_TLIMIT(i));
1217 NV_WRITE(NV40_PGRAPH_TLIMIT0(i), tmp);
1218 tmp = NV_READ(NV40_PFB_TSIZE(i));
1219 NV_WRITE(NV40_PGRAPH_TSIZE0(i), tmp);
1220 tmp = NV_READ(NV40_PFB_TSTATUS(i));
1221 NV_WRITE(NV40_PGRAPH_TSTATUS0(i), tmp);
1227 case 0x4b: /* G7X-based cores */
1228 for (i=0; i<NV40_PFB_TILE__SIZE_1; i++) {
1229 tmp = NV_READ(NV40_PFB_TILE(i));
1230 NV_WRITE(NV47_PGRAPH_TILE0(i), tmp);
1231 NV_WRITE(NV40_PGRAPH_TILE1(i), tmp);
1232 tmp = NV_READ(NV40_PFB_TLIMIT(i));
1233 NV_WRITE(NV47_PGRAPH_TLIMIT0(i), tmp);
1234 NV_WRITE(NV40_PGRAPH_TLIMIT1(i), tmp);
1235 tmp = NV_READ(NV40_PFB_TSIZE(i));
1236 NV_WRITE(NV47_PGRAPH_TSIZE0(i), tmp);
1237 NV_WRITE(NV40_PGRAPH_TSIZE1(i), tmp);
1238 tmp = NV_READ(NV40_PFB_TSTATUS(i));
1239 NV_WRITE(NV47_PGRAPH_TSTATUS0(i), tmp);
1240 NV_WRITE(NV40_PGRAPH_TSTATUS1(i), tmp);
1243 default: /* everything else */
1244 for (i=0; i<NV40_PFB_TILE__SIZE_0; i++) {
1245 tmp = NV_READ(NV40_PFB_TILE(i));
1246 NV_WRITE(NV40_PGRAPH_TILE0(i), tmp);
1247 NV_WRITE(NV40_PGRAPH_TILE1(i), tmp);
1248 tmp = NV_READ(NV40_PFB_TLIMIT(i));
1249 NV_WRITE(NV40_PGRAPH_TLIMIT0(i), tmp);
1250 NV_WRITE(NV40_PGRAPH_TLIMIT1(i), tmp);
1251 tmp = NV_READ(NV40_PFB_TSIZE(i));
1252 NV_WRITE(NV40_PGRAPH_TSIZE0(i), tmp);
1253 NV_WRITE(NV40_PGRAPH_TSIZE1(i), tmp);
1254 tmp = NV_READ(NV40_PFB_TSTATUS(i));
1255 NV_WRITE(NV40_PGRAPH_TSTATUS0(i), tmp);
1256 NV_WRITE(NV40_PGRAPH_TSTATUS1(i), tmp);
1261 /* begin RAM config */
1262 vramsz = drm_get_resource_len(dev, 0) - 1;
1263 switch (dev_priv->chipset) {
1265 NV_WRITE(0x4009A4, NV_READ(NV04_PFB_CFG0));
1266 NV_WRITE(0x4009A8, NV_READ(NV04_PFB_CFG1));
1267 NV_WRITE(0x4069A4, NV_READ(NV04_PFB_CFG0));
1268 NV_WRITE(0x4069A8, NV_READ(NV04_PFB_CFG1));
1269 NV_WRITE(0x400820, 0);
1270 NV_WRITE(0x400824, 0);
1271 NV_WRITE(0x400864, vramsz);
1272 NV_WRITE(0x400868, vramsz);
1275 switch (dev_priv->chipset) {
1280 NV_WRITE(0x400DF0, NV_READ(NV04_PFB_CFG0));
1281 NV_WRITE(0x400DF4, NV_READ(NV04_PFB_CFG1));
1284 NV_WRITE(0x4009F0, NV_READ(NV04_PFB_CFG0));
1285 NV_WRITE(0x4009F4, NV_READ(NV04_PFB_CFG1));
1288 NV_WRITE(0x4069F0, NV_READ(NV04_PFB_CFG0));
1289 NV_WRITE(0x4069F4, NV_READ(NV04_PFB_CFG1));
1290 NV_WRITE(0x400840, 0);
1291 NV_WRITE(0x400844, 0);
1292 NV_WRITE(0x4008A0, vramsz);
1293 NV_WRITE(0x4008A4, vramsz);
1297 /* per-context state, doesn't belong here */
1298 NV_WRITE(0x400B20, 0x00000000);
1299 NV_WRITE(0x400B04, 0xFFFFFFFF);
1301 tmp = NV_READ(NV10_PGRAPH_SURFACE) & 0x0007ff00;
1302 NV_WRITE(NV10_PGRAPH_SURFACE, tmp);
1303 tmp = NV_READ(NV10_PGRAPH_SURFACE) | 0x00020100;
1304 NV_WRITE(NV10_PGRAPH_SURFACE, tmp);
1306 NV_WRITE(NV03_PGRAPH_ABS_UCLIP_XMIN, 0);
1307 NV_WRITE(NV03_PGRAPH_ABS_UCLIP_YMIN, 0);
1308 NV_WRITE(NV03_PGRAPH_ABS_UCLIP_XMAX, 0x7fff);
1309 NV_WRITE(NV03_PGRAPH_ABS_UCLIP_YMAX, 0x7fff);
1314 void nv40_graph_takedown(drm_device_t *dev)