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(drm_device_t *dev) {
32 drm_nouveau_private_t *dev_priv = dev->dev_private;
35 nouveau_wait_for_idle(dev);
36 /* XXX check haiku comments */
37 NV_WRITE(NV_PGRAPH_XFMODE0, 0x10000000);
38 NV_WRITE(NV_PGRAPH_XFMODE1, 0x00000000);
39 NV_WRITE(NV_PGRAPH_PIPE_ADDRESS, 0x000064c0);
40 for (i = 0; i < 4; i++)
41 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x3f800000);
42 for (i = 0; i < 4; i++)
43 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
45 NV_WRITE(NV_PGRAPH_PIPE_ADDRESS, 0x00006ab0);
47 for (i = 0; i < 3; i++)
48 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x3f800000);
50 NV_WRITE(NV_PGRAPH_PIPE_ADDRESS, 0x00006a80);
51 for (i = 0; i < 3; i++)
52 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
54 NV_WRITE(NV_PGRAPH_PIPE_ADDRESS, 0x00000040);
55 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000008);
57 NV_WRITE(NV_PGRAPH_PIPE_ADDRESS, 0x00000200);
58 for (i = 0; i < 48; i++)
59 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
61 nouveau_wait_for_idle(dev);
63 NV_WRITE(NV_PGRAPH_XFMODE0, 0x00000000);
64 NV_WRITE(NV_PGRAPH_XFMODE1, 0x00000000);
65 NV_WRITE(NV_PGRAPH_PIPE_ADDRESS, 0x00006400);
66 for (i = 0; i < 211; i++)
67 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
69 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x3f800000);
70 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x40000000);
71 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x40000000);
72 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x40000000);
73 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x40000000);
74 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
75 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
76 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x3f800000);
77 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
78 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x3f000000);
79 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x3f000000);
80 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
81 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
82 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
83 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
84 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x3f800000);
85 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
86 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
87 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
88 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
89 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
90 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x3f800000);
91 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x3f800000);
92 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x3f800000);
93 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x3f800000);
95 NV_WRITE(NV_PGRAPH_PIPE_ADDRESS, 0x00006800);
96 for (i = 0; i < 162; i++)
97 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
98 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x3f800000);
99 for (i = 0; i < 25; i++)
100 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
102 NV_WRITE(NV_PGRAPH_PIPE_ADDRESS, 0x00006c00);
103 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
104 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
105 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
106 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
107 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0xbf800000);
108 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
109 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
110 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
111 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
112 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
113 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
114 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
115 NV_WRITE(NV_PGRAPH_PIPE_ADDRESS, 0x00007000);
116 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
117 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
118 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
119 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
120 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
121 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
122 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
123 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
124 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
125 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
126 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
127 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
128 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x7149f2ca);
129 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
130 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
131 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
132 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x7149f2ca);
133 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
134 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
135 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
136 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x7149f2ca);
137 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
138 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
139 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
140 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x7149f2ca);
141 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
142 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
143 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
144 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x7149f2ca);
145 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
146 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
147 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
148 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x7149f2ca);
149 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
150 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
151 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
152 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x7149f2ca);
153 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
154 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
155 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
156 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x7149f2ca);
157 for (i = 0; i < 35; i++)
158 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
161 NV_WRITE(NV_PGRAPH_PIPE_ADDRESS, 0x00007400);
162 for (i = 0; i < 48; i++)
163 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
165 NV_WRITE(NV_PGRAPH_PIPE_ADDRESS, 0x00007800);
166 for (i = 0; i < 48; i++)
167 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
169 NV_WRITE(NV_PGRAPH_PIPE_ADDRESS, 0x00004400);
170 for (i = 0; i < 32; i++)
171 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
173 NV_WRITE(NV_PGRAPH_PIPE_ADDRESS, 0x00000000);
174 for (i = 0; i < 16; i++)
175 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
177 NV_WRITE(NV_PGRAPH_PIPE_ADDRESS, 0x00000040);
178 for (i = 0; i < 4; i++)
179 NV_WRITE(NV_PGRAPH_PIPE_DATA, 0x00000000);
181 nouveau_wait_for_idle(dev);
184 /* TODO replace address with name
186 static int nv10_graph_ctx_regs [] = {
187 NV_PGRAPH_XY_LOGIC_MISC0,
191 NV_PGRAPH_CTX_SWITCH1,
192 NV_PGRAPH_CTX_SWITCH2,
193 NV_PGRAPH_CTX_SWITCH3,
194 NV_PGRAPH_CTX_SWITCH4,
195 NV_PGRAPH_CTX_SWITCH5,
196 NV_PGRAPH_CTX_CACHE1, /* 8 values from 0x400160 to 0x40017c */
197 NV_PGRAPH_CTX_CACHE2, /* 8 values from 0x400180 to 0x40019c */
198 NV_PGRAPH_CTX_CACHE3, /* 8 values from 0x4001a0 to 0x4001bc */
199 NV_PGRAPH_CTX_CACHE4, /* 8 values from 0x4001c0 to 0x4001dc */
200 NV_PGRAPH_CTX_CACHE5, /* 8 values from 0x4001e0 to 0x4001fc */
237 NV_PGRAPH_DMA_START_0,
238 NV_PGRAPH_DMA_START_1,
239 NV_PGRAPH_DMA_LENGTH,
271 NV_PGRAPH_PATT_COLOR0,
272 NV_PGRAPH_PATT_COLOR1,
273 NV_PGRAPH_PATT_COLORRAM, /* 64 values from 0x400900 to 0x4009fc */
337 NV_PGRAPH_PATTERN, /* 2 values from 0x400808 to 0x40080c */
339 NV_PGRAPH_PATTERN_SHAPE,
340 NV_PGRAPH_MONO_COLOR0,
344 NV_PGRAPH_BETA_PREMULT,
361 NV_PGRAPH_WINDOWCLIP_HORIZONTAL,/* 8 values from 0x400f00 to 0x400f1c */
362 NV_PGRAPH_WINDOWCLIP_VERTICAL, /* 8 values from 0x400f20 to 0x400f3c */
379 NV_PGRAPH_GLOBALSTATE0,
380 NV_PGRAPH_GLOBALSTATE1,
381 NV_PGRAPH_STORED_FMT,
382 NV_PGRAPH_SOURCE_COLOR,
383 NV_PGRAPH_ABS_X_RAM, /* 32 values from 0x400400 to 0x40047c */
384 NV_PGRAPH_ABS_Y_RAM, /* 32 values from 0x400480 to 0x4004fc */
447 NV_PGRAPH_ABS_UCLIP_XMIN,
448 NV_PGRAPH_ABS_UCLIP_XMAX,
449 NV_PGRAPH_ABS_UCLIP_YMIN,
450 NV_PGRAPH_ABS_UCLIP_YMAX,
455 NV_PGRAPH_ABS_UCLIPA_XMIN,
456 NV_PGRAPH_ABS_UCLIPA_XMAX,
457 NV_PGRAPH_ABS_UCLIPA_YMIN,
458 NV_PGRAPH_ABS_UCLIPA_YMAX,
459 NV_PGRAPH_ABS_ICLIP_XMAX,
460 NV_PGRAPH_ABS_ICLIP_YMAX,
461 NV_PGRAPH_XY_LOGIC_MISC1,
462 NV_PGRAPH_XY_LOGIC_MISC2,
463 NV_PGRAPH_XY_LOGIC_MISC3,
496 NV_PGRAPH_PASSTHRU_0,
497 NV_PGRAPH_PASSTHRU_1,
498 NV_PGRAPH_PASSTHRU_2,
499 NV_PGRAPH_DIMX_TEXTURE,
500 NV_PGRAPH_WDIMX_TEXTURE,
501 NV_PGRAPH_DVD_COLORFMT,
502 NV_PGRAPH_SCALED_FORMAT,
513 static int nv17_graph_ctx_regs [] = {
532 void nouveau_nv10_context_switch(drm_device_t *dev)
534 drm_nouveau_private_t *dev_priv = dev->dev_private;
535 int channel, channel_old, i, gpu_type;
537 channel=NV_READ(NV_PFIFO_CACH1_PSH1)&(nouveau_fifo_number(dev)-1);
538 channel_old = (NV_READ(NV_PGRAPH_CTX_USER) >> 24) & (nouveau_fifo_number(dev)-1);
540 DRM_INFO("NV: PGRAPH context switch interrupt channel %x -> %x\n",channel_old, channel);
542 NV_WRITE(NV_PGRAPH_FIFO,0x0);
544 NV_WRITE(NV_PFIFO_CACH1_PUL0, 0x00000000);
545 NV_WRITE(NV_PFIFO_CACH1_PUL1, 0x00000000);
546 NV_WRITE(NV_PFIFO_CACHES, 0x00000000);
549 // save PGRAPH context
550 for (i = 0; nv10_graph_ctx_regs[i]; i++)
551 dev_priv->fifos[channel_old].nv10_pgraph_ctx[i] = NV_READ(nv10_graph_ctx_regs[i]);
552 gpu_type = (NV_READ(NV_PMC_BOOT_0) & 0x0ff00000);
553 if ((gpu_type==0x01700000)
554 || (gpu_type==0x01800000)
555 || (gpu_type==0x01f00000))
557 for (; nv17_graph_ctx_regs[i]; i++)
558 dev_priv->fifos[channel_old].nv10_pgraph_ctx[i] = NV_READ(nv17_graph_ctx_regs[i]);
561 nouveau_wait_for_idle(dev);
563 NV_WRITE(NV_PGRAPH_CTX_CONTROL, 0x10000000);
564 NV_WRITE(NV_PGRAPH_CTX_USER, (NV_READ(NV_PGRAPH_CTX_USER) & 0xffffff) | (0x1f << 24));
566 nouveau_wait_for_idle(dev);
567 // restore PGRAPH context
568 //XXX not working yet
570 for (i = 0; nv10_graph_ctx_regs[i]; i++)
571 NV_WRITE(nv10_graph_ctx_regs[i], dev_priv->fifos[channel].nv10_pgraph_ctx[i]);
572 if ((gpu_type==0x01700000)
573 || (gpu_type==0x01800000)
574 || (gpu_type==0x01f00000))
576 for (; nv17_graph_ctx_regs[i]; i++)
577 NV_WRITE(nv17_graph_ctx_regs[i], dev_priv->fifos[channel].nv10_pgraph_ctx[i]);
579 nouveau_wait_for_idle(dev);
582 NV_WRITE(NV_PGRAPH_CTX_CONTROL, 0x10010100);
583 NV_WRITE(NV_PGRAPH_CTX_USER, channel << 24);
584 NV_WRITE(NV_PGRAPH_FFINTFC_ST2, NV_READ(NV_PGRAPH_FFINTFC_ST2)&0xCFFFFFFF);
587 NV_WRITE(NV_PFIFO_CACH1_PUL0, 0x00000001);
588 NV_WRITE(NV_PFIFO_CACH1_PUL1, 0x00000001);
589 NV_WRITE(NV_PFIFO_CACHES, 0x00000001);
591 NV_WRITE(NV_PGRAPH_FIFO,0x1);
594 int nv10_graph_context_create(drm_device_t *dev, int channel) {
595 drm_nouveau_private_t *dev_priv = dev->dev_private;
596 DRM_DEBUG("nv10_graph_context_create %d\n", channel);
598 memset(dev_priv->fifos[channel].nv10_pgraph_ctx, 0, sizeof(dev_priv->fifos[channel].nv10_pgraph_ctx));
600 //dev_priv->fifos[channel].pgraph_ctx_user = channel << 24;
601 dev_priv->fifos[channel].nv10_pgraph_ctx[0] = 0x0001ffff;
602 /* is it really needed ??? */
603 dev_priv->fifos[channel].nv10_pgraph_ctx[1] = NV_READ(NV_PGRAPH_DEBUG_4);
604 dev_priv->fifos[channel].nv10_pgraph_ctx[2] = NV_READ(0x004006b0);
609 int nv10_graph_init(drm_device_t *dev) {
610 //XXX should be call at each fifo init
611 nv10_praph_pipe(dev);