diff options
author | Christian König <christian.koenig@amd.com> | 2016-01-31 05:30:55 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2016-02-10 14:17:14 -0500 |
commit | cd75dc6887f1e1fddc4ee8ef5ae4e40529607379 (patch) | |
tree | f19195117e1ab5939e1171338029daedd5895f8d /drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | |
parent | 7270f8391df1a0b68fb6bef416dd6d7d0634ed71 (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.c | 96 |
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 | ||
769 | static 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 | |||
769 | int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) | 817 | int 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 | ||
863 | out: | 867 | out: |
864 | amdgpu_cs_parser_fini(&parser, r, reserved_buffers); | 868 | amdgpu_cs_parser_fini(&parser, r, reserved_buffers); |