aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2016-02-01 06:20:25 -0500
committerAlex Deucher <alexander.deucher@amd.com>2016-02-10 14:17:22 -0500
commitd71518b5aa7c9c298ffbd12ddd23297e3373a37b (patch)
treebb548c89c8f21770cdf7086fee8c1c92aea1fa64 /drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c
parenta0332b56f6e03e15946fb9d8813cfe44aeeb0e6c (diff)
drm/amdgpu: cleanup in kernel job submission
Add a job_alloc_with_ib helper and proper job submission. Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Alex Deucher <alexander.deucer@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c76
1 files changed, 38 insertions, 38 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c
index cabb0fc28610..bbdda727f89a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c
@@ -45,11 +45,26 @@ int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs,
45 (*job)->adev = adev; 45 (*job)->adev = adev;
46 (*job)->ibs = (void *)&(*job)[1]; 46 (*job)->ibs = (void *)&(*job)[1];
47 (*job)->num_ibs = num_ibs; 47 (*job)->num_ibs = num_ibs;
48 (*job)->free_job = NULL;
49 48
50 return 0; 49 return 0;
51} 50}
52 51
52int amdgpu_job_alloc_with_ib(struct amdgpu_device *adev, unsigned size,
53 struct amdgpu_job **job)
54{
55 int r;
56
57 r = amdgpu_job_alloc(adev, 1, job);
58 if (r)
59 return r;
60
61 r = amdgpu_ib_get(adev, NULL, size, &(*job)->ibs[0]);
62 if (r)
63 kfree(*job);
64
65 return r;
66}
67
53void amdgpu_job_free(struct amdgpu_job *job) 68void amdgpu_job_free(struct amdgpu_job *job)
54{ 69{
55 unsigned i; 70 unsigned i;
@@ -58,7 +73,27 @@ void amdgpu_job_free(struct amdgpu_job *job)
58 amdgpu_ib_free(job->adev, &job->ibs[i]); 73 amdgpu_ib_free(job->adev, &job->ibs[i]);
59 74
60 amdgpu_bo_unref(&job->uf.bo); 75 amdgpu_bo_unref(&job->uf.bo);
61 /* TODO: Free the job structure here as well */ 76 kfree(job);
77}
78
79int amdgpu_job_submit(struct amdgpu_job *job, struct amdgpu_ring *ring,
80 void *owner, struct fence **f)
81{
82 struct amdgpu_device *adev = job->adev;
83
84 job->ring = ring;
85 job->base.sched = &ring->sched;
86 job->base.s_entity = &adev->kernel_ctx.rings[ring->idx].entity;
87 job->base.s_fence = amd_sched_fence_create(job->base.s_entity, owner);
88 if (!job->base.s_fence)
89 return -ENOMEM;
90
91 *f = fence_get(&job->base.s_fence->base);
92
93 job->owner = owner;
94 amd_sched_entity_push_job(&job->base);
95
96 return 0;
62} 97}
63 98
64static struct fence *amdgpu_sched_dependency(struct amd_sched_job *sched_job) 99static struct fence *amdgpu_sched_dependency(struct amd_sched_job *sched_job)
@@ -106,10 +141,7 @@ static struct fence *amdgpu_sched_run_job(struct amd_sched_job *sched_job)
106 } 141 }
107 142
108err: 143err:
109 if (job->free_job) 144 amdgpu_job_free(job);
110 job->free_job(job);
111
112 kfree(job);
113 return fence; 145 return fence;
114} 146}
115 147
@@ -117,35 +149,3 @@ struct amd_sched_backend_ops amdgpu_sched_ops = {
117 .dependency = amdgpu_sched_dependency, 149 .dependency = amdgpu_sched_dependency,
118 .run_job = amdgpu_sched_run_job, 150 .run_job = amdgpu_sched_run_job,
119}; 151};
120
121int amdgpu_sched_ib_submit_kernel_helper(struct amdgpu_device *adev,
122 struct amdgpu_ring *ring,
123 struct amdgpu_ib *ibs,
124 unsigned num_ibs,
125 int (*free_job)(struct amdgpu_job *),
126 void *owner,
127 struct fence **f)
128{
129 struct amdgpu_job *job =
130 kzalloc(sizeof(struct amdgpu_job), GFP_KERNEL);
131 if (!job)
132 return -ENOMEM;
133 job->base.sched = &ring->sched;
134 job->base.s_entity = &adev->kernel_ctx.rings[ring->idx].entity;
135 job->base.s_fence = amd_sched_fence_create(job->base.s_entity, owner);
136 if (!job->base.s_fence) {
137 kfree(job);
138 return -ENOMEM;
139 }
140 *f = fence_get(&job->base.s_fence->base);
141
142 job->adev = adev;
143 job->ring = ring;
144 job->ibs = ibs;
145 job->num_ibs = num_ibs;
146 job->owner = owner;
147 job->free_job = free_job;
148 amd_sched_entity_push_job(&job->base);
149
150 return 0;
151}