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;
35 if ((pNv->NVArch & 0xf0) == 0x50)
41 if (nouveau_grobj_alloc(pNv->chan, Nv3D, class, &pNv->Nv3D))
44 if (nouveau_bo_new(pNv->dev, NOUVEAU_BO_VRAM, 0, 65536,
45 &pNv->tesla_scratch)) {
46 nouveau_grobj_free(&pNv->Nv3D);
52 BEGIN_RING(chan, tesla, 0x1558, 1);
54 BEGIN_RING(chan, tesla, NV50TCL_DMA_NOTIFY, 1);
55 OUT_RING (chan, pNv->NvNull->handle);
56 BEGIN_RING(chan, tesla, NV50TCL_DMA_UNK0(0), NV50TCL_DMA_UNK0__SIZE);
57 for (i = 0; i < NV50TCL_DMA_UNK0__SIZE; i++)
58 OUT_RING (chan, pNv->chan->vram->handle);
59 BEGIN_RING(chan, tesla, NV50TCL_DMA_UNK1(0), NV50TCL_DMA_UNK1__SIZE);
60 for (i = 0; i < NV50TCL_DMA_UNK1__SIZE; i++)
61 OUT_RING (chan, pNv->chan->vram->handle);
62 BEGIN_RING(chan, tesla, 0x121c, 1);
65 BEGIN_RING(chan, tesla, 0x192c, 1);
67 BEGIN_RING(chan, tesla, 0x0f90, 1);
70 BEGIN_RING(chan, tesla, 0x1234, 1);
73 /*XXX: NFI - gets the oddball 0x1458 method working "properly" */
74 BEGIN_RING(chan, tesla, 0x13bc, 1);
75 OUT_RING (chan, 0x54);
77 BEGIN_RING(chan, tesla, NV50TCL_VP_ADDRESS_HIGH, 2);
78 OUT_RELOCh(chan, pNv->tesla_scratch, PVP_OFFSET, NOUVEAU_BO_VRAM);
79 OUT_RELOCl(chan, pNv->tesla_scratch, PVP_OFFSET, NOUVEAU_BO_VRAM);
80 BEGIN_RING(chan, tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3);
81 OUT_RELOCh(chan, pNv->tesla_scratch, PVP_OFFSET, NOUVEAU_BO_VRAM);
82 OUT_RELOCl(chan, pNv->tesla_scratch, PVP_OFFSET, NOUVEAU_BO_VRAM);
83 OUT_RING (chan, 0x00004000);
84 BEGIN_RING(chan, tesla, NV50TCL_CB_ADDR, 1);
86 BEGIN_RING(chan, tesla, NV50TCL_CB_DATA(0) | 0x40000000, (3*4*2));
87 OUT_RING (chan, 0x10000001);
88 OUT_RING (chan, 0x0423c788);
89 OUT_RING (chan, 0x10000205);
90 OUT_RING (chan, 0x0423c788);
91 OUT_RING (chan, 0x10000409);
92 OUT_RING (chan, 0x0423c788);
93 OUT_RING (chan, 0x1000060d);
94 OUT_RING (chan, 0x0423c788);
95 OUT_RING (chan, 0x10000811);
96 OUT_RING (chan, 0x0423c788);
97 OUT_RING (chan, 0x10000a15);
98 OUT_RING (chan, 0x0423c788);
99 OUT_RING (chan, 0x10000c19);
100 OUT_RING (chan, 0x0423c788);
101 OUT_RING (chan, 0x10000e1d);
102 OUT_RING (chan, 0x0423c788);
103 OUT_RING (chan, 0x10001021);
104 OUT_RING (chan, 0x0423c788);
105 OUT_RING (chan, 0x10001225);
106 OUT_RING (chan, 0x0423c788);
107 OUT_RING (chan, 0x10001429);
108 OUT_RING (chan, 0x0423c788);
109 OUT_RING (chan, 0x1000162d);
110 OUT_RING (chan, 0x0423c789);
112 BEGIN_RING(chan, tesla, NV50TCL_VP_ATTR_EN_0, 2);
113 OUT_RING (chan, 0x0000000f);
114 OUT_RING (chan, 0x000000ff);
115 BEGIN_RING(chan, tesla, 0x16b8, 1);
117 BEGIN_RING(chan, tesla, 0x16ac, 2);
120 BEGIN_RING(chan, tesla, NV50TCL_VP_START_ID, 1);
123 BEGIN_RING(chan, tesla, NV50TCL_FP_ADDRESS_HIGH, 2);
124 OUT_RELOCh(chan, pNv->tesla_scratch, PFP_OFFSET, NOUVEAU_BO_VRAM);
125 OUT_RELOCl(chan, pNv->tesla_scratch, PFP_OFFSET, NOUVEAU_BO_VRAM);
126 BEGIN_RING(chan, tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3);
127 OUT_RELOCh(chan, pNv->tesla_scratch,
128 PFP_OFFSET + PFP_S, NOUVEAU_BO_VRAM);
129 OUT_RELOCl(chan, pNv->tesla_scratch,
130 PFP_OFFSET + PFP_S, NOUVEAU_BO_VRAM);
131 OUT_RING (chan, (0 << NV50TCL_CB_DEF_SET_BUFFER_SHIFT) | 0x4000);
132 BEGIN_RING(chan, tesla, NV50TCL_CB_ADDR, 1);
134 BEGIN_RING(chan, tesla, NV50TCL_CB_DATA(0) | 0x40000000, 6);
135 OUT_RING (chan, 0x80000000);
136 OUT_RING (chan, 0x90000004);
137 OUT_RING (chan, 0x82010200);
138 OUT_RING (chan, 0x82020204);
139 OUT_RING (chan, 0xf6400001);
140 OUT_RING (chan, 0x0000c785);
141 BEGIN_RING(chan, tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3);
142 OUT_RELOCh(chan, pNv->tesla_scratch,
143 PFP_OFFSET + PFP_C, NOUVEAU_BO_VRAM);
144 OUT_RELOCl(chan, pNv->tesla_scratch,
145 PFP_OFFSET + PFP_C, NOUVEAU_BO_VRAM);
146 OUT_RING (chan, (0 << NV50TCL_CB_DEF_SET_BUFFER_SHIFT) | 0x4000);
147 BEGIN_RING(chan, tesla, NV50TCL_CB_ADDR, 1);
149 BEGIN_RING(chan, tesla, NV50TCL_CB_DATA(0) | 0x40000000, 16);
150 OUT_RING (chan, 0x80000000);
151 OUT_RING (chan, 0x90000004);
152 OUT_RING (chan, 0x82030210);
153 OUT_RING (chan, 0x82040214);
154 OUT_RING (chan, 0x82010200);
155 OUT_RING (chan, 0x82020204);
156 OUT_RING (chan, 0xf6400001);
157 OUT_RING (chan, 0x0000c784);
158 OUT_RING (chan, 0xf0400211);
159 OUT_RING (chan, 0x00008784);
160 OUT_RING (chan, 0xc0040000);
161 OUT_RING (chan, 0xc0040204);
162 OUT_RING (chan, 0xc0040408);
163 OUT_RING (chan, 0xc004060c);
164 OUT_RING (chan, 0x00000001);
165 OUT_RING (chan, 0x00000001);
166 BEGIN_RING(chan, tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3);
167 OUT_RELOCh(chan, pNv->tesla_scratch,
168 PFP_OFFSET + PFP_CCA, NOUVEAU_BO_VRAM);
169 OUT_RELOCl(chan, pNv->tesla_scratch,
170 PFP_OFFSET + PFP_CCA, NOUVEAU_BO_VRAM);
171 OUT_RING (chan, (0 << NV50TCL_CB_DEF_SET_BUFFER_SHIFT) | 0x4000);
172 BEGIN_RING(chan, tesla, NV50TCL_CB_ADDR, 1);
174 BEGIN_RING(chan, tesla, NV50TCL_CB_DATA(0) | 0x40000000, 16);
175 OUT_RING (chan, 0x80000000);
176 OUT_RING (chan, 0x90000004);
177 OUT_RING (chan, 0x82030210);
178 OUT_RING (chan, 0x82040214);
179 OUT_RING (chan, 0x82010200);
180 OUT_RING (chan, 0x82020204);
181 OUT_RING (chan, 0xf6400001);
182 OUT_RING (chan, 0x0000c784);
183 OUT_RING (chan, 0xf6400211);
184 OUT_RING (chan, 0x0000c784);
185 OUT_RING (chan, 0xc0040000);
186 OUT_RING (chan, 0xc0050204);
187 OUT_RING (chan, 0xc0060408);
188 OUT_RING (chan, 0xc007060c);
189 OUT_RING (chan, 0x00000001);
190 OUT_RING (chan, 0x00000001);
191 BEGIN_RING(chan, tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3);
192 OUT_RELOCh(chan, pNv->tesla_scratch,
193 PFP_OFFSET + PFP_CCASA, NOUVEAU_BO_VRAM);
194 OUT_RELOCl(chan, pNv->tesla_scratch,
195 PFP_OFFSET + PFP_CCASA, NOUVEAU_BO_VRAM);
196 OUT_RING (chan, (0 << NV50TCL_CB_DEF_SET_BUFFER_SHIFT) | 0x4000);
197 BEGIN_RING(chan, tesla, NV50TCL_CB_ADDR, 1);
199 BEGIN_RING(chan, tesla, NV50TCL_CB_DATA(0) | 0x40000000, 16);
200 OUT_RING (chan, 0x80000000);
201 OUT_RING (chan, 0x90000004);
202 OUT_RING (chan, 0x82030200);
203 OUT_RING (chan, 0x82040204);
204 OUT_RING (chan, 0x82010210);
205 OUT_RING (chan, 0x82020214);
206 OUT_RING (chan, 0xf6400201);
207 OUT_RING (chan, 0x0000c784);
208 OUT_RING (chan, 0xf0400011);
209 OUT_RING (chan, 0x00008784);
210 OUT_RING (chan, 0xc0040000);
211 OUT_RING (chan, 0xc0040204);
212 OUT_RING (chan, 0xc0040408);
213 OUT_RING (chan, 0xc004060c);
214 OUT_RING (chan, 0x00000001);
215 OUT_RING (chan, 0x00000001);
216 BEGIN_RING(chan, tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3);
217 OUT_RELOCh(chan, pNv->tesla_scratch,
218 PFP_OFFSET + PFP_S_A8, NOUVEAU_BO_VRAM);
219 OUT_RELOCl(chan, pNv->tesla_scratch,
220 PFP_OFFSET + PFP_S_A8, NOUVEAU_BO_VRAM);
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,
237 PFP_OFFSET + PFP_C_A8, NOUVEAU_BO_VRAM);
238 OUT_RELOCl(chan, pNv->tesla_scratch,
239 PFP_OFFSET + PFP_C_A8, NOUVEAU_BO_VRAM);
240 OUT_RING (chan, (0 << NV50TCL_CB_DEF_SET_BUFFER_SHIFT) | 0x4000);
241 BEGIN_RING(chan, tesla, NV50TCL_CB_ADDR, 1);
243 BEGIN_RING(chan, tesla, NV50TCL_CB_DATA(0) | 0x40000000, 15);
244 OUT_RING (chan, 0x80000000);
245 OUT_RING (chan, 0x90000004);
246 OUT_RING (chan, 0x82030208);
247 OUT_RING (chan, 0x8204020c);
248 OUT_RING (chan, 0x82010200);
249 OUT_RING (chan, 0x82020204);
250 OUT_RING (chan, 0xf0400001);
251 OUT_RING (chan, 0x00008784);
252 OUT_RING (chan, 0xf0400209);
253 OUT_RING (chan, 0x00008784);
254 OUT_RING (chan, 0xc002000c);
255 OUT_RING (chan, 0x10008600);
256 OUT_RING (chan, 0x10008604);
257 OUT_RING (chan, 0x10000609);
258 OUT_RING (chan, 0x0403c781);
259 BEGIN_RING(chan, tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3);
260 OUT_RELOCh(chan, pNv->tesla_scratch,
261 PFP_OFFSET + PFP_NV12, NOUVEAU_BO_VRAM);
262 OUT_RELOCl(chan, pNv->tesla_scratch,
263 PFP_OFFSET + PFP_NV12, NOUVEAU_BO_VRAM);
264 OUT_RING (chan, (0 << NV50TCL_CB_DEF_SET_BUFFER_SHIFT) | 0x4000);
265 BEGIN_RING(chan, tesla, NV50TCL_CB_ADDR, 1);
267 BEGIN_RING(chan, tesla, NV50TCL_CB_DATA(0) | 0x40000000, 34);
268 OUT_RING (chan, 0x80000008);
269 OUT_RING (chan, 0x90000408);
270 OUT_RING (chan, 0x80010400);
271 OUT_RING (chan, 0x80020404);
272 OUT_RING (chan, 0xf0400001);
273 OUT_RING (chan, 0x00008784);
274 OUT_RING (chan, 0xc0080001);
275 OUT_RING (chan, 0x03f9507f);
276 OUT_RING (chan, 0xb013000d);
277 OUT_RING (chan, 0x0bf5ee3b);
278 OUT_RING (chan, 0xb02f0011);
279 OUT_RING (chan, 0x03f078ff);
280 OUT_RING (chan, 0xb0220015);
281 OUT_RING (chan, 0x0bf8a677);
282 OUT_RING (chan, 0x80030400);
283 OUT_RING (chan, 0x80040404);
284 OUT_RING (chan, 0xf0400201);
285 OUT_RING (chan, 0x0000c784);
286 OUT_RING (chan, 0xc0160009);
287 OUT_RING (chan, 0x0bec890f);
288 OUT_RING (chan, 0xb0000411);
289 OUT_RING (chan, 0x00010780);
290 OUT_RING (chan, 0xc0070009);
291 OUT_RING (chan, 0x0400116b);
292 OUT_RING (chan, 0xc02d0201);
293 OUT_RING (chan, 0x03fcc433);
294 OUT_RING (chan, 0xc0370205);
295 OUT_RING (chan, 0x0bf501a3);
296 OUT_RING (chan, 0xb0000001);
297 OUT_RING (chan, 0x0000c780);
298 OUT_RING (chan, 0xb0000205);
299 OUT_RING (chan, 0x00010780);
300 OUT_RING (chan, 0xb0000409);
301 OUT_RING (chan, 0x00014781);
303 BEGIN_RING(chan, tesla, 0x16bc, 2);
304 OUT_RING (chan, 0x03020100);
305 OUT_RING (chan, 0x09080504);
306 BEGIN_RING(chan, tesla, 0x1520, 1);
307 OUT_RING (chan, 0x00000000);
308 BEGIN_RING(chan, tesla, 0x1988, 2);
309 OUT_RING (chan, 0x08070407);
310 OUT_RING (chan, 0x00000008);
312 BEGIN_RING(chan, tesla, NV50TCL_TIC_ADDRESS_HIGH, 3);
313 OUT_RELOCh(chan, pNv->tesla_scratch, TIC_OFFSET, NOUVEAU_BO_VRAM);
314 OUT_RELOCl(chan, pNv->tesla_scratch, TIC_OFFSET, NOUVEAU_BO_VRAM);
315 OUT_RING (chan, 0x00000800);
316 BEGIN_RING(chan, tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3);
317 OUT_RELOCh(chan, pNv->tesla_scratch, TIC_OFFSET, NOUVEAU_BO_VRAM);
318 OUT_RELOCl(chan, pNv->tesla_scratch, TIC_OFFSET, NOUVEAU_BO_VRAM);
319 OUT_RING (chan, (CB_TIC << NV50TCL_CB_DEF_SET_BUFFER_SHIFT) | 0x4000);
321 BEGIN_RING(chan, tesla, NV50TCL_TSC_ADDRESS_HIGH, 3);
322 OUT_RELOCh(chan, pNv->tesla_scratch, TSC_OFFSET, NOUVEAU_BO_VRAM);
323 OUT_RELOCl(chan, pNv->tesla_scratch, TSC_OFFSET, NOUVEAU_BO_VRAM);
324 OUT_RING (chan, 0x00000000);
325 BEGIN_RING(chan, tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3);
326 OUT_RELOCh(chan, pNv->tesla_scratch, TSC_OFFSET, NOUVEAU_BO_VRAM);
327 OUT_RELOCl(chan, pNv->tesla_scratch, TSC_OFFSET, NOUVEAU_BO_VRAM);
328 OUT_RING (chan, (CB_TSC << NV50TCL_CB_DEF_SET_BUFFER_SHIFT) | 0x4000);
330 BEGIN_RING(chan, tesla, NV50TCL_VIEWPORT_HORIZ, 2);
331 OUT_RING (chan, 8192 << NV50TCL_VIEWPORT_HORIZ_W_SHIFT);
332 OUT_RING (chan, 8192 << NV50TCL_VIEWPORT_VERT_H_SHIFT);
333 BEGIN_RING(chan, tesla, NV50TCL_SCISSOR_HORIZ, 2);
334 OUT_RING (chan, 8192 << NV50TCL_SCISSOR_HORIZ_R_SHIFT);
335 OUT_RING (chan, 8192 << NV50TCL_SCISSOR_VERT_B_SHIFT);
336 BEGIN_RING(chan, tesla, 0x0ff4, 2);
337 OUT_RING (chan, 8192 << NV50TCL_UNKFF4_W_SHIFT);
338 OUT_RING (chan, 8192 << NV50TCL_UNKFF8_H_SHIFT);