diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 43 |
1 files changed, 24 insertions, 19 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index 2ae73d5232dd..44cf977ae4f6 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | |||
@@ -845,8 +845,9 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) | |||
845 | goto out; | 845 | goto out; |
846 | 846 | ||
847 | if (amdgpu_enable_scheduler && parser.num_ibs) { | 847 | if (amdgpu_enable_scheduler && parser.num_ibs) { |
848 | struct amdgpu_job *job; | ||
849 | struct amdgpu_ring * ring = parser.ibs->ring; | 848 | struct amdgpu_ring * ring = parser.ibs->ring; |
849 | struct amd_sched_fence *fence; | ||
850 | struct amdgpu_job *job; | ||
850 | 851 | ||
851 | job = kzalloc(sizeof(struct amdgpu_job), GFP_KERNEL); | 852 | job = kzalloc(sizeof(struct amdgpu_job), GFP_KERNEL); |
852 | if (!job) { | 853 | if (!job) { |
@@ -859,37 +860,41 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) | |||
859 | job->adev = parser.adev; | 860 | job->adev = parser.adev; |
860 | job->ibs = parser.ibs; | 861 | job->ibs = parser.ibs; |
861 | job->num_ibs = parser.num_ibs; | 862 | job->num_ibs = parser.num_ibs; |
862 | job->base.owner = parser.filp; | 863 | job->owner = parser.filp; |
863 | mutex_init(&job->job_lock); | 864 | job->free_job = amdgpu_cs_free_job; |
865 | |||
864 | if (job->ibs[job->num_ibs - 1].user) { | 866 | if (job->ibs[job->num_ibs - 1].user) { |
865 | job->uf = parser.uf; | 867 | job->uf = parser.uf; |
866 | job->ibs[job->num_ibs - 1].user = &job->uf; | 868 | job->ibs[job->num_ibs - 1].user = &job->uf; |
867 | parser.uf.bo = NULL; | 869 | parser.uf.bo = NULL; |
868 | } | 870 | } |
869 | 871 | ||
870 | parser.ibs = NULL; | 872 | fence = amd_sched_fence_create(job->base.s_entity, |
871 | parser.num_ibs = 0; | 873 | parser.filp); |
872 | 874 | if (!fence) { | |
873 | job->free_job = amdgpu_cs_free_job; | 875 | r = -ENOMEM; |
874 | mutex_lock(&job->job_lock); | ||
875 | r = amd_sched_entity_push_job(&job->base); | ||
876 | if (r) { | ||
877 | mutex_unlock(&job->job_lock); | ||
878 | amdgpu_cs_free_job(job); | 876 | amdgpu_cs_free_job(job); |
879 | kfree(job); | 877 | kfree(job); |
880 | goto out; | 878 | goto out; |
881 | } | 879 | } |
882 | cs->out.handle = | 880 | job->base.s_fence = fence; |
883 | amdgpu_ctx_add_fence(parser.ctx, ring, | 881 | fence_get(&fence->base); |
884 | &job->base.s_fence->base); | 882 | |
883 | cs->out.handle = amdgpu_ctx_add_fence(parser.ctx, ring, | ||
884 | &fence->base); | ||
885 | job->ibs[job->num_ibs - 1].sequence = cs->out.handle; | 885 | job->ibs[job->num_ibs - 1].sequence = cs->out.handle; |
886 | 886 | ||
887 | list_sort(NULL, &parser.validated, cmp_size_smaller_first); | 887 | parser.ibs = NULL; |
888 | ttm_eu_fence_buffer_objects(&parser.ticket, | 888 | parser.num_ibs = 0; |
889 | &parser.validated, | 889 | |
890 | &job->base.s_fence->base); | ||
891 | trace_amdgpu_cs_ioctl(job); | 890 | trace_amdgpu_cs_ioctl(job); |
892 | mutex_unlock(&job->job_lock); | 891 | amd_sched_entity_push_job(&job->base); |
892 | |||
893 | list_sort(NULL, &parser.validated, cmp_size_smaller_first); | ||
894 | ttm_eu_fence_buffer_objects(&parser.ticket, &parser.validated, | ||
895 | &fence->base); | ||
896 | fence_put(&fence->base); | ||
897 | |||
893 | amdgpu_cs_parser_fini_late(&parser); | 898 | amdgpu_cs_parser_fini_late(&parser); |
894 | mutex_unlock(&vm->mutex); | 899 | mutex_unlock(&vm->mutex); |
895 | return 0; | 900 | return 0; |