Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3196df42 authored by qctecmdr Service's avatar qctecmdr Service Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: kgsl: Add GMU memory to snapshot"

parents f8a2ff32 f94cb947
Loading
Loading
Loading
Loading
+47 −1
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -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);

+9 −7
Original line number Diff line number Diff line
@@ -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
@@ -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);
@@ -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,
+2 −0
Original line number Diff line number Diff line
@@ -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
+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
@@ -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

@@ -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 {