diff options
author | Harshdeep Dhatt <hdhatt@codeaurora.org> | 2016-04-29 09:22:29 -0600 |
---|---|---|
committer | Jeevan Shriram <jshriram@codeaurora.org> | 2016-05-05 15:05:56 -0700 |
commit | 12636f5ee9351c40fd8be2ad5c4760e83b956ed1 (patch) | |
tree | 9f41bc64b3134f83a9d1c66beb68e8fd1009bec3 /drivers/gpu | |
parent | 0a8e905b3f08e99c2f697debaf149a11f4569ef8 (diff) |
msm: kgsl: Dump 64KB of preemption record in snapshot
Dumping only the ctxt_record structure in a snapshot
is not enough. For a more meaningful snapshot, dump 64KB
of preempt record. Also, move the code to device specific
snapshot function.
Change-Id: I43e08ccefbf2d3911191b2aad5168979956e1626
Signed-off-by: Harshdeep Dhatt <hdhatt@codeaurora.org>
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/msm/adreno_a5xx_snapshot.c | 39 | ||||
-rw-r--r-- | drivers/gpu/msm/adreno_snapshot.c | 50 |
2 files changed, 38 insertions, 51 deletions
diff --git a/drivers/gpu/msm/adreno_a5xx_snapshot.c b/drivers/gpu/msm/adreno_a5xx_snapshot.c index 3d1f81fb01f7..154f5af99ffe 100644 --- a/drivers/gpu/msm/adreno_a5xx_snapshot.c +++ b/drivers/gpu/msm/adreno_a5xx_snapshot.c @@ -783,6 +783,33 @@ static size_t a5xx_snapshot_registers(struct kgsl_device *device, u8 *buf, return (header->count * 8) + sizeof(*header); } +/* Snapshot a preemption record buffer */ +static size_t snapshot_preemption_record(struct kgsl_device *device, u8 *buf, + size_t remain, void *priv) +{ + struct kgsl_memdesc *memdesc = priv; + + struct kgsl_snapshot_gpu_object_v2 *header = + (struct kgsl_snapshot_gpu_object_v2 *)buf; + + u8 *ptr = buf + sizeof(*header); + + if (remain < (SZ_64K + sizeof(*header))) { + SNAPSHOT_ERR_NOMEM(device, "PREEMPTION RECORD"); + return 0; + } + + header->size = SZ_64K >> 2; + header->gpuaddr = memdesc->gpuaddr; + header->ptbase = + kgsl_mmu_pagetable_get_ttbr0(device->mmu.defaultpagetable); + header->type = SNAPSHOT_GPU_OBJECT_GLOBAL; + + memcpy(ptr, memdesc->hostptr, SZ_64K); + + return SZ_64K + sizeof(*header); +} + /* * a5xx_snapshot() - A5XX GPU snapshot function * @adreno_dev: Device being snapshotted @@ -797,7 +824,8 @@ void a5xx_snapshot(struct adreno_device *adreno_dev, struct kgsl_device *device = KGSL_DEVICE(adreno_dev); struct adreno_gpudev *gpudev = ADRENO_GPU_DEVICE(adreno_dev); struct adreno_snapshot_data *snap_data = gpudev->snapshot_data; - unsigned int reg; + unsigned int reg, i; + struct adreno_ringbuffer *rb; /* Disable Clock gating temporarily for the debug bus to work */ a5xx_hwcg_set(adreno_dev, false); @@ -874,6 +902,15 @@ void a5xx_snapshot(struct adreno_device *adreno_dev, /* Debug bus */ a5xx_snapshot_debugbus(device, snapshot); + + /* Preemption record */ + FOR_EACH_RINGBUFFER(adreno_dev, rb, i) { + kgsl_snapshot_add_section(device, + KGSL_SNAPSHOT_SECTION_GPU_OBJECT_V2, + snapshot, snapshot_preemption_record, + &rb->preemption_desc); + } + } void a5xx_crashdump_init(struct adreno_device *adreno_dev) diff --git a/drivers/gpu/msm/adreno_snapshot.c b/drivers/gpu/msm/adreno_snapshot.c index 6c91eb3a3dc9..ca61d36a1384 100644 --- a/drivers/gpu/msm/adreno_snapshot.c +++ b/drivers/gpu/msm/adreno_snapshot.c @@ -750,46 +750,6 @@ static size_t snapshot_global(struct kgsl_device *device, u8 *buf, return memdesc->size + sizeof(*header); } -/* Snapshot a preemption record buffer */ -static size_t snapshot_preemption_record(struct kgsl_device *device, u8 *buf, - size_t remain, void *priv) -{ - struct kgsl_memdesc *memdesc = priv; - struct a5xx_cp_preemption_record record; - int size = sizeof(record); - - struct kgsl_snapshot_gpu_object_v2 *header = - (struct kgsl_snapshot_gpu_object_v2 *)buf; - - u8 *ptr = buf + sizeof(*header); - - if (size == 0) - return 0; - - if (remain < (size + sizeof(*header))) { - KGSL_CORE_ERR( - "snapshot: Not enough memory for preemption record\n"); - return 0; - } - - if (memdesc->hostptr == NULL) { - KGSL_CORE_ERR( - "snapshot: no kernel mapping for preemption record 0x%016llX\n", - memdesc->gpuaddr); - return 0; - } - - header->size = size >> 2; - header->gpuaddr = memdesc->gpuaddr; - header->ptbase = - kgsl_mmu_pagetable_get_ttbr0(device->mmu.defaultpagetable); - header->type = SNAPSHOT_GPU_OBJECT_GLOBAL; - - memcpy(ptr, memdesc->hostptr, size); - - return size + sizeof(*header); -} - /* Snapshot IOMMU specific buffers */ static void adreno_snapshot_iommu(struct kgsl_device *device, struct kgsl_snapshot *snapshot) @@ -837,7 +797,6 @@ void adreno_snapshot(struct kgsl_device *device, struct kgsl_snapshot *snapshot, unsigned int ib1size, ib2size; struct adreno_device *adreno_dev = ADRENO_DEVICE(device); struct adreno_gpudev *gpudev = ADRENO_GPU_DEVICE(adreno_dev); - struct adreno_ringbuffer *rb; ib_max_objs = 0; /* Reset the list of objects */ @@ -882,15 +841,6 @@ void adreno_snapshot(struct kgsl_device *device, struct kgsl_snapshot *snapshot, if (kgsl_mmu_get_mmutype(device) == KGSL_MMU_TYPE_IOMMU) adreno_snapshot_iommu(device, snapshot); - if (ADRENO_FEATURE(adreno_dev, ADRENO_PREEMPTION)) { - FOR_EACH_RINGBUFFER(adreno_dev, rb, i) { - kgsl_snapshot_add_section(device, - KGSL_SNAPSHOT_SECTION_GPU_OBJECT_V2, - snapshot, snapshot_preemption_record, - &rb->preemption_desc); - } - } - /* * Add a section that lists (gpuaddr, size, memtype) tuples of the * hanging process |