diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_ring.c')
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_ring.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c index 261e98a276db..08c0233db1b8 100644 --- a/drivers/gpu/drm/radeon/radeon_ring.c +++ b/drivers/gpu/drm/radeon/radeon_ring.c | |||
@@ -151,7 +151,7 @@ int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib) | |||
151 | /* 64 dwords should be enough for fence too */ | 151 | /* 64 dwords should be enough for fence too */ |
152 | r = radeon_ring_lock(rdev, 64); | 152 | r = radeon_ring_lock(rdev, 64); |
153 | if (r) { | 153 | if (r) { |
154 | DRM_ERROR("radeon: scheduling IB failled (%d).\n", r); | 154 | DRM_ERROR("radeon: scheduling IB failed (%d).\n", r); |
155 | return r; | 155 | return r; |
156 | } | 156 | } |
157 | radeon_ring_ib_execute(rdev, ib); | 157 | radeon_ring_ib_execute(rdev, ib); |
@@ -175,9 +175,9 @@ int radeon_ib_pool_init(struct radeon_device *rdev) | |||
175 | return 0; | 175 | return 0; |
176 | INIT_LIST_HEAD(&rdev->ib_pool.bogus_ib); | 176 | INIT_LIST_HEAD(&rdev->ib_pool.bogus_ib); |
177 | /* Allocate 1M object buffer */ | 177 | /* Allocate 1M object buffer */ |
178 | r = radeon_bo_create(rdev, NULL, RADEON_IB_POOL_SIZE*64*1024, | 178 | r = radeon_bo_create(rdev, RADEON_IB_POOL_SIZE*64*1024, |
179 | true, RADEON_GEM_DOMAIN_GTT, | 179 | PAGE_SIZE, true, RADEON_GEM_DOMAIN_GTT, |
180 | &rdev->ib_pool.robj); | 180 | &rdev->ib_pool.robj); |
181 | if (r) { | 181 | if (r) { |
182 | DRM_ERROR("radeon: failed to ib pool (%d).\n", r); | 182 | DRM_ERROR("radeon: failed to ib pool (%d).\n", r); |
183 | return r; | 183 | return r; |
@@ -194,7 +194,7 @@ int radeon_ib_pool_init(struct radeon_device *rdev) | |||
194 | r = radeon_bo_kmap(rdev->ib_pool.robj, &ptr); | 194 | r = radeon_bo_kmap(rdev->ib_pool.robj, &ptr); |
195 | radeon_bo_unreserve(rdev->ib_pool.robj); | 195 | radeon_bo_unreserve(rdev->ib_pool.robj); |
196 | if (r) { | 196 | if (r) { |
197 | DRM_ERROR("radeon: failed to map ib poll (%d).\n", r); | 197 | DRM_ERROR("radeon: failed to map ib pool (%d).\n", r); |
198 | return r; | 198 | return r; |
199 | } | 199 | } |
200 | for (i = 0; i < RADEON_IB_POOL_SIZE; i++) { | 200 | for (i = 0; i < RADEON_IB_POOL_SIZE; i++) { |
@@ -247,10 +247,14 @@ void radeon_ib_pool_fini(struct radeon_device *rdev) | |||
247 | */ | 247 | */ |
248 | void radeon_ring_free_size(struct radeon_device *rdev) | 248 | void radeon_ring_free_size(struct radeon_device *rdev) |
249 | { | 249 | { |
250 | if (rdev->family >= CHIP_R600) | 250 | if (rdev->wb.enabled) |
251 | rdev->cp.rptr = RREG32(R600_CP_RB_RPTR); | 251 | rdev->cp.rptr = le32_to_cpu(rdev->wb.wb[RADEON_WB_CP_RPTR_OFFSET/4]); |
252 | else | 252 | else { |
253 | rdev->cp.rptr = RREG32(RADEON_CP_RB_RPTR); | 253 | if (rdev->family >= CHIP_R600) |
254 | rdev->cp.rptr = RREG32(R600_CP_RB_RPTR); | ||
255 | else | ||
256 | rdev->cp.rptr = RREG32(RADEON_CP_RB_RPTR); | ||
257 | } | ||
254 | /* This works because ring_size is a power of 2 */ | 258 | /* This works because ring_size is a power of 2 */ |
255 | rdev->cp.ring_free_dw = (rdev->cp.rptr + (rdev->cp.ring_size / 4)); | 259 | rdev->cp.ring_free_dw = (rdev->cp.rptr + (rdev->cp.ring_size / 4)); |
256 | rdev->cp.ring_free_dw -= rdev->cp.wptr; | 260 | rdev->cp.ring_free_dw -= rdev->cp.wptr; |
@@ -328,7 +332,7 @@ int radeon_ring_init(struct radeon_device *rdev, unsigned ring_size) | |||
328 | rdev->cp.ring_size = ring_size; | 332 | rdev->cp.ring_size = ring_size; |
329 | /* Allocate ring buffer */ | 333 | /* Allocate ring buffer */ |
330 | if (rdev->cp.ring_obj == NULL) { | 334 | if (rdev->cp.ring_obj == NULL) { |
331 | r = radeon_bo_create(rdev, NULL, rdev->cp.ring_size, true, | 335 | r = radeon_bo_create(rdev, rdev->cp.ring_size, PAGE_SIZE, true, |
332 | RADEON_GEM_DOMAIN_GTT, | 336 | RADEON_GEM_DOMAIN_GTT, |
333 | &rdev->cp.ring_obj); | 337 | &rdev->cp.ring_obj); |
334 | if (r) { | 338 | if (r) { |