aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/r100.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/radeon/r100.c')
-rw-r--r--drivers/gpu/drm/radeon/r100.c109
1 files changed, 79 insertions, 30 deletions
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
index 333cde9d4e7b..81801c176aa5 100644
--- a/drivers/gpu/drm/radeon/r100.c
+++ b/drivers/gpu/drm/radeon/r100.c
@@ -65,6 +65,40 @@ MODULE_FIRMWARE(FIRMWARE_R520);
65 65
66#include "r100_track.h" 66#include "r100_track.h"
67 67
68void r100_wait_for_vblank(struct radeon_device *rdev, int crtc)
69{
70 struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc];
71 int i;
72
73 if (radeon_crtc->crtc_id == 0) {
74 if (RREG32(RADEON_CRTC_GEN_CNTL) & RADEON_CRTC_EN) {
75 for (i = 0; i < rdev->usec_timeout; i++) {
76 if (!(RREG32(RADEON_CRTC_STATUS) & RADEON_CRTC_VBLANK_CUR))
77 break;
78 udelay(1);
79 }
80 for (i = 0; i < rdev->usec_timeout; i++) {
81 if (RREG32(RADEON_CRTC_STATUS) & RADEON_CRTC_VBLANK_CUR)
82 break;
83 udelay(1);
84 }
85 }
86 } else {
87 if (RREG32(RADEON_CRTC2_GEN_CNTL) & RADEON_CRTC2_EN) {
88 for (i = 0; i < rdev->usec_timeout; i++) {
89 if (!(RREG32(RADEON_CRTC2_STATUS) & RADEON_CRTC2_VBLANK_CUR))
90 break;
91 udelay(1);
92 }
93 for (i = 0; i < rdev->usec_timeout; i++) {
94 if (RREG32(RADEON_CRTC2_STATUS) & RADEON_CRTC2_VBLANK_CUR)
95 break;
96 udelay(1);
97 }
98 }
99 }
100}
101
68/* This files gather functions specifics to: 102/* This files gather functions specifics to:
69 * r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280 103 * r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280
70 */ 104 */
@@ -87,23 +121,27 @@ int r100_reloc_pitch_offset(struct radeon_cs_parser *p,
87 r100_cs_dump_packet(p, pkt); 121 r100_cs_dump_packet(p, pkt);
88 return r; 122 return r;
89 } 123 }
124
90 value = radeon_get_ib_value(p, idx); 125 value = radeon_get_ib_value(p, idx);
91 tmp = value & 0x003fffff; 126 tmp = value & 0x003fffff;
92 tmp += (((u32)reloc->lobj.gpu_offset) >> 10); 127 tmp += (((u32)reloc->lobj.gpu_offset) >> 10);
93 128
94 if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) 129 if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS)) {
95 tile_flags |= RADEON_DST_TILE_MACRO; 130 if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
96 if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) { 131 tile_flags |= RADEON_DST_TILE_MACRO;
97 if (reg == RADEON_SRC_PITCH_OFFSET) { 132 if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) {
98 DRM_ERROR("Cannot src blit from microtiled surface\n"); 133 if (reg == RADEON_SRC_PITCH_OFFSET) {
99 r100_cs_dump_packet(p, pkt); 134 DRM_ERROR("Cannot src blit from microtiled surface\n");
100 return -EINVAL; 135 r100_cs_dump_packet(p, pkt);
136 return -EINVAL;
137 }
138 tile_flags |= RADEON_DST_TILE_MICRO;
101 } 139 }
102 tile_flags |= RADEON_DST_TILE_MICRO;
103 }
104 140
105 tmp |= tile_flags; 141 tmp |= tile_flags;
106 p->ib->ptr[idx] = (value & 0x3fc00000) | tmp; 142 p->ib->ptr[idx] = (value & 0x3fc00000) | tmp;
143 } else
144 p->ib->ptr[idx] = (value & 0xffc00000) | tmp;
107 return 0; 145 return 0;
108} 146}
109 147
@@ -412,7 +450,7 @@ void r100_pm_misc(struct radeon_device *rdev)
412 /* set pcie lanes */ 450 /* set pcie lanes */
413 if ((rdev->flags & RADEON_IS_PCIE) && 451 if ((rdev->flags & RADEON_IS_PCIE) &&
414 !(rdev->flags & RADEON_IS_IGP) && 452 !(rdev->flags & RADEON_IS_IGP) &&
415 rdev->asic->set_pcie_lanes && 453 rdev->asic->pm.set_pcie_lanes &&
416 (ps->pcie_lanes != 454 (ps->pcie_lanes !=
417 rdev->pm.power_state[rdev->pm.current_power_state_index].pcie_lanes)) { 455 rdev->pm.power_state[rdev->pm.current_power_state_index].pcie_lanes)) {
418 radeon_set_pcie_lanes(rdev, 456 radeon_set_pcie_lanes(rdev,
@@ -592,8 +630,8 @@ int r100_pci_gart_init(struct radeon_device *rdev)
592 if (r) 630 if (r)
593 return r; 631 return r;
594 rdev->gart.table_size = rdev->gart.num_gpu_pages * 4; 632 rdev->gart.table_size = rdev->gart.num_gpu_pages * 4;
595 rdev->asic->gart_tlb_flush = &r100_pci_gart_tlb_flush; 633 rdev->asic->gart.tlb_flush = &r100_pci_gart_tlb_flush;
596 rdev->asic->gart_set_page = &r100_pci_gart_set_page; 634 rdev->asic->gart.set_page = &r100_pci_gart_set_page;
597 return radeon_gart_table_ram_alloc(rdev); 635 return radeon_gart_table_ram_alloc(rdev);
598} 636}
599 637
@@ -930,9 +968,8 @@ static int r100_cp_wait_for_idle(struct radeon_device *rdev)
930 return -1; 968 return -1;
931} 969}
932 970
933void r100_ring_start(struct radeon_device *rdev) 971void r100_ring_start(struct radeon_device *rdev, struct radeon_ring *ring)
934{ 972{
935 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
936 int r; 973 int r;
937 974
938 r = radeon_ring_lock(rdev, ring, 2); 975 r = radeon_ring_lock(rdev, ring, 2);
@@ -1143,8 +1180,8 @@ int r100_cp_init(struct radeon_device *rdev, unsigned ring_size)
1143 WREG32(RADEON_CP_RB_WPTR_DELAY, 0); 1180 WREG32(RADEON_CP_RB_WPTR_DELAY, 0);
1144 WREG32(RADEON_CP_CSQ_MODE, 0x00004D4D); 1181 WREG32(RADEON_CP_CSQ_MODE, 0x00004D4D);
1145 WREG32(RADEON_CP_CSQ_CNTL, RADEON_CSQ_PRIBM_INDBM); 1182 WREG32(RADEON_CP_CSQ_CNTL, RADEON_CSQ_PRIBM_INDBM);
1146 radeon_ring_start(rdev); 1183 radeon_ring_start(rdev, RADEON_RING_TYPE_GFX_INDEX, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]);
1147 r = radeon_ring_test(rdev, ring); 1184 r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, ring);
1148 if (r) { 1185 if (r) {
1149 DRM_ERROR("radeon: cp isn't working (%d).\n", r); 1186 DRM_ERROR("radeon: cp isn't working (%d).\n", r);
1150 return r; 1187 return r;
@@ -1552,7 +1589,17 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
1552 r100_cs_dump_packet(p, pkt); 1589 r100_cs_dump_packet(p, pkt);
1553 return r; 1590 return r;
1554 } 1591 }
1555 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); 1592 if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS)) {
1593 if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
1594 tile_flags |= RADEON_TXO_MACRO_TILE;
1595 if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
1596 tile_flags |= RADEON_TXO_MICRO_TILE_X2;
1597
1598 tmp = idx_value & ~(0x7 << 2);
1599 tmp |= tile_flags;
1600 ib[idx] = tmp + ((u32)reloc->lobj.gpu_offset);
1601 } else
1602 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
1556 track->textures[i].robj = reloc->robj; 1603 track->textures[i].robj = reloc->robj;
1557 track->tex_dirty = true; 1604 track->tex_dirty = true;
1558 break; 1605 break;
@@ -1623,15 +1670,17 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
1623 r100_cs_dump_packet(p, pkt); 1670 r100_cs_dump_packet(p, pkt);
1624 return r; 1671 return r;
1625 } 1672 }
1626 1673 if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS)) {
1627 if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) 1674 if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
1628 tile_flags |= RADEON_COLOR_TILE_ENABLE; 1675 tile_flags |= RADEON_COLOR_TILE_ENABLE;
1629 if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) 1676 if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
1630 tile_flags |= RADEON_COLOR_MICROTILE_ENABLE; 1677 tile_flags |= RADEON_COLOR_MICROTILE_ENABLE;
1631 1678
1632 tmp = idx_value & ~(0x7 << 16); 1679 tmp = idx_value & ~(0x7 << 16);
1633 tmp |= tile_flags; 1680 tmp |= tile_flags;
1634 ib[idx] = tmp; 1681 ib[idx] = tmp;
1682 } else
1683 ib[idx] = idx_value;
1635 1684
1636 track->cb[0].pitch = idx_value & RADEON_COLORPITCH_MASK; 1685 track->cb[0].pitch = idx_value & RADEON_COLORPITCH_MASK;
1637 track->cb_dirty = true; 1686 track->cb_dirty = true;
@@ -3691,7 +3740,7 @@ void r100_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
3691 radeon_ring_write(ring, ib->length_dw); 3740 radeon_ring_write(ring, ib->length_dw);
3692} 3741}
3693 3742
3694int r100_ib_test(struct radeon_device *rdev) 3743int r100_ib_test(struct radeon_device *rdev, struct radeon_ring *ring)
3695{ 3744{
3696 struct radeon_ib *ib; 3745 struct radeon_ib *ib;
3697 uint32_t scratch; 3746 uint32_t scratch;
@@ -3916,7 +3965,7 @@ static int r100_startup(struct radeon_device *rdev)
3916 if (r) 3965 if (r)
3917 return r; 3966 return r;
3918 3967
3919 r = r100_ib_test(rdev); 3968 r = radeon_ib_test(rdev, RADEON_RING_TYPE_GFX_INDEX, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]);
3920 if (r) { 3969 if (r) {
3921 dev_err(rdev->dev, "failed testing IB (%d).\n", r); 3970 dev_err(rdev->dev, "failed testing IB (%d).\n", r);
3922 rdev->accel_working = false; 3971 rdev->accel_working = false;