msm: kgsl: Mark the hung context in recovery before extraction
Mark the context that has caused a hang in recovery before
calling the extraction function. This updates the context
state correctly early in recovery.
Change-Id: I68cbe5cc6f867c8d32dd0115eed6f1c65c54f796
Signed-off-by: Shubhraprakash Das <sadas@codeaurora.org>
diff --git a/drivers/gpu/msm/adreno.c b/drivers/gpu/msm/adreno.c
index d0821a2..ffe6944 100644
--- a/drivers/gpu/msm/adreno.c
+++ b/drivers/gpu/msm/adreno.c
@@ -843,27 +843,27 @@
"Bad context_id: %u, global_eop: 0x%x\n", rec_data->ib1,
rec_data->context_id, rec_data->global_eop);
- /* Extract valid contents from rb which can stil be executed after
- * hang */
- ret = adreno_ringbuffer_extract(rb, rec_data);
- if (ret)
- goto done;
-
context = idr_find(&device->context_idr, rec_data->context_id);
if (context == NULL) {
KGSL_DRV_ERR(device, "Last context unknown id:%d\n",
rec_data->context_id);
rec_data->context_id = KGSL_MEMSTORE_GLOBAL;
+ } else {
+ adreno_context = context->devctxt;
+ adreno_context->flags |= CTXT_FLAGS_GPU_HANG;
}
+ /* Extract valid contents from rb which can still be executed after
+ * hang */
+ ret = adreno_ringbuffer_extract(rb, rec_data);
+ if (ret)
+ goto done;
timestamp = rb->timestamp[KGSL_MEMSTORE_GLOBAL];
KGSL_DRV_ERR(device, "Last issued global timestamp: %x\n", timestamp);
/* Make sure memory is synchronized before restarting the GPU */
mb();
- KGSL_CTXT_ERR(device,
- "Context id that caused a GPU hang: %d\n",
- rec_data->context_id);
+
/* restart device */
ret = adreno_stop(device);
if (ret)
@@ -872,15 +872,6 @@
if (ret)
goto done;
KGSL_DRV_ERR(device, "Device has been restarted after hang\n");
- /* Mark the invalid context so no more commands are accepted from
- * that context */
-
- adreno_context = context->devctxt;
-
- KGSL_CTXT_ERR(device,
- "Context that caused a GPU hang: %d\n", adreno_context->id);
-
- adreno_context->flags |= CTXT_FLAGS_GPU_HANG;
/* Restore valid commands in ringbuffer */
adreno_ringbuffer_restore(rb, rec_data->rb_buffer, rec_data->rb_size);
diff --git a/drivers/gpu/msm/adreno_ringbuffer.c b/drivers/gpu/msm/adreno_ringbuffer.c
index eed8f23..9eca367 100644
--- a/drivers/gpu/msm/adreno_ringbuffer.c
+++ b/drivers/gpu/msm/adreno_ringbuffer.c
@@ -1241,9 +1241,7 @@
goto done;
if (context) {
- /* Mark context as hung */
adreno_context = context->devctxt;
- adreno_context->flags |= CTXT_FLAGS_GPU_HANG;
if (adreno_context->flags & CTXT_FLAGS_PREAMBLE) {
if (rec_data->ib1) {