Rev 3764 | Rev 5271 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3764 | Rev 5078 | ||
---|---|---|---|
Line 32... | Line 32... | ||
32 | #include |
32 | #include |
33 | #include "radeon_reg.h" |
33 | #include "radeon_reg.h" |
34 | #include "radeon.h" |
34 | #include "radeon.h" |
35 | #include "radeon_asic.h" |
35 | #include "radeon_asic.h" |
36 | #include |
36 | #include |
37 | - | ||
- | 37 | #include "r100_track.h" |
|
38 | #include "r300d.h" |
38 | #include "r300d.h" |
39 | #include "rv350d.h" |
39 | #include "rv350d.h" |
40 | #include "r300_reg_safe.h" |
40 | #include "r300_reg_safe.h" |
Line 41... | Line 41... | ||
41 | 41 | ||
Line 67... | Line 67... | ||
67 | WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp); |
67 | WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp); |
68 | } |
68 | } |
69 | mb(); |
69 | mb(); |
70 | } |
70 | } |
Line -... | Line 71... | ||
- | 71 | ||
71 | 72 | #define R300_PTE_UNSNOOPED (1 << 0) |
|
72 | #define R300_PTE_WRITEABLE (1 << 2) |
73 | #define R300_PTE_WRITEABLE (1 << 2) |
Line 73... | Line 74... | ||
73 | #define R300_PTE_READABLE (1 << 3) |
74 | #define R300_PTE_READABLE (1 << 3) |
- | 75 | ||
74 | 76 | void rv370_pcie_gart_set_page(struct radeon_device *rdev, unsigned i, |
|
75 | int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) |
77 | uint64_t addr, uint32_t flags) |
Line 76... | Line -... | ||
76 | { |
- | |
77 | void __iomem *ptr = rdev->gart.ptr; |
- | |
78 | - | ||
79 | if (i < 0 || i > rdev->gart.num_gpu_pages) { |
78 | { |
80 | return -EINVAL; |
79 | void __iomem *ptr = rdev->gart.ptr; |
- | 80 | ||
81 | } |
81 | addr = (lower_32_bits(addr) >> 8) | |
- | 82 | ((upper_32_bits(addr) & 0xff) << 24); |
|
- | 83 | if (flags & RADEON_GART_PAGE_READ) |
|
- | 84 | addr |= R300_PTE_READABLE; |
|
- | 85 | if (flags & RADEON_GART_PAGE_WRITE) |
|
82 | addr = (lower_32_bits(addr) >> 8) | |
86 | addr |= R300_PTE_WRITEABLE; |
83 | ((upper_32_bits(addr) & 0xff) << 24) | |
87 | if (!(flags & RADEON_GART_PAGE_SNOOP)) |
84 | R300_PTE_WRITEABLE | R300_PTE_READABLE; |
88 | addr |= R300_PTE_UNSNOOPED; |
85 | /* on x86 we want this to be CPU endian, on powerpc |
89 | /* on x86 we want this to be CPU endian, on powerpc |
86 | * on powerpc without HW swappers, it'll get swapped on way |
- | |
87 | * into VRAM - so no need for cpu_to_le32 on VRAM tables */ |
90 | * on powerpc without HW swappers, it'll get swapped on way |
Line 88... | Line 91... | ||
88 | writel(addr, ((void __iomem *)ptr) + (i * 4)); |
91 | * into VRAM - so no need for cpu_to_le32 on VRAM tables */ |
89 | return 0; |
92 | writel(addr, ((void __iomem *)ptr) + (i * 4)); |
90 | } |
93 | } |
Line 121... | Line 124... | ||
121 | return -EINVAL; |
124 | return -EINVAL; |
122 | } |
125 | } |
123 | r = radeon_gart_table_vram_pin(rdev); |
126 | r = radeon_gart_table_vram_pin(rdev); |
124 | if (r) |
127 | if (r) |
125 | return r; |
128 | return r; |
126 | radeon_gart_restore(rdev); |
- | |
127 | /* discard memory request outside of configured range */ |
129 | /* discard memory request outside of configured range */ |
128 | tmp = RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD; |
130 | tmp = RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD; |
129 | WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp); |
131 | WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp); |
130 | WREG32_PCIE(RADEON_PCIE_TX_GART_START_LO, rdev->mc.gtt_start); |
132 | WREG32_PCIE(RADEON_PCIE_TX_GART_START_LO, rdev->mc.gtt_start); |
131 | tmp = rdev->mc.gtt_end & ~RADEON_GPU_PAGE_MASK; |
133 | tmp = rdev->mc.gtt_end & ~RADEON_GPU_PAGE_MASK; |
Line 291... | Line 293... | ||
291 | R300_FRONT_PTYPE_TRIANGE | R300_BACK_PTYPE_TRIANGE); |
293 | R300_FRONT_PTYPE_TRIANGE | R300_BACK_PTYPE_TRIANGE); |
292 | radeon_ring_write(ring, PACKET0(R300_GA_ROUND_MODE, 0)); |
294 | radeon_ring_write(ring, PACKET0(R300_GA_ROUND_MODE, 0)); |
293 | radeon_ring_write(ring, |
295 | radeon_ring_write(ring, |
294 | R300_GEOMETRY_ROUND_NEAREST | |
296 | R300_GEOMETRY_ROUND_NEAREST | |
295 | R300_COLOR_ROUND_NEAREST); |
297 | R300_COLOR_ROUND_NEAREST); |
296 | radeon_ring_unlock_commit(rdev, ring); |
298 | radeon_ring_unlock_commit(rdev, ring, false); |
297 | } |
299 | } |
Line 298... | Line 300... | ||
298 | 300 | ||
299 | static void r300_errata(struct radeon_device *rdev) |
301 | static void r300_errata(struct radeon_device *rdev) |
300 | { |
302 | { |
Line 590... | Line 592... | ||
590 | #else |
592 | #else |
591 | return 0; |
593 | return 0; |
592 | #endif |
594 | #endif |
593 | } |
595 | } |
Line 594... | Line -... | ||
594 | - | ||
595 | - | ||
596 | #if 0 |
- | |
597 | 596 | ||
598 | static int r300_packet0_check(struct radeon_cs_parser *p, |
597 | static int r300_packet0_check(struct radeon_cs_parser *p, |
599 | struct radeon_cs_packet *pkt, |
598 | struct radeon_cs_packet *pkt, |
600 | unsigned idx, unsigned reg) |
599 | unsigned idx, unsigned reg) |
601 | { |
600 | { |
Line 641... | Line 640... | ||
641 | return r; |
640 | return r; |
642 | } |
641 | } |
643 | track->cb[i].robj = reloc->robj; |
642 | track->cb[i].robj = reloc->robj; |
644 | track->cb[i].offset = idx_value; |
643 | track->cb[i].offset = idx_value; |
645 | track->cb_dirty = true; |
644 | track->cb_dirty = true; |
646 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
645 | ib[idx] = idx_value + ((u32)reloc->gpu_offset); |
647 | break; |
646 | break; |
648 | case R300_ZB_DEPTHOFFSET: |
647 | case R300_ZB_DEPTHOFFSET: |
649 | r = radeon_cs_packet_next_reloc(p, &reloc, 0); |
648 | r = radeon_cs_packet_next_reloc(p, &reloc, 0); |
650 | if (r) { |
649 | if (r) { |
651 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
650 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
Line 654... | Line 653... | ||
654 | return r; |
653 | return r; |
655 | } |
654 | } |
656 | track->zb.robj = reloc->robj; |
655 | track->zb.robj = reloc->robj; |
657 | track->zb.offset = idx_value; |
656 | track->zb.offset = idx_value; |
658 | track->zb_dirty = true; |
657 | track->zb_dirty = true; |
659 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
658 | ib[idx] = idx_value + ((u32)reloc->gpu_offset); |
660 | break; |
659 | break; |
661 | case R300_TX_OFFSET_0: |
660 | case R300_TX_OFFSET_0: |
662 | case R300_TX_OFFSET_0+4: |
661 | case R300_TX_OFFSET_0+4: |
663 | case R300_TX_OFFSET_0+8: |
662 | case R300_TX_OFFSET_0+8: |
664 | case R300_TX_OFFSET_0+12: |
663 | case R300_TX_OFFSET_0+12: |
Line 683... | Line 682... | ||
683 | return r; |
682 | return r; |
684 | } |
683 | } |
Line 685... | Line 684... | ||
685 | 684 | ||
686 | if (p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS) { |
685 | if (p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS) { |
687 | ib[idx] = (idx_value & 31) | /* keep the 1st 5 bits */ |
686 | ib[idx] = (idx_value & 31) | /* keep the 1st 5 bits */ |
688 | ((idx_value & ~31) + (u32)reloc->lobj.gpu_offset); |
687 | ((idx_value & ~31) + (u32)reloc->gpu_offset); |
689 | } else { |
688 | } else { |
690 | if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) |
689 | if (reloc->tiling_flags & RADEON_TILING_MACRO) |
691 | tile_flags |= R300_TXO_MACRO_TILE; |
690 | tile_flags |= R300_TXO_MACRO_TILE; |
692 | if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) |
691 | if (reloc->tiling_flags & RADEON_TILING_MICRO) |
693 | tile_flags |= R300_TXO_MICRO_TILE; |
692 | tile_flags |= R300_TXO_MICRO_TILE; |
694 | else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO_SQUARE) |
693 | else if (reloc->tiling_flags & RADEON_TILING_MICRO_SQUARE) |
Line 695... | Line 694... | ||
695 | tile_flags |= R300_TXO_MICRO_TILE_SQUARE; |
694 | tile_flags |= R300_TXO_MICRO_TILE_SQUARE; |
696 | 695 | ||
697 | tmp = idx_value + ((u32)reloc->lobj.gpu_offset); |
696 | tmp = idx_value + ((u32)reloc->gpu_offset); |
698 | tmp |= tile_flags; |
697 | tmp |= tile_flags; |
699 | ib[idx] = tmp; |
698 | ib[idx] = tmp; |
700 | } |
699 | } |
Line 754... | Line 753... | ||
754 | idx, reg); |
753 | idx, reg); |
755 | radeon_cs_dump_packet(p, pkt); |
754 | radeon_cs_dump_packet(p, pkt); |
756 | return r; |
755 | return r; |
757 | } |
756 | } |
Line 758... | Line 757... | ||
758 | 757 | ||
759 | if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) |
758 | if (reloc->tiling_flags & RADEON_TILING_MACRO) |
760 | tile_flags |= R300_COLOR_TILE_ENABLE; |
759 | tile_flags |= R300_COLOR_TILE_ENABLE; |
761 | if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) |
760 | if (reloc->tiling_flags & RADEON_TILING_MICRO) |
762 | tile_flags |= R300_COLOR_MICROTILE_ENABLE; |
761 | tile_flags |= R300_COLOR_MICROTILE_ENABLE; |
763 | else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO_SQUARE) |
762 | else if (reloc->tiling_flags & RADEON_TILING_MICRO_SQUARE) |
Line 764... | Line 763... | ||
764 | tile_flags |= R300_COLOR_MICROTILE_SQUARE_ENABLE; |
763 | tile_flags |= R300_COLOR_MICROTILE_SQUARE_ENABLE; |
765 | 764 | ||
766 | tmp = idx_value & ~(0x7 << 16); |
765 | tmp = idx_value & ~(0x7 << 16); |
Line 839... | Line 838... | ||
839 | idx, reg); |
838 | idx, reg); |
840 | radeon_cs_dump_packet(p, pkt); |
839 | radeon_cs_dump_packet(p, pkt); |
841 | return r; |
840 | return r; |
842 | } |
841 | } |
Line 843... | Line 842... | ||
843 | 842 | ||
844 | if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) |
843 | if (reloc->tiling_flags & RADEON_TILING_MACRO) |
845 | tile_flags |= R300_DEPTHMACROTILE_ENABLE; |
844 | tile_flags |= R300_DEPTHMACROTILE_ENABLE; |
846 | if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) |
845 | if (reloc->tiling_flags & RADEON_TILING_MICRO) |
847 | tile_flags |= R300_DEPTHMICROTILE_TILED; |
846 | tile_flags |= R300_DEPTHMICROTILE_TILED; |
848 | else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO_SQUARE) |
847 | else if (reloc->tiling_flags & RADEON_TILING_MICRO_SQUARE) |
Line 849... | Line 848... | ||
849 | tile_flags |= R300_DEPTHMICROTILE_TILED_SQUARE; |
848 | tile_flags |= R300_DEPTHMICROTILE_TILED_SQUARE; |
850 | 849 | ||
851 | tmp = idx_value & ~(0x7 << 16); |
850 | tmp = idx_value & ~(0x7 << 16); |
Line 1053... | Line 1052... | ||
1053 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
1052 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
1054 | idx, reg); |
1053 | idx, reg); |
1055 | radeon_cs_dump_packet(p, pkt); |
1054 | radeon_cs_dump_packet(p, pkt); |
1056 | return r; |
1055 | return r; |
1057 | } |
1056 | } |
1058 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
1057 | ib[idx] = idx_value + ((u32)reloc->gpu_offset); |
1059 | break; |
1058 | break; |
1060 | case 0x4e0c: |
1059 | case 0x4e0c: |
1061 | /* RB3D_COLOR_CHANNEL_MASK */ |
1060 | /* RB3D_COLOR_CHANNEL_MASK */ |
1062 | track->color_channel_mask = idx_value; |
1061 | track->color_channel_mask = idx_value; |
1063 | track->cb_dirty = true; |
1062 | track->cb_dirty = true; |
Line 1098... | Line 1097... | ||
1098 | return r; |
1097 | return r; |
1099 | } |
1098 | } |
1100 | track->aa.robj = reloc->robj; |
1099 | track->aa.robj = reloc->robj; |
1101 | track->aa.offset = idx_value; |
1100 | track->aa.offset = idx_value; |
1102 | track->aa_dirty = true; |
1101 | track->aa_dirty = true; |
1103 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
1102 | ib[idx] = idx_value + ((u32)reloc->gpu_offset); |
1104 | break; |
1103 | break; |
1105 | case R300_RB3D_AARESOLVE_PITCH: |
1104 | case R300_RB3D_AARESOLVE_PITCH: |
1106 | track->aa.pitch = idx_value & 0x3FFE; |
1105 | track->aa.pitch = idx_value & 0x3FFE; |
1107 | track->aa_dirty = true; |
1106 | track->aa_dirty = true; |
1108 | break; |
1107 | break; |
Line 1163... | Line 1162... | ||
1163 | if (r) { |
1162 | if (r) { |
1164 | DRM_ERROR("No reloc for packet3 %d\n", pkt->opcode); |
1163 | DRM_ERROR("No reloc for packet3 %d\n", pkt->opcode); |
1165 | radeon_cs_dump_packet(p, pkt); |
1164 | radeon_cs_dump_packet(p, pkt); |
1166 | return r; |
1165 | return r; |
1167 | } |
1166 | } |
1168 | ib[idx+1] = radeon_get_ib_value(p, idx + 1) + ((u32)reloc->lobj.gpu_offset); |
1167 | ib[idx+1] = radeon_get_ib_value(p, idx + 1) + ((u32)reloc->gpu_offset); |
1169 | r = r100_cs_track_check_pkt3_indx_buffer(p, pkt, reloc->robj); |
1168 | r = r100_cs_track_check_pkt3_indx_buffer(p, pkt, reloc->robj); |
1170 | if (r) { |
1169 | if (r) { |
1171 | return r; |
1170 | return r; |
1172 | } |
1171 | } |
1173 | break; |
1172 | break; |
Line 1285... | Line 1284... | ||
1285 | return r; |
1284 | return r; |
1286 | } |
1285 | } |
1287 | } while (p->idx < p->chunks[p->chunk_ib_idx].length_dw); |
1286 | } while (p->idx < p->chunks[p->chunk_ib_idx].length_dw); |
1288 | return 0; |
1287 | return 0; |
1289 | } |
1288 | } |
1290 | #endif |
- | |
1291 | - | ||
Line 1292... | Line 1289... | ||
1292 | 1289 | ||
1293 | void r300_set_reg_safe(struct radeon_device *rdev) |
1290 | void r300_set_reg_safe(struct radeon_device *rdev) |
1294 | { |
1291 | { |
1295 | rdev->config.r300.reg_safe_bm = r300_reg_safe_bm; |
1292 | rdev->config.r300.reg_safe_bm = r300_reg_safe_bm; |
Line 1482... | Line 1479... | ||
1482 | if (r) |
1479 | if (r) |
1483 | return r; |
1480 | return r; |
1484 | } |
1481 | } |
1485 | r300_set_reg_safe(rdev); |
1482 | r300_set_reg_safe(rdev); |
Line -... | Line 1483... | ||
- | 1483 | ||
- | 1484 | /* Initialize power management */ |
|
- | 1485 | radeon_pm_init(rdev); |
|
1486 | 1486 | ||
1487 | rdev->accel_working = true; |
1487 | rdev->accel_working = true; |
1488 | r = r300_startup(rdev); |
1488 | r = r300_startup(rdev); |
1489 | if (r) { |
1489 | if (r) { |
1490 | /* Somethings want wront with the accel init stop accel */ |
1490 | /* Something went wrong with the accel init, so stop accel */ |
1491 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
1491 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
1492 | if (rdev->flags & RADEON_IS_PCIE) |
1492 | if (rdev->flags & RADEON_IS_PCIE) |
1493 | rv370_pcie_gart_fini(rdev); |
1493 | rv370_pcie_gart_fini(rdev); |
1494 | if (rdev->flags & RADEON_IS_PCI) |
1494 | if (rdev->flags & RADEON_IS_PCI) |