diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c | 65 |
1 files changed, 25 insertions, 40 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c index de98fbd2971e..2e946b2cad88 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c | |||
@@ -27,63 +27,48 @@ | |||
27 | #include <drm/drmP.h> | 27 | #include <drm/drmP.h> |
28 | #include "amdgpu.h" | 28 | #include "amdgpu.h" |
29 | 29 | ||
30 | static struct fence *amdgpu_sched_dependency(struct amd_sched_job *job) | 30 | static struct fence *amdgpu_sched_dependency(struct amd_sched_job *sched_job) |
31 | { | 31 | { |
32 | struct amdgpu_job *sched_job = (struct amdgpu_job *)job; | 32 | struct amdgpu_job *job = to_amdgpu_job(sched_job); |
33 | return amdgpu_sync_get_fence(&sched_job->ibs->sync); | 33 | return amdgpu_sync_get_fence(&job->ibs->sync); |
34 | } | 34 | } |
35 | 35 | ||
36 | static struct fence *amdgpu_sched_run_job(struct amd_sched_job *job) | 36 | static struct fence *amdgpu_sched_run_job(struct amd_sched_job *sched_job) |
37 | { | 37 | { |
38 | struct amdgpu_job *sched_job; | 38 | struct amdgpu_fence *fence = NULL; |
39 | struct amdgpu_fence *fence; | 39 | struct amdgpu_job *job; |
40 | int r; | 40 | int r; |
41 | 41 | ||
42 | if (!job) { | 42 | if (!sched_job) { |
43 | DRM_ERROR("job is null\n"); | 43 | DRM_ERROR("job is null\n"); |
44 | return NULL; | 44 | return NULL; |
45 | } | 45 | } |
46 | sched_job = (struct amdgpu_job *)job; | 46 | job = to_amdgpu_job(sched_job); |
47 | mutex_lock(&sched_job->job_lock); | 47 | mutex_lock(&job->job_lock); |
48 | r = amdgpu_ib_schedule(sched_job->adev, | 48 | r = amdgpu_ib_schedule(job->adev, |
49 | sched_job->num_ibs, | 49 | job->num_ibs, |
50 | sched_job->ibs, | 50 | job->ibs, |
51 | sched_job->base.owner); | 51 | job->base.owner); |
52 | if (r) | 52 | if (r) { |
53 | DRM_ERROR("Error scheduling IBs (%d)\n", r); | ||
53 | goto err; | 54 | goto err; |
54 | fence = amdgpu_fence_ref(sched_job->ibs[sched_job->num_ibs - 1].fence); | 55 | } |
55 | |||
56 | if (sched_job->free_job) | ||
57 | sched_job->free_job(sched_job); | ||
58 | 56 | ||
59 | mutex_unlock(&sched_job->job_lock); | 57 | fence = amdgpu_fence_ref(job->ibs[job->num_ibs - 1].fence); |
60 | return &fence->base; | ||
61 | 58 | ||
62 | err: | 59 | err: |
63 | DRM_ERROR("Run job error\n"); | 60 | if (job->free_job) |
64 | mutex_unlock(&sched_job->job_lock); | 61 | job->free_job(job); |
65 | job->sched->ops->process_job(job); | ||
66 | return NULL; | ||
67 | } | ||
68 | 62 | ||
69 | static void amdgpu_sched_process_job(struct amd_sched_job *job) | 63 | mutex_unlock(&job->job_lock); |
70 | { | 64 | fence_put(&job->base.s_fence->base); |
71 | struct amdgpu_job *sched_job; | 65 | kfree(job); |
72 | 66 | return fence ? &fence->base : NULL; | |
73 | if (!job) { | ||
74 | DRM_ERROR("job is null\n"); | ||
75 | return; | ||
76 | } | ||
77 | sched_job = (struct amdgpu_job *)job; | ||
78 | /* after processing job, free memory */ | ||
79 | fence_put(&sched_job->base.s_fence->base); | ||
80 | kfree(sched_job); | ||
81 | } | 67 | } |
82 | 68 | ||
83 | struct amd_sched_backend_ops amdgpu_sched_ops = { | 69 | struct amd_sched_backend_ops amdgpu_sched_ops = { |
84 | .dependency = amdgpu_sched_dependency, | 70 | .dependency = amdgpu_sched_dependency, |
85 | .run_job = amdgpu_sched_run_job, | 71 | .run_job = amdgpu_sched_run_job, |
86 | .process_job = amdgpu_sched_process_job | ||
87 | }; | 72 | }; |
88 | 73 | ||
89 | int amdgpu_sched_ib_submit_kernel_helper(struct amdgpu_device *adev, | 74 | int amdgpu_sched_ib_submit_kernel_helper(struct amdgpu_device *adev, |
@@ -100,7 +85,7 @@ int amdgpu_sched_ib_submit_kernel_helper(struct amdgpu_device *adev, | |||
100 | kzalloc(sizeof(struct amdgpu_job), GFP_KERNEL); | 85 | kzalloc(sizeof(struct amdgpu_job), GFP_KERNEL); |
101 | if (!job) | 86 | if (!job) |
102 | return -ENOMEM; | 87 | return -ENOMEM; |
103 | job->base.sched = ring->scheduler; | 88 | job->base.sched = &ring->sched; |
104 | job->base.s_entity = &adev->kernel_ctx.rings[ring->idx].entity; | 89 | job->base.s_entity = &adev->kernel_ctx.rings[ring->idx].entity; |
105 | job->adev = adev; | 90 | job->adev = adev; |
106 | job->ibs = ibs; | 91 | job->ibs = ibs; |
@@ -109,7 +94,7 @@ int amdgpu_sched_ib_submit_kernel_helper(struct amdgpu_device *adev, | |||
109 | mutex_init(&job->job_lock); | 94 | mutex_init(&job->job_lock); |
110 | job->free_job = free_job; | 95 | job->free_job = free_job; |
111 | mutex_lock(&job->job_lock); | 96 | mutex_lock(&job->job_lock); |
112 | r = amd_sched_entity_push_job((struct amd_sched_job *)job); | 97 | r = amd_sched_entity_push_job(&job->base); |
113 | if (r) { | 98 | if (r) { |
114 | mutex_unlock(&job->job_lock); | 99 | mutex_unlock(&job->job_lock); |
115 | kfree(job); | 100 | kfree(job); |