diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c | 44 |
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 | |||
230 | static 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 | } |