diff options
author | Christian König <christian.koenig@amd.com> | 2016-02-01 06:20:25 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2016-02-10 14:17:22 -0500 |
commit | d71518b5aa7c9c298ffbd12ddd23297e3373a37b (patch) | |
tree | bb548c89c8f21770cdf7086fee8c1c92aea1fa64 /drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c | |
parent | a0332b56f6e03e15946fb9d8813cfe44aeeb0e6c (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.c | 76 |
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 | ||
52 | int 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 | |||
53 | void amdgpu_job_free(struct amdgpu_job *job) | 68 | void 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 | |||
79 | int 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 | ||
64 | static struct fence *amdgpu_sched_dependency(struct amd_sched_job *sched_job) | 99 | static 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 | ||
108 | err: | 143 | err: |
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 | |||
121 | int 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 | } | ||