2 * Copyright 2008 Ben Skeggs
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
19 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 #include "nv_include.h"
24 #include "nv50_accel.h"
27 NVAccelInitNV50TCL(ScrnInfoPtr pScrn)
29 NVPtr pNv = NVPTR(pScrn);
30 struct nouveau_channel *chan = pNv->chan;
31 struct nouveau_grobj *tesla;
32 const unsigned flags = NOUVEAU_BO_VRAM | NOUVEAU_BO_RDWR;
36 switch (pNv->NVArch & 0xf0) {
51 if (nouveau_grobj_alloc(pNv->chan, Nv3D, class, &pNv->Nv3D))
54 if (nouveau_bo_new(pNv->dev, NOUVEAU_BO_VRAM, 0, 65536,
55 &pNv->tesla_scratch)) {
56 nouveau_grobj_free(&pNv->Nv3D);
62 BEGIN_RING(chan, tesla, 0x1558, 1);
64 BEGIN_RING(chan, tesla, NV50TCL_DMA_NOTIFY, 1);
65 OUT_RING (chan, chan->nullobj->handle);
66 BEGIN_RING(chan, tesla, NV50TCL_DMA_UNK0(0), NV50TCL_DMA_UNK0__SIZE);
67 for (i = 0; i < NV50TCL_DMA_UNK0__SIZE; i++)
68 OUT_RING (chan, chan->vram->handle);
69 BEGIN_RING(chan, tesla, NV50TCL_DMA_UNK1(0), NV50TCL_DMA_UNK1__SIZE);
70 for (i = 0; i < NV50TCL_DMA_UNK1__SIZE; i++)
71 OUT_RING (chan, chan->vram->handle);
72 BEGIN_RING(chan, tesla, 0x121c, 1);
75 BEGIN_RING(chan, tesla, 0x192c, 1);
77 BEGIN_RING(chan, tesla, 0x0f90, 1);
80 BEGIN_RING(chan, tesla, 0x1234, 1);
83 /*XXX: NFI - gets the oddball 0x1458 method working "properly" */
84 BEGIN_RING(chan, tesla, 0x13bc, 1);
85 OUT_RING (chan, 0x54);
87 BEGIN_RING(chan, tesla, NV50TCL_VP_ADDRESS_HIGH, 2);
88 OUT_RELOCh(chan, pNv->tesla_scratch, PVP_OFFSET, flags);
89 OUT_RELOCl(chan, pNv->tesla_scratch, PVP_OFFSET, flags);
90 BEGIN_RING(chan, tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3);
91 OUT_RELOCh(chan, pNv->tesla_scratch, PVP_OFFSET, flags);
92 OUT_RELOCl(chan, pNv->tesla_scratch, PVP_OFFSET, flags);
93 OUT_RING (chan, 0x00004000);
94 BEGIN_RING(chan, tesla, NV50TCL_CB_ADDR, 1);
96 BEGIN_RING(chan, tesla, NV50TCL_CB_DATA(0) | 0x40000000, (3*4*2));
97 OUT_RING (chan, 0x10000001);
98 OUT_RING (chan, 0x0423c788);
99 OUT_RING (chan, 0x10000205);
100 OUT_RING (chan, 0x0423c788);
101 OUT_RING (chan, 0x10000409);
102 OUT_RING (chan, 0x0423c788);
103 OUT_RING (chan, 0x1000060d);
104 OUT_RING (chan, 0x0423c788);
105 OUT_RING (chan, 0x10000811);
106 OUT_RING (chan, 0x0423c788);
107 OUT_RING (chan, 0x10000a15);
108 OUT_RING (chan, 0x0423c788);
109 OUT_RING (chan, 0x10000c19);
110 OUT_RING (chan, 0x0423c788);
111 OUT_RING (chan, 0x10000e1d);
112 OUT_RING (chan, 0x0423c788);
113 OUT_RING (chan, 0x10001021);
114 OUT_RING (chan, 0x0423c788);
115 OUT_RING (chan, 0x10001225);
116 OUT_RING (chan, 0x0423c788);
117 OUT_RING (chan, 0x10001429);
118 OUT_RING (chan, 0x0423c788);
119 OUT_RING (chan, 0x1000162d);
120 OUT_RING (chan, 0x0423c789);
122 BEGIN_RING(chan, tesla, NV50TCL_VP_ATTR_EN_0, 2);
123 OUT_RING (chan, 0x0000000f);
124 OUT_RING (chan, 0x000000ff);
125 BEGIN_RING(chan, tesla, 0x16b8, 1);
127 BEGIN_RING(chan, tesla, 0x16ac, 2);
130 BEGIN_RING(chan, tesla, NV50TCL_VP_START_ID, 1);
133 BEGIN_RING(chan, tesla, NV50TCL_FP_ADDRESS_HIGH, 2);
134 OUT_RELOCh(chan, pNv->tesla_scratch, PFP_OFFSET, flags);
135 OUT_RELOCl(chan, pNv->tesla_scratch, PFP_OFFSET, flags);
136 BEGIN_RING(chan, tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3);
137 OUT_RELOCh(chan, pNv->tesla_scratch, PFP_OFFSET + PFP_S, flags);
138 OUT_RELOCl(chan, pNv->tesla_scratch, PFP_OFFSET + PFP_S, flags);
139 OUT_RING (chan, (0 << NV50TCL_CB_DEF_SET_BUFFER_SHIFT) | 0x4000);
140 BEGIN_RING(chan, tesla, NV50TCL_CB_ADDR, 1);
142 BEGIN_RING(chan, tesla, NV50TCL_CB_DATA(0) | 0x40000000, 6);
143 OUT_RING (chan, 0x80000000);
144 OUT_RING (chan, 0x90000004);
145 OUT_RING (chan, 0x82010200);
146 OUT_RING (chan, 0x82020204);
147 OUT_RING (chan, 0xf6400001);
148 OUT_RING (chan, 0x0000c785);
149 BEGIN_RING(chan, tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3);
150 OUT_RELOCh(chan, pNv->tesla_scratch, PFP_OFFSET + PFP_C, flags);
151 OUT_RELOCl(chan, pNv->tesla_scratch, PFP_OFFSET + PFP_C, flags);
152 OUT_RING (chan, (0 << NV50TCL_CB_DEF_SET_BUFFER_SHIFT) | 0x4000);
153 BEGIN_RING(chan, tesla, NV50TCL_CB_ADDR, 1);
155 BEGIN_RING(chan, tesla, NV50TCL_CB_DATA(0) | 0x40000000, 16);
156 OUT_RING (chan, 0x80000000);
157 OUT_RING (chan, 0x90000004);
158 OUT_RING (chan, 0x82030210);
159 OUT_RING (chan, 0x82040214);
160 OUT_RING (chan, 0x82010200);
161 OUT_RING (chan, 0x82020204);
162 OUT_RING (chan, 0xf6400001);
163 OUT_RING (chan, 0x0000c784);
164 OUT_RING (chan, 0xf0400211);
165 OUT_RING (chan, 0x00008784);
166 OUT_RING (chan, 0xc0040000);
167 OUT_RING (chan, 0xc0040204);
168 OUT_RING (chan, 0xc0040408);
169 OUT_RING (chan, 0xc004060c);
170 OUT_RING (chan, 0x00000001);
171 OUT_RING (chan, 0x00000001);
172 BEGIN_RING(chan, tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3);
173 OUT_RELOCh(chan, pNv->tesla_scratch, PFP_OFFSET + PFP_CCA, flags);
174 OUT_RELOCl(chan, pNv->tesla_scratch, PFP_OFFSET + PFP_CCA, flags);
175 OUT_RING (chan, (0 << NV50TCL_CB_DEF_SET_BUFFER_SHIFT) | 0x4000);
176 BEGIN_RING(chan, tesla, NV50TCL_CB_ADDR, 1);
178 BEGIN_RING(chan, tesla, NV50TCL_CB_DATA(0) | 0x40000000, 16);
179 OUT_RING (chan, 0x80000000);
180 OUT_RING (chan, 0x90000004);
181 OUT_RING (chan, 0x82030210);
182 OUT_RING (chan, 0x82040214);
183 OUT_RING (chan, 0x82010200);
184 OUT_RING (chan, 0x82020204);
185 OUT_RING (chan, 0xf6400001);
186 OUT_RING (chan, 0x0000c784);
187 OUT_RING (chan, 0xf6400211);
188 OUT_RING (chan, 0x0000c784);
189 OUT_RING (chan, 0xc0040000);
190 OUT_RING (chan, 0xc0050204);
191 OUT_RING (chan, 0xc0060408);
192 OUT_RING (chan, 0xc007060c);
193 OUT_RING (chan, 0x00000001);
194 OUT_RING (chan, 0x00000001);
195 BEGIN_RING(chan, tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3);
196 OUT_RELOCh(chan, pNv->tesla_scratch, PFP_OFFSET + PFP_CCASA, flags);
197 OUT_RELOCl(chan, pNv->tesla_scratch, PFP_OFFSET + PFP_CCASA, flags);
198 OUT_RING (chan, (0 << NV50TCL_CB_DEF_SET_BUFFER_SHIFT) | 0x4000);
199 BEGIN_RING(chan, tesla, NV50TCL_CB_ADDR, 1);
201 BEGIN_RING(chan, tesla, NV50TCL_CB_DATA(0) | 0x40000000, 16);
202 OUT_RING (chan, 0x80000000);
203 OUT_RING (chan, 0x90000004);
204 OUT_RING (chan, 0x82030200);
205 OUT_RING (chan, 0x82040204);
206 OUT_RING (chan, 0x82010210);
207 OUT_RING (chan, 0x82020214);
208 OUT_RING (chan, 0xf6400201);
209 OUT_RING (chan, 0x0000c784);
210 OUT_RING (chan, 0xf0400011);
211 OUT_RING (chan, 0x00008784);
212 OUT_RING (chan, 0xc0040000);
213 OUT_RING (chan, 0xc0040204);
214 OUT_RING (chan, 0xc0040408);
215 OUT_RING (chan, 0xc004060c);
216 OUT_RING (chan, 0x00000001);
217 OUT_RING (chan, 0x00000001);
218 BEGIN_RING(chan, tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3);
219 OUT_RELOCh(chan, pNv->tesla_scratch, PFP_OFFSET + PFP_S_A8, flags);
220 OUT_RELOCl(chan, pNv->tesla_scratch, PFP_OFFSET + PFP_S_A8, flags);
221 OUT_RING (chan, (0 << NV50TCL_CB_DEF_SET_BUFFER_SHIFT) | 0x4000);
222 BEGIN_RING(chan, tesla, NV50TCL_CB_ADDR, 1);
224 BEGIN_RING(chan, tesla, NV50TCL_CB_DATA(0) | 0x40000000, 10);
225 OUT_RING (chan, 0x80000000);
226 OUT_RING (chan, 0x90000004);
227 OUT_RING (chan, 0x82010200);
228 OUT_RING (chan, 0x82020204);
229 OUT_RING (chan, 0xf0400001);
230 OUT_RING (chan, 0x00008784);
231 OUT_RING (chan, 0x10008004);
232 OUT_RING (chan, 0x10008008);
233 OUT_RING (chan, 0x1000000d);
234 OUT_RING (chan, 0x0403c781);
235 BEGIN_RING(chan, tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3);
236 OUT_RELOCh(chan, pNv->tesla_scratch, PFP_OFFSET + PFP_C_A8, flags);
237 OUT_RELOCl(chan, pNv->tesla_scratch, PFP_OFFSET + PFP_C_A8, flags);
238 OUT_RING (chan, (0 << NV50TCL_CB_DEF_SET_BUFFER_SHIFT) | 0x4000);
239 BEGIN_RING(chan, tesla, NV50TCL_CB_ADDR, 1);
241 BEGIN_RING(chan, tesla, NV50TCL_CB_DATA(0) | 0x40000000, 15);
242 OUT_RING (chan, 0x80000000);
243 OUT_RING (chan, 0x90000004);
244 OUT_RING (chan, 0x82030208);
245 OUT_RING (chan, 0x8204020c);
246 OUT_RING (chan, 0x82010200);
247 OUT_RING (chan, 0x82020204);
248 OUT_RING (chan, 0xf0400001);
249 OUT_RING (chan, 0x00008784);
250 OUT_RING (chan, 0xf0400209);
251 OUT_RING (chan, 0x00008784);
252 OUT_RING (chan, 0xc002000c);
253 OUT_RING (chan, 0x10008600);
254 OUT_RING (chan, 0x10008604);
255 OUT_RING (chan, 0x10000609);
256 OUT_RING (chan, 0x0403c781);
257 BEGIN_RING(chan, tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3);
258 OUT_RELOCh(chan, pNv->tesla_scratch, PFP_OFFSET + PFP_NV12, flags);
259 OUT_RELOCl(chan, pNv->tesla_scratch, PFP_OFFSET + PFP_NV12, flags);
260 OUT_RING (chan, (0 << NV50TCL_CB_DEF_SET_BUFFER_SHIFT) | 0x4000);
261 BEGIN_RING(chan, tesla, NV50TCL_CB_ADDR, 1);
263 BEGIN_RING(chan, tesla, NV50TCL_CB_DATA(0) | 0x40000000, 34);
264 OUT_RING (chan, 0x80000008);
265 OUT_RING (chan, 0x90000408);
266 OUT_RING (chan, 0x80010400);
267 OUT_RING (chan, 0x80020404);
268 OUT_RING (chan, 0xf0400001);
269 OUT_RING (chan, 0x00008784);
270 OUT_RING (chan, 0xc0080001);
271 OUT_RING (chan, 0x03f9507f);
272 OUT_RING (chan, 0xb013000d);
273 OUT_RING (chan, 0x0bf5ee3b);
274 OUT_RING (chan, 0xb02f0011);
275 OUT_RING (chan, 0x03f078ff);
276 OUT_RING (chan, 0xb0220015);
277 OUT_RING (chan, 0x0bf8a677);
278 OUT_RING (chan, 0x80030400);
279 OUT_RING (chan, 0x80040404);
280 OUT_RING (chan, 0xf0400201);
281 OUT_RING (chan, 0x0000c784);
282 OUT_RING (chan, 0xc0160009);
283 OUT_RING (chan, 0x0bec890f);
284 OUT_RING (chan, 0xb0000411);
285 OUT_RING (chan, 0x00010780);
286 OUT_RING (chan, 0xc0070009);
287 OUT_RING (chan, 0x0400116b);
288 OUT_RING (chan, 0xc02d0201);
289 OUT_RING (chan, 0x03fcc433);
290 OUT_RING (chan, 0xc0370205);
291 OUT_RING (chan, 0x0bf501a3);
292 OUT_RING (chan, 0xb0000001);
293 OUT_RING (chan, 0x0000c780);
294 OUT_RING (chan, 0xb0000205);
295 OUT_RING (chan, 0x00010780);
296 OUT_RING (chan, 0xb0000409);
297 OUT_RING (chan, 0x00014781);
299 BEGIN_RING(chan, tesla, 0x16bc, 2);
300 OUT_RING (chan, 0x03020100);
301 OUT_RING (chan, 0x09080504);
302 BEGIN_RING(chan, tesla, 0x1520, 1);
303 OUT_RING (chan, 0x00000000);
304 BEGIN_RING(chan, tesla, 0x1988, 2);
305 OUT_RING (chan, 0x08070407);
306 OUT_RING (chan, 0x00000008);
308 BEGIN_RING(chan, tesla, NV50TCL_TIC_ADDRESS_HIGH, 3);
309 OUT_RELOCh(chan, pNv->tesla_scratch, TIC_OFFSET, flags);
310 OUT_RELOCl(chan, pNv->tesla_scratch, TIC_OFFSET, flags);
311 OUT_RING (chan, 0x00000800);
312 BEGIN_RING(chan, tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3);
313 OUT_RELOCh(chan, pNv->tesla_scratch, TIC_OFFSET, flags);
314 OUT_RELOCl(chan, pNv->tesla_scratch, TIC_OFFSET, flags);
315 OUT_RING (chan, (CB_TIC << NV50TCL_CB_DEF_SET_BUFFER_SHIFT) | 0x4000);
317 BEGIN_RING(chan, tesla, NV50TCL_TSC_ADDRESS_HIGH, 3);
318 OUT_RELOCh(chan, pNv->tesla_scratch, TSC_OFFSET, flags);
319 OUT_RELOCl(chan, pNv->tesla_scratch, TSC_OFFSET, flags);
320 OUT_RING (chan, 0x00000000);
321 BEGIN_RING(chan, tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3);
322 OUT_RELOCh(chan, pNv->tesla_scratch, TSC_OFFSET, flags);
323 OUT_RELOCl(chan, pNv->tesla_scratch, TSC_OFFSET, flags);
324 OUT_RING (chan, (CB_TSC << NV50TCL_CB_DEF_SET_BUFFER_SHIFT) | 0x4000);
326 BEGIN_RING(chan, tesla, NV50TCL_VIEWPORT_HORIZ, 2);
327 OUT_RING (chan, 8192 << NV50TCL_VIEWPORT_HORIZ_W_SHIFT);
328 OUT_RING (chan, 8192 << NV50TCL_VIEWPORT_VERT_H_SHIFT);
329 BEGIN_RING(chan, tesla, NV50TCL_SCISSOR_HORIZ, 2);
330 OUT_RING (chan, 8192 << NV50TCL_SCISSOR_HORIZ_R_SHIFT);
331 OUT_RING (chan, 8192 << NV50TCL_SCISSOR_VERT_B_SHIFT);
332 BEGIN_RING(chan, tesla, 0x0ff4, 2);
333 OUT_RING (chan, 8192 << NV50TCL_UNKFF4_W_SHIFT);
334 OUT_RING (chan, 8192 << NV50TCL_UNKFF8_H_SHIFT);