Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 282732
b: refs/heads/master
c: 3000bf3
h: refs/heads/master
v: v3
  • Loading branch information
Alex Deucher authored and Dave Airlie committed Jan 6, 2012
1 parent c5df1bc commit e769808
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 5 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 93504fce28b1a387ec01f81b26637d237dca2b36
refs/heads/master: 3000bf393302a8c786e9ebfc778050cb0d6226c4
2 changes: 2 additions & 0 deletions trunk/drivers/gpu/drm/radeon/radeon.h
Original file line number Diff line number Diff line change
Expand Up @@ -1489,6 +1489,8 @@ struct radeon_device {
unsigned debugfs_count;
/* virtual memory */
struct radeon_vm_manager vm_manager;
/* ring used for bo copies */
u32 copy_ring;
};

int radeon_device_init(struct radeon_device *rdev,
Expand Down
3 changes: 3 additions & 0 deletions trunk/drivers/gpu/drm/radeon/radeon_asic.c
Original file line number Diff line number Diff line change
Expand Up @@ -1036,6 +1036,9 @@ int radeon_asic_init(struct radeon_device *rdev)
else
rdev->num_crtc = 2;

/* set the ring used for bo copies */
rdev->copy_ring = RADEON_RING_TYPE_GFX_INDEX;

switch (rdev->family) {
case CHIP_R100:
case CHIP_RV100:
Expand Down
38 changes: 34 additions & 4 deletions trunk/drivers/gpu/drm/radeon/radeon_ttm.c
Original file line number Diff line number Diff line change
Expand Up @@ -223,10 +223,10 @@ static int radeon_move_blit(struct ttm_buffer_object *bo,
struct radeon_device *rdev;
uint64_t old_start, new_start;
struct radeon_fence *fence;
int r;
int r, i;

rdev = radeon_get_rdev(bo->bdev);
r = radeon_fence_create(rdev, &fence, RADEON_RING_TYPE_GFX_INDEX);
r = radeon_fence_create(rdev, &fence, rdev->copy_ring);
if (unlikely(r)) {
return r;
}
Expand Down Expand Up @@ -255,13 +255,43 @@ static int radeon_move_blit(struct ttm_buffer_object *bo,
DRM_ERROR("Unknown placement %d\n", old_mem->mem_type);
return -EINVAL;
}
if (!rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready) {
DRM_ERROR("Trying to move memory with CP turned off.\n");
if (!rdev->ring[rdev->copy_ring].ready) {
DRM_ERROR("Trying to move memory with ring turned off.\n");
return -EINVAL;
}

BUILD_BUG_ON((PAGE_SIZE % RADEON_GPU_PAGE_SIZE) != 0);

/* sync other rings */
if (rdev->family >= CHIP_R600) {
for (i = 0; i < RADEON_NUM_RINGS; ++i) {
/* no need to sync to our own or unused rings */
if (i == rdev->copy_ring || !rdev->ring[i].ready)
continue;

if (!fence->semaphore) {
r = radeon_semaphore_create(rdev, &fence->semaphore);
/* FIXME: handle semaphore error */
if (r)
continue;
}

r = radeon_ring_lock(rdev, &rdev->ring[i], 3);
/* FIXME: handle ring lock error */
if (r)
continue;
radeon_semaphore_emit_signal(rdev, i, fence->semaphore);
radeon_ring_unlock_commit(rdev, &rdev->ring[i]);

r = radeon_ring_lock(rdev, &rdev->ring[rdev->copy_ring], 3);
/* FIXME: handle ring lock error */
if (r)
continue;
radeon_semaphore_emit_wait(rdev, rdev->copy_ring, fence->semaphore);
radeon_ring_unlock_commit(rdev, &rdev->ring[rdev->copy_ring]);
}
}

r = radeon_copy(rdev, old_start, new_start,
new_mem->num_pages * (PAGE_SIZE / RADEON_GPU_PAGE_SIZE), /* GPU pages */
fence);
Expand Down

0 comments on commit e769808

Please sign in to comment.