Rev 1179 | Rev 1246 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1179 | Rev 1221 | ||
---|---|---|---|
Line 31... | Line 31... | ||
31 | #include "radeon_reg.h" |
31 | #include "radeon_reg.h" |
32 | #include "radeon.h" |
32 | #include "radeon.h" |
33 | #include "radeon_drm.h" |
33 | #include "radeon_drm.h" |
Line 34... | Line 34... | ||
34 | 34 | ||
35 | #include "r300d.h" |
- | |
- | 35 | #include "r300d.h" |
|
36 | 36 | #include "rv350d.h" |
|
Line 37... | Line -... | ||
37 | #include "r300_reg_safe.h" |
- | |
38 | - | ||
39 | /* r300,r350,rv350,rv370,rv380 depends on : */ |
- | |
40 | void r100_hdp_reset(struct radeon_device *rdev); |
- | |
41 | int r100_cp_reset(struct radeon_device *rdev); |
- | |
42 | int r100_rb2d_reset(struct radeon_device *rdev); |
- | |
43 | int r100_cp_init(struct radeon_device *rdev, unsigned ring_size); |
- | |
44 | int r100_pci_gart_enable(struct radeon_device *rdev); |
- | |
45 | void r100_mc_setup(struct radeon_device *rdev); |
- | |
46 | void r100_mc_disable_clients(struct radeon_device *rdev); |
- | |
47 | int r100_gui_wait_for_idle(struct radeon_device *rdev); |
- | |
48 | int r100_cs_packet_parse(struct radeon_cs_parser *p, |
- | |
49 | struct radeon_cs_packet *pkt, |
- | |
50 | unsigned idx); |
- | |
51 | int r100_cs_packet_parse_vline(struct radeon_cs_parser *p); |
- | |
52 | int r100_cs_parse_packet0(struct radeon_cs_parser *p, |
- | |
53 | struct radeon_cs_packet *pkt, |
- | |
54 | const unsigned *auth, unsigned n, |
- | |
55 | radeon_packet0_check_t check); |
- | |
56 | int r100_cs_track_check_pkt3_indx_buffer(struct radeon_cs_parser *p, |
- | |
57 | struct radeon_cs_packet *pkt, |
- | |
58 | struct radeon_object *robj); |
37 | #include "r300_reg_safe.h" |
59 | - | ||
60 | /* This files gather functions specifics to: |
- | |
61 | * r300,r350,rv350,rv370,rv380 |
- | |
62 | * |
- | |
63 | * Some of these functions might be used by newer ASICs. |
- | |
64 | */ |
- | |
65 | void r300_gpu_init(struct radeon_device *rdev); |
- | |
66 | int r300_mc_wait_for_idle(struct radeon_device *rdev); |
- | |
Line 67... | Line 38... | ||
67 | int rv370_debugfs_pcie_gart_info_init(struct radeon_device *rdev); |
38 | |
68 | 39 | /* This files gather functions specifics to: r300,r350,rv350,rv370,rv380 */ |
|
69 | 40 | ||
- | 41 | /* |
|
- | 42 | * rv370,rv380 PCIE GART |
|
70 | /* |
43 | */ |
71 | * rv370,rv380 PCIE GART |
44 | static int rv370_debugfs_pcie_gart_info_init(struct radeon_device *rdev); |
72 | */ |
45 | |
73 | void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev) |
46 | void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev) |
Line 180... | Line 153... | ||
180 | rv370_pcie_gart_disable(rdev); |
153 | rv370_pcie_gart_disable(rdev); |
181 | radeon_gart_table_vram_free(rdev); |
154 | radeon_gart_table_vram_free(rdev); |
182 | radeon_gart_fini(rdev); |
155 | radeon_gart_fini(rdev); |
183 | } |
156 | } |
Line 184... | Line -... | ||
184 | - | ||
185 | /* |
- | |
186 | * MC |
- | |
187 | */ |
- | |
188 | int r300_mc_init(struct radeon_device *rdev) |
- | |
189 | { |
- | |
190 | int r; |
- | |
191 | - | ||
192 | if (r100_debugfs_rbbm_init(rdev)) { |
- | |
193 | DRM_ERROR("Failed to register debugfs file for RBBM !\n"); |
- | |
194 | } |
- | |
195 | - | ||
196 | r300_gpu_init(rdev); |
- | |
197 | r100_pci_gart_disable(rdev); |
- | |
198 | if (rdev->flags & RADEON_IS_PCIE) { |
- | |
199 | rv370_pcie_gart_disable(rdev); |
- | |
200 | } |
- | |
201 | - | ||
202 | /* Setup GPU memory space */ |
- | |
203 | rdev->mc.vram_location = 0xFFFFFFFFUL; |
- | |
204 | rdev->mc.gtt_location = 0xFFFFFFFFUL; |
- | |
205 | r = radeon_mc_setup(rdev); |
- | |
206 | if (r) { |
- | |
207 | return r; |
- | |
208 | } |
- | |
209 | - | ||
210 | /* Program GPU memory space */ |
- | |
211 | r100_mc_disable_clients(rdev); |
- | |
212 | if (r300_mc_wait_for_idle(rdev)) { |
- | |
213 | printk(KERN_WARNING "Failed to wait MC idle while " |
- | |
214 | "programming pipes. Bad things might happen.\n"); |
- | |
215 | } |
- | |
216 | r100_mc_setup(rdev); |
- | |
217 | return 0; |
- | |
218 | } |
- | |
219 | - | ||
220 | void r300_mc_fini(struct radeon_device *rdev) |
- | |
221 | { |
- | |
222 | } |
- | |
223 | - | ||
224 | - | ||
225 | /* |
- | |
226 | * Fence emission |
- | |
227 | */ |
157 | |
228 | void r300_fence_ring_emit(struct radeon_device *rdev, |
158 | void r300_fence_ring_emit(struct radeon_device *rdev, |
229 | struct radeon_fence *fence) |
159 | struct radeon_fence *fence) |
230 | { |
160 | { |
231 | /* Who ever call radeon_fence_emit should call ring_lock and ask |
161 | /* Who ever call radeon_fence_emit should call ring_lock and ask |
Line 251... | Line 181... | ||
251 | } |
181 | } |
Line 252... | Line 182... | ||
252 | 182 | ||
Line 253... | Line 183... | ||
253 | 183 | ||
254 | #if 0 |
- | |
255 | - | ||
256 | /* |
184 | #if 0 |
257 | * Global GPU functions |
185 | |
258 | */ |
186 | |
259 | int r300_copy_dma(struct radeon_device *rdev, |
187 | int r300_copy_dma(struct radeon_device *rdev, |
260 | uint64_t src_offset, |
188 | uint64_t src_offset, |
Line 574... | Line 502... | ||
574 | } |
502 | } |
Line 575... | Line 503... | ||
575 | 503 | ||
576 | r100_vram_init_sizes(rdev); |
504 | r100_vram_init_sizes(rdev); |
Line 577... | Line -... | ||
577 | } |
- | |
578 | - | ||
579 | - | ||
580 | /* |
- | |
581 | * PCIE Lanes |
- | |
582 | */ |
505 | } |
583 | 506 | ||
584 | void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes) |
507 | void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes) |
Line 585... | Line 508... | ||
585 | { |
508 | { |
Line 638... | Line 561... | ||
638 | while (link_width_cntl == 0xffffffff) |
561 | while (link_width_cntl == 0xffffffff) |
639 | link_width_cntl = RREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL); |
562 | link_width_cntl = RREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL); |
Line 640... | Line 563... | ||
640 | 563 | ||
Line 641... | Line -... | ||
641 | } |
- | |
642 | - | ||
643 | - | ||
644 | /* |
- | |
645 | * Debugfs info |
564 | } |
646 | */ |
565 | |
647 | #if defined(CONFIG_DEBUG_FS) |
566 | #if defined(CONFIG_DEBUG_FS) |
648 | static int rv370_debugfs_pcie_gart_info(struct seq_file *m, void *data) |
567 | static int rv370_debugfs_pcie_gart_info(struct seq_file *m, void *data) |
649 | { |
568 | { |
Line 672... | Line 591... | ||
672 | static struct drm_info_list rv370_pcie_gart_info_list[] = { |
591 | static struct drm_info_list rv370_pcie_gart_info_list[] = { |
673 | {"rv370_pcie_gart_info", rv370_debugfs_pcie_gart_info, 0, NULL}, |
592 | {"rv370_pcie_gart_info", rv370_debugfs_pcie_gart_info, 0, NULL}, |
674 | }; |
593 | }; |
675 | #endif |
594 | #endif |
Line 676... | Line 595... | ||
676 | 595 | ||
677 | int rv370_debugfs_pcie_gart_info_init(struct radeon_device *rdev) |
596 | static int rv370_debugfs_pcie_gart_info_init(struct radeon_device *rdev) |
678 | { |
597 | { |
679 | #if defined(CONFIG_DEBUG_FS) |
598 | #if defined(CONFIG_DEBUG_FS) |
680 | return radeon_debugfs_add_files(rdev, rv370_pcie_gart_info_list, 1); |
599 | return radeon_debugfs_add_files(rdev, rv370_pcie_gart_info_list, 1); |
681 | #else |
600 | #else |
682 | return 0; |
601 | return 0; |
683 | #endif |
602 | #endif |
Line 684... | Line 603... | ||
684 | } |
603 | } |
685 | 604 | ||
686 | - | ||
687 | #if 0 |
- | |
688 | /* |
605 | |
689 | * CS functions |
606 | #if 0 |
690 | */ |
607 | |
691 | static int r300_packet0_check(struct radeon_cs_parser *p, |
608 | static int r300_packet0_check(struct radeon_cs_parser *p, |
692 | struct radeon_cs_packet *pkt, |
- | |
693 | unsigned idx, unsigned reg) |
609 | struct radeon_cs_packet *pkt, |
694 | { |
610 | unsigned idx, unsigned reg) |
695 | struct radeon_cs_chunk *ib_chunk; |
611 | { |
696 | struct radeon_cs_reloc *reloc; |
612 | struct radeon_cs_reloc *reloc; |
697 | struct r100_cs_track *track; |
613 | struct r100_cs_track *track; |
698 | volatile uint32_t *ib; |
614 | volatile uint32_t *ib; |
- | 615 | uint32_t tmp, tile_flags = 0; |
|
Line 699... | Line 616... | ||
699 | uint32_t tmp, tile_flags = 0; |
616 | unsigned i; |
700 | unsigned i; |
- | |
701 | int r; |
617 | int r; |
- | 618 | u32 idx_value; |
|
- | 619 | ||
702 | 620 | ib = p->ib->ptr; |
|
703 | ib = p->ib->ptr; |
621 | track = (struct r100_cs_track *)p->track; |
704 | ib_chunk = &p->chunks[p->chunk_ib_idx]; |
622 | idx_value = radeon_get_ib_value(p, idx); |
705 | track = (struct r100_cs_track *)p->track; |
623 | |
706 | switch(reg) { |
624 | switch(reg) { |
Line 731... | Line 649... | ||
731 | idx, reg); |
649 | idx, reg); |
732 | r100_cs_dump_packet(p, pkt); |
650 | r100_cs_dump_packet(p, pkt); |
733 | return r; |
651 | return r; |
734 | } |
652 | } |
735 | track->cb[i].robj = reloc->robj; |
653 | track->cb[i].robj = reloc->robj; |
736 | track->cb[i].offset = ib_chunk->kdata[idx]; |
654 | track->cb[i].offset = idx_value; |
737 | ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset); |
655 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
738 | break; |
656 | break; |
739 | case R300_ZB_DEPTHOFFSET: |
657 | case R300_ZB_DEPTHOFFSET: |
740 | r = r100_cs_packet_next_reloc(p, &reloc); |
658 | r = r100_cs_packet_next_reloc(p, &reloc); |
741 | if (r) { |
659 | if (r) { |
742 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
660 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
743 | idx, reg); |
661 | idx, reg); |
744 | r100_cs_dump_packet(p, pkt); |
662 | r100_cs_dump_packet(p, pkt); |
745 | return r; |
663 | return r; |
746 | } |
664 | } |
747 | track->zb.robj = reloc->robj; |
665 | track->zb.robj = reloc->robj; |
748 | track->zb.offset = ib_chunk->kdata[idx]; |
666 | track->zb.offset = idx_value; |
749 | ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset); |
667 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
750 | break; |
668 | break; |
751 | case R300_TX_OFFSET_0: |
669 | case R300_TX_OFFSET_0: |
752 | case R300_TX_OFFSET_0+4: |
670 | case R300_TX_OFFSET_0+4: |
753 | case R300_TX_OFFSET_0+8: |
671 | case R300_TX_OFFSET_0+8: |
754 | case R300_TX_OFFSET_0+12: |
672 | case R300_TX_OFFSET_0+12: |
Line 770... | Line 688... | ||
770 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
688 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
771 | idx, reg); |
689 | idx, reg); |
772 | r100_cs_dump_packet(p, pkt); |
690 | r100_cs_dump_packet(p, pkt); |
773 | return r; |
691 | return r; |
774 | } |
692 | } |
775 | ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset); |
693 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
776 | track->textures[i].robj = reloc->robj; |
694 | track->textures[i].robj = reloc->robj; |
777 | break; |
695 | break; |
778 | /* Tracked registers */ |
696 | /* Tracked registers */ |
779 | case 0x2084: |
697 | case 0x2084: |
780 | /* VAP_VF_CNTL */ |
698 | /* VAP_VF_CNTL */ |
781 | track->vap_vf_cntl = ib_chunk->kdata[idx]; |
699 | track->vap_vf_cntl = idx_value; |
782 | break; |
700 | break; |
783 | case 0x20B4: |
701 | case 0x20B4: |
784 | /* VAP_VTX_SIZE */ |
702 | /* VAP_VTX_SIZE */ |
785 | track->vtx_size = ib_chunk->kdata[idx] & 0x7F; |
703 | track->vtx_size = idx_value & 0x7F; |
786 | break; |
704 | break; |
787 | case 0x2134: |
705 | case 0x2134: |
788 | /* VAP_VF_MAX_VTX_INDX */ |
706 | /* VAP_VF_MAX_VTX_INDX */ |
789 | track->max_indx = ib_chunk->kdata[idx] & 0x00FFFFFFUL; |
707 | track->max_indx = idx_value & 0x00FFFFFFUL; |
790 | break; |
708 | break; |
791 | case 0x43E4: |
709 | case 0x43E4: |
792 | /* SC_SCISSOR1 */ |
710 | /* SC_SCISSOR1 */ |
793 | track->maxy = ((ib_chunk->kdata[idx] >> 13) & 0x1FFF) + 1; |
711 | track->maxy = ((idx_value >> 13) & 0x1FFF) + 1; |
794 | if (p->rdev->family < CHIP_RV515) { |
712 | if (p->rdev->family < CHIP_RV515) { |
795 | track->maxy -= 1440; |
713 | track->maxy -= 1440; |
796 | } |
714 | } |
797 | break; |
715 | break; |
798 | case 0x4E00: |
716 | case 0x4E00: |
799 | /* RB3D_CCTL */ |
717 | /* RB3D_CCTL */ |
800 | track->num_cb = ((ib_chunk->kdata[idx] >> 5) & 0x3) + 1; |
718 | track->num_cb = ((idx_value >> 5) & 0x3) + 1; |
801 | break; |
719 | break; |
802 | case 0x4E38: |
720 | case 0x4E38: |
803 | case 0x4E3C: |
721 | case 0x4E3C: |
804 | case 0x4E40: |
722 | case 0x4E40: |
805 | case 0x4E44: |
723 | case 0x4E44: |
Line 818... | Line 736... | ||
818 | if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) |
736 | if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) |
819 | tile_flags |= R300_COLOR_TILE_ENABLE; |
737 | tile_flags |= R300_COLOR_TILE_ENABLE; |
820 | if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) |
738 | if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) |
821 | tile_flags |= R300_COLOR_MICROTILE_ENABLE; |
739 | tile_flags |= R300_COLOR_MICROTILE_ENABLE; |
Line 822... | Line 740... | ||
822 | 740 | ||
823 | tmp = ib_chunk->kdata[idx] & ~(0x7 << 16); |
741 | tmp = idx_value & ~(0x7 << 16); |
824 | tmp |= tile_flags; |
742 | tmp |= tile_flags; |
Line 825... | Line 743... | ||
825 | ib[idx] = tmp; |
743 | ib[idx] = tmp; |
826 | 744 | ||
827 | i = (reg - 0x4E38) >> 2; |
745 | i = (reg - 0x4E38) >> 2; |
828 | track->cb[i].pitch = ib_chunk->kdata[idx] & 0x3FFE; |
746 | track->cb[i].pitch = idx_value & 0x3FFE; |
829 | switch (((ib_chunk->kdata[idx] >> 21) & 0xF)) { |
747 | switch (((idx_value >> 21) & 0xF)) { |
830 | case 9: |
748 | case 9: |
831 | case 11: |
749 | case 11: |
832 | case 12: |
750 | case 12: |
Line 847... | Line 765... | ||
847 | case 7: |
765 | case 7: |
848 | track->cb[i].cpp = 16; |
766 | track->cb[i].cpp = 16; |
849 | break; |
767 | break; |
850 | default: |
768 | default: |
851 | DRM_ERROR("Invalid color buffer format (%d) !\n", |
769 | DRM_ERROR("Invalid color buffer format (%d) !\n", |
852 | ((ib_chunk->kdata[idx] >> 21) & 0xF)); |
770 | ((idx_value >> 21) & 0xF)); |
853 | return -EINVAL; |
771 | return -EINVAL; |
854 | } |
772 | } |
855 | break; |
773 | break; |
856 | case 0x4F00: |
774 | case 0x4F00: |
857 | /* ZB_CNTL */ |
775 | /* ZB_CNTL */ |
858 | if (ib_chunk->kdata[idx] & 2) { |
776 | if (idx_value & 2) { |
859 | track->z_enabled = true; |
777 | track->z_enabled = true; |
860 | } else { |
778 | } else { |
861 | track->z_enabled = false; |
779 | track->z_enabled = false; |
862 | } |
780 | } |
863 | break; |
781 | break; |
864 | case 0x4F10: |
782 | case 0x4F10: |
865 | /* ZB_FORMAT */ |
783 | /* ZB_FORMAT */ |
866 | switch ((ib_chunk->kdata[idx] & 0xF)) { |
784 | switch ((idx_value & 0xF)) { |
867 | case 0: |
785 | case 0: |
868 | case 1: |
786 | case 1: |
869 | track->zb.cpp = 2; |
787 | track->zb.cpp = 2; |
870 | break; |
788 | break; |
871 | case 2: |
789 | case 2: |
872 | track->zb.cpp = 4; |
790 | track->zb.cpp = 4; |
873 | break; |
791 | break; |
874 | default: |
792 | default: |
875 | DRM_ERROR("Invalid z buffer format (%d) !\n", |
793 | DRM_ERROR("Invalid z buffer format (%d) !\n", |
876 | (ib_chunk->kdata[idx] & 0xF)); |
794 | (idx_value & 0xF)); |
877 | return -EINVAL; |
795 | return -EINVAL; |
878 | } |
796 | } |
879 | break; |
797 | break; |
880 | case 0x4F24: |
798 | case 0x4F24: |
881 | /* ZB_DEPTHPITCH */ |
799 | /* ZB_DEPTHPITCH */ |
Line 890... | Line 808... | ||
890 | if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) |
808 | if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) |
891 | tile_flags |= R300_DEPTHMACROTILE_ENABLE; |
809 | tile_flags |= R300_DEPTHMACROTILE_ENABLE; |
892 | if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) |
810 | if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) |
893 | tile_flags |= R300_DEPTHMICROTILE_TILED;; |
811 | tile_flags |= R300_DEPTHMICROTILE_TILED;; |
Line 894... | Line 812... | ||
894 | 812 | ||
895 | tmp = ib_chunk->kdata[idx] & ~(0x7 << 16); |
813 | tmp = idx_value & ~(0x7 << 16); |
896 | tmp |= tile_flags; |
814 | tmp |= tile_flags; |
Line 897... | Line 815... | ||
897 | ib[idx] = tmp; |
815 | ib[idx] = tmp; |
898 | 816 | ||
899 | track->zb.pitch = ib_chunk->kdata[idx] & 0x3FFC; |
817 | track->zb.pitch = idx_value & 0x3FFC; |
900 | break; |
818 | break; |
901 | case 0x4104: |
819 | case 0x4104: |
Line 902... | Line 820... | ||
902 | for (i = 0; i < 16; i++) { |
820 | for (i = 0; i < 16; i++) { |
903 | bool enabled; |
821 | bool enabled; |
904 | 822 | ||
905 | enabled = !!(ib_chunk->kdata[idx] & (1 << i)); |
823 | enabled = !!(idx_value & (1 << i)); |
906 | track->textures[i].enabled = enabled; |
824 | track->textures[i].enabled = enabled; |
907 | } |
825 | } |
Line 922... | Line 840... | ||
922 | case 0x44F4: |
840 | case 0x44F4: |
923 | case 0x44F8: |
841 | case 0x44F8: |
924 | case 0x44FC: |
842 | case 0x44FC: |
925 | /* TX_FORMAT1_[0-15] */ |
843 | /* TX_FORMAT1_[0-15] */ |
926 | i = (reg - 0x44C0) >> 2; |
844 | i = (reg - 0x44C0) >> 2; |
927 | tmp = (ib_chunk->kdata[idx] >> 25) & 0x3; |
845 | tmp = (idx_value >> 25) & 0x3; |
928 | track->textures[i].tex_coord_type = tmp; |
846 | track->textures[i].tex_coord_type = tmp; |
929 | switch ((ib_chunk->kdata[idx] & 0x1F)) { |
847 | switch ((idx_value & 0x1F)) { |
930 | case R300_TX_FORMAT_X8: |
848 | case R300_TX_FORMAT_X8: |
931 | case R300_TX_FORMAT_Y4X4: |
849 | case R300_TX_FORMAT_Y4X4: |
932 | case R300_TX_FORMAT_Z3Y3X2: |
850 | case R300_TX_FORMAT_Z3Y3X2: |
933 | track->textures[i].cpp = 1; |
851 | track->textures[i].cpp = 1; |
934 | break; |
852 | break; |
Line 964... | Line 882... | ||
964 | case R300_TX_FORMAT_FL_R32G32B32A32: |
882 | case R300_TX_FORMAT_FL_R32G32B32A32: |
965 | track->textures[i].cpp = 16; |
883 | track->textures[i].cpp = 16; |
966 | break; |
884 | break; |
967 | default: |
885 | default: |
968 | DRM_ERROR("Invalid texture format %u\n", |
886 | DRM_ERROR("Invalid texture format %u\n", |
969 | (ib_chunk->kdata[idx] & 0x1F)); |
887 | (idx_value & 0x1F)); |
970 | return -EINVAL; |
888 | return -EINVAL; |
971 | break; |
889 | break; |
972 | } |
890 | } |
973 | break; |
891 | break; |
974 | case 0x4400: |
892 | case 0x4400: |
Line 987... | Line 905... | ||
987 | case 0x4434: |
905 | case 0x4434: |
988 | case 0x4438: |
906 | case 0x4438: |
989 | case 0x443C: |
907 | case 0x443C: |
990 | /* TX_FILTER0_[0-15] */ |
908 | /* TX_FILTER0_[0-15] */ |
991 | i = (reg - 0x4400) >> 2; |
909 | i = (reg - 0x4400) >> 2; |
992 | tmp = ib_chunk->kdata[idx] & 0x7; |
910 | tmp = idx_value & 0x7; |
993 | if (tmp == 2 || tmp == 4 || tmp == 6) { |
911 | if (tmp == 2 || tmp == 4 || tmp == 6) { |
994 | track->textures[i].roundup_w = false; |
912 | track->textures[i].roundup_w = false; |
995 | } |
913 | } |
996 | tmp = (ib_chunk->kdata[idx] >> 3) & 0x7; |
914 | tmp = (idx_value >> 3) & 0x7; |
997 | if (tmp == 2 || tmp == 4 || tmp == 6) { |
915 | if (tmp == 2 || tmp == 4 || tmp == 6) { |
998 | track->textures[i].roundup_h = false; |
916 | track->textures[i].roundup_h = false; |
999 | } |
917 | } |
1000 | break; |
918 | break; |
1001 | case 0x4500: |
919 | case 0x4500: |
Line 1014... | Line 932... | ||
1014 | case 0x4534: |
932 | case 0x4534: |
1015 | case 0x4538: |
933 | case 0x4538: |
1016 | case 0x453C: |
934 | case 0x453C: |
1017 | /* TX_FORMAT2_[0-15] */ |
935 | /* TX_FORMAT2_[0-15] */ |
1018 | i = (reg - 0x4500) >> 2; |
936 | i = (reg - 0x4500) >> 2; |
1019 | tmp = ib_chunk->kdata[idx] & 0x3FFF; |
937 | tmp = idx_value & 0x3FFF; |
1020 | track->textures[i].pitch = tmp + 1; |
938 | track->textures[i].pitch = tmp + 1; |
1021 | if (p->rdev->family >= CHIP_RV515) { |
939 | if (p->rdev->family >= CHIP_RV515) { |
1022 | tmp = ((ib_chunk->kdata[idx] >> 15) & 1) << 11; |
940 | tmp = ((idx_value >> 15) & 1) << 11; |
1023 | track->textures[i].width_11 = tmp; |
941 | track->textures[i].width_11 = tmp; |
1024 | tmp = ((ib_chunk->kdata[idx] >> 16) & 1) << 11; |
942 | tmp = ((idx_value >> 16) & 1) << 11; |
1025 | track->textures[i].height_11 = tmp; |
943 | track->textures[i].height_11 = tmp; |
1026 | } |
944 | } |
1027 | break; |
945 | break; |
1028 | case 0x4480: |
946 | case 0x4480: |
1029 | case 0x4484: |
947 | case 0x4484: |
Line 1041... | Line 959... | ||
1041 | case 0x44B4: |
959 | case 0x44B4: |
1042 | case 0x44B8: |
960 | case 0x44B8: |
1043 | case 0x44BC: |
961 | case 0x44BC: |
1044 | /* TX_FORMAT0_[0-15] */ |
962 | /* TX_FORMAT0_[0-15] */ |
1045 | i = (reg - 0x4480) >> 2; |
963 | i = (reg - 0x4480) >> 2; |
1046 | tmp = ib_chunk->kdata[idx] & 0x7FF; |
964 | tmp = idx_value & 0x7FF; |
1047 | track->textures[i].width = tmp + 1; |
965 | track->textures[i].width = tmp + 1; |
1048 | tmp = (ib_chunk->kdata[idx] >> 11) & 0x7FF; |
966 | tmp = (idx_value >> 11) & 0x7FF; |
1049 | track->textures[i].height = tmp + 1; |
967 | track->textures[i].height = tmp + 1; |
1050 | tmp = (ib_chunk->kdata[idx] >> 26) & 0xF; |
968 | tmp = (idx_value >> 26) & 0xF; |
1051 | track->textures[i].num_levels = tmp; |
969 | track->textures[i].num_levels = tmp; |
1052 | tmp = ib_chunk->kdata[idx] & (1 << 31); |
970 | tmp = idx_value & (1 << 31); |
1053 | track->textures[i].use_pitch = !!tmp; |
971 | track->textures[i].use_pitch = !!tmp; |
1054 | tmp = (ib_chunk->kdata[idx] >> 22) & 0xF; |
972 | tmp = (idx_value >> 22) & 0xF; |
1055 | track->textures[i].txdepth = tmp; |
973 | track->textures[i].txdepth = tmp; |
1056 | break; |
974 | break; |
1057 | case R300_ZB_ZPASS_ADDR: |
975 | case R300_ZB_ZPASS_ADDR: |
1058 | r = r100_cs_packet_next_reloc(p, &reloc); |
976 | r = r100_cs_packet_next_reloc(p, &reloc); |
1059 | if (r) { |
977 | if (r) { |
1060 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
978 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
1061 | idx, reg); |
979 | idx, reg); |
1062 | r100_cs_dump_packet(p, pkt); |
980 | r100_cs_dump_packet(p, pkt); |
1063 | return r; |
981 | return r; |
1064 | } |
982 | } |
1065 | ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset); |
983 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
1066 | break; |
984 | break; |
1067 | case 0x4be8: |
985 | case 0x4be8: |
1068 | /* valid register only on RV530 */ |
986 | /* valid register only on RV530 */ |
1069 | if (p->rdev->family == CHIP_RV530) |
987 | if (p->rdev->family == CHIP_RV530) |
1070 | break; |
988 | break; |
Line 1078... | Line 996... | ||
1078 | } |
996 | } |
Line 1079... | Line 997... | ||
1079 | 997 | ||
1080 | static int r300_packet3_check(struct radeon_cs_parser *p, |
998 | static int r300_packet3_check(struct radeon_cs_parser *p, |
1081 | struct radeon_cs_packet *pkt) |
999 | struct radeon_cs_packet *pkt) |
1082 | { |
- | |
1083 | struct radeon_cs_chunk *ib_chunk; |
- | |
1084 | 1000 | { |
|
1085 | struct radeon_cs_reloc *reloc; |
1001 | struct radeon_cs_reloc *reloc; |
1086 | struct r100_cs_track *track; |
1002 | struct r100_cs_track *track; |
1087 | volatile uint32_t *ib; |
1003 | volatile uint32_t *ib; |
1088 | unsigned idx; |
- | |
1089 | unsigned i, c; |
1004 | unsigned idx; |
Line 1090... | Line 1005... | ||
1090 | int r; |
1005 | int r; |
1091 | - | ||
1092 | ib = p->ib->ptr; |
1006 | |
1093 | ib_chunk = &p->chunks[p->chunk_ib_idx]; |
1007 | ib = p->ib->ptr; |
1094 | idx = pkt->idx + 1; |
1008 | idx = pkt->idx + 1; |
1095 | track = (struct r100_cs_track *)p->track; |
1009 | track = (struct r100_cs_track *)p->track; |
1096 | switch(pkt->opcode) { |
- | |
1097 | case PACKET3_3D_LOAD_VBPNTR: |
- | |
1098 | c = ib_chunk->kdata[idx++] & 0x1F; |
- | |
1099 | track->num_arrays = c; |
1010 | switch(pkt->opcode) { |
1100 | for (i = 0; i < (c - 1); i+=2, idx+=3) { |
- | |
1101 | r = r100_cs_packet_next_reloc(p, &reloc); |
- | |
1102 | if (r) { |
- | |
1103 | DRM_ERROR("No reloc for packet3 %d\n", |
- | |
1104 | pkt->opcode); |
- | |
1105 | r100_cs_dump_packet(p, pkt); |
- | |
1106 | return r; |
- | |
1107 | } |
- | |
1108 | ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset); |
- | |
1109 | track->arrays[i + 0].robj = reloc->robj; |
- | |
1110 | track->arrays[i + 0].esize = ib_chunk->kdata[idx] >> 8; |
- | |
1111 | track->arrays[i + 0].esize &= 0x7F; |
- | |
1112 | r = r100_cs_packet_next_reloc(p, &reloc); |
- | |
1113 | if (r) { |
- | |
1114 | DRM_ERROR("No reloc for packet3 %d\n", |
- | |
1115 | pkt->opcode); |
- | |
1116 | r100_cs_dump_packet(p, pkt); |
- | |
1117 | return r; |
- | |
1118 | } |
- | |
1119 | ib[idx+2] = ib_chunk->kdata[idx+2] + ((u32)reloc->lobj.gpu_offset); |
- | |
1120 | track->arrays[i + 1].robj = reloc->robj; |
- | |
1121 | track->arrays[i + 1].esize = ib_chunk->kdata[idx] >> 24; |
- | |
1122 | track->arrays[i + 1].esize &= 0x7F; |
- | |
1123 | } |
- | |
1124 | if (c & 1) { |
1011 | case PACKET3_3D_LOAD_VBPNTR: |
1125 | r = r100_cs_packet_next_reloc(p, &reloc); |
- | |
1126 | if (r) { |
- | |
1127 | DRM_ERROR("No reloc for packet3 %d\n", |
- | |
1128 | pkt->opcode); |
1012 | r = r100_packet3_load_vbpntr(p, pkt, idx); |
1129 | r100_cs_dump_packet(p, pkt); |
- | |
1130 | return r; |
- | |
1131 | } |
- | |
1132 | ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset); |
- | |
1133 | track->arrays[i + 0].robj = reloc->robj; |
- | |
1134 | track->arrays[i + 0].esize = ib_chunk->kdata[idx] >> 8; |
- | |
1135 | track->arrays[i + 0].esize &= 0x7F; |
1013 | if (r) |
1136 | } |
1014 | return r; |
1137 | break; |
1015 | break; |
1138 | case PACKET3_INDX_BUFFER: |
1016 | case PACKET3_INDX_BUFFER: |
1139 | r = r100_cs_packet_next_reloc(p, &reloc); |
1017 | r = r100_cs_packet_next_reloc(p, &reloc); |
1140 | if (r) { |
1018 | if (r) { |
1141 | DRM_ERROR("No reloc for packet3 %d\n", pkt->opcode); |
1019 | DRM_ERROR("No reloc for packet3 %d\n", pkt->opcode); |
1142 | r100_cs_dump_packet(p, pkt); |
1020 | r100_cs_dump_packet(p, pkt); |
1143 | return r; |
1021 | return r; |
1144 | } |
1022 | } |
1145 | ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset); |
1023 | ib[idx+1] = radeon_get_ib_value(p, idx + 1) + ((u32)reloc->lobj.gpu_offset); |
1146 | r = r100_cs_track_check_pkt3_indx_buffer(p, pkt, reloc->robj); |
1024 | r = r100_cs_track_check_pkt3_indx_buffer(p, pkt, reloc->robj); |
1147 | if (r) { |
1025 | if (r) { |
1148 | return r; |
1026 | return r; |
1149 | } |
1027 | } |
1150 | break; |
1028 | break; |
1151 | /* Draw packet */ |
1029 | /* Draw packet */ |
1152 | case PACKET3_3D_DRAW_IMMD: |
1030 | case PACKET3_3D_DRAW_IMMD: |
1153 | /* Number of dwords is vtx_size * (num_vertices - 1) |
1031 | /* Number of dwords is vtx_size * (num_vertices - 1) |
1154 | * PRIM_WALK must be equal to 3 vertex data in embedded |
1032 | * PRIM_WALK must be equal to 3 vertex data in embedded |
1155 | * in cmd stream */ |
1033 | * in cmd stream */ |
1156 | if (((ib_chunk->kdata[idx+1] >> 4) & 0x3) != 3) { |
1034 | if (((radeon_get_ib_value(p, idx + 1) >> 4) & 0x3) != 3) { |
1157 | DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n"); |
1035 | DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n"); |
1158 | return -EINVAL; |
1036 | return -EINVAL; |
1159 | } |
1037 | } |
1160 | track->vap_vf_cntl = ib_chunk->kdata[idx+1]; |
1038 | track->vap_vf_cntl = radeon_get_ib_value(p, idx + 1); |
1161 | track->immd_dwords = pkt->count - 1; |
1039 | track->immd_dwords = pkt->count - 1; |
1162 | r = r100_cs_track_check(p->rdev, track); |
1040 | r = r100_cs_track_check(p->rdev, track); |
1163 | if (r) { |
1041 | if (r) { |
1164 | return r; |
1042 | return r; |
1165 | } |
1043 | } |
1166 | break; |
1044 | break; |
1167 | case PACKET3_3D_DRAW_IMMD_2: |
1045 | case PACKET3_3D_DRAW_IMMD_2: |
1168 | /* Number of dwords is vtx_size * (num_vertices - 1) |
1046 | /* Number of dwords is vtx_size * (num_vertices - 1) |
1169 | * PRIM_WALK must be equal to 3 vertex data in embedded |
1047 | * PRIM_WALK must be equal to 3 vertex data in embedded |
1170 | * in cmd stream */ |
1048 | * in cmd stream */ |
1171 | if (((ib_chunk->kdata[idx] >> 4) & 0x3) != 3) { |
1049 | if (((radeon_get_ib_value(p, idx) >> 4) & 0x3) != 3) { |
1172 | DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n"); |
1050 | DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n"); |
1173 | return -EINVAL; |
1051 | return -EINVAL; |
1174 | } |
1052 | } |
1175 | track->vap_vf_cntl = ib_chunk->kdata[idx]; |
1053 | track->vap_vf_cntl = radeon_get_ib_value(p, idx); |
1176 | track->immd_dwords = pkt->count; |
1054 | track->immd_dwords = pkt->count; |
1177 | r = r100_cs_track_check(p->rdev, track); |
1055 | r = r100_cs_track_check(p->rdev, track); |
1178 | if (r) { |
1056 | if (r) { |
1179 | return r; |
1057 | return r; |
1180 | } |
1058 | } |
1181 | break; |
1059 | break; |
1182 | case PACKET3_3D_DRAW_VBUF: |
1060 | case PACKET3_3D_DRAW_VBUF: |
1183 | track->vap_vf_cntl = ib_chunk->kdata[idx + 1]; |
1061 | track->vap_vf_cntl = radeon_get_ib_value(p, idx + 1); |
1184 | r = r100_cs_track_check(p->rdev, track); |
1062 | r = r100_cs_track_check(p->rdev, track); |
1185 | if (r) { |
1063 | if (r) { |
1186 | return r; |
1064 | return r; |
1187 | } |
1065 | } |
1188 | break; |
1066 | break; |
1189 | case PACKET3_3D_DRAW_VBUF_2: |
1067 | case PACKET3_3D_DRAW_VBUF_2: |
1190 | track->vap_vf_cntl = ib_chunk->kdata[idx]; |
1068 | track->vap_vf_cntl = radeon_get_ib_value(p, idx); |
1191 | r = r100_cs_track_check(p->rdev, track); |
1069 | r = r100_cs_track_check(p->rdev, track); |
1192 | if (r) { |
1070 | if (r) { |
1193 | return r; |
1071 | return r; |
1194 | } |
1072 | } |
1195 | break; |
1073 | break; |
1196 | case PACKET3_3D_DRAW_INDX: |
1074 | case PACKET3_3D_DRAW_INDX: |
1197 | track->vap_vf_cntl = ib_chunk->kdata[idx + 1]; |
1075 | track->vap_vf_cntl = radeon_get_ib_value(p, idx + 1); |
1198 | r = r100_cs_track_check(p->rdev, track); |
1076 | r = r100_cs_track_check(p->rdev, track); |
1199 | if (r) { |
1077 | if (r) { |
1200 | return r; |
1078 | return r; |
1201 | } |
1079 | } |
1202 | break; |
1080 | break; |
1203 | case PACKET3_3D_DRAW_INDX_2: |
1081 | case PACKET3_3D_DRAW_INDX_2: |
1204 | track->vap_vf_cntl = ib_chunk->kdata[idx]; |
1082 | track->vap_vf_cntl = radeon_get_ib_value(p, idx); |
1205 | r = r100_cs_track_check(p->rdev, track); |
1083 | r = r100_cs_track_check(p->rdev, track); |
1206 | if (r) { |
1084 | if (r) { |
1207 | return r; |
1085 | return r; |
Line 1260... | Line 1138... | ||
1260 | { |
1138 | { |
1261 | rdev->config.r300.reg_safe_bm = r300_reg_safe_bm; |
1139 | rdev->config.r300.reg_safe_bm = r300_reg_safe_bm; |
1262 | rdev->config.r300.reg_safe_bm_size = ARRAY_SIZE(r300_reg_safe_bm); |
1140 | rdev->config.r300.reg_safe_bm_size = ARRAY_SIZE(r300_reg_safe_bm); |
1263 | } |
1141 | } |
Line 1264... | Line -... | ||
1264 | - | ||
1265 | int r300_init(struct radeon_device *rdev) |
- | |
1266 | { |
- | |
1267 | r300_set_reg_safe(rdev); |
- | |
1268 | return 0; |
- | |
1269 | } |
- | |
1270 | 1142 | ||
1271 | void r300_mc_program(struct radeon_device *rdev) |
1143 | void r300_mc_program(struct radeon_device *rdev) |
1272 | { |
1144 | { |
1273 | struct r100_mc_save save; |
1145 | struct r100_mc_save save; |
Line 1299... | Line 1171... | ||
1299 | WREG32(R_000148_MC_FB_LOCATION, |
1171 | WREG32(R_000148_MC_FB_LOCATION, |
1300 | S_000148_MC_FB_START(rdev->mc.vram_start >> 16) | |
1172 | S_000148_MC_FB_START(rdev->mc.vram_start >> 16) | |
1301 | S_000148_MC_FB_TOP(rdev->mc.vram_end >> 16)); |
1173 | S_000148_MC_FB_TOP(rdev->mc.vram_end >> 16)); |
1302 | r100_mc_resume(rdev, &save); |
1174 | r100_mc_resume(rdev, &save); |
1303 | }>>><>><>><>><>>><>><>>><>><>><>><>><>><>><>><>><>><>>><>><>><>><>>><>><>>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>>><>><>><>><>><>><>><>><>>> |
1175 | } |
- | 1176 | ||
- | 1177 | void r300_clock_startup(struct radeon_device *rdev) |
|
- | 1178 | { |
|
- | 1179 | u32 tmp; |
|
- | 1180 | ||
- | 1181 | if (radeon_dynclks != -1 && radeon_dynclks) |
|
- | 1182 | radeon_legacy_set_clock_gating(rdev, 1); |
|
- | 1183 | /* We need to force on some of the block */ |
|
- | 1184 | tmp = RREG32_PLL(R_00000D_SCLK_CNTL); |
|
- | 1185 | tmp |= S_00000D_FORCE_CP(1) | S_00000D_FORCE_VIP(1); |
|
- | 1186 | if ((rdev->family == CHIP_RV350) || (rdev->family == CHIP_RV380)) |
|
- | 1187 | tmp |= S_00000D_FORCE_VAP(1); |
|
- | 1188 | WREG32_PLL(R_00000D_SCLK_CNTL, tmp); |
|
- | 1189 | } |
|
- | 1190 | ||
- | 1191 | static int r300_startup(struct radeon_device *rdev) |
|
- | 1192 | { |
|
- | 1193 | int r; |
|
- | 1194 | ||
- | 1195 | r300_mc_program(rdev); |
|
- | 1196 | /* Resume clock */ |
|
- | 1197 | r300_clock_startup(rdev); |
|
- | 1198 | /* Initialize GPU configuration (# pipes, ...) */ |
|
- | 1199 | r300_gpu_init(rdev); |
|
- | 1200 | /* Initialize GART (initialize after TTM so we can allocate |
|
- | 1201 | * memory through TTM but finalize after TTM) */ |
|
- | 1202 | if (rdev->flags & RADEON_IS_PCIE) { |
|
- | 1203 | r = rv370_pcie_gart_enable(rdev); |
|
- | 1204 | if (r) |
|
- | 1205 | return r; |
|
- | 1206 | } |
|
- | 1207 | if (rdev->flags & RADEON_IS_PCI) { |
|
- | 1208 | r = r100_pci_gart_enable(rdev); |
|
- | 1209 | if (r) |
|
- | 1210 | return r; |
|
- | 1211 | } |
|
- | 1212 | /* Enable IRQ */ |
|
- | 1213 | // rdev->irq.sw_int = true; |
|
- | 1214 | // r100_irq_set(rdev); |
|
- | 1215 | /* 1M ring buffer */ |
|
- | 1216 | // r = r100_cp_init(rdev, 1024 * 1024); |
|
- | 1217 | // if (r) { |
|
- | 1218 | // dev_err(rdev->dev, "failled initializing CP (%d).\n", r); |
|
- | 1219 | // return r; |
|
- | 1220 | // } |
|
- | 1221 | // r = r100_wb_init(rdev); |
|
- | 1222 | // if (r) |
|
- | 1223 | // dev_err(rdev->dev, "failled initializing WB (%d).\n", r); |
|
- | 1224 | // r = r100_ib_init(rdev); |
|
- | 1225 | // if (r) { |
|
- | 1226 | // dev_err(rdev->dev, "failled initializing IB (%d).\n", r); |
|
- | 1227 | // return r; |
|
- | 1228 | // } |
|
- | 1229 | return 0; |
|
- | 1230 | } |
|
- | 1231 | ||
- | 1232 | ||
- | 1233 | ||
- | 1234 | ||
- | 1235 | ||
- | 1236 | int r300_init(struct radeon_device *rdev) |
|
- | 1237 | { |
|
- | 1238 | int r; |
|
- | 1239 | ||
- | 1240 | /* Disable VGA */ |
|
- | 1241 | r100_vga_render_disable(rdev); |
|
- | 1242 | /* Initialize scratch registers */ |
|
- | 1243 | radeon_scratch_init(rdev); |
|
- | 1244 | /* Initialize surface registers */ |
|
- | 1245 | radeon_surface_init(rdev); |
|
- | 1246 | /* TODO: disable VGA need to use VGA request */ |
|
- | 1247 | /* BIOS*/ |
|
- | 1248 | if (!radeon_get_bios(rdev)) { |
|
- | 1249 | if (ASIC_IS_AVIVO(rdev)) |
|
- | 1250 | return -EINVAL; |
|
- | 1251 | } |
|
- | 1252 | if (rdev->is_atom_bios) { |
|
- | 1253 | dev_err(rdev->dev, "Expecting combios for RS400/RS480 GPU\n"); |
|
- | 1254 | return -EINVAL; |
|
- | 1255 | } else { |
|
- | 1256 | r = radeon_combios_init(rdev); |
|
- | 1257 | if (r) |
|
- | 1258 | return r; |
|
- | 1259 | } |
|
- | 1260 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ |
|
- | 1261 | if (radeon_gpu_reset(rdev)) { |
|
- | 1262 | dev_warn(rdev->dev, |
|
- | 1263 | "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", |
|
- | 1264 | RREG32(R_000E40_RBBM_STATUS), |
|
- | 1265 | RREG32(R_0007C0_CP_STAT)); |
|
- | 1266 | } |
|
- | 1267 | /* check if cards are posted or not */ |
|
- | 1268 | if (!radeon_card_posted(rdev) && rdev->bios) { |
|
- | 1269 | DRM_INFO("GPU not posted. posting now...\n"); |
|
- | 1270 | radeon_combios_asic_init(rdev->ddev); |
|
- | 1271 | } |
|
- | 1272 | /* Set asic errata */ |
|
- | 1273 | r300_errata(rdev); |
|
- | 1274 | /* Initialize clocks */ |
|
- | 1275 | radeon_get_clock_info(rdev->ddev); |
|
- | 1276 | /* Get vram informations */ |
|
- | 1277 | r300_vram_info(rdev); |
|
- | 1278 | /* Initialize memory controller (also test AGP) */ |
|
- | 1279 | r = r420_mc_init(rdev); |
|
- | 1280 | if (r) |
|
- | 1281 | return r; |
|
- | 1282 | /* Fence driver */ |
|
- | 1283 | // r = radeon_fence_driver_init(rdev); |
|
- | 1284 | // if (r) |
|
- | 1285 | // return r; |
|
- | 1286 | // r = radeon_irq_kms_init(rdev); |
|
- | 1287 | // if (r) |
|
- | 1288 | // return r; |
|
- | 1289 | /* Memory manager */ |
|
- | 1290 | r = radeon_object_init(rdev); |
|
- | 1291 | if (r) |
|
- | 1292 | return r; |
|
- | 1293 | if (rdev->flags & RADEON_IS_PCIE) { |
|
- | 1294 | r = rv370_pcie_gart_init(rdev); |
|
- | 1295 | if (r) |
|
- | 1296 | return r; |
|
- | 1297 | } |
|
- | 1298 | if (rdev->flags & RADEON_IS_PCI) { |
|
- | 1299 | r = r100_pci_gart_init(rdev); |
|
- | 1300 | if (r) |
|
- | 1301 | return r; |
|
- | 1302 | } |
|
- | 1303 | r300_set_reg_safe(rdev); |
|
- | 1304 | rdev->accel_working = true; |
|
- | 1305 | r = r300_startup(rdev); |
|
- | 1306 | if (r) { |
|
- | 1307 | /* Somethings want wront with the accel init stop accel */ |
|
- | 1308 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
|
- | 1309 | // r300_suspend(rdev); |
|
- | 1310 | // r100_cp_fini(rdev); |
|
- | 1311 | // r100_wb_fini(rdev); |
|
- | 1312 | // r100_ib_fini(rdev); |
|
- | 1313 | if (rdev->flags & RADEON_IS_PCIE) |
|
- | 1314 | rv370_pcie_gart_fini(rdev); |
|
- | 1315 | if (rdev->flags & RADEON_IS_PCI) |
|
- | 1316 | r100_pci_gart_fini(rdev); |
|
- | 1317 | // radeon_irq_kms_fini(rdev); |
|
- | 1318 | rdev->accel_working = false; |
|
- | 1319 | } |
|
- | 1320 | return 0; |
|
- | 1321 | }>><>><>><>><>>><>><>>><>><>><>><>><>><>><>><>><>><>>><>><>><>><>>><>><>>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>>><>><>><>><>><>><>><>><>>> |