2 * Copyright 2007 Matthieu CASTET <castet.matthieu@free.fr>
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"
31 static void nv10_praph_pipe(struct drm_device *dev) {
32 struct drm_nouveau_private *dev_priv = dev->dev_private;
35 nouveau_wait_for_idle(dev);
36 /* XXX check haiku comments */
37 NV_WRITE(NV10_PGRAPH_XFMODE0, 0x10000000);
38 NV_WRITE(NV10_PGRAPH_XFMODE1, 0x00000000);
39 NV_WRITE(NV10_PGRAPH_PIPE_ADDRESS, 0x000064c0);
40 for (i = 0; i < 4; i++)
41 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x3f800000);
42 for (i = 0; i < 4; i++)
43 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
45 NV_WRITE(NV10_PGRAPH_PIPE_ADDRESS, 0x00006ab0);
47 for (i = 0; i < 3; i++)
48 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x3f800000);
50 NV_WRITE(NV10_PGRAPH_PIPE_ADDRESS, 0x00006a80);
51 for (i = 0; i < 3; i++)
52 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
54 NV_WRITE(NV10_PGRAPH_PIPE_ADDRESS, 0x00000040);
55 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000008);
57 NV_WRITE(NV10_PGRAPH_PIPE_ADDRESS, 0x00000200);
58 for (i = 0; i < 48; i++)
59 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
61 nouveau_wait_for_idle(dev);
63 NV_WRITE(NV10_PGRAPH_XFMODE0, 0x00000000);
64 NV_WRITE(NV10_PGRAPH_XFMODE1, 0x00000000);
65 NV_WRITE(NV10_PGRAPH_PIPE_ADDRESS, 0x00006400);
66 for (i = 0; i < 211; i++)
67 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
69 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x3f800000);
70 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x40000000);
71 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x40000000);
72 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x40000000);
73 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x40000000);
74 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
75 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
76 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x3f800000);
77 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
78 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x3f000000);
79 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x3f000000);
80 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
81 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
82 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
83 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
84 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x3f800000);
85 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
86 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
87 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
88 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
89 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
90 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x3f800000);
91 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x3f800000);
92 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x3f800000);
93 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x3f800000);
95 NV_WRITE(NV10_PGRAPH_PIPE_ADDRESS, 0x00006800);
96 for (i = 0; i < 162; i++)
97 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
98 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x3f800000);
99 for (i = 0; i < 25; i++)
100 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
102 NV_WRITE(NV10_PGRAPH_PIPE_ADDRESS, 0x00006c00);
103 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
104 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
105 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
106 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
107 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0xbf800000);
108 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
109 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
110 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
111 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
112 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
113 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
114 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
115 NV_WRITE(NV10_PGRAPH_PIPE_ADDRESS, 0x00007000);
116 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
117 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
118 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
119 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
120 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
121 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
122 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
123 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
124 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
125 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
126 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
127 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
128 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x7149f2ca);
129 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
130 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
131 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
132 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x7149f2ca);
133 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
134 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
135 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
136 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x7149f2ca);
137 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
138 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
139 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
140 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x7149f2ca);
141 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
142 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
143 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
144 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x7149f2ca);
145 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
146 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
147 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
148 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x7149f2ca);
149 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
150 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
151 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
152 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x7149f2ca);
153 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
154 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
155 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
156 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x7149f2ca);
157 for (i = 0; i < 35; i++)
158 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
161 NV_WRITE(NV10_PGRAPH_PIPE_ADDRESS, 0x00007400);
162 for (i = 0; i < 48; i++)
163 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
165 NV_WRITE(NV10_PGRAPH_PIPE_ADDRESS, 0x00007800);
166 for (i = 0; i < 48; i++)
167 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
169 NV_WRITE(NV10_PGRAPH_PIPE_ADDRESS, 0x00004400);
170 for (i = 0; i < 32; i++)
171 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
173 NV_WRITE(NV10_PGRAPH_PIPE_ADDRESS, 0x00000000);
174 for (i = 0; i < 16; i++)
175 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
177 NV_WRITE(NV10_PGRAPH_PIPE_ADDRESS, 0x00000040);
178 for (i = 0; i < 4; i++)
179 NV_WRITE(NV10_PGRAPH_PIPE_DATA, 0x00000000);
181 nouveau_wait_for_idle(dev);
184 static int nv10_graph_ctx_regs [] = {
185 NV10_PGRAPH_CTX_SWITCH1,
186 NV10_PGRAPH_CTX_SWITCH2,
187 NV10_PGRAPH_CTX_SWITCH3,
188 NV10_PGRAPH_CTX_SWITCH4,
189 NV10_PGRAPH_CTX_SWITCH5,
190 NV10_PGRAPH_CTX_CACHE1, /* 8 values from 0x400160 to 0x40017c */
191 NV10_PGRAPH_CTX_CACHE2, /* 8 values from 0x400180 to 0x40019c */
192 NV10_PGRAPH_CTX_CACHE3, /* 8 values from 0x4001a0 to 0x4001bc */
193 NV10_PGRAPH_CTX_CACHE4, /* 8 values from 0x4001c0 to 0x4001dc */
194 NV10_PGRAPH_CTX_CACHE5, /* 8 values from 0x4001e0 to 0x4001fc */
230 NV10_PGRAPH_CTX_USER,
231 NV04_PGRAPH_DMA_START_0,
232 NV04_PGRAPH_DMA_START_1,
233 NV04_PGRAPH_DMA_LENGTH,
234 NV04_PGRAPH_DMA_MISC,
235 NV10_PGRAPH_DMA_PITCH,
236 NV04_PGRAPH_BOFFSET0,
239 NV04_PGRAPH_BOFFSET1,
242 NV04_PGRAPH_BOFFSET2,
245 NV04_PGRAPH_BOFFSET3,
248 NV04_PGRAPH_BOFFSET4,
251 NV04_PGRAPH_BOFFSET5,
261 NV04_PGRAPH_BSWIZZLE2,
262 NV04_PGRAPH_BSWIZZLE5,
265 NV04_PGRAPH_PATT_COLOR0,
266 NV04_PGRAPH_PATT_COLOR1,
267 NV04_PGRAPH_PATT_COLORRAM, /* 64 values from 0x400900 to 0x4009fc */
331 NV04_PGRAPH_PATTERN, /* 2 values from 0x400808 to 0x40080c */
333 NV04_PGRAPH_PATTERN_SHAPE,
334 NV03_PGRAPH_MONO_COLOR0,
337 NV04_PGRAPH_BETA_AND,
338 NV04_PGRAPH_BETA_PREMULT,
354 NV10_PGRAPH_WINDOWCLIP_HORIZONTAL, /* 8 values from 0x400f00 to 0x400f1c */
355 NV10_PGRAPH_WINDOWCLIP_VERTICAL, /* 8 values from 0x400f20 to 0x400f3c */
372 NV10_PGRAPH_GLOBALSTATE0,
373 NV10_PGRAPH_GLOBALSTATE1,
374 NV04_PGRAPH_STORED_FMT,
375 NV04_PGRAPH_SOURCE_COLOR,
376 NV03_PGRAPH_ABS_X_RAM, /* 32 values from 0x400400 to 0x40047c */
377 NV03_PGRAPH_ABS_Y_RAM, /* 32 values from 0x400480 to 0x4004fc */
440 NV03_PGRAPH_ABS_UCLIP_XMIN,
441 NV03_PGRAPH_ABS_UCLIP_XMAX,
442 NV03_PGRAPH_ABS_UCLIP_YMIN,
443 NV03_PGRAPH_ABS_UCLIP_YMAX,
448 NV03_PGRAPH_ABS_UCLIPA_XMIN,
449 NV03_PGRAPH_ABS_UCLIPA_XMAX,
450 NV03_PGRAPH_ABS_UCLIPA_YMIN,
451 NV03_PGRAPH_ABS_UCLIPA_YMAX,
452 NV03_PGRAPH_ABS_ICLIP_XMAX,
453 NV03_PGRAPH_ABS_ICLIP_YMAX,
454 NV03_PGRAPH_XY_LOGIC_MISC0,
455 NV03_PGRAPH_XY_LOGIC_MISC1,
456 NV03_PGRAPH_XY_LOGIC_MISC2,
457 NV03_PGRAPH_XY_LOGIC_MISC3,
490 NV04_PGRAPH_PASSTHRU_0,
491 NV04_PGRAPH_PASSTHRU_1,
492 NV04_PGRAPH_PASSTHRU_2,
493 NV10_PGRAPH_DIMX_TEXTURE,
494 NV10_PGRAPH_WDIMX_TEXTURE,
495 NV10_PGRAPH_DVD_COLORFMT,
496 NV10_PGRAPH_SCALED_FORMAT,
497 NV04_PGRAPH_MISC24_0,
498 NV04_PGRAPH_MISC24_1,
499 NV04_PGRAPH_MISC24_2,
506 static int nv17_graph_ctx_regs [] = {
527 static int nv10_graph_ctx_regs_find_offset(struct drm_device *dev, int reg)
529 struct drm_nouveau_private *dev_priv = dev->dev_private;
531 for (i = 0; i < sizeof(nv10_graph_ctx_regs)/sizeof(nv10_graph_ctx_regs[0]); i++) {
532 if (nv10_graph_ctx_regs[i] == reg)
535 if (dev_priv->chipset>=0x17) {
536 for (j = 0; j < sizeof(nv17_graph_ctx_regs)/sizeof(nv17_graph_ctx_regs[0]); i++,j++) {
537 if (nv17_graph_ctx_regs[j] == reg)
544 int nv10_graph_load_context(struct nouveau_channel *chan)
546 struct drm_device *dev = chan->dev;
547 struct drm_nouveau_private *dev_priv = dev->dev_private;
550 for (i = 0; i < sizeof(nv10_graph_ctx_regs)/sizeof(nv10_graph_ctx_regs[0]); i++)
551 NV_WRITE(nv10_graph_ctx_regs[i], chan->pgraph_ctx[i]);
552 if (dev_priv->chipset>=0x17) {
553 for (j = 0; j < sizeof(nv17_graph_ctx_regs)/sizeof(nv17_graph_ctx_regs[0]); i++,j++)
554 NV_WRITE(nv17_graph_ctx_regs[j], chan->pgraph_ctx[i]);
556 NV_WRITE(NV10_PGRAPH_CTX_USER, chan->id << 24);
561 int nv10_graph_save_context(struct nouveau_channel *chan)
563 struct drm_device *dev = chan->dev;
564 struct drm_nouveau_private *dev_priv = dev->dev_private;
567 for (i = 0; i < sizeof(nv10_graph_ctx_regs)/sizeof(nv10_graph_ctx_regs[0]); i++)
568 chan->pgraph_ctx[i] = NV_READ(nv10_graph_ctx_regs[i]);
569 if (dev_priv->chipset>=0x17) {
570 for (j = 0; j < sizeof(nv17_graph_ctx_regs)/sizeof(nv17_graph_ctx_regs[0]); i++,j++)
571 chan->pgraph_ctx[i] = NV_READ(nv17_graph_ctx_regs[j]);
577 void nouveau_nv10_context_switch(struct drm_device *dev)
579 struct drm_nouveau_private *dev_priv;
580 struct nouveau_channel *next, *last;
584 DRM_DEBUG("Invalid drm_device\n");
587 dev_priv = dev->dev_private;
589 DRM_DEBUG("Invalid drm_nouveau_private\n");
592 if (!dev_priv->fifos) {
593 DRM_DEBUG("Invalid drm_nouveau_private->fifos\n");
597 chid = NV_READ(NV03_PFIFO_CACHE1_PUSH1)&(nouveau_fifo_number(dev)-1);
598 next = dev_priv->fifos[chid];
601 DRM_DEBUG("Invalid next channel\n");
605 chid = (NV_READ(NV10_PGRAPH_CTX_USER) >> 24) & (nouveau_fifo_number(dev)-1);
606 last = dev_priv->fifos[chid];
609 DRM_DEBUG("WARNING: Invalid last channel, switch to %x\n",
612 DRM_INFO("NV: PGRAPH context switch interrupt channel %x -> %x\n",
616 NV_WRITE(NV04_PGRAPH_FIFO,0x0);
618 nv10_graph_save_context(last);
621 nouveau_wait_for_idle(dev);
623 NV_WRITE(NV10_PGRAPH_CTX_CONTROL, 0x10000000);
624 NV_WRITE(NV10_PGRAPH_CTX_USER, (NV_READ(NV10_PGRAPH_CTX_USER) & 0xffffff) | (0x1f << 24));
626 nouveau_wait_for_idle(dev);
628 nv10_graph_load_context(next);
630 NV_WRITE(NV10_PGRAPH_CTX_CONTROL, 0x10010100);
631 //NV_WRITE(NV10_PGRAPH_CTX_USER, next->id << 24);
632 NV_WRITE(NV10_PGRAPH_FFINTFC_ST2, NV_READ(NV10_PGRAPH_FFINTFC_ST2)&0xCFFFFFFF);
633 NV_WRITE(NV04_PGRAPH_FIFO,0x1);
636 #define NV_WRITE_CTX(reg, val) do { \
637 int offset = nv10_graph_ctx_regs_find_offset(dev, reg); \
639 chan->pgraph_ctx[offset] = val; \
642 int nv10_graph_create_context(struct nouveau_channel *chan) {
643 struct drm_device *dev = chan->dev;
644 struct drm_nouveau_private *dev_priv = dev->dev_private;
646 DRM_DEBUG("nv10_graph_context_create %d\n", chan->id);
648 memset(chan->pgraph_ctx, 0, sizeof(chan->pgraph_ctx));
650 /* mmio trace suggest that should be done in ddx with methods/objects */
652 uint32_t tmp, vramsz;
653 /* per channel init from ddx */
654 tmp = NV_READ(NV10_PGRAPH_SURFACE) & 0x0007ff00;
655 /*XXX the original ddx code, does this in 2 steps :
656 * tmp = NV_READ(NV10_PGRAPH_SURFACE) & 0x0007ff00;
657 * NV_WRITE(NV10_PGRAPH_SURFACE, tmp);
658 * tmp = NV_READ(NV10_PGRAPH_SURFACE) | 0x00020100;
659 * NV_WRITE(NV10_PGRAPH_SURFACE, tmp);
662 NV_WRITE_CTX(NV10_PGRAPH_SURFACE, tmp);
664 vramsz = drm_get_resource_len(dev, 0) - 1;
665 NV_WRITE_CTX(NV04_PGRAPH_BOFFSET0, 0);
666 NV_WRITE_CTX(NV04_PGRAPH_BOFFSET1, 0);
667 NV_WRITE_CTX(NV04_PGRAPH_BLIMIT0 , vramsz);
668 NV_WRITE_CTX(NV04_PGRAPH_BLIMIT1 , vramsz);
670 NV_WRITE_CTX(NV04_PGRAPH_PATTERN_SHAPE, 0x00000000);
671 NV_WRITE_CTX(NV04_PGRAPH_BETA_AND , 0xFFFFFFFF);
673 NV_WRITE_CTX(NV03_PGRAPH_ABS_UCLIP_XMIN, 0);
674 NV_WRITE_CTX(NV03_PGRAPH_ABS_UCLIP_YMIN, 0);
675 NV_WRITE_CTX(NV03_PGRAPH_ABS_UCLIP_XMAX, 0x7fff);
676 NV_WRITE_CTX(NV03_PGRAPH_ABS_UCLIP_YMAX, 0x7fff);
679 NV_WRITE_CTX(0x00400e88, 0x08000000);
680 NV_WRITE_CTX(0x00400e9c, 0x4b7fffff);
681 NV_WRITE_CTX(NV03_PGRAPH_XY_LOGIC_MISC0, 0x0001ffff);
682 NV_WRITE_CTX(0x00400e10, 0x00001000);
683 NV_WRITE_CTX(0x00400e14, 0x00001000);
684 NV_WRITE_CTX(0x00400e30, 0x00080008);
685 NV_WRITE_CTX(0x00400e34, 0x00080008);
686 if (dev_priv->chipset>=0x17) {
687 /* is it really needed ??? */
688 NV_WRITE_CTX(NV10_PGRAPH_DEBUG_4, NV_READ(NV10_PGRAPH_DEBUG_4));
689 NV_WRITE_CTX(0x004006b0, NV_READ(0x004006b0));
690 NV_WRITE_CTX(0x00400eac, 0x0fff0000);
691 NV_WRITE_CTX(0x00400eb0, 0x0fff0000);
692 NV_WRITE_CTX(0x00400ec0, 0x00000080);
693 NV_WRITE_CTX(0x00400ed0, 0x00000080);
696 /* for the first channel init the regs */
697 if (dev_priv->fifo_alloc_count == 0)
698 nv10_graph_load_context(chan);
701 //XXX should be saved/restored for each fifo
702 //we supposed here we have X fifo and only one 3D fifo.
703 nv10_praph_pipe(dev);
707 void nv10_graph_destroy_context(struct nouveau_channel *chan)
709 struct drm_device *dev = chan->dev;
710 struct drm_nouveau_private *dev_priv = dev->dev_private;
712 chid = (NV_READ(NV10_PGRAPH_CTX_USER) >> 24) & (nouveau_fifo_number(dev)-1);
714 /* does this avoid a potential context switch while we are written graph
715 * reg, or we should mask graph interrupt ???
717 NV_WRITE(NV04_PGRAPH_FIFO,0x0);
718 if (chid == chan->id) {
719 DRM_INFO("cleanning a channel with graph in current context\n");
720 nouveau_wait_for_idle(dev);
721 DRM_INFO("reseting current graph context\n");
722 nv10_graph_create_context(chan);
723 nv10_graph_load_context(chan);
725 NV_WRITE(NV04_PGRAPH_FIFO,0x1);
728 int nv10_graph_init(struct drm_device *dev) {
729 struct drm_nouveau_private *dev_priv = dev->dev_private;
732 NV_WRITE(NV03_PMC_ENABLE, NV_READ(NV03_PMC_ENABLE) &
733 ~NV_PMC_ENABLE_PGRAPH);
734 NV_WRITE(NV03_PMC_ENABLE, NV_READ(NV03_PMC_ENABLE) |
735 NV_PMC_ENABLE_PGRAPH);
737 NV_WRITE(NV03_PGRAPH_INTR , 0xFFFFFFFF);
738 NV_WRITE(NV03_PGRAPH_INTR_EN, 0xFFFFFFFF);
740 NV_WRITE(NV04_PGRAPH_DEBUG_0, 0xFFFFFFFF);
741 NV_WRITE(NV04_PGRAPH_DEBUG_0, 0x00000000);
742 NV_WRITE(NV04_PGRAPH_DEBUG_1, 0x00118700);
743 //NV_WRITE(NV04_PGRAPH_DEBUG_2, 0x24E00810); /* 0x25f92ad9 */
744 NV_WRITE(NV04_PGRAPH_DEBUG_2, 0x25f92ad9);
745 NV_WRITE(NV04_PGRAPH_DEBUG_3, 0x55DE0830 |
748 if (dev_priv->chipset>=0x17) {
749 NV_WRITE(NV10_PGRAPH_DEBUG_4, 0x1f000000);
750 NV_WRITE(0x004006b0, 0x40000020);
753 NV_WRITE(NV10_PGRAPH_DEBUG_4, 0x00000000);
755 /* copy tile info from PFB */
756 for (i=0; i<NV10_PFB_TILE__SIZE; i++) {
757 NV_WRITE(NV10_PGRAPH_TILE(i), NV_READ(NV10_PFB_TILE(i)));
758 NV_WRITE(NV10_PGRAPH_TLIMIT(i), NV_READ(NV10_PFB_TLIMIT(i)));
759 NV_WRITE(NV10_PGRAPH_TSIZE(i), NV_READ(NV10_PFB_TSIZE(i)));
760 NV_WRITE(NV10_PGRAPH_TSTATUS(i), NV_READ(NV10_PFB_TSTATUS(i)));
763 NV_WRITE(NV10_PGRAPH_CTX_SWITCH1, 0x00000000);
764 NV_WRITE(NV10_PGRAPH_CTX_SWITCH2, 0x00000000);
765 NV_WRITE(NV10_PGRAPH_CTX_SWITCH3, 0x00000000);
766 NV_WRITE(NV10_PGRAPH_CTX_SWITCH4, 0x00000000);
767 NV_WRITE(NV10_PGRAPH_CTX_CONTROL, 0x10010100);
768 NV_WRITE(NV10_PGRAPH_STATE , 0xFFFFFFFF);
769 NV_WRITE(NV04_PGRAPH_FIFO , 0x00000001);
774 void nv10_graph_takedown(struct drm_device *dev)