msm: kgsl: let postmortem dump find context switch IBs
Because the IBs used for context switching are not allocated
by userspace, a separate search is needed to find them
in adreno_find_region.
Change-Id: I4c2a180333ae54ecbf257fd8c90ec2e3f748ad95
Signed-off-by: Jeremy Gebben <jgebben@codeaurora.org>
diff --git a/drivers/gpu/msm/adreno.c b/drivers/gpu/msm/adreno.c
index e519cd4..d7c11db 100644
--- a/drivers/gpu/msm/adreno.c
+++ b/drivers/gpu/msm/adreno.c
@@ -947,6 +947,8 @@
struct kgsl_process_private *priv;
struct adreno_device *adreno_dev = ADRENO_DEVICE(device);
struct adreno_ringbuffer *ringbuffer = &adreno_dev->ringbuffer;
+ struct kgsl_context *context;
+ int next = 0;
if (kgsl_gpuaddr_in_memdesc(&ringbuffer->buffer_desc, gpuaddr, size))
return &ringbuffer->buffer_desc;
@@ -978,11 +980,39 @@
list_for_each_entry(entry, &device->memqueue, list) {
if (kgsl_gpuaddr_in_memdesc(&entry->memdesc, gpuaddr, size)) {
result = &entry->memdesc;
- break;
+ return result;
}
}
- return result;
+
+ while (1) {
+ struct adreno_context *adreno_context = NULL;
+ struct kgsl_memdesc *gpustate;
+ struct kgsl_memdesc *gmemshadow;
+ context = idr_get_next(&device->context_idr, &next);
+ if (context == NULL)
+ break;
+
+ adreno_context = (struct adreno_context *)context->devctxt;
+
+ if (!kgsl_mmu_pt_equal(adreno_context->pagetable, pt_base))
+ continue;
+
+ gpustate = &adreno_context->gpustate;
+ if (kgsl_gpuaddr_in_memdesc(gpustate, gpuaddr, size)) {
+ result = gpustate;
+ return result;
+ }
+ gmemshadow = &adreno_context->context_gmem_shadow.gmemshadow;
+ if (kgsl_gpuaddr_in_memdesc(gmemshadow, gpuaddr, size)) {
+ result = gmemshadow;
+ return result;
+ }
+
+ next = next + 1;
+ }
+
+ return NULL;
}