blob: eb45f3aac88557adfe53bff308f3a69073d09e20 [file] [log] [blame]
Ben Skeggs6ee73862009-12-11 19:24:15 +10001/*
2 * Copyright 2007 Stephane Marchesin
3 * All Rights Reserved.
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice (including the next
13 * paragraph) shall be included in all copies or substantial portions of the
14 * Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 */
24
25#include "drmP.h"
26#include "drm.h"
27#include "nouveau_drm.h"
28#include "nouveau_drv.h"
Francisco Jerez332b2422010-10-20 23:35:40 +020029#include "nouveau_hw.h"
Ben Skeggs274fec92010-11-03 13:16:18 +100030#include "nouveau_util.h"
Ben Skeggs4ea52f82011-03-31 13:44:16 +100031#include "nouveau_ramht.h"
Ben Skeggs6ee73862009-12-11 19:24:15 +100032
Ben Skeggs274fec92010-11-03 13:16:18 +100033static int nv04_graph_register(struct drm_device *dev);
34static void nv04_graph_isr(struct drm_device *dev);
Ben Skeggsb8c157d2010-10-20 10:39:35 +100035
Ben Skeggs6ee73862009-12-11 19:24:15 +100036static uint32_t nv04_graph_ctx_regs[] = {
Francisco Jerezea911a12009-12-26 14:39:46 +010037 0x0040053c,
38 0x00400544,
39 0x00400540,
40 0x00400548,
Ben Skeggs6ee73862009-12-11 19:24:15 +100041 NV04_PGRAPH_CTX_SWITCH1,
42 NV04_PGRAPH_CTX_SWITCH2,
43 NV04_PGRAPH_CTX_SWITCH3,
44 NV04_PGRAPH_CTX_SWITCH4,
45 NV04_PGRAPH_CTX_CACHE1,
46 NV04_PGRAPH_CTX_CACHE2,
47 NV04_PGRAPH_CTX_CACHE3,
48 NV04_PGRAPH_CTX_CACHE4,
49 0x00400184,
50 0x004001a4,
51 0x004001c4,
52 0x004001e4,
53 0x00400188,
54 0x004001a8,
55 0x004001c8,
56 0x004001e8,
57 0x0040018c,
58 0x004001ac,
59 0x004001cc,
60 0x004001ec,
61 0x00400190,
62 0x004001b0,
63 0x004001d0,
64 0x004001f0,
65 0x00400194,
66 0x004001b4,
67 0x004001d4,
68 0x004001f4,
69 0x00400198,
70 0x004001b8,
71 0x004001d8,
72 0x004001f8,
73 0x0040019c,
74 0x004001bc,
75 0x004001dc,
76 0x004001fc,
77 0x00400174,
78 NV04_PGRAPH_DMA_START_0,
79 NV04_PGRAPH_DMA_START_1,
80 NV04_PGRAPH_DMA_LENGTH,
81 NV04_PGRAPH_DMA_MISC,
82 NV04_PGRAPH_DMA_PITCH,
83 NV04_PGRAPH_BOFFSET0,
84 NV04_PGRAPH_BBASE0,
85 NV04_PGRAPH_BLIMIT0,
86 NV04_PGRAPH_BOFFSET1,
87 NV04_PGRAPH_BBASE1,
88 NV04_PGRAPH_BLIMIT1,
89 NV04_PGRAPH_BOFFSET2,
90 NV04_PGRAPH_BBASE2,
91 NV04_PGRAPH_BLIMIT2,
92 NV04_PGRAPH_BOFFSET3,
93 NV04_PGRAPH_BBASE3,
94 NV04_PGRAPH_BLIMIT3,
95 NV04_PGRAPH_BOFFSET4,
96 NV04_PGRAPH_BBASE4,
97 NV04_PGRAPH_BLIMIT4,
98 NV04_PGRAPH_BOFFSET5,
99 NV04_PGRAPH_BBASE5,
100 NV04_PGRAPH_BLIMIT5,
101 NV04_PGRAPH_BPITCH0,
102 NV04_PGRAPH_BPITCH1,
103 NV04_PGRAPH_BPITCH2,
104 NV04_PGRAPH_BPITCH3,
105 NV04_PGRAPH_BPITCH4,
106 NV04_PGRAPH_SURFACE,
107 NV04_PGRAPH_STATE,
108 NV04_PGRAPH_BSWIZZLE2,
109 NV04_PGRAPH_BSWIZZLE5,
110 NV04_PGRAPH_BPIXEL,
111 NV04_PGRAPH_NOTIFY,
112 NV04_PGRAPH_PATT_COLOR0,
113 NV04_PGRAPH_PATT_COLOR1,
114 NV04_PGRAPH_PATT_COLORRAM+0x00,
Ben Skeggs6ee73862009-12-11 19:24:15 +1000115 NV04_PGRAPH_PATT_COLORRAM+0x04,
Ben Skeggs6ee73862009-12-11 19:24:15 +1000116 NV04_PGRAPH_PATT_COLORRAM+0x08,
Francisco Jerezea911a12009-12-26 14:39:46 +0100117 NV04_PGRAPH_PATT_COLORRAM+0x0c,
Ben Skeggs6ee73862009-12-11 19:24:15 +1000118 NV04_PGRAPH_PATT_COLORRAM+0x10,
Ben Skeggs6ee73862009-12-11 19:24:15 +1000119 NV04_PGRAPH_PATT_COLORRAM+0x14,
Ben Skeggs6ee73862009-12-11 19:24:15 +1000120 NV04_PGRAPH_PATT_COLORRAM+0x18,
Francisco Jerezea911a12009-12-26 14:39:46 +0100121 NV04_PGRAPH_PATT_COLORRAM+0x1c,
Ben Skeggs6ee73862009-12-11 19:24:15 +1000122 NV04_PGRAPH_PATT_COLORRAM+0x20,
Ben Skeggs6ee73862009-12-11 19:24:15 +1000123 NV04_PGRAPH_PATT_COLORRAM+0x24,
Ben Skeggs6ee73862009-12-11 19:24:15 +1000124 NV04_PGRAPH_PATT_COLORRAM+0x28,
Francisco Jerezea911a12009-12-26 14:39:46 +0100125 NV04_PGRAPH_PATT_COLORRAM+0x2c,
Ben Skeggs6ee73862009-12-11 19:24:15 +1000126 NV04_PGRAPH_PATT_COLORRAM+0x30,
Ben Skeggs6ee73862009-12-11 19:24:15 +1000127 NV04_PGRAPH_PATT_COLORRAM+0x34,
Ben Skeggs6ee73862009-12-11 19:24:15 +1000128 NV04_PGRAPH_PATT_COLORRAM+0x38,
Francisco Jerezea911a12009-12-26 14:39:46 +0100129 NV04_PGRAPH_PATT_COLORRAM+0x3c,
130 NV04_PGRAPH_PATT_COLORRAM+0x40,
131 NV04_PGRAPH_PATT_COLORRAM+0x44,
132 NV04_PGRAPH_PATT_COLORRAM+0x48,
133 NV04_PGRAPH_PATT_COLORRAM+0x4c,
134 NV04_PGRAPH_PATT_COLORRAM+0x50,
135 NV04_PGRAPH_PATT_COLORRAM+0x54,
136 NV04_PGRAPH_PATT_COLORRAM+0x58,
137 NV04_PGRAPH_PATT_COLORRAM+0x5c,
138 NV04_PGRAPH_PATT_COLORRAM+0x60,
139 NV04_PGRAPH_PATT_COLORRAM+0x64,
140 NV04_PGRAPH_PATT_COLORRAM+0x68,
141 NV04_PGRAPH_PATT_COLORRAM+0x6c,
142 NV04_PGRAPH_PATT_COLORRAM+0x70,
143 NV04_PGRAPH_PATT_COLORRAM+0x74,
144 NV04_PGRAPH_PATT_COLORRAM+0x78,
145 NV04_PGRAPH_PATT_COLORRAM+0x7c,
146 NV04_PGRAPH_PATT_COLORRAM+0x80,
147 NV04_PGRAPH_PATT_COLORRAM+0x84,
148 NV04_PGRAPH_PATT_COLORRAM+0x88,
149 NV04_PGRAPH_PATT_COLORRAM+0x8c,
150 NV04_PGRAPH_PATT_COLORRAM+0x90,
151 NV04_PGRAPH_PATT_COLORRAM+0x94,
152 NV04_PGRAPH_PATT_COLORRAM+0x98,
153 NV04_PGRAPH_PATT_COLORRAM+0x9c,
154 NV04_PGRAPH_PATT_COLORRAM+0xa0,
155 NV04_PGRAPH_PATT_COLORRAM+0xa4,
156 NV04_PGRAPH_PATT_COLORRAM+0xa8,
157 NV04_PGRAPH_PATT_COLORRAM+0xac,
158 NV04_PGRAPH_PATT_COLORRAM+0xb0,
159 NV04_PGRAPH_PATT_COLORRAM+0xb4,
160 NV04_PGRAPH_PATT_COLORRAM+0xb8,
161 NV04_PGRAPH_PATT_COLORRAM+0xbc,
162 NV04_PGRAPH_PATT_COLORRAM+0xc0,
163 NV04_PGRAPH_PATT_COLORRAM+0xc4,
164 NV04_PGRAPH_PATT_COLORRAM+0xc8,
165 NV04_PGRAPH_PATT_COLORRAM+0xcc,
166 NV04_PGRAPH_PATT_COLORRAM+0xd0,
167 NV04_PGRAPH_PATT_COLORRAM+0xd4,
168 NV04_PGRAPH_PATT_COLORRAM+0xd8,
169 NV04_PGRAPH_PATT_COLORRAM+0xdc,
170 NV04_PGRAPH_PATT_COLORRAM+0xe0,
171 NV04_PGRAPH_PATT_COLORRAM+0xe4,
172 NV04_PGRAPH_PATT_COLORRAM+0xe8,
173 NV04_PGRAPH_PATT_COLORRAM+0xec,
174 NV04_PGRAPH_PATT_COLORRAM+0xf0,
175 NV04_PGRAPH_PATT_COLORRAM+0xf4,
176 NV04_PGRAPH_PATT_COLORRAM+0xf8,
177 NV04_PGRAPH_PATT_COLORRAM+0xfc,
Ben Skeggs6ee73862009-12-11 19:24:15 +1000178 NV04_PGRAPH_PATTERN,
179 0x0040080c,
180 NV04_PGRAPH_PATTERN_SHAPE,
181 0x00400600,
182 NV04_PGRAPH_ROP3,
183 NV04_PGRAPH_CHROMA,
184 NV04_PGRAPH_BETA_AND,
185 NV04_PGRAPH_BETA_PREMULT,
186 NV04_PGRAPH_CONTROL0,
187 NV04_PGRAPH_CONTROL1,
188 NV04_PGRAPH_CONTROL2,
189 NV04_PGRAPH_BLEND,
190 NV04_PGRAPH_STORED_FMT,
191 NV04_PGRAPH_SOURCE_COLOR,
192 0x00400560,
193 0x00400568,
194 0x00400564,
195 0x0040056c,
196 0x00400400,
197 0x00400480,
198 0x00400404,
199 0x00400484,
200 0x00400408,
201 0x00400488,
202 0x0040040c,
203 0x0040048c,
204 0x00400410,
205 0x00400490,
206 0x00400414,
207 0x00400494,
208 0x00400418,
209 0x00400498,
210 0x0040041c,
211 0x0040049c,
212 0x00400420,
213 0x004004a0,
214 0x00400424,
215 0x004004a4,
216 0x00400428,
217 0x004004a8,
218 0x0040042c,
219 0x004004ac,
220 0x00400430,
221 0x004004b0,
222 0x00400434,
223 0x004004b4,
224 0x00400438,
225 0x004004b8,
226 0x0040043c,
227 0x004004bc,
228 0x00400440,
229 0x004004c0,
230 0x00400444,
231 0x004004c4,
232 0x00400448,
233 0x004004c8,
234 0x0040044c,
235 0x004004cc,
236 0x00400450,
237 0x004004d0,
238 0x00400454,
239 0x004004d4,
240 0x00400458,
241 0x004004d8,
242 0x0040045c,
243 0x004004dc,
244 0x00400460,
245 0x004004e0,
246 0x00400464,
247 0x004004e4,
248 0x00400468,
249 0x004004e8,
250 0x0040046c,
251 0x004004ec,
252 0x00400470,
253 0x004004f0,
254 0x00400474,
255 0x004004f4,
256 0x00400478,
257 0x004004f8,
258 0x0040047c,
259 0x004004fc,
Ben Skeggs6ee73862009-12-11 19:24:15 +1000260 0x00400534,
261 0x00400538,
262 0x00400514,
263 0x00400518,
264 0x0040051c,
265 0x00400520,
266 0x00400524,
267 0x00400528,
268 0x0040052c,
269 0x00400530,
270 0x00400d00,
271 0x00400d40,
272 0x00400d80,
273 0x00400d04,
274 0x00400d44,
275 0x00400d84,
276 0x00400d08,
277 0x00400d48,
278 0x00400d88,
279 0x00400d0c,
280 0x00400d4c,
281 0x00400d8c,
282 0x00400d10,
283 0x00400d50,
284 0x00400d90,
285 0x00400d14,
286 0x00400d54,
287 0x00400d94,
288 0x00400d18,
289 0x00400d58,
290 0x00400d98,
291 0x00400d1c,
292 0x00400d5c,
293 0x00400d9c,
294 0x00400d20,
295 0x00400d60,
296 0x00400da0,
297 0x00400d24,
298 0x00400d64,
299 0x00400da4,
300 0x00400d28,
301 0x00400d68,
302 0x00400da8,
303 0x00400d2c,
304 0x00400d6c,
305 0x00400dac,
306 0x00400d30,
307 0x00400d70,
308 0x00400db0,
309 0x00400d34,
310 0x00400d74,
311 0x00400db4,
312 0x00400d38,
313 0x00400d78,
314 0x00400db8,
315 0x00400d3c,
316 0x00400d7c,
317 0x00400dbc,
318 0x00400590,
319 0x00400594,
320 0x00400598,
321 0x0040059c,
322 0x004005a8,
323 0x004005ac,
324 0x004005b0,
325 0x004005b4,
326 0x004005c0,
327 0x004005c4,
328 0x004005c8,
329 0x004005cc,
330 0x004005d0,
331 0x004005d4,
332 0x004005d8,
333 0x004005dc,
334 0x004005e0,
335 NV04_PGRAPH_PASSTHRU_0,
336 NV04_PGRAPH_PASSTHRU_1,
337 NV04_PGRAPH_PASSTHRU_2,
338 NV04_PGRAPH_DVD_COLORFMT,
339 NV04_PGRAPH_SCALED_FORMAT,
340 NV04_PGRAPH_MISC24_0,
341 NV04_PGRAPH_MISC24_1,
342 NV04_PGRAPH_MISC24_2,
343 0x00400500,
344 0x00400504,
345 NV04_PGRAPH_VALID1,
Francisco Jerezea911a12009-12-26 14:39:46 +0100346 NV04_PGRAPH_VALID2,
347 NV04_PGRAPH_DEBUG_3
Ben Skeggs6ee73862009-12-11 19:24:15 +1000348};
349
350struct graph_state {
Francisco Jerez6e86e042010-07-03 18:36:39 +0200351 uint32_t nv04[ARRAY_SIZE(nv04_graph_ctx_regs)];
Ben Skeggs6ee73862009-12-11 19:24:15 +1000352};
353
354struct nouveau_channel *
355nv04_graph_channel(struct drm_device *dev)
356{
357 struct drm_nouveau_private *dev_priv = dev->dev_private;
358 int chid = dev_priv->engine.fifo.channels;
359
360 if (nv_rd32(dev, NV04_PGRAPH_CTX_CONTROL) & 0x00010000)
361 chid = nv_rd32(dev, NV04_PGRAPH_CTX_USER) >> 24;
362
363 if (chid >= dev_priv->engine.fifo.channels)
364 return NULL;
365
Ben Skeggscff5c132010-10-06 16:16:59 +1000366 return dev_priv->channels.ptr[chid];
Ben Skeggs6ee73862009-12-11 19:24:15 +1000367}
368
Ben Skeggs274fec92010-11-03 13:16:18 +1000369static void
Ben Skeggs6ee73862009-12-11 19:24:15 +1000370nv04_graph_context_switch(struct drm_device *dev)
371{
372 struct drm_nouveau_private *dev_priv = dev->dev_private;
373 struct nouveau_pgraph_engine *pgraph = &dev_priv->engine.graph;
374 struct nouveau_channel *chan = NULL;
375 int chid;
376
Ben Skeggs6ee73862009-12-11 19:24:15 +1000377 nouveau_wait_for_idle(dev);
378
379 /* If previous context is valid, we need to save it */
380 pgraph->unload_context(dev);
381
382 /* Load context for next channel */
383 chid = dev_priv->engine.fifo.channel_id(dev);
Ben Skeggscff5c132010-10-06 16:16:59 +1000384 chan = dev_priv->channels.ptr[chid];
Ben Skeggs6ee73862009-12-11 19:24:15 +1000385 if (chan)
386 nv04_graph_load_context(chan);
Ben Skeggs6ee73862009-12-11 19:24:15 +1000387}
388
Francisco Jerezea911a12009-12-26 14:39:46 +0100389static uint32_t *ctx_reg(struct graph_state *ctx, uint32_t reg)
390{
391 int i;
392
393 for (i = 0; i < ARRAY_SIZE(nv04_graph_ctx_regs); i++) {
394 if (nv04_graph_ctx_regs[i] == reg)
395 return &ctx->nv04[i];
396 }
397
398 return NULL;
399}
400
Ben Skeggs6ee73862009-12-11 19:24:15 +1000401int nv04_graph_create_context(struct nouveau_channel *chan)
402{
403 struct graph_state *pgraph_ctx;
404 NV_DEBUG(chan->dev, "nv04_graph_context_create %d\n", chan->id);
405
406 chan->pgraph_ctx = pgraph_ctx = kzalloc(sizeof(*pgraph_ctx),
407 GFP_KERNEL);
408 if (pgraph_ctx == NULL)
409 return -ENOMEM;
410
Francisco Jerezea911a12009-12-26 14:39:46 +0100411 *ctx_reg(pgraph_ctx, NV04_PGRAPH_DEBUG_3) = 0xfad4ff31;
412
Ben Skeggs6ee73862009-12-11 19:24:15 +1000413 return 0;
414}
415
416void nv04_graph_destroy_context(struct nouveau_channel *chan)
417{
Francisco Jerez3945e472010-10-18 03:53:39 +0200418 struct drm_device *dev = chan->dev;
419 struct drm_nouveau_private *dev_priv = dev->dev_private;
420 struct nouveau_pgraph_engine *pgraph = &dev_priv->engine.graph;
Ben Skeggs6ee73862009-12-11 19:24:15 +1000421 struct graph_state *pgraph_ctx = chan->pgraph_ctx;
Francisco Jerez3945e472010-10-18 03:53:39 +0200422 unsigned long flags;
Ben Skeggs6ee73862009-12-11 19:24:15 +1000423
Francisco Jerez3945e472010-10-18 03:53:39 +0200424 spin_lock_irqsave(&dev_priv->context_switch_lock, flags);
425 pgraph->fifo_access(dev, false);
426
427 /* Unload the context if it's the currently active one */
428 if (pgraph->channel(dev) == chan)
429 pgraph->unload_context(dev);
430
431 /* Free the context resources */
Ben Skeggs6ee73862009-12-11 19:24:15 +1000432 kfree(pgraph_ctx);
433 chan->pgraph_ctx = NULL;
Francisco Jerez3945e472010-10-18 03:53:39 +0200434
435 pgraph->fifo_access(dev, true);
436 spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags);
Ben Skeggs6ee73862009-12-11 19:24:15 +1000437}
438
439int nv04_graph_load_context(struct nouveau_channel *chan)
440{
441 struct drm_device *dev = chan->dev;
442 struct graph_state *pgraph_ctx = chan->pgraph_ctx;
443 uint32_t tmp;
444 int i;
445
446 for (i = 0; i < ARRAY_SIZE(nv04_graph_ctx_regs); i++)
447 nv_wr32(dev, nv04_graph_ctx_regs[i], pgraph_ctx->nv04[i]);
448
449 nv_wr32(dev, NV04_PGRAPH_CTX_CONTROL, 0x10010100);
Francisco Jerezea911a12009-12-26 14:39:46 +0100450
451 tmp = nv_rd32(dev, NV04_PGRAPH_CTX_USER) & 0x00ffffff;
452 nv_wr32(dev, NV04_PGRAPH_CTX_USER, tmp | chan->id << 24);
453
Ben Skeggs6ee73862009-12-11 19:24:15 +1000454 tmp = nv_rd32(dev, NV04_PGRAPH_FFINTFC_ST2);
455 nv_wr32(dev, NV04_PGRAPH_FFINTFC_ST2, tmp & 0x000fffff);
Francisco Jerezea911a12009-12-26 14:39:46 +0100456
Ben Skeggs6ee73862009-12-11 19:24:15 +1000457 return 0;
458}
459
460int
461nv04_graph_unload_context(struct drm_device *dev)
462{
463 struct drm_nouveau_private *dev_priv = dev->dev_private;
464 struct nouveau_pgraph_engine *pgraph = &dev_priv->engine.graph;
465 struct nouveau_channel *chan = NULL;
466 struct graph_state *ctx;
467 uint32_t tmp;
468 int i;
469
470 chan = pgraph->channel(dev);
471 if (!chan)
472 return 0;
473 ctx = chan->pgraph_ctx;
474
475 for (i = 0; i < ARRAY_SIZE(nv04_graph_ctx_regs); i++)
476 ctx->nv04[i] = nv_rd32(dev, nv04_graph_ctx_regs[i]);
477
478 nv_wr32(dev, NV04_PGRAPH_CTX_CONTROL, 0x10000000);
479 tmp = nv_rd32(dev, NV04_PGRAPH_CTX_USER) & 0x00ffffff;
480 tmp |= (dev_priv->engine.fifo.channels - 1) << 24;
481 nv_wr32(dev, NV04_PGRAPH_CTX_USER, tmp);
482 return 0;
483}
484
Ben Skeggs4ea52f82011-03-31 13:44:16 +1000485int
486nv04_graph_object_new(struct nouveau_channel *chan, u32 handle, u16 class)
487{
488 struct drm_device *dev = chan->dev;
489 struct nouveau_gpuobj *obj = NULL;
490 int ret;
491
492 ret = nouveau_gpuobj_new(dev, chan, 16, 16, NVOBJ_FLAG_ZERO_FREE, &obj);
493 if (ret)
494 return ret;
495 obj->engine = 1;
496 obj->class = class;
497
498#ifdef __BIG_ENDIAN
499 nv_wo32(obj, 0x00, 0x00080000 | class);
500#else
501 nv_wo32(obj, 0x00, class);
502#endif
503 nv_wo32(obj, 0x04, 0x00000000);
504 nv_wo32(obj, 0x08, 0x00000000);
505 nv_wo32(obj, 0x0c, 0x00000000);
506
507 ret = nouveau_ramht_insert(chan, handle, obj);
508 nouveau_gpuobj_ref(NULL, &obj);
509 return ret;
510}
511
Ben Skeggs6ee73862009-12-11 19:24:15 +1000512int nv04_graph_init(struct drm_device *dev)
513{
514 struct drm_nouveau_private *dev_priv = dev->dev_private;
515 uint32_t tmp;
Ben Skeggsb8c157d2010-10-20 10:39:35 +1000516 int ret;
Ben Skeggs6ee73862009-12-11 19:24:15 +1000517
518 nv_wr32(dev, NV03_PMC_ENABLE, nv_rd32(dev, NV03_PMC_ENABLE) &
519 ~NV_PMC_ENABLE_PGRAPH);
520 nv_wr32(dev, NV03_PMC_ENABLE, nv_rd32(dev, NV03_PMC_ENABLE) |
521 NV_PMC_ENABLE_PGRAPH);
522
Ben Skeggsb8c157d2010-10-20 10:39:35 +1000523 ret = nv04_graph_register(dev);
524 if (ret)
525 return ret;
526
Ben Skeggs6ee73862009-12-11 19:24:15 +1000527 /* Enable PGRAPH interrupts */
Ben Skeggs274fec92010-11-03 13:16:18 +1000528 nouveau_irq_register(dev, 12, nv04_graph_isr);
Ben Skeggs6ee73862009-12-11 19:24:15 +1000529 nv_wr32(dev, NV03_PGRAPH_INTR, 0xFFFFFFFF);
530 nv_wr32(dev, NV03_PGRAPH_INTR_EN, 0xFFFFFFFF);
531
532 nv_wr32(dev, NV04_PGRAPH_VALID1, 0);
533 nv_wr32(dev, NV04_PGRAPH_VALID2, 0);
534 /*nv_wr32(dev, NV04_PGRAPH_DEBUG_0, 0x000001FF);
535 nv_wr32(dev, NV04_PGRAPH_DEBUG_0, 0x001FFFFF);*/
536 nv_wr32(dev, NV04_PGRAPH_DEBUG_0, 0x1231c000);
537 /*1231C000 blob, 001 haiku*/
Emil Velikovf2129492011-03-19 23:31:52 +0000538 /*V_WRITE(NV04_PGRAPH_DEBUG_1, 0xf2d91100);*/
Ben Skeggs6ee73862009-12-11 19:24:15 +1000539 nv_wr32(dev, NV04_PGRAPH_DEBUG_1, 0x72111100);
540 /*0x72111100 blob , 01 haiku*/
541 /*nv_wr32(dev, NV04_PGRAPH_DEBUG_2, 0x11d5f870);*/
542 nv_wr32(dev, NV04_PGRAPH_DEBUG_2, 0x11d5f071);
543 /*haiku same*/
544
545 /*nv_wr32(dev, NV04_PGRAPH_DEBUG_3, 0xfad4ff31);*/
546 nv_wr32(dev, NV04_PGRAPH_DEBUG_3, 0xf0d4ff31);
547 /*haiku and blob 10d4*/
548
549 nv_wr32(dev, NV04_PGRAPH_STATE , 0xFFFFFFFF);
550 nv_wr32(dev, NV04_PGRAPH_CTX_CONTROL , 0x10000100);
551 tmp = nv_rd32(dev, NV04_PGRAPH_CTX_USER) & 0x00ffffff;
Francisco Jerezea911a12009-12-26 14:39:46 +0100552 tmp |= (dev_priv->engine.fifo.channels - 1) << 24;
Ben Skeggs6ee73862009-12-11 19:24:15 +1000553 nv_wr32(dev, NV04_PGRAPH_CTX_USER, tmp);
554
555 /* These don't belong here, they're part of a per-channel context */
556 nv_wr32(dev, NV04_PGRAPH_PATTERN_SHAPE, 0x00000000);
557 nv_wr32(dev, NV04_PGRAPH_BETA_AND , 0xFFFFFFFF);
558
559 return 0;
560}
561
562void nv04_graph_takedown(struct drm_device *dev)
563{
Ben Skeggs274fec92010-11-03 13:16:18 +1000564 nv_wr32(dev, NV03_PGRAPH_INTR_EN, 0x00000000);
565 nouveau_irq_unregister(dev, 12);
Ben Skeggs6ee73862009-12-11 19:24:15 +1000566}
567
568void
569nv04_graph_fifo_access(struct drm_device *dev, bool enabled)
570{
571 if (enabled)
572 nv_wr32(dev, NV04_PGRAPH_FIFO,
573 nv_rd32(dev, NV04_PGRAPH_FIFO) | 1);
574 else
575 nv_wr32(dev, NV04_PGRAPH_FIFO,
576 nv_rd32(dev, NV04_PGRAPH_FIFO) & ~1);
577}
578
579static int
Ben Skeggsb8c157d2010-10-20 10:39:35 +1000580nv04_graph_mthd_set_ref(struct nouveau_channel *chan,
581 u32 class, u32 mthd, u32 data)
Ben Skeggs6ee73862009-12-11 19:24:15 +1000582{
Ben Skeggs047d1d32010-05-31 12:00:43 +1000583 atomic_set(&chan->fence.last_sequence_irq, data);
Ben Skeggs6ee73862009-12-11 19:24:15 +1000584 return 0;
585}
586
Francisco Jerez332b2422010-10-20 23:35:40 +0200587int
588nv04_graph_mthd_page_flip(struct nouveau_channel *chan,
589 u32 class, u32 mthd, u32 data)
590{
591 struct drm_device *dev = chan->dev;
592 struct nouveau_page_flip_state s;
593
594 if (!nouveau_finish_page_flip(chan, &s))
595 nv_set_crtc_base(dev, s.crtc,
596 s.offset + s.y * s.pitch + s.x * s.bpp / 8);
597
598 return 0;
599}
600
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +0000601/*
602 * Software methods, why they are needed, and how they all work:
603 *
604 * NV04 and NV05 keep most of the state in PGRAPH context itself, but some
605 * 2d engine settings are kept inside the grobjs themselves. The grobjs are
606 * 3 words long on both. grobj format on NV04 is:
607 *
608 * word 0:
609 * - bits 0-7: class
610 * - bit 12: color key active
611 * - bit 13: clip rect active
612 * - bit 14: if set, destination surface is swizzled and taken from buffer 5
613 * [set by NV04_SWIZZLED_SURFACE], otherwise it's linear and taken
614 * from buffer 0 [set by NV04_CONTEXT_SURFACES_2D or
615 * NV03_CONTEXT_SURFACE_DST].
616 * - bits 15-17: 2d operation [aka patch config]
617 * - bit 24: patch valid [enables rendering using this object]
618 * - bit 25: surf3d valid [for tex_tri and multitex_tri only]
619 * word 1:
620 * - bits 0-1: mono format
621 * - bits 8-13: color format
622 * - bits 16-31: DMA_NOTIFY instance
623 * word 2:
624 * - bits 0-15: DMA_A instance
625 * - bits 16-31: DMA_B instance
626 *
627 * On NV05 it's:
628 *
629 * word 0:
630 * - bits 0-7: class
631 * - bit 12: color key active
632 * - bit 13: clip rect active
633 * - bit 14: if set, destination surface is swizzled and taken from buffer 5
634 * [set by NV04_SWIZZLED_SURFACE], otherwise it's linear and taken
635 * from buffer 0 [set by NV04_CONTEXT_SURFACES_2D or
636 * NV03_CONTEXT_SURFACE_DST].
637 * - bits 15-17: 2d operation [aka patch config]
638 * - bits 20-22: dither mode
639 * - bit 24: patch valid [enables rendering using this object]
640 * - bit 25: surface_dst/surface_color/surf2d/surf3d valid
641 * - bit 26: surface_src/surface_zeta valid
642 * - bit 27: pattern valid
643 * - bit 28: rop valid
644 * - bit 29: beta1 valid
645 * - bit 30: beta4 valid
646 * word 1:
647 * - bits 0-1: mono format
648 * - bits 8-13: color format
649 * - bits 16-31: DMA_NOTIFY instance
650 * word 2:
651 * - bits 0-15: DMA_A instance
652 * - bits 16-31: DMA_B instance
653 *
654 * NV05 will set/unset the relevant valid bits when you poke the relevant
655 * object-binding methods with object of the proper type, or with the NULL
656 * type. It'll only allow rendering using the grobj if all needed objects
657 * are bound. The needed set of objects depends on selected operation: for
658 * example rop object is needed by ROP_AND, but not by SRCCOPY_AND.
659 *
660 * NV04 doesn't have these methods implemented at all, and doesn't have the
661 * relevant bits in grobj. Instead, it'll allow rendering whenever bit 24
662 * is set. So we have to emulate them in software, internally keeping the
663 * same bits as NV05 does. Since grobjs are aligned to 16 bytes on nv04,
664 * but the last word isn't actually used for anything, we abuse it for this
665 * purpose.
666 *
667 * Actually, NV05 can optionally check bit 24 too, but we disable this since
668 * there's no use for it.
669 *
670 * For unknown reasons, NV04 implements surf3d binding in hardware as an
671 * exception. Also for unknown reasons, NV04 doesn't implement the clipping
672 * methods on the surf3d object, so we have to emulate them too.
673 */
674
675static void
Ben Skeggsb8c157d2010-10-20 10:39:35 +1000676nv04_graph_set_ctx1(struct nouveau_channel *chan, u32 mask, u32 value)
Ben Skeggs6ee73862009-12-11 19:24:15 +1000677{
678 struct drm_device *dev = chan->dev;
Ben Skeggsb8c157d2010-10-20 10:39:35 +1000679 u32 instance = (nv_rd32(dev, NV04_PGRAPH_CTX_SWITCH4) & 0xffff) << 4;
Ben Skeggs6ee73862009-12-11 19:24:15 +1000680 int subc = (nv_rd32(dev, NV04_PGRAPH_TRAPPED_ADDR) >> 13) & 0x7;
Ben Skeggsb8c157d2010-10-20 10:39:35 +1000681 u32 tmp;
Ben Skeggs6ee73862009-12-11 19:24:15 +1000682
683 tmp = nv_ri32(dev, instance);
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +0000684 tmp &= ~mask;
685 tmp |= value;
Ben Skeggs6ee73862009-12-11 19:24:15 +1000686
687 nv_wi32(dev, instance, tmp);
688 nv_wr32(dev, NV04_PGRAPH_CTX_SWITCH1, tmp);
Marcin Kościelnicki13c54432009-12-14 20:38:17 +0000689 nv_wr32(dev, NV04_PGRAPH_CTX_CACHE1 + (subc<<2), tmp);
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +0000690}
691
692static void
Ben Skeggsb8c157d2010-10-20 10:39:35 +1000693nv04_graph_set_ctx_val(struct nouveau_channel *chan, u32 mask, u32 value)
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +0000694{
695 struct drm_device *dev = chan->dev;
Ben Skeggsb8c157d2010-10-20 10:39:35 +1000696 u32 instance = (nv_rd32(dev, NV04_PGRAPH_CTX_SWITCH4) & 0xffff) << 4;
697 u32 tmp, ctx1;
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +0000698 int class, op, valid = 1;
699
700 ctx1 = nv_ri32(dev, instance);
701 class = ctx1 & 0xff;
702 op = (ctx1 >> 15) & 7;
703 tmp = nv_ri32(dev, instance + 0xc);
704 tmp &= ~mask;
705 tmp |= value;
706 nv_wi32(dev, instance + 0xc, tmp);
707
708 /* check for valid surf2d/surf_dst/surf_color */
709 if (!(tmp & 0x02000000))
710 valid = 0;
711 /* check for valid surf_src/surf_zeta */
712 if ((class == 0x1f || class == 0x48) && !(tmp & 0x04000000))
713 valid = 0;
714
715 switch (op) {
716 /* SRCCOPY_AND, SRCCOPY: no extra objects required */
717 case 0:
718 case 3:
719 break;
720 /* ROP_AND: requires pattern and rop */
721 case 1:
722 if (!(tmp & 0x18000000))
723 valid = 0;
724 break;
725 /* BLEND_AND: requires beta1 */
726 case 2:
727 if (!(tmp & 0x20000000))
728 valid = 0;
729 break;
730 /* SRCCOPY_PREMULT, BLEND_PREMULT: beta4 required */
731 case 4:
732 case 5:
733 if (!(tmp & 0x40000000))
734 valid = 0;
735 break;
736 }
737
738 nv04_graph_set_ctx1(chan, 0x01000000, valid << 24);
739}
740
741static int
Ben Skeggsb8c157d2010-10-20 10:39:35 +1000742nv04_graph_mthd_set_operation(struct nouveau_channel *chan,
743 u32 class, u32 mthd, u32 data)
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +0000744{
745 if (data > 5)
746 return 1;
747 /* Old versions of the objects only accept first three operations. */
Ben Skeggsb8c157d2010-10-20 10:39:35 +1000748 if (data > 2 && class < 0x40)
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +0000749 return 1;
750 nv04_graph_set_ctx1(chan, 0x00038000, data << 15);
751 /* changing operation changes set of objects needed for validation */
752 nv04_graph_set_ctx_val(chan, 0, 0);
Ben Skeggs6ee73862009-12-11 19:24:15 +1000753 return 0;
754}
755
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +0000756static int
Ben Skeggsb8c157d2010-10-20 10:39:35 +1000757nv04_graph_mthd_surf3d_clip_h(struct nouveau_channel *chan,
758 u32 class, u32 mthd, u32 data)
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +0000759{
760 uint32_t min = data & 0xffff, max;
761 uint32_t w = data >> 16;
762 if (min & 0x8000)
763 /* too large */
764 return 1;
765 if (w & 0x8000)
766 /* yes, it accepts negative for some reason. */
767 w |= 0xffff0000;
768 max = min + w;
769 max &= 0x3ffff;
770 nv_wr32(chan->dev, 0x40053c, min);
771 nv_wr32(chan->dev, 0x400544, max);
772 return 0;
773}
774
775static int
Ben Skeggsb8c157d2010-10-20 10:39:35 +1000776nv04_graph_mthd_surf3d_clip_v(struct nouveau_channel *chan,
777 u32 class, u32 mthd, u32 data)
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +0000778{
779 uint32_t min = data & 0xffff, max;
780 uint32_t w = data >> 16;
781 if (min & 0x8000)
782 /* too large */
783 return 1;
784 if (w & 0x8000)
785 /* yes, it accepts negative for some reason. */
786 w |= 0xffff0000;
787 max = min + w;
788 max &= 0x3ffff;
789 nv_wr32(chan->dev, 0x400540, min);
790 nv_wr32(chan->dev, 0x400548, max);
791 return 0;
792}
793
794static int
Ben Skeggsb8c157d2010-10-20 10:39:35 +1000795nv04_graph_mthd_bind_surf2d(struct nouveau_channel *chan,
796 u32 class, u32 mthd, u32 data)
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +0000797{
798 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
799 case 0x30:
800 nv04_graph_set_ctx1(chan, 0x00004000, 0);
801 nv04_graph_set_ctx_val(chan, 0x02000000, 0);
802 return 0;
803 case 0x42:
804 nv04_graph_set_ctx1(chan, 0x00004000, 0);
805 nv04_graph_set_ctx_val(chan, 0x02000000, 0x02000000);
806 return 0;
807 }
808 return 1;
809}
810
811static int
Ben Skeggsb8c157d2010-10-20 10:39:35 +1000812nv04_graph_mthd_bind_surf2d_swzsurf(struct nouveau_channel *chan,
813 u32 class, u32 mthd, u32 data)
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +0000814{
815 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
816 case 0x30:
817 nv04_graph_set_ctx1(chan, 0x00004000, 0);
818 nv04_graph_set_ctx_val(chan, 0x02000000, 0);
819 return 0;
820 case 0x42:
821 nv04_graph_set_ctx1(chan, 0x00004000, 0);
822 nv04_graph_set_ctx_val(chan, 0x02000000, 0x02000000);
823 return 0;
824 case 0x52:
825 nv04_graph_set_ctx1(chan, 0x00004000, 0x00004000);
826 nv04_graph_set_ctx_val(chan, 0x02000000, 0x02000000);
827 return 0;
828 }
829 return 1;
830}
831
832static int
Ben Skeggsb8c157d2010-10-20 10:39:35 +1000833nv04_graph_mthd_bind_nv01_patt(struct nouveau_channel *chan,
834 u32 class, u32 mthd, u32 data)
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +0000835{
836 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
837 case 0x30:
838 nv04_graph_set_ctx_val(chan, 0x08000000, 0);
839 return 0;
840 case 0x18:
841 nv04_graph_set_ctx_val(chan, 0x08000000, 0x08000000);
842 return 0;
843 }
844 return 1;
845}
846
847static int
Ben Skeggsb8c157d2010-10-20 10:39:35 +1000848nv04_graph_mthd_bind_nv04_patt(struct nouveau_channel *chan,
849 u32 class, u32 mthd, u32 data)
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +0000850{
851 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
852 case 0x30:
853 nv04_graph_set_ctx_val(chan, 0x08000000, 0);
854 return 0;
855 case 0x44:
856 nv04_graph_set_ctx_val(chan, 0x08000000, 0x08000000);
857 return 0;
858 }
859 return 1;
860}
861
862static int
Ben Skeggsb8c157d2010-10-20 10:39:35 +1000863nv04_graph_mthd_bind_rop(struct nouveau_channel *chan,
864 u32 class, u32 mthd, u32 data)
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +0000865{
866 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
867 case 0x30:
868 nv04_graph_set_ctx_val(chan, 0x10000000, 0);
869 return 0;
870 case 0x43:
871 nv04_graph_set_ctx_val(chan, 0x10000000, 0x10000000);
872 return 0;
873 }
874 return 1;
875}
876
877static int
Ben Skeggsb8c157d2010-10-20 10:39:35 +1000878nv04_graph_mthd_bind_beta1(struct nouveau_channel *chan,
879 u32 class, u32 mthd, u32 data)
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +0000880{
881 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
882 case 0x30:
883 nv04_graph_set_ctx_val(chan, 0x20000000, 0);
884 return 0;
885 case 0x12:
886 nv04_graph_set_ctx_val(chan, 0x20000000, 0x20000000);
887 return 0;
888 }
889 return 1;
890}
891
892static int
Ben Skeggsb8c157d2010-10-20 10:39:35 +1000893nv04_graph_mthd_bind_beta4(struct nouveau_channel *chan,
894 u32 class, u32 mthd, u32 data)
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +0000895{
896 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
897 case 0x30:
898 nv04_graph_set_ctx_val(chan, 0x40000000, 0);
899 return 0;
900 case 0x72:
901 nv04_graph_set_ctx_val(chan, 0x40000000, 0x40000000);
902 return 0;
903 }
904 return 1;
905}
906
907static int
Ben Skeggsb8c157d2010-10-20 10:39:35 +1000908nv04_graph_mthd_bind_surf_dst(struct nouveau_channel *chan,
909 u32 class, u32 mthd, u32 data)
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +0000910{
911 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
912 case 0x30:
913 nv04_graph_set_ctx_val(chan, 0x02000000, 0);
914 return 0;
915 case 0x58:
916 nv04_graph_set_ctx_val(chan, 0x02000000, 0x02000000);
917 return 0;
918 }
919 return 1;
920}
921
922static int
Ben Skeggsb8c157d2010-10-20 10:39:35 +1000923nv04_graph_mthd_bind_surf_src(struct nouveau_channel *chan,
924 u32 class, u32 mthd, u32 data)
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +0000925{
926 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
927 case 0x30:
928 nv04_graph_set_ctx_val(chan, 0x04000000, 0);
929 return 0;
930 case 0x59:
931 nv04_graph_set_ctx_val(chan, 0x04000000, 0x04000000);
932 return 0;
933 }
934 return 1;
935}
936
937static int
Ben Skeggsb8c157d2010-10-20 10:39:35 +1000938nv04_graph_mthd_bind_surf_color(struct nouveau_channel *chan,
939 u32 class, u32 mthd, u32 data)
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +0000940{
941 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
942 case 0x30:
943 nv04_graph_set_ctx_val(chan, 0x02000000, 0);
944 return 0;
945 case 0x5a:
946 nv04_graph_set_ctx_val(chan, 0x02000000, 0x02000000);
947 return 0;
948 }
949 return 1;
950}
951
952static int
Ben Skeggsb8c157d2010-10-20 10:39:35 +1000953nv04_graph_mthd_bind_surf_zeta(struct nouveau_channel *chan,
954 u32 class, u32 mthd, u32 data)
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +0000955{
956 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
957 case 0x30:
958 nv04_graph_set_ctx_val(chan, 0x04000000, 0);
959 return 0;
960 case 0x5b:
961 nv04_graph_set_ctx_val(chan, 0x04000000, 0x04000000);
962 return 0;
963 }
964 return 1;
965}
966
967static int
Ben Skeggsb8c157d2010-10-20 10:39:35 +1000968nv04_graph_mthd_bind_clip(struct nouveau_channel *chan,
969 u32 class, u32 mthd, u32 data)
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +0000970{
971 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
972 case 0x30:
973 nv04_graph_set_ctx1(chan, 0x2000, 0);
974 return 0;
975 case 0x19:
976 nv04_graph_set_ctx1(chan, 0x2000, 0x2000);
977 return 0;
978 }
979 return 1;
980}
981
982static int
Ben Skeggsb8c157d2010-10-20 10:39:35 +1000983nv04_graph_mthd_bind_chroma(struct nouveau_channel *chan,
984 u32 class, u32 mthd, u32 data)
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +0000985{
986 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
987 case 0x30:
988 nv04_graph_set_ctx1(chan, 0x1000, 0);
989 return 0;
990 /* Yes, for some reason even the old versions of objects
991 * accept 0x57 and not 0x17. Consistency be damned.
992 */
993 case 0x57:
994 nv04_graph_set_ctx1(chan, 0x1000, 0x1000);
995 return 0;
996 }
997 return 1;
998}
999
Ben Skeggsb8c157d2010-10-20 10:39:35 +10001000static int
1001nv04_graph_register(struct drm_device *dev)
1002{
1003 struct drm_nouveau_private *dev_priv = dev->dev_private;
Ben Skeggs6ee73862009-12-11 19:24:15 +10001004
Ben Skeggsb8c157d2010-10-20 10:39:35 +10001005 if (dev_priv->engine.graph.registered)
1006 return 0;
Ben Skeggs6ee73862009-12-11 19:24:15 +10001007
Ben Skeggsb8c157d2010-10-20 10:39:35 +10001008 /* dvd subpicture */
1009 NVOBJ_CLASS(dev, 0x0038, GR);
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +00001010
Ben Skeggsb8c157d2010-10-20 10:39:35 +10001011 /* m2mf */
1012 NVOBJ_CLASS(dev, 0x0039, GR);
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +00001013
Ben Skeggsb8c157d2010-10-20 10:39:35 +10001014 /* nv03 gdirect */
1015 NVOBJ_CLASS(dev, 0x004b, GR);
1016 NVOBJ_MTHD (dev, 0x004b, 0x0184, nv04_graph_mthd_bind_nv01_patt);
1017 NVOBJ_MTHD (dev, 0x004b, 0x0188, nv04_graph_mthd_bind_rop);
1018 NVOBJ_MTHD (dev, 0x004b, 0x018c, nv04_graph_mthd_bind_beta1);
1019 NVOBJ_MTHD (dev, 0x004b, 0x0190, nv04_graph_mthd_bind_surf_dst);
1020 NVOBJ_MTHD (dev, 0x004b, 0x02fc, nv04_graph_mthd_set_operation);
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +00001021
Ben Skeggsb8c157d2010-10-20 10:39:35 +10001022 /* nv04 gdirect */
1023 NVOBJ_CLASS(dev, 0x004a, GR);
1024 NVOBJ_MTHD (dev, 0x004a, 0x0188, nv04_graph_mthd_bind_nv04_patt);
1025 NVOBJ_MTHD (dev, 0x004a, 0x018c, nv04_graph_mthd_bind_rop);
1026 NVOBJ_MTHD (dev, 0x004a, 0x0190, nv04_graph_mthd_bind_beta1);
1027 NVOBJ_MTHD (dev, 0x004a, 0x0194, nv04_graph_mthd_bind_beta4);
1028 NVOBJ_MTHD (dev, 0x004a, 0x0198, nv04_graph_mthd_bind_surf2d);
1029 NVOBJ_MTHD (dev, 0x004a, 0x02fc, nv04_graph_mthd_set_operation);
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +00001030
Ben Skeggsb8c157d2010-10-20 10:39:35 +10001031 /* nv01 imageblit */
1032 NVOBJ_CLASS(dev, 0x001f, GR);
1033 NVOBJ_MTHD (dev, 0x001f, 0x0184, nv04_graph_mthd_bind_chroma);
1034 NVOBJ_MTHD (dev, 0x001f, 0x0188, nv04_graph_mthd_bind_clip);
1035 NVOBJ_MTHD (dev, 0x001f, 0x018c, nv04_graph_mthd_bind_nv01_patt);
1036 NVOBJ_MTHD (dev, 0x001f, 0x0190, nv04_graph_mthd_bind_rop);
1037 NVOBJ_MTHD (dev, 0x001f, 0x0194, nv04_graph_mthd_bind_beta1);
1038 NVOBJ_MTHD (dev, 0x001f, 0x0198, nv04_graph_mthd_bind_surf_dst);
1039 NVOBJ_MTHD (dev, 0x001f, 0x019c, nv04_graph_mthd_bind_surf_src);
1040 NVOBJ_MTHD (dev, 0x001f, 0x02fc, nv04_graph_mthd_set_operation);
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +00001041
Ben Skeggsb8c157d2010-10-20 10:39:35 +10001042 /* nv04 imageblit */
1043 NVOBJ_CLASS(dev, 0x005f, GR);
1044 NVOBJ_MTHD (dev, 0x005f, 0x0184, nv04_graph_mthd_bind_chroma);
1045 NVOBJ_MTHD (dev, 0x005f, 0x0188, nv04_graph_mthd_bind_clip);
1046 NVOBJ_MTHD (dev, 0x005f, 0x018c, nv04_graph_mthd_bind_nv04_patt);
1047 NVOBJ_MTHD (dev, 0x005f, 0x0190, nv04_graph_mthd_bind_rop);
1048 NVOBJ_MTHD (dev, 0x005f, 0x0194, nv04_graph_mthd_bind_beta1);
1049 NVOBJ_MTHD (dev, 0x005f, 0x0198, nv04_graph_mthd_bind_beta4);
1050 NVOBJ_MTHD (dev, 0x005f, 0x019c, nv04_graph_mthd_bind_surf2d);
1051 NVOBJ_MTHD (dev, 0x005f, 0x02fc, nv04_graph_mthd_set_operation);
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +00001052
Ben Skeggsb8c157d2010-10-20 10:39:35 +10001053 /* nv04 iifc */
1054 NVOBJ_CLASS(dev, 0x0060, GR);
1055 NVOBJ_MTHD (dev, 0x0060, 0x0188, nv04_graph_mthd_bind_chroma);
1056 NVOBJ_MTHD (dev, 0x0060, 0x018c, nv04_graph_mthd_bind_clip);
1057 NVOBJ_MTHD (dev, 0x0060, 0x0190, nv04_graph_mthd_bind_nv04_patt);
1058 NVOBJ_MTHD (dev, 0x0060, 0x0194, nv04_graph_mthd_bind_rop);
1059 NVOBJ_MTHD (dev, 0x0060, 0x0198, nv04_graph_mthd_bind_beta1);
1060 NVOBJ_MTHD (dev, 0x0060, 0x019c, nv04_graph_mthd_bind_beta4);
1061 NVOBJ_MTHD (dev, 0x0060, 0x01a0, nv04_graph_mthd_bind_surf2d_swzsurf);
1062 NVOBJ_MTHD (dev, 0x0060, 0x03e4, nv04_graph_mthd_set_operation);
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +00001063
Ben Skeggsb8c157d2010-10-20 10:39:35 +10001064 /* nv05 iifc */
1065 NVOBJ_CLASS(dev, 0x0064, GR);
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +00001066
Ben Skeggsb8c157d2010-10-20 10:39:35 +10001067 /* nv01 ifc */
1068 NVOBJ_CLASS(dev, 0x0021, GR);
1069 NVOBJ_MTHD (dev, 0x0021, 0x0184, nv04_graph_mthd_bind_chroma);
1070 NVOBJ_MTHD (dev, 0x0021, 0x0188, nv04_graph_mthd_bind_clip);
1071 NVOBJ_MTHD (dev, 0x0021, 0x018c, nv04_graph_mthd_bind_nv01_patt);
1072 NVOBJ_MTHD (dev, 0x0021, 0x0190, nv04_graph_mthd_bind_rop);
1073 NVOBJ_MTHD (dev, 0x0021, 0x0194, nv04_graph_mthd_bind_beta1);
1074 NVOBJ_MTHD (dev, 0x0021, 0x0198, nv04_graph_mthd_bind_surf_dst);
1075 NVOBJ_MTHD (dev, 0x0021, 0x02fc, nv04_graph_mthd_set_operation);
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +00001076
Ben Skeggsb8c157d2010-10-20 10:39:35 +10001077 /* nv04 ifc */
1078 NVOBJ_CLASS(dev, 0x0061, GR);
1079 NVOBJ_MTHD (dev, 0x0061, 0x0184, nv04_graph_mthd_bind_chroma);
1080 NVOBJ_MTHD (dev, 0x0061, 0x0188, nv04_graph_mthd_bind_clip);
1081 NVOBJ_MTHD (dev, 0x0061, 0x018c, nv04_graph_mthd_bind_nv04_patt);
1082 NVOBJ_MTHD (dev, 0x0061, 0x0190, nv04_graph_mthd_bind_rop);
1083 NVOBJ_MTHD (dev, 0x0061, 0x0194, nv04_graph_mthd_bind_beta1);
1084 NVOBJ_MTHD (dev, 0x0061, 0x0198, nv04_graph_mthd_bind_beta4);
1085 NVOBJ_MTHD (dev, 0x0061, 0x019c, nv04_graph_mthd_bind_surf2d);
1086 NVOBJ_MTHD (dev, 0x0061, 0x02fc, nv04_graph_mthd_set_operation);
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +00001087
Ben Skeggsb8c157d2010-10-20 10:39:35 +10001088 /* nv05 ifc */
1089 NVOBJ_CLASS(dev, 0x0065, GR);
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +00001090
Ben Skeggsb8c157d2010-10-20 10:39:35 +10001091 /* nv03 sifc */
1092 NVOBJ_CLASS(dev, 0x0036, GR);
1093 NVOBJ_MTHD (dev, 0x0036, 0x0184, nv04_graph_mthd_bind_chroma);
1094 NVOBJ_MTHD (dev, 0x0036, 0x0188, nv04_graph_mthd_bind_nv01_patt);
1095 NVOBJ_MTHD (dev, 0x0036, 0x018c, nv04_graph_mthd_bind_rop);
1096 NVOBJ_MTHD (dev, 0x0036, 0x0190, nv04_graph_mthd_bind_beta1);
1097 NVOBJ_MTHD (dev, 0x0036, 0x0194, nv04_graph_mthd_bind_surf_dst);
1098 NVOBJ_MTHD (dev, 0x0036, 0x02fc, nv04_graph_mthd_set_operation);
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +00001099
Ben Skeggsb8c157d2010-10-20 10:39:35 +10001100 /* nv04 sifc */
1101 NVOBJ_CLASS(dev, 0x0076, GR);
1102 NVOBJ_MTHD (dev, 0x0076, 0x0184, nv04_graph_mthd_bind_chroma);
1103 NVOBJ_MTHD (dev, 0x0076, 0x0188, nv04_graph_mthd_bind_nv04_patt);
1104 NVOBJ_MTHD (dev, 0x0076, 0x018c, nv04_graph_mthd_bind_rop);
1105 NVOBJ_MTHD (dev, 0x0076, 0x0190, nv04_graph_mthd_bind_beta1);
1106 NVOBJ_MTHD (dev, 0x0076, 0x0194, nv04_graph_mthd_bind_beta4);
1107 NVOBJ_MTHD (dev, 0x0076, 0x0198, nv04_graph_mthd_bind_surf2d);
1108 NVOBJ_MTHD (dev, 0x0076, 0x02fc, nv04_graph_mthd_set_operation);
Marcin Kościelnickif23d4cf2010-04-11 18:41:38 +00001109
Ben Skeggsb8c157d2010-10-20 10:39:35 +10001110 /* nv05 sifc */
1111 NVOBJ_CLASS(dev, 0x0066, GR);
Ben Skeggs6ee73862009-12-11 19:24:15 +10001112
Ben Skeggsb8c157d2010-10-20 10:39:35 +10001113 /* nv03 sifm */
1114 NVOBJ_CLASS(dev, 0x0037, GR);
1115 NVOBJ_MTHD (dev, 0x0037, 0x0188, nv04_graph_mthd_bind_nv01_patt);
1116 NVOBJ_MTHD (dev, 0x0037, 0x018c, nv04_graph_mthd_bind_rop);
1117 NVOBJ_MTHD (dev, 0x0037, 0x0190, nv04_graph_mthd_bind_beta1);
1118 NVOBJ_MTHD (dev, 0x0037, 0x0194, nv04_graph_mthd_bind_surf_dst);
1119 NVOBJ_MTHD (dev, 0x0037, 0x0304, nv04_graph_mthd_set_operation);
1120
1121 /* nv04 sifm */
1122 NVOBJ_CLASS(dev, 0x0077, GR);
1123 NVOBJ_MTHD (dev, 0x0077, 0x0188, nv04_graph_mthd_bind_nv04_patt);
1124 NVOBJ_MTHD (dev, 0x0077, 0x018c, nv04_graph_mthd_bind_rop);
1125 NVOBJ_MTHD (dev, 0x0077, 0x0190, nv04_graph_mthd_bind_beta1);
1126 NVOBJ_MTHD (dev, 0x0077, 0x0194, nv04_graph_mthd_bind_beta4);
1127 NVOBJ_MTHD (dev, 0x0077, 0x0198, nv04_graph_mthd_bind_surf2d_swzsurf);
1128 NVOBJ_MTHD (dev, 0x0077, 0x0304, nv04_graph_mthd_set_operation);
1129
1130 /* null */
1131 NVOBJ_CLASS(dev, 0x0030, GR);
1132
1133 /* surf2d */
1134 NVOBJ_CLASS(dev, 0x0042, GR);
1135
1136 /* rop */
1137 NVOBJ_CLASS(dev, 0x0043, GR);
1138
1139 /* beta1 */
1140 NVOBJ_CLASS(dev, 0x0012, GR);
1141
1142 /* beta4 */
1143 NVOBJ_CLASS(dev, 0x0072, GR);
1144
1145 /* cliprect */
1146 NVOBJ_CLASS(dev, 0x0019, GR);
1147
1148 /* nv01 pattern */
1149 NVOBJ_CLASS(dev, 0x0018, GR);
1150
1151 /* nv04 pattern */
1152 NVOBJ_CLASS(dev, 0x0044, GR);
1153
1154 /* swzsurf */
1155 NVOBJ_CLASS(dev, 0x0052, GR);
1156
1157 /* surf3d */
1158 NVOBJ_CLASS(dev, 0x0053, GR);
1159 NVOBJ_MTHD (dev, 0x0053, 0x02f8, nv04_graph_mthd_surf3d_clip_h);
1160 NVOBJ_MTHD (dev, 0x0053, 0x02fc, nv04_graph_mthd_surf3d_clip_v);
1161
1162 /* nv03 tex_tri */
1163 NVOBJ_CLASS(dev, 0x0048, GR);
1164 NVOBJ_MTHD (dev, 0x0048, 0x0188, nv04_graph_mthd_bind_clip);
1165 NVOBJ_MTHD (dev, 0x0048, 0x018c, nv04_graph_mthd_bind_surf_color);
1166 NVOBJ_MTHD (dev, 0x0048, 0x0190, nv04_graph_mthd_bind_surf_zeta);
1167
1168 /* tex_tri */
1169 NVOBJ_CLASS(dev, 0x0054, GR);
1170
1171 /* multitex_tri */
1172 NVOBJ_CLASS(dev, 0x0055, GR);
1173
1174 /* nv01 chroma */
1175 NVOBJ_CLASS(dev, 0x0017, GR);
1176
1177 /* nv04 chroma */
1178 NVOBJ_CLASS(dev, 0x0057, GR);
1179
1180 /* surf_dst */
1181 NVOBJ_CLASS(dev, 0x0058, GR);
1182
1183 /* surf_src */
1184 NVOBJ_CLASS(dev, 0x0059, GR);
1185
1186 /* surf_color */
1187 NVOBJ_CLASS(dev, 0x005a, GR);
1188
1189 /* surf_zeta */
1190 NVOBJ_CLASS(dev, 0x005b, GR);
1191
1192 /* nv01 line */
1193 NVOBJ_CLASS(dev, 0x001c, GR);
1194 NVOBJ_MTHD (dev, 0x001c, 0x0184, nv04_graph_mthd_bind_clip);
1195 NVOBJ_MTHD (dev, 0x001c, 0x0188, nv04_graph_mthd_bind_nv01_patt);
1196 NVOBJ_MTHD (dev, 0x001c, 0x018c, nv04_graph_mthd_bind_rop);
1197 NVOBJ_MTHD (dev, 0x001c, 0x0190, nv04_graph_mthd_bind_beta1);
1198 NVOBJ_MTHD (dev, 0x001c, 0x0194, nv04_graph_mthd_bind_surf_dst);
1199 NVOBJ_MTHD (dev, 0x001c, 0x02fc, nv04_graph_mthd_set_operation);
1200
1201 /* nv04 line */
1202 NVOBJ_CLASS(dev, 0x005c, GR);
1203 NVOBJ_MTHD (dev, 0x005c, 0x0184, nv04_graph_mthd_bind_clip);
1204 NVOBJ_MTHD (dev, 0x005c, 0x0188, nv04_graph_mthd_bind_nv04_patt);
1205 NVOBJ_MTHD (dev, 0x005c, 0x018c, nv04_graph_mthd_bind_rop);
1206 NVOBJ_MTHD (dev, 0x005c, 0x0190, nv04_graph_mthd_bind_beta1);
1207 NVOBJ_MTHD (dev, 0x005c, 0x0194, nv04_graph_mthd_bind_beta4);
1208 NVOBJ_MTHD (dev, 0x005c, 0x0198, nv04_graph_mthd_bind_surf2d);
1209 NVOBJ_MTHD (dev, 0x005c, 0x02fc, nv04_graph_mthd_set_operation);
1210
1211 /* nv01 tri */
1212 NVOBJ_CLASS(dev, 0x001d, GR);
1213 NVOBJ_MTHD (dev, 0x001d, 0x0184, nv04_graph_mthd_bind_clip);
1214 NVOBJ_MTHD (dev, 0x001d, 0x0188, nv04_graph_mthd_bind_nv01_patt);
1215 NVOBJ_MTHD (dev, 0x001d, 0x018c, nv04_graph_mthd_bind_rop);
1216 NVOBJ_MTHD (dev, 0x001d, 0x0190, nv04_graph_mthd_bind_beta1);
1217 NVOBJ_MTHD (dev, 0x001d, 0x0194, nv04_graph_mthd_bind_surf_dst);
1218 NVOBJ_MTHD (dev, 0x001d, 0x02fc, nv04_graph_mthd_set_operation);
1219
1220 /* nv04 tri */
1221 NVOBJ_CLASS(dev, 0x005d, GR);
1222 NVOBJ_MTHD (dev, 0x005d, 0x0184, nv04_graph_mthd_bind_clip);
1223 NVOBJ_MTHD (dev, 0x005d, 0x0188, nv04_graph_mthd_bind_nv04_patt);
1224 NVOBJ_MTHD (dev, 0x005d, 0x018c, nv04_graph_mthd_bind_rop);
1225 NVOBJ_MTHD (dev, 0x005d, 0x0190, nv04_graph_mthd_bind_beta1);
1226 NVOBJ_MTHD (dev, 0x005d, 0x0194, nv04_graph_mthd_bind_beta4);
1227 NVOBJ_MTHD (dev, 0x005d, 0x0198, nv04_graph_mthd_bind_surf2d);
1228 NVOBJ_MTHD (dev, 0x005d, 0x02fc, nv04_graph_mthd_set_operation);
1229
1230 /* nv01 rect */
1231 NVOBJ_CLASS(dev, 0x001e, GR);
1232 NVOBJ_MTHD (dev, 0x001e, 0x0184, nv04_graph_mthd_bind_clip);
1233 NVOBJ_MTHD (dev, 0x001e, 0x0188, nv04_graph_mthd_bind_nv01_patt);
1234 NVOBJ_MTHD (dev, 0x001e, 0x018c, nv04_graph_mthd_bind_rop);
1235 NVOBJ_MTHD (dev, 0x001e, 0x0190, nv04_graph_mthd_bind_beta1);
1236 NVOBJ_MTHD (dev, 0x001e, 0x0194, nv04_graph_mthd_bind_surf_dst);
1237 NVOBJ_MTHD (dev, 0x001e, 0x02fc, nv04_graph_mthd_set_operation);
1238
1239 /* nv04 rect */
1240 NVOBJ_CLASS(dev, 0x005e, GR);
1241 NVOBJ_MTHD (dev, 0x005e, 0x0184, nv04_graph_mthd_bind_clip);
1242 NVOBJ_MTHD (dev, 0x005e, 0x0188, nv04_graph_mthd_bind_nv04_patt);
1243 NVOBJ_MTHD (dev, 0x005e, 0x018c, nv04_graph_mthd_bind_rop);
1244 NVOBJ_MTHD (dev, 0x005e, 0x0190, nv04_graph_mthd_bind_beta1);
1245 NVOBJ_MTHD (dev, 0x005e, 0x0194, nv04_graph_mthd_bind_beta4);
1246 NVOBJ_MTHD (dev, 0x005e, 0x0198, nv04_graph_mthd_bind_surf2d);
1247 NVOBJ_MTHD (dev, 0x005e, 0x02fc, nv04_graph_mthd_set_operation);
1248
1249 /* nvsw */
1250 NVOBJ_CLASS(dev, 0x506e, SW);
1251 NVOBJ_MTHD (dev, 0x506e, 0x0150, nv04_graph_mthd_set_ref);
Francisco Jerez332b2422010-10-20 23:35:40 +02001252 NVOBJ_MTHD (dev, 0x506e, 0x0500, nv04_graph_mthd_page_flip);
Ben Skeggsb8c157d2010-10-20 10:39:35 +10001253
1254 dev_priv->engine.graph.registered = true;
1255 return 0;
1256};
Ben Skeggs274fec92010-11-03 13:16:18 +10001257
1258static struct nouveau_bitfield nv04_graph_intr[] = {
1259 { NV_PGRAPH_INTR_NOTIFY, "NOTIFY" },
1260 {}
1261};
1262
Emil Velikovf9ec8f62011-03-19 23:31:53 +00001263static struct nouveau_bitfield nv04_graph_nstatus[] = {
Ben Skeggs274fec92010-11-03 13:16:18 +10001264 { NV04_PGRAPH_NSTATUS_STATE_IN_USE, "STATE_IN_USE" },
1265 { NV04_PGRAPH_NSTATUS_INVALID_STATE, "INVALID_STATE" },
1266 { NV04_PGRAPH_NSTATUS_BAD_ARGUMENT, "BAD_ARGUMENT" },
1267 { NV04_PGRAPH_NSTATUS_PROTECTION_FAULT, "PROTECTION_FAULT" },
1268 {}
1269};
1270
Emil Velikovf9ec8f62011-03-19 23:31:53 +00001271struct nouveau_bitfield nv04_graph_nsource[] = {
Ben Skeggs274fec92010-11-03 13:16:18 +10001272 { NV03_PGRAPH_NSOURCE_NOTIFICATION, "NOTIFICATION" },
1273 { NV03_PGRAPH_NSOURCE_DATA_ERROR, "DATA_ERROR" },
1274 { NV03_PGRAPH_NSOURCE_PROTECTION_ERROR, "PROTECTION_ERROR" },
1275 { NV03_PGRAPH_NSOURCE_RANGE_EXCEPTION, "RANGE_EXCEPTION" },
1276 { NV03_PGRAPH_NSOURCE_LIMIT_COLOR, "LIMIT_COLOR" },
1277 { NV03_PGRAPH_NSOURCE_LIMIT_ZETA, "LIMIT_ZETA" },
1278 { NV03_PGRAPH_NSOURCE_ILLEGAL_MTHD, "ILLEGAL_MTHD" },
1279 { NV03_PGRAPH_NSOURCE_DMA_R_PROTECTION, "DMA_R_PROTECTION" },
1280 { NV03_PGRAPH_NSOURCE_DMA_W_PROTECTION, "DMA_W_PROTECTION" },
1281 { NV03_PGRAPH_NSOURCE_FORMAT_EXCEPTION, "FORMAT_EXCEPTION" },
1282 { NV03_PGRAPH_NSOURCE_PATCH_EXCEPTION, "PATCH_EXCEPTION" },
1283 { NV03_PGRAPH_NSOURCE_STATE_INVALID, "STATE_INVALID" },
1284 { NV03_PGRAPH_NSOURCE_DOUBLE_NOTIFY, "DOUBLE_NOTIFY" },
1285 { NV03_PGRAPH_NSOURCE_NOTIFY_IN_USE, "NOTIFY_IN_USE" },
1286 { NV03_PGRAPH_NSOURCE_METHOD_CNT, "METHOD_CNT" },
1287 { NV03_PGRAPH_NSOURCE_BFR_NOTIFICATION, "BFR_NOTIFICATION" },
1288 { NV03_PGRAPH_NSOURCE_DMA_VTX_PROTECTION, "DMA_VTX_PROTECTION" },
1289 { NV03_PGRAPH_NSOURCE_DMA_WIDTH_A, "DMA_WIDTH_A" },
1290 { NV03_PGRAPH_NSOURCE_DMA_WIDTH_B, "DMA_WIDTH_B" },
1291 {}
1292};
1293
1294static void
1295nv04_graph_isr(struct drm_device *dev)
1296{
1297 u32 stat;
1298
1299 while ((stat = nv_rd32(dev, NV03_PGRAPH_INTR))) {
1300 u32 nsource = nv_rd32(dev, NV03_PGRAPH_NSOURCE);
1301 u32 nstatus = nv_rd32(dev, NV03_PGRAPH_NSTATUS);
1302 u32 addr = nv_rd32(dev, NV04_PGRAPH_TRAPPED_ADDR);
1303 u32 chid = (addr & 0x0f000000) >> 24;
1304 u32 subc = (addr & 0x0000e000) >> 13;
1305 u32 mthd = (addr & 0x00001ffc);
1306 u32 data = nv_rd32(dev, NV04_PGRAPH_TRAPPED_DATA);
1307 u32 class = nv_rd32(dev, 0x400180 + subc * 4) & 0xff;
1308 u32 show = stat;
1309
1310 if (stat & NV_PGRAPH_INTR_NOTIFY) {
1311 if (nsource & NV03_PGRAPH_NSOURCE_ILLEGAL_MTHD) {
1312 if (!nouveau_gpuobj_mthd_call2(dev, chid, class, mthd, data))
1313 show &= ~NV_PGRAPH_INTR_NOTIFY;
1314 }
1315 }
1316
1317 if (stat & NV_PGRAPH_INTR_CONTEXT_SWITCH) {
1318 nv_wr32(dev, NV03_PGRAPH_INTR, NV_PGRAPH_INTR_CONTEXT_SWITCH);
1319 stat &= ~NV_PGRAPH_INTR_CONTEXT_SWITCH;
1320 show &= ~NV_PGRAPH_INTR_CONTEXT_SWITCH;
1321 nv04_graph_context_switch(dev);
1322 }
1323
1324 nv_wr32(dev, NV03_PGRAPH_INTR, stat);
1325 nv_wr32(dev, NV04_PGRAPH_FIFO, 0x00000001);
1326
1327 if (show && nouveau_ratelimit()) {
1328 NV_INFO(dev, "PGRAPH -");
1329 nouveau_bitfield_print(nv04_graph_intr, show);
1330 printk(" nsource:");
1331 nouveau_bitfield_print(nv04_graph_nsource, nsource);
1332 printk(" nstatus:");
1333 nouveau_bitfield_print(nv04_graph_nstatus, nstatus);
1334 printk("\n");
1335 NV_INFO(dev, "PGRAPH - ch %d/%d class 0x%04x "
1336 "mthd 0x%04x data 0x%08x\n",
1337 chid, subc, class, mthd, data);
1338 }
1339 }
1340}