diff options
author | Christian König <christian.koenig@amd.com> | 2016-02-01 06:31:01 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2016-02-10 14:17:23 -0500 |
commit | 0856cab1a6298d9cbf037dc683ce514cadb28040 (patch) | |
tree | c0b0fa03d84ad2339399bc9e2d21688b300b36c9 /drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | |
parent | d71518b5aa7c9c298ffbd12ddd23297e3373a37b (diff) |
drm/amdgpu: rename amdgpu_sched.c to amdgpu_job.c
That's probably a better matching name.
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_job.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c new file mode 100644 index 000000000000..6f3e757e056e --- /dev/null +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | |||
@@ -0,0 +1,151 @@ | |||
1 | /* | ||
2 | * Copyright 2015 Advanced Micro Devices, Inc. | ||
3 | * | ||
4 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
5 | * copy of this software and associated documentation files (the "Software"), | ||
6 | * to deal in the Software without restriction, including without limitation | ||
7 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
8 | * and/or sell copies of the Software, and to permit persons to whom the | ||
9 | * Software is furnished to do so, subject to the following conditions: | ||
10 | * | ||
11 | * The above copyright notice and this permission notice shall be included in | ||
12 | * all copies or substantial portions of the Software. | ||
13 | * | ||
14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
15 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
16 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
17 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
18 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
19 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
20 | * OTHER DEALINGS IN THE SOFTWARE. | ||
21 | * | ||
22 | * | ||
23 | */ | ||
24 | #include <linux/kthread.h> | ||
25 | #include <linux/wait.h> | ||
26 | #include <linux/sched.h> | ||
27 | #include <drm/drmP.h> | ||
28 | #include "amdgpu.h" | ||
29 | #include "amdgpu_trace.h" | ||
30 | |||
31 | int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs, | ||
32 | struct amdgpu_job **job) | ||
33 | { | ||
34 | size_t size = sizeof(struct amdgpu_job); | ||
35 | |||
36 | if (num_ibs == 0) | ||
37 | return -EINVAL; | ||
38 | |||
39 | size += sizeof(struct amdgpu_ib) * num_ibs; | ||
40 | |||
41 | *job = kzalloc(size, GFP_KERNEL); | ||
42 | if (!*job) | ||
43 | return -ENOMEM; | ||
44 | |||
45 | (*job)->adev = adev; | ||
46 | (*job)->ibs = (void *)&(*job)[1]; | ||
47 | (*job)->num_ibs = num_ibs; | ||
48 | |||
49 | return 0; | ||
50 | } | ||
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 | |||
68 | void amdgpu_job_free(struct amdgpu_job *job) | ||
69 | { | ||
70 | unsigned i; | ||
71 | |||
72 | for (i = 0; i < job->num_ibs; ++i) | ||
73 | amdgpu_ib_free(job->adev, &job->ibs[i]); | ||
74 | |||
75 | amdgpu_bo_unref(&job->uf.bo); | ||
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; | ||
97 | } | ||
98 | |||
99 | static struct fence *amdgpu_job_dependency(struct amd_sched_job *sched_job) | ||
100 | { | ||
101 | struct amdgpu_job *job = to_amdgpu_job(sched_job); | ||
102 | struct amdgpu_sync *sync = &job->ibs->sync; | ||
103 | struct amdgpu_vm *vm = job->ibs->vm; | ||
104 | |||
105 | struct fence *fence = amdgpu_sync_get_fence(sync); | ||
106 | |||
107 | if (fence == NULL && vm && !job->ibs->grabbed_vmid) { | ||
108 | struct amdgpu_ring *ring = job->ring; | ||
109 | int r; | ||
110 | |||
111 | r = amdgpu_vm_grab_id(vm, ring, sync, | ||
112 | &job->base.s_fence->base); | ||
113 | if (r) | ||
114 | DRM_ERROR("Error getting VM ID (%d)\n", r); | ||
115 | else | ||
116 | job->ibs->grabbed_vmid = true; | ||
117 | |||
118 | fence = amdgpu_sync_get_fence(sync); | ||
119 | } | ||
120 | |||
121 | return fence; | ||
122 | } | ||
123 | |||
124 | static struct fence *amdgpu_job_run(struct amd_sched_job *sched_job) | ||
125 | { | ||
126 | struct fence *fence = NULL; | ||
127 | struct amdgpu_job *job; | ||
128 | int r; | ||
129 | |||
130 | if (!sched_job) { | ||
131 | DRM_ERROR("job is null\n"); | ||
132 | return NULL; | ||
133 | } | ||
134 | job = to_amdgpu_job(sched_job); | ||
135 | trace_amdgpu_sched_run_job(job); | ||
136 | r = amdgpu_ib_schedule(job->ring, job->num_ibs, job->ibs, | ||
137 | job->owner, &fence); | ||
138 | if (r) { | ||
139 | DRM_ERROR("Error scheduling IBs (%d)\n", r); | ||
140 | goto err; | ||
141 | } | ||
142 | |||
143 | err: | ||
144 | amdgpu_job_free(job); | ||
145 | return fence; | ||
146 | } | ||
147 | |||
148 | struct amd_sched_backend_ops amdgpu_sched_ops = { | ||
149 | .dependency = amdgpu_job_dependency, | ||
150 | .run_job = amdgpu_job_run, | ||
151 | }; | ||