2 * Copyright 2007 Stephane Marchesin
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:
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
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.
27 #include "nouveau_drm.h"
28 #include "nouveau_drv.h"
30 static uint32_t nv04_graph_ctx_regs[] = {
35 NV04_PGRAPH_CTX_SWITCH1,
36 NV04_PGRAPH_CTX_SWITCH2,
37 NV04_PGRAPH_CTX_SWITCH3,
38 NV04_PGRAPH_CTX_SWITCH4,
39 NV04_PGRAPH_CTX_CACHE1,
40 NV04_PGRAPH_CTX_CACHE2,
41 NV04_PGRAPH_CTX_CACHE3,
42 NV04_PGRAPH_CTX_CACHE4,
72 NV04_PGRAPH_DMA_START_0,
73 NV04_PGRAPH_DMA_START_1,
74 NV04_PGRAPH_DMA_LENGTH,
76 NV04_PGRAPH_DMA_PITCH,
102 NV04_PGRAPH_BSWIZZLE2,
103 NV04_PGRAPH_BSWIZZLE5,
106 NV04_PGRAPH_PATT_COLOR0,
107 NV04_PGRAPH_PATT_COLOR1,
108 NV04_PGRAPH_PATT_COLORRAM+0x00,
109 NV04_PGRAPH_PATT_COLORRAM+0x04,
110 NV04_PGRAPH_PATT_COLORRAM+0x08,
111 NV04_PGRAPH_PATT_COLORRAM+0x0c,
112 NV04_PGRAPH_PATT_COLORRAM+0x10,
113 NV04_PGRAPH_PATT_COLORRAM+0x14,
114 NV04_PGRAPH_PATT_COLORRAM+0x18,
115 NV04_PGRAPH_PATT_COLORRAM+0x1c,
116 NV04_PGRAPH_PATT_COLORRAM+0x20,
117 NV04_PGRAPH_PATT_COLORRAM+0x24,
118 NV04_PGRAPH_PATT_COLORRAM+0x28,
119 NV04_PGRAPH_PATT_COLORRAM+0x2c,
120 NV04_PGRAPH_PATT_COLORRAM+0x30,
121 NV04_PGRAPH_PATT_COLORRAM+0x34,
122 NV04_PGRAPH_PATT_COLORRAM+0x38,
123 NV04_PGRAPH_PATT_COLORRAM+0x3c,
124 NV04_PGRAPH_PATT_COLORRAM+0x40,
125 NV04_PGRAPH_PATT_COLORRAM+0x44,
126 NV04_PGRAPH_PATT_COLORRAM+0x48,
127 NV04_PGRAPH_PATT_COLORRAM+0x4c,
128 NV04_PGRAPH_PATT_COLORRAM+0x50,
129 NV04_PGRAPH_PATT_COLORRAM+0x54,
130 NV04_PGRAPH_PATT_COLORRAM+0x58,
131 NV04_PGRAPH_PATT_COLORRAM+0x5c,
132 NV04_PGRAPH_PATT_COLORRAM+0x60,
133 NV04_PGRAPH_PATT_COLORRAM+0x64,
134 NV04_PGRAPH_PATT_COLORRAM+0x68,
135 NV04_PGRAPH_PATT_COLORRAM+0x6c,
136 NV04_PGRAPH_PATT_COLORRAM+0x70,
137 NV04_PGRAPH_PATT_COLORRAM+0x74,
138 NV04_PGRAPH_PATT_COLORRAM+0x78,
139 NV04_PGRAPH_PATT_COLORRAM+0x7c,
140 NV04_PGRAPH_PATT_COLORRAM+0x80,
141 NV04_PGRAPH_PATT_COLORRAM+0x84,
142 NV04_PGRAPH_PATT_COLORRAM+0x88,
143 NV04_PGRAPH_PATT_COLORRAM+0x8c,
144 NV04_PGRAPH_PATT_COLORRAM+0x90,
145 NV04_PGRAPH_PATT_COLORRAM+0x94,
146 NV04_PGRAPH_PATT_COLORRAM+0x98,
147 NV04_PGRAPH_PATT_COLORRAM+0x9c,
148 NV04_PGRAPH_PATT_COLORRAM+0xa0,
149 NV04_PGRAPH_PATT_COLORRAM+0xa4,
150 NV04_PGRAPH_PATT_COLORRAM+0xa8,
151 NV04_PGRAPH_PATT_COLORRAM+0xac,
152 NV04_PGRAPH_PATT_COLORRAM+0xb0,
153 NV04_PGRAPH_PATT_COLORRAM+0xb4,
154 NV04_PGRAPH_PATT_COLORRAM+0xb8,
155 NV04_PGRAPH_PATT_COLORRAM+0xbc,
156 NV04_PGRAPH_PATT_COLORRAM+0xc0,
157 NV04_PGRAPH_PATT_COLORRAM+0xc4,
158 NV04_PGRAPH_PATT_COLORRAM+0xc8,
159 NV04_PGRAPH_PATT_COLORRAM+0xcc,
160 NV04_PGRAPH_PATT_COLORRAM+0xd0,
161 NV04_PGRAPH_PATT_COLORRAM+0xd4,
162 NV04_PGRAPH_PATT_COLORRAM+0xd8,
163 NV04_PGRAPH_PATT_COLORRAM+0xdc,
164 NV04_PGRAPH_PATT_COLORRAM+0xe0,
165 NV04_PGRAPH_PATT_COLORRAM+0xe4,
166 NV04_PGRAPH_PATT_COLORRAM+0xe8,
167 NV04_PGRAPH_PATT_COLORRAM+0xec,
168 NV04_PGRAPH_PATT_COLORRAM+0xf0,
169 NV04_PGRAPH_PATT_COLORRAM+0xf4,
170 NV04_PGRAPH_PATT_COLORRAM+0xf8,
171 NV04_PGRAPH_PATT_COLORRAM+0xfc,
174 NV04_PGRAPH_PATTERN_SHAPE,
178 NV04_PGRAPH_BETA_AND,
179 NV04_PGRAPH_BETA_PREMULT,
180 NV04_PGRAPH_CONTROL0,
181 NV04_PGRAPH_CONTROL1,
182 NV04_PGRAPH_CONTROL2,
184 NV04_PGRAPH_STORED_FMT,
185 NV04_PGRAPH_SOURCE_COLOR,
329 NV04_PGRAPH_PASSTHRU_0,
330 NV04_PGRAPH_PASSTHRU_1,
331 NV04_PGRAPH_PASSTHRU_2,
332 NV04_PGRAPH_DVD_COLORFMT,
333 NV04_PGRAPH_SCALED_FORMAT,
334 NV04_PGRAPH_MISC24_0,
335 NV04_PGRAPH_MISC24_1,
336 NV04_PGRAPH_MISC24_2,
345 uint32_t nv04[ARRAY_SIZE(nv04_graph_ctx_regs)];
348 struct nouveau_channel *
349 nv04_graph_channel(struct drm_device *dev)
351 struct drm_nouveau_private *dev_priv = dev->dev_private;
352 int chid = dev_priv->engine.fifo.channels;
354 if (nv_rd32(dev, NV04_PGRAPH_CTX_CONTROL) & 0x00010000)
355 chid = nv_rd32(dev, NV04_PGRAPH_CTX_USER) >> 24;
357 if (chid >= dev_priv->engine.fifo.channels)
360 return dev_priv->channels.ptr[chid];
364 nv04_graph_context_switch(struct drm_device *dev)
366 struct drm_nouveau_private *dev_priv = dev->dev_private;
367 struct nouveau_pgraph_engine *pgraph = &dev_priv->engine.graph;
368 struct nouveau_channel *chan = NULL;
371 pgraph->fifo_access(dev, false);
372 nouveau_wait_for_idle(dev);
374 /* If previous context is valid, we need to save it */
375 pgraph->unload_context(dev);
377 /* Load context for next channel */
378 chid = dev_priv->engine.fifo.channel_id(dev);
379 chan = dev_priv->channels.ptr[chid];
381 nv04_graph_load_context(chan);
383 pgraph->fifo_access(dev, true);
386 static uint32_t *ctx_reg(struct graph_state *ctx, uint32_t reg)
390 for (i = 0; i < ARRAY_SIZE(nv04_graph_ctx_regs); i++) {
391 if (nv04_graph_ctx_regs[i] == reg)
392 return &ctx->nv04[i];
398 int nv04_graph_create_context(struct nouveau_channel *chan)
400 struct graph_state *pgraph_ctx;
401 NV_DEBUG(chan->dev, "nv04_graph_context_create %d\n", chan->id);
403 chan->pgraph_ctx = pgraph_ctx = kzalloc(sizeof(*pgraph_ctx),
405 if (pgraph_ctx == NULL)
408 *ctx_reg(pgraph_ctx, NV04_PGRAPH_DEBUG_3) = 0xfad4ff31;
413 void nv04_graph_destroy_context(struct nouveau_channel *chan)
415 struct drm_device *dev = chan->dev;
416 struct drm_nouveau_private *dev_priv = dev->dev_private;
417 struct nouveau_pgraph_engine *pgraph = &dev_priv->engine.graph;
418 struct graph_state *pgraph_ctx = chan->pgraph_ctx;
421 spin_lock_irqsave(&dev_priv->context_switch_lock, flags);
422 pgraph->fifo_access(dev, false);
424 /* Unload the context if it's the currently active one */
425 if (pgraph->channel(dev) == chan)
426 pgraph->unload_context(dev);
428 /* Free the context resources */
430 chan->pgraph_ctx = NULL;
432 pgraph->fifo_access(dev, true);
433 spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags);
436 int nv04_graph_load_context(struct nouveau_channel *chan)
438 struct drm_device *dev = chan->dev;
439 struct graph_state *pgraph_ctx = chan->pgraph_ctx;
443 for (i = 0; i < ARRAY_SIZE(nv04_graph_ctx_regs); i++)
444 nv_wr32(dev, nv04_graph_ctx_regs[i], pgraph_ctx->nv04[i]);
446 nv_wr32(dev, NV04_PGRAPH_CTX_CONTROL, 0x10010100);
448 tmp = nv_rd32(dev, NV04_PGRAPH_CTX_USER) & 0x00ffffff;
449 nv_wr32(dev, NV04_PGRAPH_CTX_USER, tmp | chan->id << 24);
451 tmp = nv_rd32(dev, NV04_PGRAPH_FFINTFC_ST2);
452 nv_wr32(dev, NV04_PGRAPH_FFINTFC_ST2, tmp & 0x000fffff);
458 nv04_graph_unload_context(struct drm_device *dev)
460 struct drm_nouveau_private *dev_priv = dev->dev_private;
461 struct nouveau_pgraph_engine *pgraph = &dev_priv->engine.graph;
462 struct nouveau_channel *chan = NULL;
463 struct graph_state *ctx;
467 chan = pgraph->channel(dev);
470 ctx = chan->pgraph_ctx;
472 for (i = 0; i < ARRAY_SIZE(nv04_graph_ctx_regs); i++)
473 ctx->nv04[i] = nv_rd32(dev, nv04_graph_ctx_regs[i]);
475 nv_wr32(dev, NV04_PGRAPH_CTX_CONTROL, 0x10000000);
476 tmp = nv_rd32(dev, NV04_PGRAPH_CTX_USER) & 0x00ffffff;
477 tmp |= (dev_priv->engine.fifo.channels - 1) << 24;
478 nv_wr32(dev, NV04_PGRAPH_CTX_USER, tmp);
482 int nv04_graph_init(struct drm_device *dev)
484 struct drm_nouveau_private *dev_priv = dev->dev_private;
487 nv_wr32(dev, NV03_PMC_ENABLE, nv_rd32(dev, NV03_PMC_ENABLE) &
488 ~NV_PMC_ENABLE_PGRAPH);
489 nv_wr32(dev, NV03_PMC_ENABLE, nv_rd32(dev, NV03_PMC_ENABLE) |
490 NV_PMC_ENABLE_PGRAPH);
492 /* Enable PGRAPH interrupts */
493 nv_wr32(dev, NV03_PGRAPH_INTR, 0xFFFFFFFF);
494 nv_wr32(dev, NV03_PGRAPH_INTR_EN, 0xFFFFFFFF);
496 nv_wr32(dev, NV04_PGRAPH_VALID1, 0);
497 nv_wr32(dev, NV04_PGRAPH_VALID2, 0);
498 /*nv_wr32(dev, NV04_PGRAPH_DEBUG_0, 0x000001FF);
499 nv_wr32(dev, NV04_PGRAPH_DEBUG_0, 0x001FFFFF);*/
500 nv_wr32(dev, NV04_PGRAPH_DEBUG_0, 0x1231c000);
501 /*1231C000 blob, 001 haiku*/
502 //*V_WRITE(NV04_PGRAPH_DEBUG_1, 0xf2d91100);*/
503 nv_wr32(dev, NV04_PGRAPH_DEBUG_1, 0x72111100);
504 /*0x72111100 blob , 01 haiku*/
505 /*nv_wr32(dev, NV04_PGRAPH_DEBUG_2, 0x11d5f870);*/
506 nv_wr32(dev, NV04_PGRAPH_DEBUG_2, 0x11d5f071);
509 /*nv_wr32(dev, NV04_PGRAPH_DEBUG_3, 0xfad4ff31);*/
510 nv_wr32(dev, NV04_PGRAPH_DEBUG_3, 0xf0d4ff31);
511 /*haiku and blob 10d4*/
513 nv_wr32(dev, NV04_PGRAPH_STATE , 0xFFFFFFFF);
514 nv_wr32(dev, NV04_PGRAPH_CTX_CONTROL , 0x10000100);
515 tmp = nv_rd32(dev, NV04_PGRAPH_CTX_USER) & 0x00ffffff;
516 tmp |= (dev_priv->engine.fifo.channels - 1) << 24;
517 nv_wr32(dev, NV04_PGRAPH_CTX_USER, tmp);
519 /* These don't belong here, they're part of a per-channel context */
520 nv_wr32(dev, NV04_PGRAPH_PATTERN_SHAPE, 0x00000000);
521 nv_wr32(dev, NV04_PGRAPH_BETA_AND , 0xFFFFFFFF);
526 void nv04_graph_takedown(struct drm_device *dev)
531 nv04_graph_fifo_access(struct drm_device *dev, bool enabled)
534 nv_wr32(dev, NV04_PGRAPH_FIFO,
535 nv_rd32(dev, NV04_PGRAPH_FIFO) | 1);
537 nv_wr32(dev, NV04_PGRAPH_FIFO,
538 nv_rd32(dev, NV04_PGRAPH_FIFO) & ~1);
542 nv04_graph_mthd_set_ref(struct nouveau_channel *chan, int grclass,
543 int mthd, uint32_t data)
545 atomic_set(&chan->fence.last_sequence_irq, data);
550 * Software methods, why they are needed, and how they all work:
552 * NV04 and NV05 keep most of the state in PGRAPH context itself, but some
553 * 2d engine settings are kept inside the grobjs themselves. The grobjs are
554 * 3 words long on both. grobj format on NV04 is:
558 * - bit 12: color key active
559 * - bit 13: clip rect active
560 * - bit 14: if set, destination surface is swizzled and taken from buffer 5
561 * [set by NV04_SWIZZLED_SURFACE], otherwise it's linear and taken
562 * from buffer 0 [set by NV04_CONTEXT_SURFACES_2D or
563 * NV03_CONTEXT_SURFACE_DST].
564 * - bits 15-17: 2d operation [aka patch config]
565 * - bit 24: patch valid [enables rendering using this object]
566 * - bit 25: surf3d valid [for tex_tri and multitex_tri only]
568 * - bits 0-1: mono format
569 * - bits 8-13: color format
570 * - bits 16-31: DMA_NOTIFY instance
572 * - bits 0-15: DMA_A instance
573 * - bits 16-31: DMA_B instance
579 * - bit 12: color key active
580 * - bit 13: clip rect active
581 * - bit 14: if set, destination surface is swizzled and taken from buffer 5
582 * [set by NV04_SWIZZLED_SURFACE], otherwise it's linear and taken
583 * from buffer 0 [set by NV04_CONTEXT_SURFACES_2D or
584 * NV03_CONTEXT_SURFACE_DST].
585 * - bits 15-17: 2d operation [aka patch config]
586 * - bits 20-22: dither mode
587 * - bit 24: patch valid [enables rendering using this object]
588 * - bit 25: surface_dst/surface_color/surf2d/surf3d valid
589 * - bit 26: surface_src/surface_zeta valid
590 * - bit 27: pattern valid
591 * - bit 28: rop valid
592 * - bit 29: beta1 valid
593 * - bit 30: beta4 valid
595 * - bits 0-1: mono format
596 * - bits 8-13: color format
597 * - bits 16-31: DMA_NOTIFY instance
599 * - bits 0-15: DMA_A instance
600 * - bits 16-31: DMA_B instance
602 * NV05 will set/unset the relevant valid bits when you poke the relevant
603 * object-binding methods with object of the proper type, or with the NULL
604 * type. It'll only allow rendering using the grobj if all needed objects
605 * are bound. The needed set of objects depends on selected operation: for
606 * example rop object is needed by ROP_AND, but not by SRCCOPY_AND.
608 * NV04 doesn't have these methods implemented at all, and doesn't have the
609 * relevant bits in grobj. Instead, it'll allow rendering whenever bit 24
610 * is set. So we have to emulate them in software, internally keeping the
611 * same bits as NV05 does. Since grobjs are aligned to 16 bytes on nv04,
612 * but the last word isn't actually used for anything, we abuse it for this
615 * Actually, NV05 can optionally check bit 24 too, but we disable this since
616 * there's no use for it.
618 * For unknown reasons, NV04 implements surf3d binding in hardware as an
619 * exception. Also for unknown reasons, NV04 doesn't implement the clipping
620 * methods on the surf3d object, so we have to emulate them too.
624 nv04_graph_set_ctx1(struct nouveau_channel *chan, uint32_t mask, uint32_t value)
626 struct drm_device *dev = chan->dev;
627 uint32_t instance = (nv_rd32(dev, NV04_PGRAPH_CTX_SWITCH4) & 0xffff) << 4;
628 int subc = (nv_rd32(dev, NV04_PGRAPH_TRAPPED_ADDR) >> 13) & 0x7;
631 tmp = nv_ri32(dev, instance);
635 nv_wi32(dev, instance, tmp);
636 nv_wr32(dev, NV04_PGRAPH_CTX_SWITCH1, tmp);
637 nv_wr32(dev, NV04_PGRAPH_CTX_CACHE1 + (subc<<2), tmp);
641 nv04_graph_set_ctx_val(struct nouveau_channel *chan, uint32_t mask, uint32_t value)
643 struct drm_device *dev = chan->dev;
644 uint32_t instance = (nv_rd32(dev, NV04_PGRAPH_CTX_SWITCH4) & 0xffff) << 4;
646 int class, op, valid = 1;
648 ctx1 = nv_ri32(dev, instance);
650 op = (ctx1 >> 15) & 7;
651 tmp = nv_ri32(dev, instance + 0xc);
654 nv_wi32(dev, instance + 0xc, tmp);
656 /* check for valid surf2d/surf_dst/surf_color */
657 if (!(tmp & 0x02000000))
659 /* check for valid surf_src/surf_zeta */
660 if ((class == 0x1f || class == 0x48) && !(tmp & 0x04000000))
664 /* SRCCOPY_AND, SRCCOPY: no extra objects required */
668 /* ROP_AND: requires pattern and rop */
670 if (!(tmp & 0x18000000))
673 /* BLEND_AND: requires beta1 */
675 if (!(tmp & 0x20000000))
678 /* SRCCOPY_PREMULT, BLEND_PREMULT: beta4 required */
681 if (!(tmp & 0x40000000))
686 nv04_graph_set_ctx1(chan, 0x01000000, valid << 24);
690 nv04_graph_mthd_set_operation(struct nouveau_channel *chan, int grclass,
691 int mthd, uint32_t data)
695 /* Old versions of the objects only accept first three operations. */
696 if (data > 2 && grclass < 0x40)
698 nv04_graph_set_ctx1(chan, 0x00038000, data << 15);
699 /* changing operation changes set of objects needed for validation */
700 nv04_graph_set_ctx_val(chan, 0, 0);
705 nv04_graph_mthd_surf3d_clip_h(struct nouveau_channel *chan, int grclass,
706 int mthd, uint32_t data)
708 uint32_t min = data & 0xffff, max;
709 uint32_t w = data >> 16;
714 /* yes, it accepts negative for some reason. */
718 nv_wr32(chan->dev, 0x40053c, min);
719 nv_wr32(chan->dev, 0x400544, max);
724 nv04_graph_mthd_surf3d_clip_v(struct nouveau_channel *chan, int grclass,
725 int mthd, uint32_t data)
727 uint32_t min = data & 0xffff, max;
728 uint32_t w = data >> 16;
733 /* yes, it accepts negative for some reason. */
737 nv_wr32(chan->dev, 0x400540, min);
738 nv_wr32(chan->dev, 0x400548, max);
743 nv04_graph_mthd_bind_surf2d(struct nouveau_channel *chan, int grclass,
744 int mthd, uint32_t data)
746 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
748 nv04_graph_set_ctx1(chan, 0x00004000, 0);
749 nv04_graph_set_ctx_val(chan, 0x02000000, 0);
752 nv04_graph_set_ctx1(chan, 0x00004000, 0);
753 nv04_graph_set_ctx_val(chan, 0x02000000, 0x02000000);
760 nv04_graph_mthd_bind_surf2d_swzsurf(struct nouveau_channel *chan, int grclass,
761 int mthd, uint32_t data)
763 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
765 nv04_graph_set_ctx1(chan, 0x00004000, 0);
766 nv04_graph_set_ctx_val(chan, 0x02000000, 0);
769 nv04_graph_set_ctx1(chan, 0x00004000, 0);
770 nv04_graph_set_ctx_val(chan, 0x02000000, 0x02000000);
773 nv04_graph_set_ctx1(chan, 0x00004000, 0x00004000);
774 nv04_graph_set_ctx_val(chan, 0x02000000, 0x02000000);
781 nv04_graph_mthd_bind_nv01_patt(struct nouveau_channel *chan, int grclass,
782 int mthd, uint32_t data)
784 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
786 nv04_graph_set_ctx_val(chan, 0x08000000, 0);
789 nv04_graph_set_ctx_val(chan, 0x08000000, 0x08000000);
796 nv04_graph_mthd_bind_nv04_patt(struct nouveau_channel *chan, int grclass,
797 int mthd, uint32_t data)
799 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
801 nv04_graph_set_ctx_val(chan, 0x08000000, 0);
804 nv04_graph_set_ctx_val(chan, 0x08000000, 0x08000000);
811 nv04_graph_mthd_bind_rop(struct nouveau_channel *chan, int grclass,
812 int mthd, uint32_t data)
814 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
816 nv04_graph_set_ctx_val(chan, 0x10000000, 0);
819 nv04_graph_set_ctx_val(chan, 0x10000000, 0x10000000);
826 nv04_graph_mthd_bind_beta1(struct nouveau_channel *chan, int grclass,
827 int mthd, uint32_t data)
829 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
831 nv04_graph_set_ctx_val(chan, 0x20000000, 0);
834 nv04_graph_set_ctx_val(chan, 0x20000000, 0x20000000);
841 nv04_graph_mthd_bind_beta4(struct nouveau_channel *chan, int grclass,
842 int mthd, uint32_t data)
844 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
846 nv04_graph_set_ctx_val(chan, 0x40000000, 0);
849 nv04_graph_set_ctx_val(chan, 0x40000000, 0x40000000);
856 nv04_graph_mthd_bind_surf_dst(struct nouveau_channel *chan, int grclass,
857 int mthd, uint32_t data)
859 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
861 nv04_graph_set_ctx_val(chan, 0x02000000, 0);
864 nv04_graph_set_ctx_val(chan, 0x02000000, 0x02000000);
871 nv04_graph_mthd_bind_surf_src(struct nouveau_channel *chan, int grclass,
872 int mthd, uint32_t data)
874 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
876 nv04_graph_set_ctx_val(chan, 0x04000000, 0);
879 nv04_graph_set_ctx_val(chan, 0x04000000, 0x04000000);
886 nv04_graph_mthd_bind_surf_color(struct nouveau_channel *chan, int grclass,
887 int mthd, uint32_t data)
889 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
891 nv04_graph_set_ctx_val(chan, 0x02000000, 0);
894 nv04_graph_set_ctx_val(chan, 0x02000000, 0x02000000);
901 nv04_graph_mthd_bind_surf_zeta(struct nouveau_channel *chan, int grclass,
902 int mthd, uint32_t data)
904 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
906 nv04_graph_set_ctx_val(chan, 0x04000000, 0);
909 nv04_graph_set_ctx_val(chan, 0x04000000, 0x04000000);
916 nv04_graph_mthd_bind_clip(struct nouveau_channel *chan, int grclass,
917 int mthd, uint32_t data)
919 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
921 nv04_graph_set_ctx1(chan, 0x2000, 0);
924 nv04_graph_set_ctx1(chan, 0x2000, 0x2000);
931 nv04_graph_mthd_bind_chroma(struct nouveau_channel *chan, int grclass,
932 int mthd, uint32_t data)
934 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
936 nv04_graph_set_ctx1(chan, 0x1000, 0);
938 /* Yes, for some reason even the old versions of objects
939 * accept 0x57 and not 0x17. Consistency be damned.
942 nv04_graph_set_ctx1(chan, 0x1000, 0x1000);
948 static struct nouveau_pgraph_object_method nv04_graph_mthds_sw[] = {
949 { 0x0150, nv04_graph_mthd_set_ref },
953 static struct nouveau_pgraph_object_method nv04_graph_mthds_nv03_gdirect[] = {
954 { 0x0184, nv04_graph_mthd_bind_nv01_patt },
955 { 0x0188, nv04_graph_mthd_bind_rop },
956 { 0x018c, nv04_graph_mthd_bind_beta1 },
957 { 0x0190, nv04_graph_mthd_bind_surf_dst },
958 { 0x02fc, nv04_graph_mthd_set_operation },
962 static struct nouveau_pgraph_object_method nv04_graph_mthds_nv04_gdirect[] = {
963 { 0x0188, nv04_graph_mthd_bind_nv04_patt },
964 { 0x018c, nv04_graph_mthd_bind_rop },
965 { 0x0190, nv04_graph_mthd_bind_beta1 },
966 { 0x0194, nv04_graph_mthd_bind_beta4 },
967 { 0x0198, nv04_graph_mthd_bind_surf2d },
968 { 0x02fc, nv04_graph_mthd_set_operation },
972 static struct nouveau_pgraph_object_method nv04_graph_mthds_nv01_imageblit[] = {
973 { 0x0184, nv04_graph_mthd_bind_chroma },
974 { 0x0188, nv04_graph_mthd_bind_clip },
975 { 0x018c, nv04_graph_mthd_bind_nv01_patt },
976 { 0x0190, nv04_graph_mthd_bind_rop },
977 { 0x0194, nv04_graph_mthd_bind_beta1 },
978 { 0x0198, nv04_graph_mthd_bind_surf_dst },
979 { 0x019c, nv04_graph_mthd_bind_surf_src },
980 { 0x02fc, nv04_graph_mthd_set_operation },
984 static struct nouveau_pgraph_object_method nv04_graph_mthds_nv04_imageblit_ifc[] = {
985 { 0x0184, nv04_graph_mthd_bind_chroma },
986 { 0x0188, nv04_graph_mthd_bind_clip },
987 { 0x018c, nv04_graph_mthd_bind_nv04_patt },
988 { 0x0190, nv04_graph_mthd_bind_rop },
989 { 0x0194, nv04_graph_mthd_bind_beta1 },
990 { 0x0198, nv04_graph_mthd_bind_beta4 },
991 { 0x019c, nv04_graph_mthd_bind_surf2d },
992 { 0x02fc, nv04_graph_mthd_set_operation },
996 static struct nouveau_pgraph_object_method nv04_graph_mthds_nv04_iifc[] = {
997 { 0x0188, nv04_graph_mthd_bind_chroma },
998 { 0x018c, nv04_graph_mthd_bind_clip },
999 { 0x0190, nv04_graph_mthd_bind_nv04_patt },
1000 { 0x0194, nv04_graph_mthd_bind_rop },
1001 { 0x0198, nv04_graph_mthd_bind_beta1 },
1002 { 0x019c, nv04_graph_mthd_bind_beta4 },
1003 { 0x01a0, nv04_graph_mthd_bind_surf2d_swzsurf },
1004 { 0x03e4, nv04_graph_mthd_set_operation },
1008 static struct nouveau_pgraph_object_method nv04_graph_mthds_nv01_ifc[] = {
1009 { 0x0184, nv04_graph_mthd_bind_chroma },
1010 { 0x0188, nv04_graph_mthd_bind_clip },
1011 { 0x018c, nv04_graph_mthd_bind_nv01_patt },
1012 { 0x0190, nv04_graph_mthd_bind_rop },
1013 { 0x0194, nv04_graph_mthd_bind_beta1 },
1014 { 0x0198, nv04_graph_mthd_bind_surf_dst },
1015 { 0x02fc, nv04_graph_mthd_set_operation },
1019 static struct nouveau_pgraph_object_method nv04_graph_mthds_nv03_sifc[] = {
1020 { 0x0184, nv04_graph_mthd_bind_chroma },
1021 { 0x0188, nv04_graph_mthd_bind_nv01_patt },
1022 { 0x018c, nv04_graph_mthd_bind_rop },
1023 { 0x0190, nv04_graph_mthd_bind_beta1 },
1024 { 0x0194, nv04_graph_mthd_bind_surf_dst },
1025 { 0x02fc, nv04_graph_mthd_set_operation },
1029 static struct nouveau_pgraph_object_method nv04_graph_mthds_nv04_sifc[] = {
1030 { 0x0184, nv04_graph_mthd_bind_chroma },
1031 { 0x0188, nv04_graph_mthd_bind_nv04_patt },
1032 { 0x018c, nv04_graph_mthd_bind_rop },
1033 { 0x0190, nv04_graph_mthd_bind_beta1 },
1034 { 0x0194, nv04_graph_mthd_bind_beta4 },
1035 { 0x0198, nv04_graph_mthd_bind_surf2d },
1036 { 0x02fc, nv04_graph_mthd_set_operation },
1040 static struct nouveau_pgraph_object_method nv04_graph_mthds_nv03_sifm[] = {
1041 { 0x0188, nv04_graph_mthd_bind_nv01_patt },
1042 { 0x018c, nv04_graph_mthd_bind_rop },
1043 { 0x0190, nv04_graph_mthd_bind_beta1 },
1044 { 0x0194, nv04_graph_mthd_bind_surf_dst },
1045 { 0x0304, nv04_graph_mthd_set_operation },
1049 static struct nouveau_pgraph_object_method nv04_graph_mthds_nv04_sifm[] = {
1050 { 0x0188, nv04_graph_mthd_bind_nv04_patt },
1051 { 0x018c, nv04_graph_mthd_bind_rop },
1052 { 0x0190, nv04_graph_mthd_bind_beta1 },
1053 { 0x0194, nv04_graph_mthd_bind_beta4 },
1054 { 0x0198, nv04_graph_mthd_bind_surf2d_swzsurf },
1055 { 0x0304, nv04_graph_mthd_set_operation },
1059 static struct nouveau_pgraph_object_method nv04_graph_mthds_nv01_shape[] = {
1060 { 0x0184, nv04_graph_mthd_bind_clip },
1061 { 0x0188, nv04_graph_mthd_bind_nv01_patt },
1062 { 0x018c, nv04_graph_mthd_bind_rop },
1063 { 0x0190, nv04_graph_mthd_bind_beta1 },
1064 { 0x0194, nv04_graph_mthd_bind_surf_dst },
1065 { 0x02fc, nv04_graph_mthd_set_operation },
1069 static struct nouveau_pgraph_object_method nv04_graph_mthds_nv04_shape[] = {
1070 { 0x0184, nv04_graph_mthd_bind_clip },
1071 { 0x0188, nv04_graph_mthd_bind_nv04_patt },
1072 { 0x018c, nv04_graph_mthd_bind_rop },
1073 { 0x0190, nv04_graph_mthd_bind_beta1 },
1074 { 0x0194, nv04_graph_mthd_bind_beta4 },
1075 { 0x0198, nv04_graph_mthd_bind_surf2d },
1076 { 0x02fc, nv04_graph_mthd_set_operation },
1080 static struct nouveau_pgraph_object_method nv04_graph_mthds_nv03_tex_tri[] = {
1081 { 0x0188, nv04_graph_mthd_bind_clip },
1082 { 0x018c, nv04_graph_mthd_bind_surf_color },
1083 { 0x0190, nv04_graph_mthd_bind_surf_zeta },
1087 static struct nouveau_pgraph_object_method nv04_graph_mthds_surf3d[] = {
1088 { 0x02f8, nv04_graph_mthd_surf3d_clip_h },
1089 { 0x02fc, nv04_graph_mthd_surf3d_clip_v },
1093 struct nouveau_pgraph_object_class nv04_graph_grclass[] = {
1094 { 0x0038, NVOBJ_ENGINE_GR, NULL }, /* dvd subpicture */
1095 { 0x0039, NVOBJ_ENGINE_GR, NULL }, /* m2mf */
1096 { 0x004b, NVOBJ_ENGINE_GR, nv04_graph_mthds_nv03_gdirect }, /* nv03 gdirect */
1097 { 0x004a, NVOBJ_ENGINE_GR, nv04_graph_mthds_nv04_gdirect }, /* nv04 gdirect */
1098 { 0x001f, NVOBJ_ENGINE_GR, nv04_graph_mthds_nv01_imageblit }, /* nv01 imageblit */
1099 { 0x005f, NVOBJ_ENGINE_GR, nv04_graph_mthds_nv04_imageblit_ifc }, /* nv04 imageblit */
1100 { 0x0060, NVOBJ_ENGINE_GR, nv04_graph_mthds_nv04_iifc }, /* nv04 iifc */
1101 { 0x0064, NVOBJ_ENGINE_GR, NULL }, /* nv05 iifc */
1102 { 0x0021, NVOBJ_ENGINE_GR, nv04_graph_mthds_nv01_ifc }, /* nv01 ifc */
1103 { 0x0061, NVOBJ_ENGINE_GR, nv04_graph_mthds_nv04_imageblit_ifc }, /* nv04 ifc */
1104 { 0x0065, NVOBJ_ENGINE_GR, NULL }, /* nv05 ifc */
1105 { 0x0036, NVOBJ_ENGINE_GR, nv04_graph_mthds_nv03_sifc }, /* nv03 sifc */
1106 { 0x0076, NVOBJ_ENGINE_GR, nv04_graph_mthds_nv04_sifc }, /* nv04 sifc */
1107 { 0x0066, NVOBJ_ENGINE_GR, NULL }, /* nv05 sifc */
1108 { 0x0037, NVOBJ_ENGINE_GR, nv04_graph_mthds_nv03_sifm }, /* nv03 sifm */
1109 { 0x0077, NVOBJ_ENGINE_GR, nv04_graph_mthds_nv04_sifm }, /* nv04 sifm */
1110 { 0x0030, NVOBJ_ENGINE_GR, NULL }, /* null */
1111 { 0x0042, NVOBJ_ENGINE_GR, NULL }, /* surf2d */
1112 { 0x0043, NVOBJ_ENGINE_GR, NULL }, /* rop */
1113 { 0x0012, NVOBJ_ENGINE_GR, NULL }, /* beta1 */
1114 { 0x0072, NVOBJ_ENGINE_GR, NULL }, /* beta4 */
1115 { 0x0019, NVOBJ_ENGINE_GR, NULL }, /* cliprect */
1116 { 0x0018, NVOBJ_ENGINE_GR, NULL }, /* nv01 pattern */
1117 { 0x0044, NVOBJ_ENGINE_GR, NULL }, /* nv04 pattern */
1118 { 0x0052, NVOBJ_ENGINE_GR, NULL }, /* swzsurf */
1119 { 0x0053, NVOBJ_ENGINE_GR, nv04_graph_mthds_surf3d }, /* surf3d */
1120 { 0x0048, NVOBJ_ENGINE_GR, nv04_graph_mthds_nv03_tex_tri }, /* nv03 tex_tri */
1121 { 0x0054, NVOBJ_ENGINE_GR, NULL }, /* tex_tri */
1122 { 0x0055, NVOBJ_ENGINE_GR, NULL }, /* multitex_tri */
1123 { 0x0017, NVOBJ_ENGINE_GR, NULL }, /* nv01 chroma */
1124 { 0x0057, NVOBJ_ENGINE_GR, NULL }, /* nv04 chroma */
1125 { 0x0058, NVOBJ_ENGINE_GR, NULL }, /* surf_dst */
1126 { 0x0059, NVOBJ_ENGINE_GR, NULL }, /* surf_src */
1127 { 0x005a, NVOBJ_ENGINE_GR, NULL }, /* surf_color */
1128 { 0x005b, NVOBJ_ENGINE_GR, NULL }, /* surf_zeta */
1129 { 0x001c, NVOBJ_ENGINE_GR, nv04_graph_mthds_nv01_shape }, /* nv01 line */
1130 { 0x005c, NVOBJ_ENGINE_GR, nv04_graph_mthds_nv04_shape }, /* nv04 line */
1131 { 0x001d, NVOBJ_ENGINE_GR, nv04_graph_mthds_nv01_shape }, /* nv01 tri */
1132 { 0x005d, NVOBJ_ENGINE_GR, nv04_graph_mthds_nv04_shape }, /* nv04 tri */
1133 { 0x001e, NVOBJ_ENGINE_GR, nv04_graph_mthds_nv01_shape }, /* nv01 rect */
1134 { 0x005e, NVOBJ_ENGINE_GR, nv04_graph_mthds_nv04_shape }, /* nv04 rect */
1135 { 0x506e, NVOBJ_ENGINE_SW, nv04_graph_mthds_sw },