diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2012-07-17 14:02:32 -0400 |
---|---|---|
committer | Christian König <deathsimple@vodafone.de> | 2012-07-18 07:53:32 -0400 |
commit | c7eff978e0868ccad1ecbefcc342f6709f9f4789 (patch) | |
tree | 18d46fc75600c3d247005ca1c1f699798193bd94 /drivers/gpu/drm/radeon/r100.c | |
parent | 89d35807fb0fe53b84e88e759cc39107a6195e5f (diff) |
drm/radeon: add rptr save support for r1xx-r5xx
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/r100.c')
-rw-r--r-- | drivers/gpu/drm/radeon/r100.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index 4ee5a74dac22..2e0a60328bd4 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
@@ -1060,6 +1060,14 @@ int r100_cp_init(struct radeon_device *rdev, unsigned ring_size) | |||
1060 | } | 1060 | } |
1061 | ring->ready = true; | 1061 | ring->ready = true; |
1062 | radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size); | 1062 | radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size); |
1063 | |||
1064 | if (radeon_ring_supports_scratch_reg(rdev, ring)) { | ||
1065 | r = radeon_scratch_get(rdev, &ring->rptr_save_reg); | ||
1066 | if (r) { | ||
1067 | DRM_ERROR("failed to get scratch reg for rptr save (%d).\n", r); | ||
1068 | ring->rptr_save_reg = 0; | ||
1069 | } | ||
1070 | } | ||
1063 | return 0; | 1071 | return 0; |
1064 | } | 1072 | } |
1065 | 1073 | ||
@@ -1070,6 +1078,7 @@ void r100_cp_fini(struct radeon_device *rdev) | |||
1070 | } | 1078 | } |
1071 | /* Disable ring */ | 1079 | /* Disable ring */ |
1072 | r100_cp_disable(rdev); | 1080 | r100_cp_disable(rdev); |
1081 | radeon_scratch_free(rdev, rdev->ring[RADEON_RING_TYPE_GFX_INDEX].rptr_save_reg); | ||
1073 | radeon_ring_fini(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]); | 1082 | radeon_ring_fini(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]); |
1074 | DRM_INFO("radeon: cp finalized\n"); | 1083 | DRM_INFO("radeon: cp finalized\n"); |
1075 | } | 1084 | } |
@@ -3661,6 +3670,12 @@ void r100_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib) | |||
3661 | { | 3670 | { |
3662 | struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; | 3671 | struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; |
3663 | 3672 | ||
3673 | if (ring->rptr_save_reg) { | ||
3674 | u32 next_rptr = ring->wptr + 2 + 3; | ||
3675 | radeon_ring_write(ring, PACKET0(ring->rptr_save_reg, 0)); | ||
3676 | radeon_ring_write(ring, next_rptr); | ||
3677 | } | ||
3678 | |||
3664 | radeon_ring_write(ring, PACKET0(RADEON_CP_IB_BASE, 1)); | 3679 | radeon_ring_write(ring, PACKET0(RADEON_CP_IB_BASE, 1)); |
3665 | radeon_ring_write(ring, ib->gpu_addr); | 3680 | radeon_ring_write(ring, ib->gpu_addr); |
3666 | radeon_ring_write(ring, ib->length_dw); | 3681 | radeon_ring_write(ring, ib->length_dw); |