diff options
Diffstat (limited to 'drivers/gpu/drm/amd')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 10 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c | 22 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | 7 |
4 files changed, 24 insertions, 17 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index db87edc72936..9b55ad351602 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h | |||
| @@ -743,7 +743,6 @@ struct amdgpu_ib { | |||
| 743 | struct amdgpu_user_fence *user; | 743 | struct amdgpu_user_fence *user; |
| 744 | unsigned vm_id; | 744 | unsigned vm_id; |
| 745 | uint64_t vm_pd_addr; | 745 | uint64_t vm_pd_addr; |
| 746 | uint64_t ctx; | ||
| 747 | uint32_t gds_base, gds_size; | 746 | uint32_t gds_base, gds_size; |
| 748 | uint32_t gws_base, gws_size; | 747 | uint32_t gws_base, gws_size; |
| 749 | uint32_t oa_base, oa_size; | 748 | uint32_t oa_base, oa_size; |
| @@ -1262,6 +1261,7 @@ struct amdgpu_job { | |||
| 1262 | struct fence *fence; /* the hw fence */ | 1261 | struct fence *fence; /* the hw fence */ |
| 1263 | uint32_t num_ibs; | 1262 | uint32_t num_ibs; |
| 1264 | void *owner; | 1263 | void *owner; |
| 1264 | uint64_t ctx; | ||
| 1265 | struct amdgpu_user_fence uf; | 1265 | struct amdgpu_user_fence uf; |
| 1266 | }; | 1266 | }; |
| 1267 | #define to_amdgpu_job(sched_job) \ | 1267 | #define to_amdgpu_job(sched_job) \ |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index 87ec1136a0bb..2895d63c9979 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | |||
| @@ -741,7 +741,6 @@ static int amdgpu_cs_ib_fill(struct amdgpu_device *adev, | |||
| 741 | 741 | ||
| 742 | ib->length_dw = chunk_ib->ib_bytes / 4; | 742 | ib->length_dw = chunk_ib->ib_bytes / 4; |
| 743 | ib->flags = chunk_ib->flags; | 743 | ib->flags = chunk_ib->flags; |
| 744 | ib->ctx = parser->ctx->rings[ring->idx].entity.fence_context; | ||
| 745 | j++; | 744 | j++; |
| 746 | } | 745 | } |
| 747 | 746 | ||
| @@ -840,6 +839,7 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p, | |||
| 840 | union drm_amdgpu_cs *cs) | 839 | union drm_amdgpu_cs *cs) |
| 841 | { | 840 | { |
| 842 | struct amdgpu_ring *ring = p->job->ring; | 841 | struct amdgpu_ring *ring = p->job->ring; |
| 842 | struct amd_sched_entity *entity = &p->ctx->rings[ring->idx].entity; | ||
| 843 | struct fence *fence; | 843 | struct fence *fence; |
| 844 | struct amdgpu_job *job; | 844 | struct amdgpu_job *job; |
| 845 | int r; | 845 | int r; |
| @@ -848,16 +848,16 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p, | |||
| 848 | p->job = NULL; | 848 | p->job = NULL; |
| 849 | 849 | ||
| 850 | r = amd_sched_job_init(&job->base, &ring->sched, | 850 | r = amd_sched_job_init(&job->base, &ring->sched, |
| 851 | &p->ctx->rings[ring->idx].entity, | 851 | entity, amdgpu_job_timeout_func, |
| 852 | amdgpu_job_timeout_func, | 852 | amdgpu_job_free_func, |
| 853 | amdgpu_job_free_func, | 853 | p->filp, &fence); |
| 854 | p->filp, &fence); | ||
| 855 | if (r) { | 854 | if (r) { |
| 856 | amdgpu_job_free(job); | 855 | amdgpu_job_free(job); |
| 857 | return r; | 856 | return r; |
| 858 | } | 857 | } |
| 859 | 858 | ||
| 860 | job->owner = p->filp; | 859 | job->owner = p->filp; |
| 860 | job->ctx = entity->fence_context; | ||
| 861 | p->fence = fence_get(fence); | 861 | p->fence = fence_get(fence); |
| 862 | cs->out.handle = amdgpu_ctx_add_fence(p->ctx, ring, fence); | 862 | cs->out.handle = amdgpu_ctx_add_fence(p->ctx, ring, fence); |
| 863 | job->ibs[job->num_ibs - 1].sequence = cs->out.handle; | 863 | job->ibs[job->num_ibs - 1].sequence = cs->out.handle; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c index 88b8fda7340f..dacbd2e32072 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c | |||
| @@ -121,18 +121,26 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs, | |||
| 121 | { | 121 | { |
| 122 | struct amdgpu_device *adev = ring->adev; | 122 | struct amdgpu_device *adev = ring->adev; |
| 123 | struct amdgpu_ib *ib = &ibs[0]; | 123 | struct amdgpu_ib *ib = &ibs[0]; |
| 124 | struct fence *hwf; | ||
| 125 | struct amdgpu_vm *vm = NULL; | ||
| 126 | unsigned i, patch_offset = ~0; | ||
| 127 | bool skip_preamble, need_ctx_switch; | 124 | bool skip_preamble, need_ctx_switch; |
| 125 | unsigned patch_offset = ~0; | ||
| 126 | struct amdgpu_vm *vm; | ||
| 127 | struct fence *hwf; | ||
| 128 | uint64_t ctx; | ||
| 128 | 129 | ||
| 130 | unsigned i; | ||
| 129 | int r = 0; | 131 | int r = 0; |
| 130 | 132 | ||
| 131 | if (num_ibs == 0) | 133 | if (num_ibs == 0) |
| 132 | return -EINVAL; | 134 | return -EINVAL; |
| 133 | 135 | ||
| 134 | if (job) /* for domain0 job like ring test, ibs->job is not assigned */ | 136 | /* ring tests don't use a job */ |
| 137 | if (job) { | ||
| 135 | vm = job->vm; | 138 | vm = job->vm; |
| 139 | ctx = job->ctx; | ||
| 140 | } else { | ||
| 141 | vm = NULL; | ||
| 142 | ctx = 0; | ||
| 143 | } | ||
| 136 | 144 | ||
| 137 | if (!ring->ready) { | 145 | if (!ring->ready) { |
| 138 | dev_err(adev->dev, "couldn't schedule ib\n"); | 146 | dev_err(adev->dev, "couldn't schedule ib\n"); |
| @@ -170,8 +178,8 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs, | |||
| 170 | /* always set cond_exec_polling to CONTINUE */ | 178 | /* always set cond_exec_polling to CONTINUE */ |
| 171 | *ring->cond_exe_cpu_addr = 1; | 179 | *ring->cond_exe_cpu_addr = 1; |
| 172 | 180 | ||
| 173 | skip_preamble = ring->current_ctx == ib->ctx; | 181 | skip_preamble = ring->current_ctx == ctx; |
| 174 | need_ctx_switch = ring->current_ctx != ib->ctx; | 182 | need_ctx_switch = ring->current_ctx != ctx; |
| 175 | for (i = 0; i < num_ibs; ++i) { | 183 | for (i = 0; i < num_ibs; ++i) { |
| 176 | ib = &ibs[i]; | 184 | ib = &ibs[i]; |
| 177 | 185 | ||
| @@ -209,7 +217,7 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs, | |||
| 209 | if (patch_offset != ~0 && ring->funcs->patch_cond_exec) | 217 | if (patch_offset != ~0 && ring->funcs->patch_cond_exec) |
| 210 | amdgpu_ring_patch_cond_exec(ring, patch_offset); | 218 | amdgpu_ring_patch_cond_exec(ring, patch_offset); |
| 211 | 219 | ||
| 212 | ring->current_ctx = ibs->ctx; | 220 | ring->current_ctx = ctx; |
| 213 | amdgpu_ring_commit(ring); | 221 | amdgpu_ring_commit(ring); |
| 214 | return 0; | 222 | return 0; |
| 215 | } | 223 | } |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c index 917c6f3bfa09..a0961f2a93d2 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | |||
| @@ -122,14 +122,13 @@ int amdgpu_job_submit(struct amdgpu_job *job, struct amdgpu_ring *ring, | |||
| 122 | return -EINVAL; | 122 | return -EINVAL; |
| 123 | 123 | ||
| 124 | r = amd_sched_job_init(&job->base, &ring->sched, | 124 | r = amd_sched_job_init(&job->base, &ring->sched, |
| 125 | entity, | 125 | entity, amdgpu_job_timeout_func, |
| 126 | amdgpu_job_timeout_func, | 126 | amdgpu_job_free_func, owner, &fence); |
| 127 | amdgpu_job_free_func, | ||
| 128 | owner, &fence); | ||
| 129 | if (r) | 127 | if (r) |
| 130 | return r; | 128 | return r; |
| 131 | 129 | ||
| 132 | job->owner = owner; | 130 | job->owner = owner; |
| 131 | job->ctx = entity->fence_context; | ||
| 133 | *f = fence_get(fence); | 132 | *f = fence_get(fence); |
| 134 | amd_sched_entity_push_job(&job->base); | 133 | amd_sched_entity_push_job(&job->base); |
| 135 | 134 | ||
