aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
diff options
context:
space:
mode:
authorChunming Zhou <david1.zhou@amd.com>2015-08-01 23:18:04 -0400
committerAlex Deucher <alexander.deucher@amd.com>2015-08-17 16:51:07 -0400
commitf556cb0caeec1ba9b8e5e2aa85b47e76277f5d4b (patch)
tree1325c1eb049a5a85901437743ea0c3f499f73f2d /drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
parent4af9f07ccdac96e16f7a0ddaf983891a29ebd11a (diff)
drm/amd: add scheduler fence implementation (v2)
scheduler fence is based on kernel fence framework. v2: squash in Christian's build fix Signed-off-by: Chunming Zhou <david1.zhou@amd.com> Reviewed-by: Christian K?nig <christian.koenig@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index b1dc7e1ed271..f428288d8363 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -899,8 +899,6 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
899 if (amdgpu_enable_scheduler && parser->num_ibs) { 899 if (amdgpu_enable_scheduler && parser->num_ibs) {
900 struct amdgpu_ring * ring = 900 struct amdgpu_ring * ring =
901 amdgpu_cs_parser_get_ring(adev, parser); 901 amdgpu_cs_parser_get_ring(adev, parser);
902 parser->ibs[parser->num_ibs - 1].sequence = atomic64_inc_return(
903 &parser->ctx->rings[ring->idx].entity.last_queued_v_seq);
904 if (ring->is_pte_ring || (parser->bo_list && parser->bo_list->has_userptr)) { 902 if (ring->is_pte_ring || (parser->bo_list && parser->bo_list->has_userptr)) {
905 r = amdgpu_cs_parser_prepare_job(parser); 903 r = amdgpu_cs_parser_prepare_job(parser);
906 if (r) 904 if (r)
@@ -910,10 +908,21 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
910 parser->ring = ring; 908 parser->ring = ring;
911 parser->run_job = amdgpu_cs_parser_run_job; 909 parser->run_job = amdgpu_cs_parser_run_job;
912 parser->free_job = amdgpu_cs_parser_free_job; 910 parser->free_job = amdgpu_cs_parser_free_job;
913 amd_sched_push_job(ring->scheduler, 911 mutex_lock(&parser->job_lock);
914 &parser->ctx->rings[ring->idx].entity, 912 r = amd_sched_push_job(ring->scheduler,
915 parser); 913 &parser->ctx->rings[ring->idx].entity,
916 cs->out.handle = parser->ibs[parser->num_ibs - 1].sequence; 914 parser,
915 &parser->s_fence);
916 if (r) {
917 mutex_unlock(&parser->job_lock);
918 goto out;
919 }
920 parser->ibs[parser->num_ibs - 1].sequence =
921 amdgpu_ctx_add_fence(parser->ctx, ring,
922 &parser->s_fence->base,
923 parser->s_fence->v_seq);
924 cs->out.handle = parser->s_fence->v_seq;
925 mutex_unlock(&parser->job_lock);
917 up_read(&adev->exclusive_lock); 926 up_read(&adev->exclusive_lock);
918 return 0; 927 return 0;
919 } 928 }