aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu.h2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c10
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c22
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_job.c7
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