msm: kgsl: During postmortem check for IOMMU table change

When performing postmortem, check for IOMMU pagetable change commands
which will allow us to find the IB from the correct pagetable.

Change-Id: I411f4c78632d1673d49d5557da435e2a9d31d420
Signed-off-by: Shubhraprakash Das <sadas@codeaurora.org>
This commit is contained in:
Shubhraprakash Das
2012-05-30 17:26:54 -06:00
committed by Stephen Boyd
parent 9562544cb0
commit 0145b4df7d

View File

@@ -699,6 +699,10 @@ static int adreno_dump(struct kgsl_device *device)
struct adreno_device *adreno_dev = ADRENO_DEVICE(device);
struct kgsl_memdesc **reg_map;
void *reg_map_array;
int num_iommu_units = 0;
mb();
if (adreno_is_a2xx(adreno_dev))
@@ -780,6 +784,10 @@ static int adreno_dump(struct kgsl_device *device)
/* extract the latest ib commands from the buffer */
ib_list.count = 0;
i = 0;
/* get the register mapped array in case we are using IOMMU */
num_iommu_units = kgsl_mmu_get_reg_map_desc(&device->mmu,
&reg_map_array);
reg_map = reg_map_array;
for (read_idx = 0; read_idx < num_item; ) {
uint32_t this_cmd = rb_copy[read_idx++];
if (adreno_cmd_is_ib(this_cmd)) {
@@ -792,7 +800,10 @@ static int adreno_dump(struct kgsl_device *device)
ib_list.offsets[i],
ib_list.bases[i],
ib_list.sizes[i], 0);
} else if (this_cmd == cp_type0_packet(MH_MMU_PT_BASE, 1)) {
} else if (this_cmd == cp_type0_packet(MH_MMU_PT_BASE, 1) ||
(num_iommu_units && this_cmd == (reg_map[0]->gpuaddr +
(KGSL_IOMMU_CONTEXT_USER << KGSL_IOMMU_CTX_SHIFT) +
KGSL_IOMMU_TTBR0))) {
KGSL_LOG_DUMP(device, "Current pagetable: %x\t"
"pagetable base: %x\n",
@@ -808,6 +819,8 @@ static int adreno_dump(struct kgsl_device *device)
cur_pt_base);
}
}
if (num_iommu_units)
kfree(reg_map_array);
/* Restore cur_pt_base back to the pt_base of
the process in whose context the GPU hung */