aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2016-01-31 05:30:55 -0500
committerAlex Deucher <alexander.deucher@amd.com>2016-02-10 14:17:14 -0500
commitcd75dc6887f1e1fddc4ee8ef5ae4e40529607379 (patch)
treef19195117e1ab5939e1171338029daedd5895f8d /drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
parent7270f8391df1a0b68fb6bef416dd6d7d0634ed71 (diff)
drm/amdgpu: separate pushing CS to scheduler
Move that out of the main IOCTL function. Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c96
1 files changed, 50 insertions, 46 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index ddeba55c3b7d..a795af3ab0ad 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -766,6 +766,54 @@ static int amdgpu_cs_free_job(struct amdgpu_job *job)
766 return 0; 766 return 0;
767} 767}
768 768
769static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
770 union drm_amdgpu_cs *cs)
771{
772 struct amdgpu_ring * ring = p->ibs->ring;
773 struct amd_sched_fence *fence;
774 struct amdgpu_job *job;
775
776 job = kzalloc(sizeof(struct amdgpu_job), GFP_KERNEL);
777 if (!job)
778 return -ENOMEM;
779
780 job->base.sched = &ring->sched;
781 job->base.s_entity = &p->ctx->rings[ring->idx].entity;
782 job->adev = p->adev;
783 job->owner = p->filp;
784 job->free_job = amdgpu_cs_free_job;
785
786 job->ibs = p->ibs;
787 job->num_ibs = p->num_ibs;
788 p->ibs = NULL;
789 p->num_ibs = 0;
790
791 if (job->ibs[job->num_ibs - 1].user) {
792 job->uf = p->uf;
793 job->ibs[job->num_ibs - 1].user = &job->uf;
794 p->uf.bo = NULL;
795 }
796
797 fence = amd_sched_fence_create(job->base.s_entity, p->filp);
798 if (!fence) {
799 amdgpu_cs_free_job(job);
800 kfree(job);
801 return -ENOMEM;
802 }
803
804 job->base.s_fence = fence;
805 p->fence = fence_get(&fence->base);
806
807 cs->out.handle = amdgpu_ctx_add_fence(p->ctx, ring,
808 &fence->base);
809 job->ibs[job->num_ibs - 1].sequence = cs->out.handle;
810
811 trace_amdgpu_cs_ioctl(job);
812 amd_sched_entity_push_job(&job->base);
813
814 return 0;
815}
816
769int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) 817int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
770{ 818{
771 struct amdgpu_device *adev = dev->dev_private; 819 struct amdgpu_device *adev = dev->dev_private;
@@ -813,52 +861,8 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
813 if (r) 861 if (r)
814 goto out; 862 goto out;
815 863
816 if (parser.num_ibs) { 864 if (parser.num_ibs)
817 struct amdgpu_ring * ring = parser.ibs->ring; 865 r = amdgpu_cs_submit(&parser, cs);
818 struct amd_sched_fence *fence;
819 struct amdgpu_job *job;
820
821 job = kzalloc(sizeof(struct amdgpu_job), GFP_KERNEL);
822 if (!job) {
823 r = -ENOMEM;
824 goto out;
825 }
826
827 job->base.sched = &ring->sched;
828 job->base.s_entity = &parser.ctx->rings[ring->idx].entity;
829 job->adev = parser.adev;
830 job->owner = parser.filp;
831 job->free_job = amdgpu_cs_free_job;
832
833 job->ibs = parser.ibs;
834 job->num_ibs = parser.num_ibs;
835 parser.ibs = NULL;
836 parser.num_ibs = 0;
837
838 if (job->ibs[job->num_ibs - 1].user) {
839 job->uf = parser.uf;
840 job->ibs[job->num_ibs - 1].user = &job->uf;
841 parser.uf.bo = NULL;
842 }
843
844 fence = amd_sched_fence_create(job->base.s_entity,
845 parser.filp);
846 if (!fence) {
847 r = -ENOMEM;
848 amdgpu_cs_free_job(job);
849 kfree(job);
850 goto out;
851 }
852 job->base.s_fence = fence;
853 parser.fence = fence_get(&fence->base);
854
855 cs->out.handle = amdgpu_ctx_add_fence(parser.ctx, ring,
856 &fence->base);
857 job->ibs[job->num_ibs - 1].sequence = cs->out.handle;
858
859 trace_amdgpu_cs_ioctl(job);
860 amd_sched_entity_push_job(&job->base);
861 }
862 866
863out: 867out:
864 amdgpu_cs_parser_fini(&parser, r, reserved_buffers); 868 amdgpu_cs_parser_fini(&parser, r, reserved_buffers);