Loading drivers/gpu/msm/adreno_a6xx_snapshot.c +47 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ #include "a6xx_reg.h" #include "adreno_a6xx.h" #include "kgsl_gmu.h" #include "kgsl_hfi.h" #define A6XX_NUM_CTXTS 2 #define A6XX_NUM_AXI_ARB_BLOCKS 2 Loading Loading @@ -1447,6 +1448,37 @@ static void a6xx_snapshot_debugbus(struct kgsl_device *device, } } struct gmu_mem_type_desc { struct gmu_memdesc *memdesc; uint32_t type; }; static size_t a6xx_snapshot_gmu_mem(struct kgsl_device *device, u8 *buf, size_t remain, void *priv) { struct kgsl_snapshot_gmu *header = (struct kgsl_snapshot_gmu *)buf; struct gmu_mem_type_desc *desc = priv; unsigned int *data = (unsigned int *)(buf + sizeof(*header)); if (priv == NULL) return 0; if (remain < desc->memdesc->size + sizeof(*header)) { KGSL_CORE_ERR( "snapshot: Not enough memory for the gmu section %d\n", desc->type); return 0; } header->type = desc->type; header->size = desc->memdesc->size; /* Just copy the ringbuffer, there are no active IBs */ memcpy(data, desc->memdesc->hostptr, desc->memdesc->size); return desc->memdesc->size + sizeof(*header); } /* * a6xx_snapshot_gmu() - A6XX GMU snapshot function * @adreno_dev: Device being snapshotted Loading @@ -1459,12 +1491,26 @@ void a6xx_snapshot_gmu(struct adreno_device *adreno_dev, struct kgsl_snapshot *snapshot) { struct kgsl_device *device = KGSL_DEVICE(adreno_dev); struct gmu_device *gmu = &device->gmu; struct gmu_mem_type_desc desc[] = { {gmu->hfi_mem, SNAPSHOT_GMU_HFIMEM}, {gmu->gmu_log, SNAPSHOT_GMU_LOG}, {gmu->bw_mem, SNAPSHOT_GMU_BWMEM}, {gmu->dump_mem, SNAPSHOT_GMU_DUMPMEM} }; struct adreno_gpudev *gpudev = ADRENO_GPU_DEVICE(adreno_dev); unsigned int val; unsigned int val, i; if (!kgsl_gmu_isenabled(device)) return; for (i = 0; i < ARRAY_SIZE(desc); i++) { if (desc[i].memdesc) kgsl_snapshot_add_section(device, KGSL_SNAPSHOT_SECTION_GMU, snapshot, a6xx_snapshot_gmu_mem, &desc[i]); } adreno_snapshot_registers(device, snapshot, a6xx_gmu_registers, ARRAY_SIZE(a6xx_gmu_registers) / 2); Loading drivers/gpu/msm/kgsl_gmu.c +9 −7 Original line number Diff line number Diff line Loading @@ -68,8 +68,6 @@ struct gmu_iommu_context { struct iommu_domain *domain; }; #define HFIMEM_SIZE (HFI_QUEUE_SIZE * (HFI_QUEUE_MAX + 1)) #define DUMPMEM_SIZE SZ_16K #define DUMMY_SIZE SZ_4K Loading Loading @@ -555,6 +553,8 @@ static void gmu_memory_close(struct gmu_device *gmu) */ static int gmu_memory_probe(struct gmu_device *gmu, struct device_node *node) { struct kgsl_device *device = container_of(gmu, struct kgsl_device, gmu); struct adreno_device *adreno_dev = ADRENO_DEVICE(device); int ret; ret = gmu_iommu_init(gmu, node); Loading Loading @@ -582,12 +582,14 @@ static int gmu_memory_probe(struct gmu_device *gmu, struct device_node *node) } /* Allocates & maps GMU crash dump memory */ if (adreno_is_a630(adreno_dev)) { gmu->dump_mem = allocate_gmu_kmem(gmu, GMU_NONCACHED_KERNEL, DUMPMEM_SIZE, (IOMMU_READ | IOMMU_WRITE)); if (IS_ERR(gmu->dump_mem)) { ret = PTR_ERR(gmu->dump_mem); goto err_ret; } } /* GMU master log */ gmu->gmu_log = allocate_gmu_kmem(gmu, GMU_NONCACHED_KERNEL, LOGMEM_SIZE, Loading drivers/gpu/msm/kgsl_hfi.h +2 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,8 @@ #define HFI_QUEUE_DISPATCH_CNT 1 #define HFI_QUEUE_MAX (HFI_QUEUE_DEFAULT_CNT + HFI_QUEUE_DISPATCH_CNT) #define HFIMEM_SIZE (HFI_QUEUE_SIZE * (HFI_QUEUE_MAX + 1)) #define HFI_CMD_ID 0 #define HFI_MSG_ID 1 #define HFI_DBG_ID 2 Loading drivers/gpu/msm/kgsl_snapshot.h +14 −1 Original line number Diff line number Diff line /* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2012-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 Loading Loading @@ -59,6 +59,7 @@ struct kgsl_snapshot_section_header { #define KGSL_SNAPSHOT_SECTION_MEMLIST_V2 0x0E02 #define KGSL_SNAPSHOT_SECTION_SHADER 0x1201 #define KGSL_SNAPSHOT_SECTION_MVC 0x1501 #define KGSL_SNAPSHOT_SECTION_GMU 0x1601 #define KGSL_SNAPSHOT_SECTION_END 0xFFFF Loading Loading @@ -183,6 +184,18 @@ struct kgsl_snapshot_ib_v2 { __u64 size; /* Size of the IB */ } __packed; #define SNAPSHOT_GMU_OTHER 0 #define SNAPSHOT_GMU_HFIMEM 1 #define SNAPSHOT_GMU_LOG 2 #define SNAPSHOT_GMU_BWMEM 3 #define SNAPSHOT_GMU_DUMPMEM 4 #define SNAPSHOT_GMU_DCACHE 5 /* Indirect buffer sub-section header */ struct kgsl_snapshot_gmu { int type; /* Type of data to dump */ int size; /* Size in bytes to dump */ } __packed; /* Register sub-section header */ struct kgsl_snapshot_regs { Loading Loading
drivers/gpu/msm/adreno_a6xx_snapshot.c +47 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ #include "a6xx_reg.h" #include "adreno_a6xx.h" #include "kgsl_gmu.h" #include "kgsl_hfi.h" #define A6XX_NUM_CTXTS 2 #define A6XX_NUM_AXI_ARB_BLOCKS 2 Loading Loading @@ -1447,6 +1448,37 @@ static void a6xx_snapshot_debugbus(struct kgsl_device *device, } } struct gmu_mem_type_desc { struct gmu_memdesc *memdesc; uint32_t type; }; static size_t a6xx_snapshot_gmu_mem(struct kgsl_device *device, u8 *buf, size_t remain, void *priv) { struct kgsl_snapshot_gmu *header = (struct kgsl_snapshot_gmu *)buf; struct gmu_mem_type_desc *desc = priv; unsigned int *data = (unsigned int *)(buf + sizeof(*header)); if (priv == NULL) return 0; if (remain < desc->memdesc->size + sizeof(*header)) { KGSL_CORE_ERR( "snapshot: Not enough memory for the gmu section %d\n", desc->type); return 0; } header->type = desc->type; header->size = desc->memdesc->size; /* Just copy the ringbuffer, there are no active IBs */ memcpy(data, desc->memdesc->hostptr, desc->memdesc->size); return desc->memdesc->size + sizeof(*header); } /* * a6xx_snapshot_gmu() - A6XX GMU snapshot function * @adreno_dev: Device being snapshotted Loading @@ -1459,12 +1491,26 @@ void a6xx_snapshot_gmu(struct adreno_device *adreno_dev, struct kgsl_snapshot *snapshot) { struct kgsl_device *device = KGSL_DEVICE(adreno_dev); struct gmu_device *gmu = &device->gmu; struct gmu_mem_type_desc desc[] = { {gmu->hfi_mem, SNAPSHOT_GMU_HFIMEM}, {gmu->gmu_log, SNAPSHOT_GMU_LOG}, {gmu->bw_mem, SNAPSHOT_GMU_BWMEM}, {gmu->dump_mem, SNAPSHOT_GMU_DUMPMEM} }; struct adreno_gpudev *gpudev = ADRENO_GPU_DEVICE(adreno_dev); unsigned int val; unsigned int val, i; if (!kgsl_gmu_isenabled(device)) return; for (i = 0; i < ARRAY_SIZE(desc); i++) { if (desc[i].memdesc) kgsl_snapshot_add_section(device, KGSL_SNAPSHOT_SECTION_GMU, snapshot, a6xx_snapshot_gmu_mem, &desc[i]); } adreno_snapshot_registers(device, snapshot, a6xx_gmu_registers, ARRAY_SIZE(a6xx_gmu_registers) / 2); Loading
drivers/gpu/msm/kgsl_gmu.c +9 −7 Original line number Diff line number Diff line Loading @@ -68,8 +68,6 @@ struct gmu_iommu_context { struct iommu_domain *domain; }; #define HFIMEM_SIZE (HFI_QUEUE_SIZE * (HFI_QUEUE_MAX + 1)) #define DUMPMEM_SIZE SZ_16K #define DUMMY_SIZE SZ_4K Loading Loading @@ -555,6 +553,8 @@ static void gmu_memory_close(struct gmu_device *gmu) */ static int gmu_memory_probe(struct gmu_device *gmu, struct device_node *node) { struct kgsl_device *device = container_of(gmu, struct kgsl_device, gmu); struct adreno_device *adreno_dev = ADRENO_DEVICE(device); int ret; ret = gmu_iommu_init(gmu, node); Loading Loading @@ -582,12 +582,14 @@ static int gmu_memory_probe(struct gmu_device *gmu, struct device_node *node) } /* Allocates & maps GMU crash dump memory */ if (adreno_is_a630(adreno_dev)) { gmu->dump_mem = allocate_gmu_kmem(gmu, GMU_NONCACHED_KERNEL, DUMPMEM_SIZE, (IOMMU_READ | IOMMU_WRITE)); if (IS_ERR(gmu->dump_mem)) { ret = PTR_ERR(gmu->dump_mem); goto err_ret; } } /* GMU master log */ gmu->gmu_log = allocate_gmu_kmem(gmu, GMU_NONCACHED_KERNEL, LOGMEM_SIZE, Loading
drivers/gpu/msm/kgsl_hfi.h +2 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,8 @@ #define HFI_QUEUE_DISPATCH_CNT 1 #define HFI_QUEUE_MAX (HFI_QUEUE_DEFAULT_CNT + HFI_QUEUE_DISPATCH_CNT) #define HFIMEM_SIZE (HFI_QUEUE_SIZE * (HFI_QUEUE_MAX + 1)) #define HFI_CMD_ID 0 #define HFI_MSG_ID 1 #define HFI_DBG_ID 2 Loading
drivers/gpu/msm/kgsl_snapshot.h +14 −1 Original line number Diff line number Diff line /* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2012-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 Loading Loading @@ -59,6 +59,7 @@ struct kgsl_snapshot_section_header { #define KGSL_SNAPSHOT_SECTION_MEMLIST_V2 0x0E02 #define KGSL_SNAPSHOT_SECTION_SHADER 0x1201 #define KGSL_SNAPSHOT_SECTION_MVC 0x1501 #define KGSL_SNAPSHOT_SECTION_GMU 0x1601 #define KGSL_SNAPSHOT_SECTION_END 0xFFFF Loading Loading @@ -183,6 +184,18 @@ struct kgsl_snapshot_ib_v2 { __u64 size; /* Size of the IB */ } __packed; #define SNAPSHOT_GMU_OTHER 0 #define SNAPSHOT_GMU_HFIMEM 1 #define SNAPSHOT_GMU_LOG 2 #define SNAPSHOT_GMU_BWMEM 3 #define SNAPSHOT_GMU_DUMPMEM 4 #define SNAPSHOT_GMU_DCACHE 5 /* Indirect buffer sub-section header */ struct kgsl_snapshot_gmu { int type; /* Type of data to dump */ int size; /* Size in bytes to dump */ } __packed; /* Register sub-section header */ struct kgsl_snapshot_regs { Loading