Commit 91700f3c authored by Matthew Garrett's avatar Matthew Garrett Committed by Dave Airlie

radeon: Split out ring locking and allocation

We need to handle the ring while we've already locked it, so split out
the allocation and commit functions in order to allow them to be used.
Signed-off-by: default avatarMatthew Garrett <mjg@redhat.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 78930b1c
...@@ -471,7 +471,9 @@ int radeon_ib_test(struct radeon_device *rdev); ...@@ -471,7 +471,9 @@ int radeon_ib_test(struct radeon_device *rdev);
extern void radeon_ib_bogus_add(struct radeon_device *rdev, struct radeon_ib *ib); extern void radeon_ib_bogus_add(struct radeon_device *rdev, struct radeon_ib *ib);
/* Ring access between begin & end cannot sleep */ /* Ring access between begin & end cannot sleep */
void radeon_ring_free_size(struct radeon_device *rdev); void radeon_ring_free_size(struct radeon_device *rdev);
int radeon_ring_alloc(struct radeon_device *rdev, unsigned ndw);
int radeon_ring_lock(struct radeon_device *rdev, unsigned ndw); int radeon_ring_lock(struct radeon_device *rdev, unsigned ndw);
void radeon_ring_commit(struct radeon_device *rdev);
void radeon_ring_unlock_commit(struct radeon_device *rdev); void radeon_ring_unlock_commit(struct radeon_device *rdev);
void radeon_ring_unlock_undo(struct radeon_device *rdev); void radeon_ring_unlock_undo(struct radeon_device *rdev);
int radeon_ring_test(struct radeon_device *rdev); int radeon_ring_test(struct radeon_device *rdev);
......
...@@ -258,31 +258,41 @@ void radeon_ring_free_size(struct radeon_device *rdev) ...@@ -258,31 +258,41 @@ void radeon_ring_free_size(struct radeon_device *rdev)
} }
} }
int radeon_ring_lock(struct radeon_device *rdev, unsigned ndw) int radeon_ring_alloc(struct radeon_device *rdev, unsigned ndw)
{ {
int r; int r;
/* Align requested size with padding so unlock_commit can /* Align requested size with padding so unlock_commit can
* pad safely */ * pad safely */
ndw = (ndw + rdev->cp.align_mask) & ~rdev->cp.align_mask; ndw = (ndw + rdev->cp.align_mask) & ~rdev->cp.align_mask;
mutex_lock(&rdev->cp.mutex);
while (ndw > (rdev->cp.ring_free_dw - 1)) { while (ndw > (rdev->cp.ring_free_dw - 1)) {
radeon_ring_free_size(rdev); radeon_ring_free_size(rdev);
if (ndw < rdev->cp.ring_free_dw) { if (ndw < rdev->cp.ring_free_dw) {
break; break;
} }
r = radeon_fence_wait_next(rdev); r = radeon_fence_wait_next(rdev);
if (r) { if (r)
mutex_unlock(&rdev->cp.mutex);
return r; return r;
}
} }
rdev->cp.count_dw = ndw; rdev->cp.count_dw = ndw;
rdev->cp.wptr_old = rdev->cp.wptr; rdev->cp.wptr_old = rdev->cp.wptr;
return 0; return 0;
} }
void radeon_ring_unlock_commit(struct radeon_device *rdev) int radeon_ring_lock(struct radeon_device *rdev, unsigned ndw)
{
int r;
mutex_lock(&rdev->cp.mutex);
r = radeon_ring_alloc(rdev, ndw);
if (r) {
mutex_unlock(&rdev->cp.mutex);
return r;
}
return 0;
}
void radeon_ring_commit(struct radeon_device *rdev)
{ {
unsigned count_dw_pad; unsigned count_dw_pad;
unsigned i; unsigned i;
...@@ -295,6 +305,11 @@ void radeon_ring_unlock_commit(struct radeon_device *rdev) ...@@ -295,6 +305,11 @@ void radeon_ring_unlock_commit(struct radeon_device *rdev)
} }
DRM_MEMORYBARRIER(); DRM_MEMORYBARRIER();
radeon_cp_commit(rdev); radeon_cp_commit(rdev);
}
void radeon_ring_unlock_commit(struct radeon_device *rdev)
{
radeon_ring_commit(rdev);
mutex_unlock(&rdev->cp.mutex); mutex_unlock(&rdev->cp.mutex);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment