aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c43
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;