From 36f505230b39a61abb094d82ede4b484f7739201 Mon Sep 17 00:00:00 2001 From: Deepak Kumar Date: Tue, 31 Jul 2018 14:06:33 +0530 Subject: [PATCH] msm: kgsl: Dump both GMU and GPU state for GMU faults GPU state especially command processor state is important to debug GMU fault. If GPU is powered ON, dump both GMU and GPU state for GMU faults to make sure all required state needed for debug is captured. Change-Id: I71b359cd944a12cb19c419bca0254fd2fa468328 Signed-off-by: Deepak Kumar --- drivers/gpu/msm/adreno.c | 1 - drivers/gpu/msm/adreno.h | 4 ---- drivers/gpu/msm/adreno_a6xx.c | 1 - drivers/gpu/msm/adreno_a6xx.h | 5 +---- drivers/gpu/msm/adreno_a6xx_snapshot.c | 13 ++++++++++--- drivers/gpu/msm/adreno_snapshot.c | 18 ------------------ drivers/gpu/msm/kgsl_device.h | 2 -- drivers/gpu/msm/kgsl_snapshot.c | 24 +++++++++++------------- 8 files changed, 22 insertions(+), 46 deletions(-) diff --git a/drivers/gpu/msm/adreno.c b/drivers/gpu/msm/adreno.c index 7c219fa0af68..bf62087ef40c 100644 --- a/drivers/gpu/msm/adreno.c +++ b/drivers/gpu/msm/adreno.c @@ -3772,7 +3772,6 @@ static const struct kgsl_functable adreno_functable = { .device_private_create = adreno_device_private_create, .device_private_destroy = adreno_device_private_destroy, /* Optional functions */ - .snapshot_gmu = adreno_snapshot_gmu, .drawctxt_create = adreno_drawctxt_create, .drawctxt_detach = adreno_drawctxt_detach, .drawctxt_destroy = adreno_drawctxt_destroy, diff --git a/drivers/gpu/msm/adreno.h b/drivers/gpu/msm/adreno.h index 555856a023fd..abbe62bc77b8 100644 --- a/drivers/gpu/msm/adreno.h +++ b/drivers/gpu/msm/adreno.h @@ -941,7 +941,6 @@ struct adreno_gpudev { /* GPU specific function hooks */ void (*irq_trace)(struct adreno_device *, unsigned int status); void (*snapshot)(struct adreno_device *, struct kgsl_snapshot *); - void (*snapshot_gmu)(struct adreno_device *, struct kgsl_snapshot *); void (*platform_setup)(struct adreno_device *); void (*init)(struct adreno_device *); void (*remove)(struct adreno_device *); @@ -1123,9 +1122,6 @@ void adreno_snapshot(struct kgsl_device *device, struct kgsl_snapshot *snapshot, struct kgsl_context *context); -void adreno_snapshot_gmu(struct kgsl_device *device, - struct kgsl_snapshot *snapshot); - int adreno_reset(struct kgsl_device *device, int fault); void adreno_fault_skipcmd_detached(struct adreno_device *adreno_dev, diff --git a/drivers/gpu/msm/adreno_a6xx.c b/drivers/gpu/msm/adreno_a6xx.c index 517b813b4dcc..be87207b438a 100644 --- a/drivers/gpu/msm/adreno_a6xx.c +++ b/drivers/gpu/msm/adreno_a6xx.c @@ -3909,7 +3909,6 @@ struct adreno_gpudev adreno_a6xx_gpudev = { .reg_offsets = &a6xx_reg_offsets, .start = a6xx_start, .snapshot = a6xx_snapshot, - .snapshot_gmu = a6xx_snapshot_gmu, .irq = &a6xx_irq, .snapshot_data = &a6xx_snapshot_data, .irq_trace = trace_kgsl_a5xx_irq_status, diff --git a/drivers/gpu/msm/adreno_a6xx.h b/drivers/gpu/msm/adreno_a6xx.h index bf1111c6204c..3267213d7ce2 100644 --- a/drivers/gpu/msm/adreno_a6xx.h +++ b/drivers/gpu/msm/adreno_a6xx.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2017, The Linux Foundation. All rights reserved. +/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -129,8 +129,5 @@ void a6xx_preemption_context_destroy(struct kgsl_context *context); void a6xx_snapshot(struct adreno_device *adreno_dev, struct kgsl_snapshot *snapshot); -void a6xx_snapshot_gmu(struct adreno_device *adreno_dev, - struct kgsl_snapshot *snapshot); - void a6xx_crashdump_init(struct adreno_device *adreno_dev); #endif diff --git a/drivers/gpu/msm/adreno_a6xx_snapshot.c b/drivers/gpu/msm/adreno_a6xx_snapshot.c index 7376a388e6ea..d3f13d4a9541 100644 --- a/drivers/gpu/msm/adreno_a6xx_snapshot.c +++ b/drivers/gpu/msm/adreno_a6xx_snapshot.c @@ -1456,7 +1456,7 @@ static void a6xx_snapshot_debugbus(struct kgsl_device *device, * This is where all of the A6XX GMU specific bits and pieces are grabbed * into the snapshot memory */ -void a6xx_snapshot_gmu(struct adreno_device *adreno_dev, +static void a6xx_snapshot_gmu(struct adreno_device *adreno_dev, struct kgsl_snapshot *snapshot) { struct kgsl_device *device = KGSL_DEVICE(adreno_dev); @@ -1479,8 +1479,6 @@ void a6xx_snapshot_gmu(struct adreno_device *adreno_dev, a6xx_gmu_gx_registers, ARRAY_SIZE(a6xx_gmu_gx_registers) / 2); } - - a6xx_snapshot_debugbus(device, snapshot); } /* a6xx_snapshot_sqe() - Dump SQE data in snapshot */ @@ -1571,6 +1569,15 @@ void a6xx_snapshot(struct adreno_device *adreno_dev, /* GMU TCM data dumped through AHB */ a6xx_snapshot_gmu(adreno_dev, snapshot); + /* + * Dump debugbus data here to capture it for both + * GMU and GPU snapshot. Debugbus data can be accessed + * even if the gx headswitch or sptprac is off. If gx + * headswitch is off, data for gx blocks will show as + * 0x5c00bd00. + */ + a6xx_snapshot_debugbus(device, snapshot); + sptprac_on = gpudev->sptprac_is_on(adreno_dev); /* Return if the GX is off */ diff --git a/drivers/gpu/msm/adreno_snapshot.c b/drivers/gpu/msm/adreno_snapshot.c index 22939199c28c..b93ee9c02824 100644 --- a/drivers/gpu/msm/adreno_snapshot.c +++ b/drivers/gpu/msm/adreno_snapshot.c @@ -946,24 +946,6 @@ void adreno_snapshot(struct kgsl_device *device, struct kgsl_snapshot *snapshot, } -/* adreno_snapshot_gmu - Snapshot the Adreno GMU state - * @device - KGSL device to snapshot - * @snapshot - Pointer to the snapshot instance - * This is a hook function called by kgsl_snapshot to snapshot the - * Adreno specific information for the GMU snapshot. In turn, this function - * calls the GMU specific snapshot function to get core specific information. - */ -void adreno_snapshot_gmu(struct kgsl_device *device, - struct kgsl_snapshot *snapshot) -{ - struct adreno_device *adreno_dev = ADRENO_DEVICE(device); - struct adreno_gpudev *gpudev = ADRENO_GPU_DEVICE(adreno_dev); - - /* Add GMU specific sections */ - if (gpudev->snapshot_gmu) - gpudev->snapshot_gmu(adreno_dev, snapshot); -} - /* * adreno_snapshot_cp_roq - Dump CP merciu data in snapshot * @device: Device being snapshotted diff --git a/drivers/gpu/msm/kgsl_device.h b/drivers/gpu/msm/kgsl_device.h index 4a98a240810a..6f80011e2600 100644 --- a/drivers/gpu/msm/kgsl_device.h +++ b/drivers/gpu/msm/kgsl_device.h @@ -152,8 +152,6 @@ struct kgsl_functable { unsigned int (*gpuid)(struct kgsl_device *device, unsigned int *chipid); void (*snapshot)(struct kgsl_device *device, struct kgsl_snapshot *snapshot, struct kgsl_context *context); - void (*snapshot_gmu)(struct kgsl_device *device, - struct kgsl_snapshot *snapshot); irqreturn_t (*irq_handler)(struct kgsl_device *device); int (*drain)(struct kgsl_device *device); struct kgsl_device_private * (*device_private_create)(void); diff --git a/drivers/gpu/msm/kgsl_snapshot.c b/drivers/gpu/msm/kgsl_snapshot.c index 0ed17d859080..009cbbb45c70 100644 --- a/drivers/gpu/msm/kgsl_snapshot.c +++ b/drivers/gpu/msm/kgsl_snapshot.c @@ -704,22 +704,20 @@ void kgsl_device_snapshot(struct kgsl_device *device, snapshot->size += sizeof(*header); /* Build the Linux specific header */ - /* We either want to only dump GMU, or we want to dump GPU and GMU */ - if (gmu_fault) { - /* Dump only the GMU */ + if (gmu_fault) kgsl_snapshot_add_section(device, KGSL_SNAPSHOT_SECTION_OS, - snapshot, snapshot_os_no_ctxt, NULL); - - if (device->ftbl->snapshot_gmu) - device->ftbl->snapshot_gmu(device, snapshot); - } else { - /* Dump GPU and GMU */ + snapshot, snapshot_os_no_ctxt, NULL); + else kgsl_snapshot_add_section(device, KGSL_SNAPSHOT_SECTION_OS, - snapshot, snapshot_os, NULL); + snapshot, snapshot_os, NULL); - if (device->ftbl->snapshot) - device->ftbl->snapshot(device, snapshot, context); - } + /* + * Trigger both GPU and GMU snapshot. GPU specific code + * will take care of whether to dumps full state or only + * GMU state based on current GPU power state. + */ + if (device->ftbl->snapshot) + device->ftbl->snapshot(device, snapshot, context); /* * The timestamp is the seconds since boot so it is easier to match to