DRM from FreeBSD current, tested for r600
[dragonfly.git] / sys / dev / drm / r600_blit.c
blobc34427abffecf86eb3872590cb3bafb3e25e06da
1 /*-
2 * Copyright 2009 Advanced Micro Devices, Inc.
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 (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE COPYRIGHT HOLDER(S) AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
19 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21 * DEALINGS IN THE SOFTWARE.
23 * Authors:
24 * Alex Deucher <alexander.deucher@amd.com>
25 * __FBSDID("$FreeBSD: src/sys/dev/drm/r600_blit.c,v 1.5 2009/10/30 18:08:46 rnoland Exp $");
28 #include "dev/drm/drmP.h"
29 #include "dev/drm/drm.h"
30 #include "dev/drm/radeon_drm.h"
31 #include "dev/drm/radeon_drv.h"
33 static u32 r6xx_default_state[] =
35 0xc0002400,
36 0x00000000,
37 0xc0012800,
38 0x80000000,
39 0x80000000,
40 0xc0004600,
41 0x00000016,
42 0xc0016800,
43 0x00000010,
44 0x00028000,
45 0xc0016800,
46 0x00000010,
47 0x00008000,
48 0xc0016800,
49 0x00000542,
50 0x07000003,
51 0xc0016800,
52 0x000005c5,
53 0x00000000,
54 0xc0016800,
55 0x00000363,
56 0x00000000,
57 0xc0016800,
58 0x0000060c,
59 0x82000000,
60 0xc0016800,
61 0x0000060e,
62 0x01020204,
63 0xc0016f00,
64 0x00000000,
65 0x00000000,
66 0xc0016f00,
67 0x00000001,
68 0x00000000,
69 0xc0096900,
70 0x0000022a,
71 0x00000000,
72 0x00000000,
73 0x00000000,
74 0x00000000,
75 0x00000000,
76 0x00000000,
77 0x00000000,
78 0x00000000,
79 0x00000000,
80 0xc0016900,
81 0x00000004,
82 0x00000000,
83 0xc0016900,
84 0x0000000a,
85 0x00000000,
86 0xc0016900,
87 0x0000000b,
88 0x00000000,
89 0xc0016900,
90 0x0000010c,
91 0x00000000,
92 0xc0016900,
93 0x0000010d,
94 0x00000000,
95 0xc0016900,
96 0x00000200,
97 0x00000000,
98 0xc0016900,
99 0x00000343,
100 0x00000060,
101 0xc0016900,
102 0x00000344,
103 0x00000040,
104 0xc0016900,
105 0x00000351,
106 0x0000aa00,
107 0xc0016900,
108 0x00000104,
109 0x00000000,
110 0xc0016900,
111 0x0000010e,
112 0x00000000,
113 0xc0046900,
114 0x00000105,
115 0x00000000,
116 0x00000000,
117 0x00000000,
118 0x00000000,
119 0xc0036900,
120 0x00000109,
121 0x00000000,
122 0x00000000,
123 0x00000000,
124 0xc0046900,
125 0x0000030c,
126 0x01000000,
127 0x00000000,
128 0x00000000,
129 0x00000000,
130 0xc0046900,
131 0x00000048,
132 0x3f800000,
133 0x00000000,
134 0x3f800000,
135 0x3f800000,
136 0xc0016900,
137 0x0000008e,
138 0x0000000f,
139 0xc0016900,
140 0x00000080,
141 0x00000000,
142 0xc0016900,
143 0x00000083,
144 0x0000ffff,
145 0xc0016900,
146 0x00000084,
147 0x00000000,
148 0xc0016900,
149 0x00000085,
150 0x20002000,
151 0xc0016900,
152 0x00000086,
153 0x00000000,
154 0xc0016900,
155 0x00000087,
156 0x20002000,
157 0xc0016900,
158 0x00000088,
159 0x00000000,
160 0xc0016900,
161 0x00000089,
162 0x20002000,
163 0xc0016900,
164 0x0000008a,
165 0x00000000,
166 0xc0016900,
167 0x0000008b,
168 0x20002000,
169 0xc0016900,
170 0x0000008c,
171 0x00000000,
172 0xc0016900,
173 0x00000094,
174 0x80000000,
175 0xc0016900,
176 0x00000095,
177 0x20002000,
178 0xc0026900,
179 0x000000b4,
180 0x00000000,
181 0x3f800000,
182 0xc0016900,
183 0x00000096,
184 0x80000000,
185 0xc0016900,
186 0x00000097,
187 0x20002000,
188 0xc0026900,
189 0x000000b6,
190 0x00000000,
191 0x3f800000,
192 0xc0016900,
193 0x00000098,
194 0x80000000,
195 0xc0016900,
196 0x00000099,
197 0x20002000,
198 0xc0026900,
199 0x000000b8,
200 0x00000000,
201 0x3f800000,
202 0xc0016900,
203 0x0000009a,
204 0x80000000,
205 0xc0016900,
206 0x0000009b,
207 0x20002000,
208 0xc0026900,
209 0x000000ba,
210 0x00000000,
211 0x3f800000,
212 0xc0016900,
213 0x0000009c,
214 0x80000000,
215 0xc0016900,
216 0x0000009d,
217 0x20002000,
218 0xc0026900,
219 0x000000bc,
220 0x00000000,
221 0x3f800000,
222 0xc0016900,
223 0x0000009e,
224 0x80000000,
225 0xc0016900,
226 0x0000009f,
227 0x20002000,
228 0xc0026900,
229 0x000000be,
230 0x00000000,
231 0x3f800000,
232 0xc0016900,
233 0x000000a0,
234 0x80000000,
235 0xc0016900,
236 0x000000a1,
237 0x20002000,
238 0xc0026900,
239 0x000000c0,
240 0x00000000,
241 0x3f800000,
242 0xc0016900,
243 0x000000a2,
244 0x80000000,
245 0xc0016900,
246 0x000000a3,
247 0x20002000,
248 0xc0026900,
249 0x000000c2,
250 0x00000000,
251 0x3f800000,
252 0xc0016900,
253 0x000000a4,
254 0x80000000,
255 0xc0016900,
256 0x000000a5,
257 0x20002000,
258 0xc0026900,
259 0x000000c4,
260 0x00000000,
261 0x3f800000,
262 0xc0016900,
263 0x000000a6,
264 0x80000000,
265 0xc0016900,
266 0x000000a7,
267 0x20002000,
268 0xc0026900,
269 0x000000c6,
270 0x00000000,
271 0x3f800000,
272 0xc0016900,
273 0x000000a8,
274 0x80000000,
275 0xc0016900,
276 0x000000a9,
277 0x20002000,
278 0xc0026900,
279 0x000000c8,
280 0x00000000,
281 0x3f800000,
282 0xc0016900,
283 0x000000aa,
284 0x80000000,
285 0xc0016900,
286 0x000000ab,
287 0x20002000,
288 0xc0026900,
289 0x000000ca,
290 0x00000000,
291 0x3f800000,
292 0xc0016900,
293 0x000000ac,
294 0x80000000,
295 0xc0016900,
296 0x000000ad,
297 0x20002000,
298 0xc0026900,
299 0x000000cc,
300 0x00000000,
301 0x3f800000,
302 0xc0016900,
303 0x000000ae,
304 0x80000000,
305 0xc0016900,
306 0x000000af,
307 0x20002000,
308 0xc0026900,
309 0x000000ce,
310 0x00000000,
311 0x3f800000,
312 0xc0016900,
313 0x000000b0,
314 0x80000000,
315 0xc0016900,
316 0x000000b1,
317 0x20002000,
318 0xc0026900,
319 0x000000d0,
320 0x00000000,
321 0x3f800000,
322 0xc0016900,
323 0x000000b2,
324 0x80000000,
325 0xc0016900,
326 0x000000b3,
327 0x20002000,
328 0xc0026900,
329 0x000000d2,
330 0x00000000,
331 0x3f800000,
332 0xc0016900,
333 0x00000293,
334 0x00004010,
335 0xc0016900,
336 0x00000300,
337 0x00000000,
338 0xc0016900,
339 0x00000301,
340 0x00000000,
341 0xc0016900,
342 0x00000312,
343 0xffffffff,
344 0xc0016900,
345 0x00000307,
346 0x00000000,
347 0xc0016900,
348 0x00000308,
349 0x00000000,
350 0xc0016900,
351 0x00000283,
352 0x00000000,
353 0xc0016900,
354 0x00000292,
355 0x00000000,
356 0xc0066900,
357 0x0000010f,
358 0x00000000,
359 0x00000000,
360 0x00000000,
361 0x00000000,
362 0x00000000,
363 0x00000000,
364 0xc0016900,
365 0x00000206,
366 0x00000000,
367 0xc0016900,
368 0x00000207,
369 0x00000000,
370 0xc0016900,
371 0x00000208,
372 0x00000000,
373 0xc0046900,
374 0x00000303,
375 0x3f800000,
376 0x3f800000,
377 0x3f800000,
378 0x3f800000,
379 0xc0016900,
380 0x00000205,
381 0x00000004,
382 0xc0016900,
383 0x00000280,
384 0x00000000,
385 0xc0016900,
386 0x00000281,
387 0x00000000,
388 0xc0016900,
389 0x0000037e,
390 0x00000000,
391 0xc0016900,
392 0x00000382,
393 0x00000000,
394 0xc0016900,
395 0x00000380,
396 0x00000000,
397 0xc0016900,
398 0x00000383,
399 0x00000000,
400 0xc0016900,
401 0x00000381,
402 0x00000000,
403 0xc0016900,
404 0x00000282,
405 0x00000008,
406 0xc0016900,
407 0x00000302,
408 0x0000002d,
409 0xc0016900,
410 0x0000037f,
411 0x00000000,
412 0xc0016900,
413 0x000001b2,
414 0x00000000,
415 0xc0016900,
416 0x000001b6,
417 0x00000000,
418 0xc0016900,
419 0x000001b7,
420 0x00000000,
421 0xc0016900,
422 0x000001b8,
423 0x00000000,
424 0xc0016900,
425 0x000001b9,
426 0x00000000,
427 0xc0016900,
428 0x00000225,
429 0x00000000,
430 0xc0016900,
431 0x00000229,
432 0x00000000,
433 0xc0016900,
434 0x00000237,
435 0x00000000,
436 0xc0016900,
437 0x00000100,
438 0x00000800,
439 0xc0016900,
440 0x00000101,
441 0x00000000,
442 0xc0016900,
443 0x00000102,
444 0x00000000,
445 0xc0016900,
446 0x000002a8,
447 0x00000000,
448 0xc0016900,
449 0x000002a9,
450 0x00000000,
451 0xc0016900,
452 0x00000103,
453 0x00000000,
454 0xc0016900,
455 0x00000284,
456 0x00000000,
457 0xc0016900,
458 0x00000290,
459 0x00000000,
460 0xc0016900,
461 0x00000285,
462 0x00000000,
463 0xc0016900,
464 0x00000286,
465 0x00000000,
466 0xc0016900,
467 0x00000287,
468 0x00000000,
469 0xc0016900,
470 0x00000288,
471 0x00000000,
472 0xc0016900,
473 0x00000289,
474 0x00000000,
475 0xc0016900,
476 0x0000028a,
477 0x00000000,
478 0xc0016900,
479 0x0000028b,
480 0x00000000,
481 0xc0016900,
482 0x0000028c,
483 0x00000000,
484 0xc0016900,
485 0x0000028d,
486 0x00000000,
487 0xc0016900,
488 0x0000028e,
489 0x00000000,
490 0xc0016900,
491 0x0000028f,
492 0x00000000,
493 0xc0016900,
494 0x000002a1,
495 0x00000000,
496 0xc0016900,
497 0x000002a5,
498 0x00000000,
499 0xc0016900,
500 0x000002ac,
501 0x00000000,
502 0xc0016900,
503 0x000002ad,
504 0x00000000,
505 0xc0016900,
506 0x000002ae,
507 0x00000000,
508 0xc0016900,
509 0x000002c8,
510 0x00000000,
511 0xc0016900,
512 0x00000206,
513 0x00000100,
514 0xc0016900,
515 0x00000204,
516 0x00010000,
517 0xc0036e00,
518 0x00000000,
519 0x00000012,
520 0x00000000,
521 0x00000000,
522 0xc0016900,
523 0x0000008f,
524 0x0000000f,
525 0xc0016900,
526 0x000001e8,
527 0x00000001,
528 0xc0016900,
529 0x00000202,
530 0x00cc0000,
531 0xc0016900,
532 0x00000205,
533 0x00000244,
534 0xc0016900,
535 0x00000203,
536 0x00000210,
537 0xc0016900,
538 0x000001b1,
539 0x00000000,
540 0xc0016900,
541 0x00000185,
542 0x00000000,
543 0xc0016900,
544 0x000001b3,
545 0x00000001,
546 0xc0016900,
547 0x000001b4,
548 0x00000000,
549 0xc0016900,
550 0x00000191,
551 0x00000b00,
552 0xc0016900,
553 0x000001b5,
554 0x00000000,
557 static u32 r7xx_default_state[] =
559 0xc0012800,
560 0x80000000,
561 0x80000000,
562 0xc0004600,
563 0x00000016,
564 0xc0016800,
565 0x00000010,
566 0x00028000,
567 0xc0016800,
568 0x00000010,
569 0x00008000,
570 0xc0016800,
571 0x00000542,
572 0x07000002,
573 0xc0016800,
574 0x000005c5,
575 0x00000000,
576 0xc0016800,
577 0x00000363,
578 0x00004000,
579 0xc0016800,
580 0x0000060c,
581 0x00000000,
582 0xc0016800,
583 0x0000060e,
584 0x00420204,
585 0xc0016f00,
586 0x00000000,
587 0x00000000,
588 0xc0016f00,
589 0x00000001,
590 0x00000000,
591 0xc0096900,
592 0x0000022a,
593 0x00000000,
594 0x00000000,
595 0x00000000,
596 0x00000000,
597 0x00000000,
598 0x00000000,
599 0x00000000,
600 0x00000000,
601 0x00000000,
602 0xc0016900,
603 0x00000004,
604 0x00000000,
605 0xc0016900,
606 0x0000000a,
607 0x00000000,
608 0xc0016900,
609 0x0000000b,
610 0x00000000,
611 0xc0016900,
612 0x0000010c,
613 0x00000000,
614 0xc0016900,
615 0x0000010d,
616 0x00000000,
617 0xc0016900,
618 0x00000200,
619 0x00000000,
620 0xc0016900,
621 0x00000343,
622 0x00000060,
623 0xc0016900,
624 0x00000344,
625 0x00000000,
626 0xc0016900,
627 0x00000351,
628 0x0000aa00,
629 0xc0016900,
630 0x00000104,
631 0x00000000,
632 0xc0016900,
633 0x0000010e,
634 0x00000000,
635 0xc0046900,
636 0x00000105,
637 0x00000000,
638 0x00000000,
639 0x00000000,
640 0x00000000,
641 0xc0046900,
642 0x0000030c,
643 0x01000000,
644 0x00000000,
645 0x00000000,
646 0x00000000,
647 0xc0016900,
648 0x0000008e,
649 0x0000000f,
650 0xc0016900,
651 0x00000080,
652 0x00000000,
653 0xc0016900,
654 0x00000083,
655 0x0000ffff,
656 0xc0016900,
657 0x00000084,
658 0x00000000,
659 0xc0016900,
660 0x00000085,
661 0x20002000,
662 0xc0016900,
663 0x00000086,
664 0x00000000,
665 0xc0016900,
666 0x00000087,
667 0x20002000,
668 0xc0016900,
669 0x00000088,
670 0x00000000,
671 0xc0016900,
672 0x00000089,
673 0x20002000,
674 0xc0016900,
675 0x0000008a,
676 0x00000000,
677 0xc0016900,
678 0x0000008b,
679 0x20002000,
680 0xc0016900,
681 0x0000008c,
682 0xaaaaaaaa,
683 0xc0016900,
684 0x00000094,
685 0x80000000,
686 0xc0016900,
687 0x00000095,
688 0x20002000,
689 0xc0026900,
690 0x000000b4,
691 0x00000000,
692 0x3f800000,
693 0xc0016900,
694 0x00000096,
695 0x80000000,
696 0xc0016900,
697 0x00000097,
698 0x20002000,
699 0xc0026900,
700 0x000000b6,
701 0x00000000,
702 0x3f800000,
703 0xc0016900,
704 0x00000098,
705 0x80000000,
706 0xc0016900,
707 0x00000099,
708 0x20002000,
709 0xc0026900,
710 0x000000b8,
711 0x00000000,
712 0x3f800000,
713 0xc0016900,
714 0x0000009a,
715 0x80000000,
716 0xc0016900,
717 0x0000009b,
718 0x20002000,
719 0xc0026900,
720 0x000000ba,
721 0x00000000,
722 0x3f800000,
723 0xc0016900,
724 0x0000009c,
725 0x80000000,
726 0xc0016900,
727 0x0000009d,
728 0x20002000,
729 0xc0026900,
730 0x000000bc,
731 0x00000000,
732 0x3f800000,
733 0xc0016900,
734 0x0000009e,
735 0x80000000,
736 0xc0016900,
737 0x0000009f,
738 0x20002000,
739 0xc0026900,
740 0x000000be,
741 0x00000000,
742 0x3f800000,
743 0xc0016900,
744 0x000000a0,
745 0x80000000,
746 0xc0016900,
747 0x000000a1,
748 0x20002000,
749 0xc0026900,
750 0x000000c0,
751 0x00000000,
752 0x3f800000,
753 0xc0016900,
754 0x000000a2,
755 0x80000000,
756 0xc0016900,
757 0x000000a3,
758 0x20002000,
759 0xc0026900,
760 0x000000c2,
761 0x00000000,
762 0x3f800000,
763 0xc0016900,
764 0x000000a4,
765 0x80000000,
766 0xc0016900,
767 0x000000a5,
768 0x20002000,
769 0xc0026900,
770 0x000000c4,
771 0x00000000,
772 0x3f800000,
773 0xc0016900,
774 0x000000a6,
775 0x80000000,
776 0xc0016900,
777 0x000000a7,
778 0x20002000,
779 0xc0026900,
780 0x000000c6,
781 0x00000000,
782 0x3f800000,
783 0xc0016900,
784 0x000000a8,
785 0x80000000,
786 0xc0016900,
787 0x000000a9,
788 0x20002000,
789 0xc0026900,
790 0x000000c8,
791 0x00000000,
792 0x3f800000,
793 0xc0016900,
794 0x000000aa,
795 0x80000000,
796 0xc0016900,
797 0x000000ab,
798 0x20002000,
799 0xc0026900,
800 0x000000ca,
801 0x00000000,
802 0x3f800000,
803 0xc0016900,
804 0x000000ac,
805 0x80000000,
806 0xc0016900,
807 0x000000ad,
808 0x20002000,
809 0xc0026900,
810 0x000000cc,
811 0x00000000,
812 0x3f800000,
813 0xc0016900,
814 0x000000ae,
815 0x80000000,
816 0xc0016900,
817 0x000000af,
818 0x20002000,
819 0xc0026900,
820 0x000000ce,
821 0x00000000,
822 0x3f800000,
823 0xc0016900,
824 0x000000b0,
825 0x80000000,
826 0xc0016900,
827 0x000000b1,
828 0x20002000,
829 0xc0026900,
830 0x000000d0,
831 0x00000000,
832 0x3f800000,
833 0xc0016900,
834 0x000000b2,
835 0x80000000,
836 0xc0016900,
837 0x000000b3,
838 0x20002000,
839 0xc0026900,
840 0x000000d2,
841 0x00000000,
842 0x3f800000,
843 0xc0016900,
844 0x00000293,
845 0x00514000,
846 0xc0016900,
847 0x00000300,
848 0x00000000,
849 0xc0016900,
850 0x00000301,
851 0x00000000,
852 0xc0016900,
853 0x00000312,
854 0xffffffff,
855 0xc0016900,
856 0x00000307,
857 0x00000000,
858 0xc0016900,
859 0x00000308,
860 0x00000000,
861 0xc0016900,
862 0x00000283,
863 0x00000000,
864 0xc0016900,
865 0x00000292,
866 0x00000000,
867 0xc0066900,
868 0x0000010f,
869 0x00000000,
870 0x00000000,
871 0x00000000,
872 0x00000000,
873 0x00000000,
874 0x00000000,
875 0xc0016900,
876 0x00000206,
877 0x00000000,
878 0xc0016900,
879 0x00000207,
880 0x00000000,
881 0xc0016900,
882 0x00000208,
883 0x00000000,
884 0xc0046900,
885 0x00000303,
886 0x3f800000,
887 0x3f800000,
888 0x3f800000,
889 0x3f800000,
890 0xc0016900,
891 0x00000205,
892 0x00000004,
893 0xc0016900,
894 0x00000280,
895 0x00000000,
896 0xc0016900,
897 0x00000281,
898 0x00000000,
899 0xc0016900,
900 0x0000037e,
901 0x00000000,
902 0xc0016900,
903 0x00000382,
904 0x00000000,
905 0xc0016900,
906 0x00000380,
907 0x00000000,
908 0xc0016900,
909 0x00000383,
910 0x00000000,
911 0xc0016900,
912 0x00000381,
913 0x00000000,
914 0xc0016900,
915 0x00000282,
916 0x00000008,
917 0xc0016900,
918 0x00000302,
919 0x0000002d,
920 0xc0016900,
921 0x0000037f,
922 0x00000000,
923 0xc0016900,
924 0x000001b2,
925 0x00000001,
926 0xc0016900,
927 0x000001b6,
928 0x00000000,
929 0xc0016900,
930 0x000001b7,
931 0x00000000,
932 0xc0016900,
933 0x000001b8,
934 0x00000000,
935 0xc0016900,
936 0x000001b9,
937 0x00000000,
938 0xc0016900,
939 0x00000225,
940 0x00000000,
941 0xc0016900,
942 0x00000229,
943 0x00000000,
944 0xc0016900,
945 0x00000237,
946 0x00000000,
947 0xc0016900,
948 0x00000100,
949 0x00000800,
950 0xc0016900,
951 0x00000101,
952 0x00000000,
953 0xc0016900,
954 0x00000102,
955 0x00000000,
956 0xc0016900,
957 0x000002a8,
958 0x00000000,
959 0xc0016900,
960 0x000002a9,
961 0x00000000,
962 0xc0016900,
963 0x00000103,
964 0x00000000,
965 0xc0016900,
966 0x00000284,
967 0x00000000,
968 0xc0016900,
969 0x00000290,
970 0x00000000,
971 0xc0016900,
972 0x00000285,
973 0x00000000,
974 0xc0016900,
975 0x00000286,
976 0x00000000,
977 0xc0016900,
978 0x00000287,
979 0x00000000,
980 0xc0016900,
981 0x00000288,
982 0x00000000,
983 0xc0016900,
984 0x00000289,
985 0x00000000,
986 0xc0016900,
987 0x0000028a,
988 0x00000000,
989 0xc0016900,
990 0x0000028b,
991 0x00000000,
992 0xc0016900,
993 0x0000028c,
994 0x00000000,
995 0xc0016900,
996 0x0000028d,
997 0x00000000,
998 0xc0016900,
999 0x0000028e,
1000 0x00000000,
1001 0xc0016900,
1002 0x0000028f,
1003 0x00000000,
1004 0xc0016900,
1005 0x000002a1,
1006 0x00000000,
1007 0xc0016900,
1008 0x000002a5,
1009 0x00000000,
1010 0xc0016900,
1011 0x000002ac,
1012 0x00000000,
1013 0xc0016900,
1014 0x000002ad,
1015 0x00000000,
1016 0xc0016900,
1017 0x000002ae,
1018 0x00000000,
1019 0xc0016900,
1020 0x000002c8,
1021 0x00000000,
1022 0xc0016900,
1023 0x00000206,
1024 0x00000100,
1025 0xc0016900,
1026 0x00000204,
1027 0x00010000,
1028 0xc0036e00,
1029 0x00000000,
1030 0x00000012,
1031 0x00000000,
1032 0x00000000,
1033 0xc0016900,
1034 0x0000008f,
1035 0x0000000f,
1036 0xc0016900,
1037 0x000001e8,
1038 0x00000001,
1039 0xc0016900,
1040 0x00000202,
1041 0x00cc0000,
1042 0xc0016900,
1043 0x00000205,
1044 0x00000244,
1045 0xc0016900,
1046 0x00000203,
1047 0x00000210,
1048 0xc0016900,
1049 0x000001b1,
1050 0x00000000,
1051 0xc0016900,
1052 0x00000185,
1053 0x00000000,
1054 0xc0016900,
1055 0x000001b3,
1056 0x00000001,
1057 0xc0016900,
1058 0x000001b4,
1059 0x00000000,
1060 0xc0016900,
1061 0x00000191,
1062 0x00000b00,
1063 0xc0016900,
1064 0x000001b5,
1065 0x00000000,
1068 /* same for r6xx/r7xx */
1069 static u32 r6xx_vs[] =
1071 0x00000004,
1072 0x81000000,
1073 0x0000203c,
1074 0x94000b08,
1075 0x00004000,
1076 0x14200b1a,
1077 0x00000000,
1078 0x00000000,
1079 0x3c000000,
1080 0x68cd1000,
1081 0x00080000,
1082 0x00000000,
1085 static u32 r6xx_ps[] =
1087 0x00000002,
1088 0x80800000,
1089 0x00000000,
1090 0x94200688,
1091 0x00000010,
1092 0x000d1000,
1093 0xb0800000,
1094 0x00000000,
1097 #define DI_PT_RECTLIST 0x11
1098 #define DI_INDEX_SIZE_16_BIT 0x0
1099 #define DI_SRC_SEL_AUTO_INDEX 0x2
1101 #define FMT_8 1
1102 #define FMT_5_6_5 8
1103 #define FMT_8_8_8_8 0x1a
1104 #define COLOR_8 1
1105 #define COLOR_5_6_5 8
1106 #define COLOR_8_8_8_8 0x1a
1108 #define R600_CB0_DEST_BASE_ENA (1 << 6)
1109 #define R600_TC_ACTION_ENA (1 << 23)
1110 #define R600_VC_ACTION_ENA (1 << 24)
1111 #define R600_CB_ACTION_ENA (1 << 25)
1112 #define R600_DB_ACTION_ENA (1 << 26)
1113 #define R600_SH_ACTION_ENA (1 << 27)
1114 #define R600_SMX_ACTION_ENA (1 << 28)
1116 #define R600_CB_COLOR0_SIZE 0x28060
1117 #define R600_CB_COLOR0_VIEW 0x28080
1118 #define R600_CB_COLOR0_INFO 0x280a0
1119 #define R600_CB_COLOR0_TILE 0x280c0
1120 #define R600_CB_COLOR0_FRAG 0x280e0
1121 #define R600_CB_COLOR0_MASK 0x28100
1123 #define R600_SQ_PGM_START_VS 0x28858
1124 #define R600_SQ_PGM_RESOURCES_VS 0x28868
1125 #define R600_SQ_PGM_CF_OFFSET_VS 0x288d0
1126 #define R600_SQ_PGM_START_PS 0x28840
1127 #define R600_SQ_PGM_RESOURCES_PS 0x28850
1128 #define R600_SQ_PGM_EXPORTS_PS 0x28854
1129 #define R600_SQ_PGM_CF_OFFSET_PS 0x288cc
1131 #define R600_VGT_PRIMITIVE_TYPE 0x8958
1133 #define R600_PA_SC_SCREEN_SCISSOR_TL 0x28030
1134 #define R600_PA_SC_GENERIC_SCISSOR_TL 0x28240
1135 #define R600_PA_SC_WINDOW_SCISSOR_TL 0x28204
1137 #define R600_SQ_TEX_VTX_INVALID_TEXTURE 0x0
1138 #define R600_SQ_TEX_VTX_INVALID_BUFFER 0x1
1139 #define R600_SQ_TEX_VTX_VALID_TEXTURE 0x2
1140 #define R600_SQ_TEX_VTX_VALID_BUFFER 0x3
1142 /* packet 3 type offsets */
1143 #define R600_SET_CONFIG_REG_OFFSET 0x00008000
1144 #define R600_SET_CONFIG_REG_END 0x0000ac00
1145 #define R600_SET_CONTEXT_REG_OFFSET 0x00028000
1146 #define R600_SET_CONTEXT_REG_END 0x00029000
1147 #define R600_SET_ALU_CONST_OFFSET 0x00030000
1148 #define R600_SET_ALU_CONST_END 0x00032000
1149 #define R600_SET_RESOURCE_OFFSET 0x00038000
1150 #define R600_SET_RESOURCE_END 0x0003c000
1151 #define R600_SET_SAMPLER_OFFSET 0x0003c000
1152 #define R600_SET_SAMPLER_END 0x0003cff0
1153 #define R600_SET_CTL_CONST_OFFSET 0x0003cff0
1154 #define R600_SET_CTL_CONST_END 0x0003e200
1155 #define R600_SET_LOOP_CONST_OFFSET 0x0003e200
1156 #define R600_SET_LOOP_CONST_END 0x0003e380
1157 #define R600_SET_BOOL_CONST_OFFSET 0x0003e380
1158 #define R600_SET_BOOL_CONST_END 0x00040000
1160 /* Packet 3 types */
1161 #define R600_IT_INDIRECT_BUFFER_END 0x00001700
1162 #define R600_IT_SET_PREDICATION 0x00002000
1163 #define R600_IT_REG_RMW 0x00002100
1164 #define R600_IT_COND_EXEC 0x00002200
1165 #define R600_IT_PRED_EXEC 0x00002300
1166 #define R600_IT_START_3D_CMDBUF 0x00002400
1167 #define R600_IT_DRAW_INDEX_2 0x00002700
1168 #define R600_IT_CONTEXT_CONTROL 0x00002800
1169 #define R600_IT_DRAW_INDEX_IMMD_BE 0x00002900
1170 #define R600_IT_INDEX_TYPE 0x00002A00
1171 #define R600_IT_DRAW_INDEX 0x00002B00
1172 #define R600_IT_DRAW_INDEX_AUTO 0x00002D00
1173 #define R600_IT_DRAW_INDEX_IMMD 0x00002E00
1174 #define R600_IT_NUM_INSTANCES 0x00002F00
1175 #define R600_IT_STRMOUT_BUFFER_UPDATE 0x00003400
1176 #define R600_IT_INDIRECT_BUFFER_MP 0x00003800
1177 #define R600_IT_MEM_SEMAPHORE 0x00003900
1178 #define R600_IT_MPEG_INDEX 0x00003A00
1179 #define R600_IT_WAIT_REG_MEM 0x00003C00
1180 #define R600_IT_MEM_WRITE 0x00003D00
1181 #define R600_IT_INDIRECT_BUFFER 0x00003200
1182 #define R600_IT_CP_INTERRUPT 0x00004000
1183 #define R600_IT_SURFACE_SYNC 0x00004300
1184 #define R600_IT_ME_INITIALIZE 0x00004400
1185 #define R600_IT_COND_WRITE 0x00004500
1186 #define R600_IT_EVENT_WRITE 0x00004600
1187 #define R600_IT_EVENT_WRITE_EOP 0x00004700
1188 #define R600_IT_ONE_REG_WRITE 0x00005700
1189 #define R600_IT_SET_CONFIG_REG 0x00006800
1190 #define R600_IT_SET_CONTEXT_REG 0x00006900
1191 #define R600_IT_SET_ALU_CONST 0x00006A00
1192 #define R600_IT_SET_BOOL_CONST 0x00006B00
1193 #define R600_IT_SET_LOOP_CONST 0x00006C00
1194 #define R600_IT_SET_RESOURCE 0x00006D00
1195 #define R600_IT_SET_SAMPLER 0x00006E00
1196 #define R600_IT_SET_CTL_CONST 0x00006F00
1197 #define R600_IT_SURFACE_BASE_UPDATE 0x00007300
1199 static inline void
1200 set_render_target(drm_radeon_private_t *dev_priv, int format, int w, int h, u64 gpu_addr)
1202 u32 cb_color_info;
1203 int pitch, slice;
1204 RING_LOCALS;
1205 DRM_DEBUG("\n");
1207 h = (h + 7) & ~7;
1208 if (h < 8)
1209 h = 8;
1211 cb_color_info = ((format << 2) | (1 << 27));
1212 pitch = (w / 8) - 1;
1213 slice = ((w * h) / 64) - 1;
1215 if (((dev_priv->flags & RADEON_FAMILY_MASK) > CHIP_R600) &&
1216 ((dev_priv->flags & RADEON_FAMILY_MASK) < CHIP_RV770)) {
1217 BEGIN_RING(21 + 2);
1218 OUT_RING(CP_PACKET3(R600_IT_SET_CONTEXT_REG, 1));
1219 OUT_RING((R600_CB_COLOR0_BASE - R600_SET_CONTEXT_REG_OFFSET) >> 2);
1220 OUT_RING(gpu_addr >> 8);
1221 OUT_RING(CP_PACKET3(R600_IT_SURFACE_BASE_UPDATE, 0));
1222 OUT_RING(2 << 0);
1223 } else {
1224 BEGIN_RING(21);
1225 OUT_RING(CP_PACKET3(R600_IT_SET_CONTEXT_REG, 1));
1226 OUT_RING((R600_CB_COLOR0_BASE - R600_SET_CONTEXT_REG_OFFSET) >> 2);
1227 OUT_RING(gpu_addr >> 8);
1230 OUT_RING(CP_PACKET3(R600_IT_SET_CONTEXT_REG, 1));
1231 OUT_RING((R600_CB_COLOR0_SIZE - R600_SET_CONTEXT_REG_OFFSET) >> 2);
1232 OUT_RING((pitch << 0) | (slice << 10));
1234 OUT_RING(CP_PACKET3(R600_IT_SET_CONTEXT_REG, 1));
1235 OUT_RING((R600_CB_COLOR0_VIEW - R600_SET_CONTEXT_REG_OFFSET) >> 2);
1236 OUT_RING(0);
1238 OUT_RING(CP_PACKET3(R600_IT_SET_CONTEXT_REG, 1));
1239 OUT_RING((R600_CB_COLOR0_INFO - R600_SET_CONTEXT_REG_OFFSET) >> 2);
1240 OUT_RING(cb_color_info);
1242 OUT_RING(CP_PACKET3(R600_IT_SET_CONTEXT_REG, 1));
1243 OUT_RING((R600_CB_COLOR0_TILE - R600_SET_CONTEXT_REG_OFFSET) >> 2);
1244 OUT_RING(0);
1246 OUT_RING(CP_PACKET3(R600_IT_SET_CONTEXT_REG, 1));
1247 OUT_RING((R600_CB_COLOR0_FRAG - R600_SET_CONTEXT_REG_OFFSET) >> 2);
1248 OUT_RING(0);
1250 OUT_RING(CP_PACKET3(R600_IT_SET_CONTEXT_REG, 1));
1251 OUT_RING((R600_CB_COLOR0_MASK - R600_SET_CONTEXT_REG_OFFSET) >> 2);
1252 OUT_RING(0);
1254 ADVANCE_RING();
1257 static inline void
1258 cp_set_surface_sync(drm_radeon_private_t *dev_priv,
1259 u32 sync_type, u32 size, u64 mc_addr)
1261 u32 cp_coher_size;
1262 RING_LOCALS;
1263 DRM_DEBUG("\n");
1265 if (size == 0xffffffff)
1266 cp_coher_size = 0xffffffff;
1267 else
1268 cp_coher_size = ((size + 255) >> 8);
1270 BEGIN_RING(5);
1271 OUT_RING(CP_PACKET3(R600_IT_SURFACE_SYNC, 3));
1272 OUT_RING(sync_type);
1273 OUT_RING(cp_coher_size);
1274 OUT_RING((mc_addr >> 8));
1275 OUT_RING(10); /* poll interval */
1276 ADVANCE_RING();
1279 static inline void
1280 set_shaders(struct drm_device *dev)
1282 drm_radeon_private_t *dev_priv = dev->dev_private;
1283 u64 gpu_addr;
1284 int shader_size, i;
1285 u32 *vs, *ps;
1286 uint32_t sq_pgm_resources;
1287 RING_LOCALS;
1288 DRM_DEBUG("\n");
1290 /* load shaders */
1291 vs = (u32 *) ((char *)dev->agp_buffer_map->handle + dev_priv->blit_vb->offset);
1292 ps = (u32 *) ((char *)dev->agp_buffer_map->handle + dev_priv->blit_vb->offset + 256);
1294 shader_size = sizeof(r6xx_vs) / 4;
1295 for (i= 0; i < shader_size; i++)
1296 vs[i] = r6xx_vs[i];
1297 shader_size = sizeof(r6xx_ps) / 4;
1298 for (i= 0; i < shader_size; i++)
1299 ps[i] = r6xx_ps[i];
1301 dev_priv->blit_vb->used = 512;
1303 gpu_addr = dev_priv->gart_buffers_offset + dev_priv->blit_vb->offset;
1305 /* setup shader regs */
1306 sq_pgm_resources = (1 << 0);
1308 BEGIN_RING(9 + 12);
1309 /* VS */
1310 OUT_RING(CP_PACKET3(R600_IT_SET_CONTEXT_REG, 1));
1311 OUT_RING((R600_SQ_PGM_START_VS - R600_SET_CONTEXT_REG_OFFSET) >> 2);
1312 OUT_RING(gpu_addr >> 8);
1314 OUT_RING(CP_PACKET3(R600_IT_SET_CONTEXT_REG, 1));
1315 OUT_RING((R600_SQ_PGM_RESOURCES_VS - R600_SET_CONTEXT_REG_OFFSET) >> 2);
1316 OUT_RING(sq_pgm_resources);
1318 OUT_RING(CP_PACKET3(R600_IT_SET_CONTEXT_REG, 1));
1319 OUT_RING((R600_SQ_PGM_CF_OFFSET_VS - R600_SET_CONTEXT_REG_OFFSET) >> 2);
1320 OUT_RING(0);
1322 /* PS */
1323 OUT_RING(CP_PACKET3(R600_IT_SET_CONTEXT_REG, 1));
1324 OUT_RING((R600_SQ_PGM_START_PS - R600_SET_CONTEXT_REG_OFFSET) >> 2);
1325 OUT_RING((gpu_addr + 256) >> 8);
1327 OUT_RING(CP_PACKET3(R600_IT_SET_CONTEXT_REG, 1));
1328 OUT_RING((R600_SQ_PGM_RESOURCES_PS - R600_SET_CONTEXT_REG_OFFSET) >> 2);
1329 OUT_RING(sq_pgm_resources | (1 << 28));
1331 OUT_RING(CP_PACKET3(R600_IT_SET_CONTEXT_REG, 1));
1332 OUT_RING((R600_SQ_PGM_EXPORTS_PS - R600_SET_CONTEXT_REG_OFFSET) >> 2);
1333 OUT_RING(2);
1335 OUT_RING(CP_PACKET3(R600_IT_SET_CONTEXT_REG, 1));
1336 OUT_RING((R600_SQ_PGM_CF_OFFSET_PS - R600_SET_CONTEXT_REG_OFFSET) >> 2);
1337 OUT_RING(0);
1338 ADVANCE_RING();
1340 cp_set_surface_sync(dev_priv,
1341 R600_SH_ACTION_ENA, 512, gpu_addr);
1344 static inline void
1345 set_vtx_resource(drm_radeon_private_t *dev_priv, u64 gpu_addr)
1347 uint32_t sq_vtx_constant_word2;
1348 RING_LOCALS;
1349 DRM_DEBUG("\n");
1351 sq_vtx_constant_word2 = (((gpu_addr >> 32) & 0xff) | (16 << 8));
1353 BEGIN_RING(9);
1354 OUT_RING(CP_PACKET3(R600_IT_SET_RESOURCE, 7));
1355 OUT_RING(0x460);
1356 OUT_RING(gpu_addr & 0xffffffff);
1357 OUT_RING(48 - 1);
1358 OUT_RING(sq_vtx_constant_word2);
1359 OUT_RING(1 << 0);
1360 OUT_RING(0);
1361 OUT_RING(0);
1362 OUT_RING(R600_SQ_TEX_VTX_VALID_BUFFER << 30);
1363 ADVANCE_RING();
1365 if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV610) ||
1366 ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV620) ||
1367 ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS780) ||
1368 ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS880) ||
1369 ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV710))
1370 cp_set_surface_sync(dev_priv,
1371 R600_TC_ACTION_ENA, 48, gpu_addr);
1372 else
1373 cp_set_surface_sync(dev_priv,
1374 R600_VC_ACTION_ENA, 48, gpu_addr);
1377 static inline void
1378 set_tex_resource(drm_radeon_private_t *dev_priv,
1379 int format, int w, int h, int pitch, u64 gpu_addr)
1381 uint32_t sq_tex_resource_word0, sq_tex_resource_word1, sq_tex_resource_word4;
1382 RING_LOCALS;
1383 DRM_DEBUG("\n");
1385 if (h < 1)
1386 h = 1;
1388 sq_tex_resource_word0 = (1 << 0);
1389 sq_tex_resource_word0 |= ((((pitch >> 3) - 1) << 8) |
1390 ((w - 1) << 19));
1392 sq_tex_resource_word1 = (format << 26);
1393 sq_tex_resource_word1 |= ((h - 1) << 0);
1395 sq_tex_resource_word4 = ((1 << 14) |
1396 (0 << 16) |
1397 (1 << 19) |
1398 (2 << 22) |
1399 (3 << 25));
1401 BEGIN_RING(9);
1402 OUT_RING(CP_PACKET3(R600_IT_SET_RESOURCE, 7));
1403 OUT_RING(0);
1404 OUT_RING(sq_tex_resource_word0);
1405 OUT_RING(sq_tex_resource_word1);
1406 OUT_RING(gpu_addr >> 8);
1407 OUT_RING(gpu_addr >> 8);
1408 OUT_RING(sq_tex_resource_word4);
1409 OUT_RING(0);
1410 OUT_RING(R600_SQ_TEX_VTX_VALID_TEXTURE << 30);
1411 ADVANCE_RING();
1415 static inline void
1416 set_scissors(drm_radeon_private_t *dev_priv, int x1, int y1, int x2, int y2)
1418 RING_LOCALS;
1419 DRM_DEBUG("\n");
1421 BEGIN_RING(12);
1422 OUT_RING(CP_PACKET3(R600_IT_SET_CONTEXT_REG, 2));
1423 OUT_RING((R600_PA_SC_SCREEN_SCISSOR_TL - R600_SET_CONTEXT_REG_OFFSET) >> 2);
1424 OUT_RING((x1 << 0) | (y1 << 16));
1425 OUT_RING((x2 << 0) | (y2 << 16));
1427 OUT_RING(CP_PACKET3(R600_IT_SET_CONTEXT_REG, 2));
1428 OUT_RING((R600_PA_SC_GENERIC_SCISSOR_TL - R600_SET_CONTEXT_REG_OFFSET) >> 2);
1429 OUT_RING((x1 << 0) | (y1 << 16) | (1 << 31));
1430 OUT_RING((x2 << 0) | (y2 << 16));
1432 OUT_RING(CP_PACKET3(R600_IT_SET_CONTEXT_REG, 2));
1433 OUT_RING((R600_PA_SC_WINDOW_SCISSOR_TL - R600_SET_CONTEXT_REG_OFFSET) >> 2);
1434 OUT_RING((x1 << 0) | (y1 << 16) | (1 << 31));
1435 OUT_RING((x2 << 0) | (y2 << 16));
1436 ADVANCE_RING();
1439 static inline void
1440 draw_auto(drm_radeon_private_t *dev_priv)
1442 RING_LOCALS;
1443 DRM_DEBUG("\n");
1445 BEGIN_RING(10);
1446 OUT_RING(CP_PACKET3(R600_IT_SET_CONFIG_REG, 1));
1447 OUT_RING((R600_VGT_PRIMITIVE_TYPE - R600_SET_CONFIG_REG_OFFSET) >> 2);
1448 OUT_RING(DI_PT_RECTLIST);
1450 OUT_RING(CP_PACKET3(R600_IT_INDEX_TYPE, 0));
1451 OUT_RING(DI_INDEX_SIZE_16_BIT);
1453 OUT_RING(CP_PACKET3(R600_IT_NUM_INSTANCES, 0));
1454 OUT_RING(1);
1456 OUT_RING(CP_PACKET3(R600_IT_DRAW_INDEX_AUTO, 1));
1457 OUT_RING(3);
1458 OUT_RING(DI_SRC_SEL_AUTO_INDEX);
1460 ADVANCE_RING();
1461 COMMIT_RING();
1464 static inline void
1465 set_default_state(drm_radeon_private_t *dev_priv)
1467 int default_state_dw, i;
1468 u32 sq_config, sq_gpr_resource_mgmt_1, sq_gpr_resource_mgmt_2;
1469 u32 sq_thread_resource_mgmt, sq_stack_resource_mgmt_1, sq_stack_resource_mgmt_2;
1470 int num_ps_gprs, num_vs_gprs, num_temp_gprs, num_gs_gprs, num_es_gprs;
1471 int num_ps_threads, num_vs_threads, num_gs_threads, num_es_threads;
1472 int num_ps_stack_entries, num_vs_stack_entries, num_gs_stack_entries, num_es_stack_entries;
1473 RING_LOCALS;
1475 switch ((dev_priv->flags & RADEON_FAMILY_MASK)) {
1476 case CHIP_R600:
1477 num_ps_gprs = 192;
1478 num_vs_gprs = 56;
1479 num_temp_gprs = 4;
1480 num_gs_gprs = 0;
1481 num_es_gprs = 0;
1482 num_ps_threads = 136;
1483 num_vs_threads = 48;
1484 num_gs_threads = 4;
1485 num_es_threads = 4;
1486 num_ps_stack_entries = 128;
1487 num_vs_stack_entries = 128;
1488 num_gs_stack_entries = 0;
1489 num_es_stack_entries = 0;
1490 break;
1491 case CHIP_RV630:
1492 case CHIP_RV635:
1493 num_ps_gprs = 84;
1494 num_vs_gprs = 36;
1495 num_temp_gprs = 4;
1496 num_gs_gprs = 0;
1497 num_es_gprs = 0;
1498 num_ps_threads = 144;
1499 num_vs_threads = 40;
1500 num_gs_threads = 4;
1501 num_es_threads = 4;
1502 num_ps_stack_entries = 40;
1503 num_vs_stack_entries = 40;
1504 num_gs_stack_entries = 32;
1505 num_es_stack_entries = 16;
1506 break;
1507 case CHIP_RV610:
1508 case CHIP_RV620:
1509 case CHIP_RS780:
1510 case CHIP_RS880:
1511 default:
1512 num_ps_gprs = 84;
1513 num_vs_gprs = 36;
1514 num_temp_gprs = 4;
1515 num_gs_gprs = 0;
1516 num_es_gprs = 0;
1517 num_ps_threads = 136;
1518 num_vs_threads = 48;
1519 num_gs_threads = 4;
1520 num_es_threads = 4;
1521 num_ps_stack_entries = 40;
1522 num_vs_stack_entries = 40;
1523 num_gs_stack_entries = 32;
1524 num_es_stack_entries = 16;
1525 break;
1526 case CHIP_RV670:
1527 num_ps_gprs = 144;
1528 num_vs_gprs = 40;
1529 num_temp_gprs = 4;
1530 num_gs_gprs = 0;
1531 num_es_gprs = 0;
1532 num_ps_threads = 136;
1533 num_vs_threads = 48;
1534 num_gs_threads = 4;
1535 num_es_threads = 4;
1536 num_ps_stack_entries = 40;
1537 num_vs_stack_entries = 40;
1538 num_gs_stack_entries = 32;
1539 num_es_stack_entries = 16;
1540 break;
1541 case CHIP_RV770:
1542 num_ps_gprs = 192;
1543 num_vs_gprs = 56;
1544 num_temp_gprs = 4;
1545 num_gs_gprs = 0;
1546 num_es_gprs = 0;
1547 num_ps_threads = 188;
1548 num_vs_threads = 60;
1549 num_gs_threads = 0;
1550 num_es_threads = 0;
1551 num_ps_stack_entries = 256;
1552 num_vs_stack_entries = 256;
1553 num_gs_stack_entries = 0;
1554 num_es_stack_entries = 0;
1555 break;
1556 case CHIP_RV730:
1557 case CHIP_RV740:
1558 num_ps_gprs = 84;
1559 num_vs_gprs = 36;
1560 num_temp_gprs = 4;
1561 num_gs_gprs = 0;
1562 num_es_gprs = 0;
1563 num_ps_threads = 188;
1564 num_vs_threads = 60;
1565 num_gs_threads = 0;
1566 num_es_threads = 0;
1567 num_ps_stack_entries = 128;
1568 num_vs_stack_entries = 128;
1569 num_gs_stack_entries = 0;
1570 num_es_stack_entries = 0;
1571 break;
1572 case CHIP_RV710:
1573 num_ps_gprs = 192;
1574 num_vs_gprs = 56;
1575 num_temp_gprs = 4;
1576 num_gs_gprs = 0;
1577 num_es_gprs = 0;
1578 num_ps_threads = 144;
1579 num_vs_threads = 48;
1580 num_gs_threads = 0;
1581 num_es_threads = 0;
1582 num_ps_stack_entries = 128;
1583 num_vs_stack_entries = 128;
1584 num_gs_stack_entries = 0;
1585 num_es_stack_entries = 0;
1586 break;
1589 if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV610) ||
1590 ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV620) ||
1591 ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS780) ||
1592 ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS880) ||
1593 ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV710))
1594 sq_config = 0;
1595 else
1596 sq_config = R600_VC_ENABLE;
1598 sq_config |= (R600_DX9_CONSTS |
1599 R600_ALU_INST_PREFER_VECTOR |
1600 R600_PS_PRIO(0) |
1601 R600_VS_PRIO(1) |
1602 R600_GS_PRIO(2) |
1603 R600_ES_PRIO(3));
1605 sq_gpr_resource_mgmt_1 = (R600_NUM_PS_GPRS(num_ps_gprs) |
1606 R600_NUM_VS_GPRS(num_vs_gprs) |
1607 R600_NUM_CLAUSE_TEMP_GPRS(num_temp_gprs));
1608 sq_gpr_resource_mgmt_2 = (R600_NUM_GS_GPRS(num_gs_gprs) |
1609 R600_NUM_ES_GPRS(num_es_gprs));
1610 sq_thread_resource_mgmt = (R600_NUM_PS_THREADS(num_ps_threads) |
1611 R600_NUM_VS_THREADS(num_vs_threads) |
1612 R600_NUM_GS_THREADS(num_gs_threads) |
1613 R600_NUM_ES_THREADS(num_es_threads));
1614 sq_stack_resource_mgmt_1 = (R600_NUM_PS_STACK_ENTRIES(num_ps_stack_entries) |
1615 R600_NUM_VS_STACK_ENTRIES(num_vs_stack_entries));
1616 sq_stack_resource_mgmt_2 = (R600_NUM_GS_STACK_ENTRIES(num_gs_stack_entries) |
1617 R600_NUM_ES_STACK_ENTRIES(num_es_stack_entries));
1619 if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RV770) {
1620 default_state_dw = sizeof(r7xx_default_state) / 4;
1621 BEGIN_RING(default_state_dw + 10);
1622 for (i = 0; i < default_state_dw; i++)
1623 OUT_RING(r7xx_default_state[i]);
1624 } else {
1625 default_state_dw = sizeof(r6xx_default_state) / 4;
1626 BEGIN_RING(default_state_dw + 10);
1627 for (i = 0; i < default_state_dw; i++)
1628 OUT_RING(r6xx_default_state[i]);
1630 OUT_RING(CP_PACKET3(R600_IT_EVENT_WRITE, 0));
1631 OUT_RING(R600_CACHE_FLUSH_AND_INV_EVENT);
1632 /* SQ config */
1633 OUT_RING(CP_PACKET3(R600_IT_SET_CONFIG_REG, 6));
1634 OUT_RING((R600_SQ_CONFIG - R600_SET_CONFIG_REG_OFFSET) >> 2);
1635 OUT_RING(sq_config);
1636 OUT_RING(sq_gpr_resource_mgmt_1);
1637 OUT_RING(sq_gpr_resource_mgmt_2);
1638 OUT_RING(sq_thread_resource_mgmt);
1639 OUT_RING(sq_stack_resource_mgmt_1);
1640 OUT_RING(sq_stack_resource_mgmt_2);
1641 ADVANCE_RING();
1644 static inline uint32_t i2f(uint32_t input)
1646 u32 result, i, exponent, fraction;
1648 if ((input & 0x3fff) == 0)
1649 result = 0; /* 0 is a special case */
1650 else {
1651 exponent = 140; /* exponent biased by 127; */
1652 fraction = (input & 0x3fff) << 10; /* cheat and only
1653 handle numbers below 2^^15 */
1654 for (i = 0; i < 14; i++) {
1655 if (fraction & 0x800000)
1656 break;
1657 else {
1658 fraction = fraction << 1; /* keep
1659 shifting left until top bit = 1 */
1660 exponent = exponent -1;
1663 result = exponent << 23 | (fraction & 0x7fffff); /* mask
1664 off top bit; assumed 1 */
1666 return result;
1670 r600_prepare_blit_copy(struct drm_device *dev)
1672 drm_radeon_private_t *dev_priv = dev->dev_private;
1673 DRM_DEBUG("\n");
1675 dev_priv->blit_vb = radeon_freelist_get(dev);
1676 if (!dev_priv->blit_vb) {
1677 DRM_ERROR("Unable to allocate vertex buffer for blit\n");
1678 return -EAGAIN;
1681 set_default_state(dev_priv);
1682 set_shaders(dev);
1684 return 0;
1687 void
1688 r600_done_blit_copy(struct drm_device *dev)
1690 drm_radeon_private_t *dev_priv = dev->dev_private;
1691 RING_LOCALS;
1692 DRM_DEBUG("\n");
1694 BEGIN_RING(5);
1695 OUT_RING(CP_PACKET3(R600_IT_EVENT_WRITE, 0));
1696 OUT_RING(R600_CACHE_FLUSH_AND_INV_EVENT);
1697 /* wait for 3D idle clean */
1698 OUT_RING(CP_PACKET3(R600_IT_SET_CONFIG_REG, 1));
1699 OUT_RING((R600_WAIT_UNTIL - R600_SET_CONFIG_REG_OFFSET) >> 2);
1700 OUT_RING(RADEON_WAIT_3D_IDLE | RADEON_WAIT_3D_IDLECLEAN);
1702 ADVANCE_RING();
1703 COMMIT_RING();
1705 dev_priv->blit_vb->used = 0;
1706 radeon_cp_discard_buffer(dev, dev_priv->blit_vb);
1709 void
1710 r600_blit_copy(struct drm_device *dev,
1711 uint64_t src_gpu_addr, uint64_t dst_gpu_addr,
1712 int size_bytes)
1714 drm_radeon_private_t *dev_priv = dev->dev_private;
1715 int max_bytes;
1716 u64 vb_addr;
1717 u32 *vb;
1719 vb = (u32 *) ((char *)dev->agp_buffer_map->handle +
1720 dev_priv->blit_vb->offset + dev_priv->blit_vb->used);
1721 DRM_DEBUG("src=0x%016llx, dst=0x%016llx, size=%d\n",
1722 (unsigned long long)src_gpu_addr,
1723 (unsigned long long)dst_gpu_addr, size_bytes);
1725 if ((size_bytes & 3) || (src_gpu_addr & 3) || (dst_gpu_addr & 3)) {
1726 max_bytes = 8192;
1728 while (size_bytes) {
1729 int cur_size = size_bytes;
1730 int src_x = src_gpu_addr & 255;
1731 int dst_x = dst_gpu_addr & 255;
1732 int h = 1;
1733 src_gpu_addr = src_gpu_addr & ~255;
1734 dst_gpu_addr = dst_gpu_addr & ~255;
1736 if (!src_x && !dst_x) {
1737 h = (cur_size / max_bytes);
1738 if (h > 8192)
1739 h = 8192;
1740 if (h == 0)
1741 h = 1;
1742 else
1743 cur_size = max_bytes;
1744 } else {
1745 if (cur_size > max_bytes)
1746 cur_size = max_bytes;
1747 if (cur_size > (max_bytes - dst_x))
1748 cur_size = (max_bytes - dst_x);
1749 if (cur_size > (max_bytes - src_x))
1750 cur_size = (max_bytes - src_x);
1753 if ((dev_priv->blit_vb->used + 48) > dev_priv->blit_vb->total) {
1754 dev_priv->blit_vb->used = 0;
1755 radeon_cp_discard_buffer(dev, dev_priv->blit_vb);
1756 dev_priv->blit_vb = radeon_freelist_get(dev);
1757 if (!dev_priv->blit_vb)
1758 return;
1759 set_shaders(dev);
1760 vb = (u32 *) ((char *)dev->agp_buffer_map->handle +
1761 dev_priv->blit_vb->offset + dev_priv->blit_vb->used);
1764 vb[0] = i2f(dst_x);
1765 vb[1] = 0;
1766 vb[2] = i2f(src_x);
1767 vb[3] = 0;
1769 vb[4] = i2f(dst_x);
1770 vb[5] = i2f(h);
1771 vb[6] = i2f(src_x);
1772 vb[7] = i2f(h);
1774 vb[8] = i2f(dst_x + cur_size);
1775 vb[9] = i2f(h);
1776 vb[10] = i2f(src_x + cur_size);
1777 vb[11] = i2f(h);
1779 /* src */
1780 set_tex_resource(dev_priv, FMT_8,
1781 src_x + cur_size, h, src_x + cur_size,
1782 src_gpu_addr);
1784 cp_set_surface_sync(dev_priv,
1785 R600_TC_ACTION_ENA, (src_x + cur_size * h), src_gpu_addr);
1787 /* dst */
1788 set_render_target(dev_priv, COLOR_8,
1789 dst_x + cur_size, h,
1790 dst_gpu_addr);
1792 /* scissors */
1793 set_scissors(dev_priv, dst_x, 0, dst_x + cur_size, h);
1795 /* Vertex buffer setup */
1796 vb_addr = dev_priv->gart_buffers_offset +
1797 dev_priv->blit_vb->offset +
1798 dev_priv->blit_vb->used;
1799 set_vtx_resource(dev_priv, vb_addr);
1801 /* draw */
1802 draw_auto(dev_priv);
1804 cp_set_surface_sync(dev_priv,
1805 R600_CB_ACTION_ENA | R600_CB0_DEST_BASE_ENA,
1806 cur_size * h, dst_gpu_addr);
1808 vb += 12;
1809 dev_priv->blit_vb->used += 12 * 4;
1811 src_gpu_addr += cur_size * h;
1812 dst_gpu_addr += cur_size * h;
1813 size_bytes -= cur_size * h;
1815 } else {
1816 max_bytes = 8192 * 4;
1818 while (size_bytes) {
1819 int cur_size = size_bytes;
1820 int src_x = (src_gpu_addr & 255);
1821 int dst_x = (dst_gpu_addr & 255);
1822 int h = 1;
1823 src_gpu_addr = src_gpu_addr & ~255;
1824 dst_gpu_addr = dst_gpu_addr & ~255;
1826 if (!src_x && !dst_x) {
1827 h = (cur_size / max_bytes);
1828 if (h > 8192)
1829 h = 8192;
1830 if (h == 0)
1831 h = 1;
1832 else
1833 cur_size = max_bytes;
1834 } else {
1835 if (cur_size > max_bytes)
1836 cur_size = max_bytes;
1837 if (cur_size > (max_bytes - dst_x))
1838 cur_size = (max_bytes - dst_x);
1839 if (cur_size > (max_bytes - src_x))
1840 cur_size = (max_bytes - src_x);
1843 if ((dev_priv->blit_vb->used + 48) > dev_priv->blit_vb->total) {
1844 dev_priv->blit_vb->used = 0;
1845 radeon_cp_discard_buffer(dev, dev_priv->blit_vb);
1846 dev_priv->blit_vb = radeon_freelist_get(dev);
1847 if (!dev_priv->blit_vb)
1848 return;
1849 set_shaders(dev);
1850 vb = (u32 *) ((char *)dev->agp_buffer_map->handle +
1851 dev_priv->blit_vb->offset + dev_priv->blit_vb->used);
1854 vb[0] = i2f(dst_x / 4);
1855 vb[1] = 0;
1856 vb[2] = i2f(src_x / 4);
1857 vb[3] = 0;
1859 vb[4] = i2f(dst_x / 4);
1860 vb[5] = i2f(h);
1861 vb[6] = i2f(src_x / 4);
1862 vb[7] = i2f(h);
1864 vb[8] = i2f((dst_x + cur_size) / 4);
1865 vb[9] = i2f(h);
1866 vb[10] = i2f((src_x + cur_size) / 4);
1867 vb[11] = i2f(h);
1869 /* src */
1870 set_tex_resource(dev_priv, FMT_8_8_8_8,
1871 (src_x + cur_size) / 4,
1872 h, (src_x + cur_size) / 4,
1873 src_gpu_addr);
1875 cp_set_surface_sync(dev_priv,
1876 R600_TC_ACTION_ENA, (src_x + cur_size * h), src_gpu_addr);
1878 /* dst */
1879 set_render_target(dev_priv, COLOR_8_8_8_8,
1880 (dst_x + cur_size) / 4, h,
1881 dst_gpu_addr);
1883 /* scissors */
1884 set_scissors(dev_priv, (dst_x / 4), 0, (dst_x + cur_size / 4), h);
1886 /* Vertex buffer setup */
1887 vb_addr = dev_priv->gart_buffers_offset +
1888 dev_priv->blit_vb->offset +
1889 dev_priv->blit_vb->used;
1890 set_vtx_resource(dev_priv, vb_addr);
1892 /* draw */
1893 draw_auto(dev_priv);
1895 cp_set_surface_sync(dev_priv,
1896 R600_CB_ACTION_ENA | R600_CB0_DEST_BASE_ENA,
1897 cur_size * h, dst_gpu_addr);
1899 vb += 12;
1900 dev_priv->blit_vb->used += 12 * 4;
1902 src_gpu_addr += cur_size * h;
1903 dst_gpu_addr += cur_size * h;
1904 size_bytes -= cur_size * h;
1909 void
1910 r600_blit_swap(struct drm_device *dev,
1911 uint64_t src_gpu_addr, uint64_t dst_gpu_addr,
1912 int sx, int sy, int dx, int dy,
1913 int w, int h, int src_pitch, int dst_pitch, int cpp)
1915 drm_radeon_private_t *dev_priv = dev->dev_private;
1916 int cb_format, tex_format;
1917 int sx2, sy2, dx2, dy2;
1918 u64 vb_addr;
1919 u32 *vb;
1921 if ((dev_priv->blit_vb->used + 48) > dev_priv->blit_vb->total) {
1922 dev_priv->blit_vb->used = 0;
1923 radeon_cp_discard_buffer(dev, dev_priv->blit_vb);
1924 dev_priv->blit_vb = radeon_freelist_get(dev);
1925 if (!dev_priv->blit_vb)
1926 return;
1927 set_shaders(dev);
1929 vb = (u32 *) ((char *)dev->agp_buffer_map->handle +
1930 dev_priv->blit_vb->offset + dev_priv->blit_vb->used);
1932 sx2 = sx + w;
1933 sy2 = sy + h;
1934 dx2 = dx + w;
1935 dy2 = dy + h;
1937 vb[0] = i2f(dx);
1938 vb[1] = i2f(dy);
1939 vb[2] = i2f(sx);
1940 vb[3] = i2f(sy);
1942 vb[4] = i2f(dx);
1943 vb[5] = i2f(dy2);
1944 vb[6] = i2f(sx);
1945 vb[7] = i2f(sy2);
1947 vb[8] = i2f(dx2);
1948 vb[9] = i2f(dy2);
1949 vb[10] = i2f(sx2);
1950 vb[11] = i2f(sy2);
1952 switch(cpp) {
1953 case 4:
1954 cb_format = COLOR_8_8_8_8;
1955 tex_format = FMT_8_8_8_8;
1956 break;
1957 case 2:
1958 cb_format = COLOR_5_6_5;
1959 tex_format = FMT_5_6_5;
1960 break;
1961 default:
1962 cb_format = COLOR_8;
1963 tex_format = FMT_8;
1964 break;
1967 /* src */
1968 set_tex_resource(dev_priv, tex_format,
1969 src_pitch / cpp,
1970 sy2, src_pitch / cpp,
1971 src_gpu_addr);
1973 cp_set_surface_sync(dev_priv,
1974 R600_TC_ACTION_ENA, src_pitch * sy2, src_gpu_addr);
1976 /* dst */
1977 set_render_target(dev_priv, cb_format,
1978 dst_pitch / cpp, dy2,
1979 dst_gpu_addr);
1981 /* scissors */
1982 set_scissors(dev_priv, dx, dy, dx2, dy2);
1984 /* Vertex buffer setup */
1985 vb_addr = dev_priv->gart_buffers_offset +
1986 dev_priv->blit_vb->offset +
1987 dev_priv->blit_vb->used;
1988 set_vtx_resource(dev_priv, vb_addr);
1990 /* draw */
1991 draw_auto(dev_priv);
1993 cp_set_surface_sync(dev_priv,
1994 R600_CB_ACTION_ENA | R600_CB0_DEST_BASE_ENA,
1995 dst_pitch * dy2, dst_gpu_addr);
1997 dev_priv->blit_vb->used += 12 * 4;