aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c44
1 files changed, 41 insertions, 3 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
index c184468e2b2b..d71dc164b469 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
@@ -75,6 +75,7 @@ static int amdgpu_ctx_init(struct amdgpu_device *adev,
75 } 75 }
76 76
77 ctx->reset_counter = atomic_read(&adev->gpu_reset_counter); 77 ctx->reset_counter = atomic_read(&adev->gpu_reset_counter);
78 ctx->reset_counter_query = ctx->reset_counter;
78 ctx->vram_lost_counter = atomic_read(&adev->vram_lost_counter); 79 ctx->vram_lost_counter = atomic_read(&adev->vram_lost_counter);
79 ctx->init_priority = priority; 80 ctx->init_priority = priority;
80 ctx->override_priority = AMD_SCHED_PRIORITY_UNSET; 81 ctx->override_priority = AMD_SCHED_PRIORITY_UNSET;
@@ -90,7 +91,7 @@ static int amdgpu_ctx_init(struct amdgpu_device *adev,
90 continue; 91 continue;
91 92
92 r = amd_sched_entity_init(&ring->sched, &ctx->rings[i].entity, 93 r = amd_sched_entity_init(&ring->sched, &ctx->rings[i].entity,
93 rq, amdgpu_sched_jobs); 94 rq, amdgpu_sched_jobs, &ctx->guilty);
94 if (r) 95 if (r)
95 goto failed; 96 goto failed;
96 } 97 }
@@ -216,11 +217,45 @@ static int amdgpu_ctx_query(struct amdgpu_device *adev,
216 /* determine if a GPU reset has occured since the last call */ 217 /* determine if a GPU reset has occured since the last call */
217 reset_counter = atomic_read(&adev->gpu_reset_counter); 218 reset_counter = atomic_read(&adev->gpu_reset_counter);
218 /* TODO: this should ideally return NO, GUILTY, or INNOCENT. */ 219 /* TODO: this should ideally return NO, GUILTY, or INNOCENT. */
219 if (ctx->reset_counter == reset_counter) 220 if (ctx->reset_counter_query == reset_counter)
220 out->state.reset_status = AMDGPU_CTX_NO_RESET; 221 out->state.reset_status = AMDGPU_CTX_NO_RESET;
221 else 222 else
222 out->state.reset_status = AMDGPU_CTX_UNKNOWN_RESET; 223 out->state.reset_status = AMDGPU_CTX_UNKNOWN_RESET;
223 ctx->reset_counter = reset_counter; 224 ctx->reset_counter_query = reset_counter;
225
226 mutex_unlock(&mgr->lock);
227 return 0;
228}
229
230static int amdgpu_ctx_query2(struct amdgpu_device *adev,
231 struct amdgpu_fpriv *fpriv, uint32_t id,
232 union drm_amdgpu_ctx_out *out)
233{
234 struct amdgpu_ctx *ctx;
235 struct amdgpu_ctx_mgr *mgr;
236
237 if (!fpriv)
238 return -EINVAL;
239
240 mgr = &fpriv->ctx_mgr;
241 mutex_lock(&mgr->lock);
242 ctx = idr_find(&mgr->ctx_handles, id);
243 if (!ctx) {
244 mutex_unlock(&mgr->lock);
245 return -EINVAL;
246 }
247
248 out->state.flags = 0x0;
249 out->state.hangs = 0x0;
250
251 if (ctx->reset_counter != atomic_read(&adev->gpu_reset_counter))
252 out->state.flags |= AMDGPU_CTX_QUERY2_FLAGS_RESET;
253
254 if (ctx->vram_lost_counter != atomic_read(&adev->vram_lost_counter))
255 out->state.flags |= AMDGPU_CTX_QUERY2_FLAGS_VRAMLOST;
256
257 if (atomic_read(&ctx->guilty))
258 out->state.flags |= AMDGPU_CTX_QUERY2_FLAGS_GUILTY;
224 259
225 mutex_unlock(&mgr->lock); 260 mutex_unlock(&mgr->lock);
226 return 0; 261 return 0;
@@ -257,6 +292,9 @@ int amdgpu_ctx_ioctl(struct drm_device *dev, void *data,
257 case AMDGPU_CTX_OP_QUERY_STATE: 292 case AMDGPU_CTX_OP_QUERY_STATE:
258 r = amdgpu_ctx_query(adev, fpriv, id, &args->out); 293 r = amdgpu_ctx_query(adev, fpriv, id, &args->out);
259 break; 294 break;
295 case AMDGPU_CTX_OP_QUERY_STATE2:
296 r = amdgpu_ctx_query2(adev, fpriv, id, &args->out);
297 break;
260 default: 298 default:
261 return -EINVAL; 299 return -EINVAL;
262 } 300 }