Merge "msm: kgsl: Add support for VA-Minidump in hwsched path"

This commit is contained in:
qctecmdr 2023-03-28 20:48:24 -07:00 committed by Gerrit - the friendly Code Review server
commit 5da05cd6f1
6 changed files with 159 additions and 13 deletions

View File

@ -1445,6 +1445,7 @@ static void adreno_unbind(struct device *dev)
input_unregister_handler(&adreno_input_handler);
#endif
kgsl_qcom_va_md_unregister(device);
adreno_coresight_remove(adreno_dev);
adreno_profile_close(adreno_dev);

View File

@ -16,7 +16,6 @@
#include "adreno_snapshot.h"
#include "kgsl_device.h"
#include "kgsl_trace.h"
#include "kgsl_util.h"
static size_t adreno_hwsched_snapshot_rb(struct kgsl_device *device, u8 *buf,
size_t remain, void *priv)
@ -1237,7 +1236,8 @@ int a6xx_hwsched_add_to_minidump(struct adreno_device *adreno_dev)
struct a6xx_device, adreno_dev);
struct a6xx_hwsched_device *a6xx_hwsched = container_of(a6xx_dev,
struct a6xx_hwsched_device, a6xx_dev);
int ret;
struct a6xx_hwsched_hfi *hw_hfi = &a6xx_hwsched->hwsched_hfi;
int ret, i;
ret = kgsl_add_va_to_minidump(adreno_dev->dev.dev, KGSL_HWSCHED_DEVICE,
(void *)(a6xx_hwsched), sizeof(struct a6xx_hwsched_device));
@ -1263,11 +1263,47 @@ int a6xx_hwsched_add_to_minidump(struct adreno_device *adreno_dev)
}
if ((adreno_is_a630(adreno_dev) || adreno_is_a615_family(adreno_dev)) &&
a6xx_dev->gmu.dump_mem)
a6xx_dev->gmu.dump_mem) {
ret = kgsl_add_va_to_minidump(adreno_dev->dev.dev,
KGSL_GMU_DUMPMEM_ENTRY,
a6xx_dev->gmu.dump_mem->hostptr,
a6xx_dev->gmu.dump_mem->size);
if (ret)
return ret;
}
/* Dump HFI hwsched global mem alloc entries */
for (i = 0; i < hw_hfi->mem_alloc_entries; i++) {
struct hfi_mem_alloc_entry *entry = &hw_hfi->mem_alloc_table[i];
char hfi_minidump_str[MAX_VA_MINIDUMP_STR_LEN] = {0};
u32 rb_id = 0;
if (!hfi_get_minidump_string(entry->desc.mem_kind,
&hfi_minidump_str[0],
sizeof(hfi_minidump_str), &rb_id)) {
ret = kgsl_add_va_to_minidump(adreno_dev->dev.dev,
hfi_minidump_str,
entry->md->hostptr,
entry->md->size);
if (ret)
return ret;
}
}
if (hw_hfi->big_ib) {
ret = kgsl_add_va_to_minidump(adreno_dev->dev.dev,
KGSL_HFI_BIG_IB_ENTRY,
hw_hfi->big_ib->hostptr,
hw_hfi->big_ib->size);
if (ret)
return ret;
}
if (hw_hfi->big_ib_recurring)
ret = kgsl_add_va_to_minidump(adreno_dev->dev.dev,
KGSL_HFI_BIG_IB_REC_ENTRY,
hw_hfi->big_ib_recurring->hostptr,
hw_hfi->big_ib_recurring->size);
return ret;
}

View File

@ -15,7 +15,6 @@
#include "adreno_snapshot.h"
#include "kgsl_device.h"
#include "kgsl_trace.h"
#include "kgsl_util.h"
static size_t adreno_hwsched_snapshot_rb(struct kgsl_device *device, u8 *buf,
size_t remain, void *priv)
@ -1439,7 +1438,8 @@ int gen7_hwsched_add_to_minidump(struct adreno_device *adreno_dev)
struct gen7_device, adreno_dev);
struct gen7_hwsched_device *gen7_hwsched = container_of(gen7_dev,
struct gen7_hwsched_device, gen7_dev);
int ret;
struct gen7_hwsched_hfi *hw_hfi = &gen7_hwsched->hwsched_hfi;
int ret, i;
ret = kgsl_add_va_to_minidump(adreno_dev->dev.dev, KGSL_HWSCHED_DEVICE,
(void *)(gen7_hwsched), sizeof(struct gen7_hwsched_device));
@ -1455,11 +1455,47 @@ int gen7_hwsched_add_to_minidump(struct adreno_device *adreno_dev)
return ret;
}
if (gen7_dev->gmu.hfi.hfi_mem)
if (gen7_dev->gmu.hfi.hfi_mem) {
ret = kgsl_add_va_to_minidump(adreno_dev->dev.dev,
KGSL_HFIMEM_ENTRY,
gen7_dev->gmu.hfi.hfi_mem->hostptr,
gen7_dev->gmu.hfi.hfi_mem->size);
if (ret)
return ret;
}
/* Dump HFI hwsched global mem alloc entries */
for (i = 0; i < hw_hfi->mem_alloc_entries; i++) {
struct hfi_mem_alloc_entry *entry = &hw_hfi->mem_alloc_table[i];
char hfi_minidump_str[MAX_VA_MINIDUMP_STR_LEN] = {0};
u32 rb_id = 0;
if (!hfi_get_minidump_string(entry->desc.mem_kind,
&hfi_minidump_str[0],
sizeof(hfi_minidump_str), &rb_id)) {
ret = kgsl_add_va_to_minidump(adreno_dev->dev.dev,
hfi_minidump_str,
entry->md->hostptr,
entry->md->size);
if (ret)
return ret;
}
}
if (hw_hfi->big_ib) {
ret = kgsl_add_va_to_minidump(adreno_dev->dev.dev,
KGSL_HFI_BIG_IB_ENTRY,
hw_hfi->big_ib->hostptr,
hw_hfi->big_ib->size);
if (ret)
return ret;
}
if (hw_hfi->big_ib_recurring)
ret = kgsl_add_va_to_minidump(adreno_dev->dev.dev,
KGSL_HFI_BIG_IB_REC_ENTRY,
hw_hfi->big_ib_recurring->hostptr,
hw_hfi->big_ib_recurring->size);
return ret;
}

View File

@ -1,11 +1,13 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved.
*/
#ifndef __ADRENO_HFI_H
#define __ADRENO_HFI_H
#include "kgsl_util.h"
#define HW_FENCE_QUEUE_SIZE SZ_4K
#define HFI_QUEUE_SIZE SZ_4K /* bytes, must be base 4dw */
#define MAX_RCVD_PAYLOAD_SIZE 16 /* dwords */
@ -1091,4 +1093,41 @@ static inline u32 hfi_get_gmu_va_alignment(u32 va_align)
int adreno_hwsched_wait_ack_completion(struct adreno_device *adreno_dev,
struct device *dev, struct pending_cmd *ack,
void (*process_msgq)(struct adreno_device *adreno_dev));
/**
* hfi_get_minidump_string - Get the va-minidump string from entry
* mem_kind: mem_kind type
* hfi_minidump_str: Pointer to the output string
* size: Max size of the hfi_minidump_str
* rb_id: Pointer to the rb_id count
*
* This function return 0 on valid mem_kind and copies the VA-MINIDUMP string to
* hfi_minidump_str else return error
*/
static inline int hfi_get_minidump_string(u32 mem_kind, char *hfi_minidump_str,
size_t size, u32 *rb_id)
{
/* Extend this if the VA mindump need more hfi alloc entries */
switch (mem_kind) {
case HFI_MEMKIND_RB:
snprintf(hfi_minidump_str, size, KGSL_GMU_RB_ENTRY"_%d", (*rb_id)++);
break;
case HFI_MEMKIND_SCRATCH:
snprintf(hfi_minidump_str, size, KGSL_SCRATCH_ENTRY);
break;
case HFI_MEMKIND_PROFILE:
snprintf(hfi_minidump_str, size, KGSL_GMU_KERNEL_PROF_ENTRY);
break;
case HFI_MEMKIND_USER_PROFILE_IBS:
snprintf(hfi_minidump_str, size, KGSL_GMU_USER_PROF_ENTRY);
break;
case HFI_MEMKIND_CMD_BUFFER:
snprintf(hfi_minidump_str, size, KGSL_GMU_CMD_BUFFER_ENTRY);
break;
default:
return -EINVAL;
}
return 0;
}
#endif

View File

@ -1,6 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
* Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved.
*/
@ -266,7 +267,7 @@ int kgsl_add_va_to_minidump(struct device *dev, const char *name, void *ptr,
static int kgsl_add_driver_data_to_va_minidump(struct kgsl_device *device)
{
int ret;
char name[32];
char name[MAX_VA_MINIDUMP_STR_LEN];
struct kgsl_pagetable *pt;
struct adreno_context *ctxt;
struct kgsl_process_private *p;
@ -292,7 +293,7 @@ static int kgsl_add_driver_data_to_va_minidump(struct kgsl_device *device)
spin_lock(&adreno_dev->active_list_lock);
list_for_each_entry(ctxt, &adreno_dev->active_list, active_node) {
snprintf(name, sizeof(name), "kgsl_adreno_ctx_%d", ctxt->base.id);
snprintf(name, sizeof(name), KGSL_ADRENO_CTX_ENTRY"_%d", ctxt->base.id);
ret = kgsl_add_va_to_minidump(device->dev, name,
(void *)(ctxt), sizeof(struct adreno_context));
if (ret)
@ -302,7 +303,7 @@ static int kgsl_add_driver_data_to_va_minidump(struct kgsl_device *device)
read_lock(&kgsl_driver.proclist_lock);
list_for_each_entry(p, &kgsl_driver.process_list, list) {
snprintf(name, sizeof(name), "kgsl_proc_priv_%d", pid_nr(p->pid));
snprintf(name, sizeof(name), KGSL_PROC_PRIV_ENTRY "_%d", pid_nr(p->pid));
ret = kgsl_add_va_to_minidump(device->dev, name,
(void *)(p), sizeof(struct kgsl_process_private));
if (ret)
@ -312,7 +313,7 @@ static int kgsl_add_driver_data_to_va_minidump(struct kgsl_device *device)
spin_lock(&kgsl_driver.ptlock);
list_for_each_entry(pt, &kgsl_driver.pagetable_list, list) {
snprintf(name, sizeof(name), "kgsl_pgtable_%d", pt->name);
snprintf(name, sizeof(name), KGSL_PGTABLE_ENTRY"_%d", pt->name);
ret = kgsl_add_va_to_minidump(device->dev, name,
(void *)(pt), sizeof(struct kgsl_pagetable));
if (ret)
@ -345,9 +346,24 @@ static struct notifier_block kgsl_va_minidump_nb = {
void kgsl_qcom_va_md_register(struct kgsl_device *device)
{
int ret;
if (!qcom_va_md_enabled())
return;
if (qcom_va_md_register("KGSL", &kgsl_va_minidump_nb))
dev_err(device->dev, "Failed to register notifier with va_minidump\n");
ret = qcom_va_md_register("KGSL", &kgsl_va_minidump_nb);
if (ret)
dev_err(device->dev, "Failed to register notifier with va_minidump: %d\n", ret);
}
void kgsl_qcom_va_md_unregister(struct kgsl_device *device)
{
int ret;
if (!qcom_va_md_enabled())
return;
ret = qcom_va_md_unregister("KGSL", &kgsl_va_minidump_nb);
if (ret)
dev_err(device->dev, "Failed to unregister notifier with va_minidump: %d\n", ret);
}

View File

@ -1,6 +1,7 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2019-2021, The Linux Foundation. All rights reserved.
* Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved.
*/
#ifndef _KGSL_UTIL_H_
@ -17,6 +18,17 @@
#define KGSL_GMU_LOG_ENTRY "kgsl_gmu_log"
#define KGSL_HFIMEM_ENTRY "kgsl_hfi_mem"
#define KGSL_GMU_DUMPMEM_ENTRY "kgsl_gmu_dump_mem"
#define KGSL_GMU_RB_ENTRY "kgsl_gmu_rb"
#define KGSL_GMU_KERNEL_PROF_ENTRY "kgsl_gmu_kernel_profiling"
#define KGSL_GMU_USER_PROF_ENTRY "kgsl_gmu_user_profiling"
#define KGSL_GMU_CMD_BUFFER_ENTRY "kgsl_gmu_cmd_buffer"
#define KGSL_HFI_BIG_IB_ENTRY "kgsl_hfi_big_ib"
#define KGSL_HFI_BIG_IB_REC_ENTRY "kgsl_hfi_big_ib_rec"
#define KGSL_ADRENO_CTX_ENTRY "kgsl_adreno_ctx"
#define KGSL_PROC_PRIV_ENTRY "kgsl_proc_priv"
#define KGSL_PGTABLE_ENTRY "kgsl_pgtable"
#define MAX_VA_MINIDUMP_STR_LEN 32
struct regulator;
struct clk_bulk_data;
@ -159,4 +171,10 @@ int kgsl_add_va_to_minidump(struct device *dev, const char *name, void *ptr,
*/
void kgsl_qcom_va_md_register(struct kgsl_device *device);
/**
* kgsl_qcom_va_md_unregister - Unregister driver with va-minidump
* @device: Pointer to kgsl device
*/
void kgsl_qcom_va_md_unregister(struct kgsl_device *device);
#endif