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"
34 } nv04_graph_ctx_regs [] = {
35 {NV04_PGRAPH_CTX_SWITCH1,1},
36 {NV04_PGRAPH_CTX_SWITCH2,1},
37 {NV04_PGRAPH_CTX_SWITCH3,1},
38 {NV04_PGRAPH_CTX_SWITCH4,1},
39 {NV04_PGRAPH_CTX_CACHE1,1},
40 {NV04_PGRAPH_CTX_CACHE2,1},
41 {NV04_PGRAPH_CTX_CACHE3,1},
42 {NV04_PGRAPH_CTX_CACHE4,1},
72 {NV04_PGRAPH_DMA_START_0,1},
73 {NV04_PGRAPH_DMA_START_1,1},
74 {NV04_PGRAPH_DMA_LENGTH,1},
75 {NV04_PGRAPH_DMA_MISC,1},
76 {NV04_PGRAPH_DMA_PITCH,1},
77 {NV04_PGRAPH_BOFFSET0,1},
78 {NV04_PGRAPH_BBASE0,1},
79 {NV04_PGRAPH_BLIMIT0,1},
80 {NV04_PGRAPH_BOFFSET1,1},
81 {NV04_PGRAPH_BBASE1,1},
82 {NV04_PGRAPH_BLIMIT1,1},
83 {NV04_PGRAPH_BOFFSET2,1},
84 {NV04_PGRAPH_BBASE2,1},
85 {NV04_PGRAPH_BLIMIT2,1},
86 {NV04_PGRAPH_BOFFSET3,1},
87 {NV04_PGRAPH_BBASE3,1},
88 {NV04_PGRAPH_BLIMIT3,1},
89 {NV04_PGRAPH_BOFFSET4,1},
90 {NV04_PGRAPH_BBASE4,1},
91 {NV04_PGRAPH_BLIMIT4,1},
92 {NV04_PGRAPH_BOFFSET5,1},
93 {NV04_PGRAPH_BBASE5,1},
94 {NV04_PGRAPH_BLIMIT5,1},
95 {NV04_PGRAPH_BPITCH0,1},
96 {NV04_PGRAPH_BPITCH1,1},
97 {NV04_PGRAPH_BPITCH2,1},
98 {NV04_PGRAPH_BPITCH3,1},
99 {NV04_PGRAPH_BPITCH4,1},
100 {NV04_PGRAPH_SURFACE,1},
101 {NV04_PGRAPH_STATE,1},
102 {NV04_PGRAPH_BSWIZZLE2,1},
103 {NV04_PGRAPH_BSWIZZLE5,1},
104 {NV04_PGRAPH_BPIXEL,1},
105 {NV04_PGRAPH_NOTIFY,1},
106 {NV04_PGRAPH_PATT_COLOR0,1},
107 {NV04_PGRAPH_PATT_COLOR1,1},
108 {NV04_PGRAPH_PATT_COLORRAM,64},
109 {NV04_PGRAPH_PATTERN,1},
111 {NV04_PGRAPH_PATTERN_SHAPE,1},
113 {NV04_PGRAPH_ROP3,1},
114 {NV04_PGRAPH_CHROMA,1},
115 {NV04_PGRAPH_BETA_AND,1},
116 {NV04_PGRAPH_BETA_PREMULT,1},
117 {NV04_PGRAPH_CONTROL0,1},
118 {NV04_PGRAPH_CONTROL1,1},
119 {NV04_PGRAPH_CONTROL2,1},
120 {NV04_PGRAPH_BLEND,1},
121 {NV04_PGRAPH_STORED_FMT,1},
122 {NV04_PGRAPH_SOURCE_COLOR,1},
274 {NV04_PGRAPH_PASSTHRU_0,1},
275 {NV04_PGRAPH_PASSTHRU_1,1},
276 {NV04_PGRAPH_PASSTHRU_2,1},
277 {NV04_PGRAPH_DVD_COLORFMT,1},
278 {NV04_PGRAPH_SCALED_FORMAT,1},
279 {NV04_PGRAPH_MISC24_0,1},
280 {NV04_PGRAPH_MISC24_1,1},
281 {NV04_PGRAPH_MISC24_2,1},
284 {NV04_PGRAPH_VALID1,1},
285 {NV04_PGRAPH_VALID2,1}
290 void nouveau_nv04_context_switch(drm_device_t *dev)
292 drm_nouveau_private_t *dev_priv = dev->dev_private;
293 int channel, channel_old, i, j, index;
295 channel=NV_READ(NV03_PFIFO_CACHE1_PUSH1)&(nouveau_fifo_number(dev)-1);
296 channel_old = (NV_READ(NV04_PGRAPH_CTX_USER) >> 24) & (nouveau_fifo_number(dev)-1);
298 DRM_DEBUG("NV: PGRAPH context switch interrupt channel %x -> %x\n",channel_old, channel);
300 NV_WRITE(NV03_PFIFO_CACHES, 0x0);
301 NV_WRITE(NV04_PFIFO_CACHE0_PULL0, 0x0);
302 NV_WRITE(NV04_PFIFO_CACHE1_PULL0, 0x0);
303 NV_WRITE(NV04_PGRAPH_FIFO,0x0);
305 nouveau_wait_for_idle(dev);
307 // save PGRAPH context
309 for (i = 0; i<sizeof(nv04_graph_ctx_regs)/sizeof(nv04_graph_ctx_regs[0]); i++)
310 for (j = 0; j<nv04_graph_ctx_regs[i].number; j++)
312 dev_priv->fifos[channel_old].pgraph_ctx[index] = NV_READ(nv04_graph_ctx_regs[i].reg+j*4);
316 NV_WRITE(NV04_PGRAPH_CTX_CONTROL, 0x10000000);
317 NV_WRITE(NV04_PGRAPH_CTX_USER, (NV_READ(NV04_PGRAPH_CTX_USER) & 0xffffff) | (0x0f << 24));
319 // restore PGRAPH context
321 for (i = 0; i<sizeof(nv04_graph_ctx_regs)/sizeof(nv04_graph_ctx_regs[0]); i++)
322 for (j = 0; j<nv04_graph_ctx_regs[i].number; j++)
324 NV_WRITE(nv04_graph_ctx_regs[i].reg+j*4, dev_priv->fifos[channel].pgraph_ctx[index]);
328 NV_WRITE(NV04_PGRAPH_CTX_CONTROL, 0x10010100);
329 NV_WRITE(NV04_PGRAPH_CTX_USER, channel << 24);
330 NV_WRITE(NV04_PGRAPH_FFINTFC_ST2, NV_READ(NV04_PGRAPH_FFINTFC_ST2)&0x000FFFFF);
332 NV_WRITE(NV04_PGRAPH_FIFO,0x0);
333 NV_WRITE(NV04_PFIFO_CACHE0_PULL0, 0x0);
334 NV_WRITE(NV04_PFIFO_CACHE1_PULL0, 0x1);
335 NV_WRITE(NV03_PFIFO_CACHES, 0x1);
336 NV_WRITE(NV04_PGRAPH_FIFO,0x1);
339 int nv04_graph_context_create(drm_device_t *dev, int channel) {
340 drm_nouveau_private_t *dev_priv = dev->dev_private;
341 DRM_DEBUG("nv04_graph_context_create %d\n", channel);
343 memset(dev_priv->fifos[channel].pgraph_ctx, 0, sizeof(dev_priv->fifos[channel].pgraph_ctx));
345 //dev_priv->fifos[channel].pgraph_ctx_user = channel << 24;
346 dev_priv->fifos[channel].pgraph_ctx[0] = 0x0001ffff;
347 /* is it really needed ??? */
348 //dev_priv->fifos[channel].pgraph_ctx[1] = NV_READ(NV_PGRAPH_DEBUG_4);
349 //dev_priv->fifos[channel].pgraph_ctx[2] = NV_READ(0x004006b0);
355 int nv04_graph_init(drm_device_t *dev) {
356 drm_nouveau_private_t *dev_priv = dev->dev_private;
359 NV_WRITE(NV03_PMC_ENABLE, NV_READ(NV03_PMC_ENABLE) &
360 ~NV_PMC_ENABLE_PGRAPH);
361 NV_WRITE(NV03_PMC_ENABLE, NV_READ(NV03_PMC_ENABLE) |
362 NV_PMC_ENABLE_PGRAPH);
364 // check the context is big enough
365 for ( i = 0 ; i<sizeof(nv04_graph_ctx_regs)/sizeof(nv04_graph_ctx_regs[0]); i++)
366 sum+=nv04_graph_ctx_regs[i].number;
367 if ( sum*4>sizeof(dev_priv->fifos[0].pgraph_ctx) )
368 DRM_ERROR("pgraph_ctx too small\n");
370 NV_WRITE(NV03_PGRAPH_INTR_EN, 0x00000000);
371 NV_WRITE(NV03_PGRAPH_INTR , 0xFFFFFFFF);
373 NV_WRITE(NV04_PGRAPH_DEBUG_0, 0x000001FF);
374 NV_WRITE(NV04_PGRAPH_DEBUG_0, 0x1230C000);
375 NV_WRITE(NV04_PGRAPH_DEBUG_1, 0x72111101);
376 NV_WRITE(NV04_PGRAPH_DEBUG_2, 0x11D5F071);
377 NV_WRITE(NV04_PGRAPH_DEBUG_3, 0x0004FF31);
378 NV_WRITE(NV04_PGRAPH_DEBUG_3, 0x4004FF31 |
383 NV_WRITE(NV04_PGRAPH_STATE , 0xFFFFFFFF);
384 NV_WRITE(NV04_PGRAPH_CTX_CONTROL , 0x10010100);
385 NV_WRITE(NV04_PGRAPH_FIFO , 0x00000001);
387 /* These don't belong here, they're part of a per-channel context */
388 NV_WRITE(NV04_PGRAPH_PATTERN_SHAPE, 0x00000000);
389 NV_WRITE(NV04_PGRAPH_BETA_AND , 0xFFFFFFFF);
394 void nv04_graph_takedown(drm_device_t *dev)