soc: qcom: Minidump support for VMs

Add minidump support for VMs. RM call is used to manage regions of VMs.

Change-Id: I85a21223e13f2a8477919858aebaca8b11b5faeb
Signed-off-by: Cong Zhang <quic_congzhan@quicinc.com>
This commit is contained in:
Cong Zhang 2022-07-11 22:06:31 +08:00 committed by Gerrit - the friendly Code Review server
parent 75dda42eb8
commit accaa1e653
4 changed files with 680 additions and 258 deletions

View File

@ -567,7 +567,7 @@ config QCOM_HUNG_TASK_ENH
config QCOM_MINIDUMP
tristate "QCOM Minidump Support"
depends on QCOM_SMEM
depends on QCOM_SMEM || ARCH_QTI_VM
help
This enables minidump feature. It allows various clients to
register to dump their state at system bad state (panic/WDT,etc.,).

View File

@ -284,19 +284,19 @@ bool md_register_memory_dump(int size, char *name)
bool md_unregister_memory_dump(char *name)
{
struct page *page;
struct md_region *mdr;
struct md_region mdr;
struct md_region md_entry;
mdr = md_get_region(name);
if (!mdr) {
if (!mdr.virt_addr) {
pr_err("minidump entry for %s not found\n", name);
return false;
}
strscpy(md_entry.name, mdr->name, sizeof(md_entry.name));
md_entry.virt_addr = mdr->virt_addr;
md_entry.phys_addr = mdr->phys_addr;
md_entry.size = mdr->size;
page = virt_to_page(mdr->virt_addr);
strscpy(md_entry.name, mdr.name, sizeof(md_entry.name));
md_entry.virt_addr = mdr.virt_addr;
md_entry.phys_addr = mdr.phys_addr;
md_entry.size = mdr.size;
page = virt_to_page(mdr.virt_addr);
if (msm_minidump_remove_region(&md_entry) < 0)
return false;

File diff suppressed because it is too large Load Diff

View File

@ -8,6 +8,14 @@
#define __MINIDUMP_H
#include <linux/types.h>
#include <linux/workqueue.h>
enum minidump_entry_cmd {
MINIDUMP_ADD,
MINIDUMP_REMOVE,
MINIDUMP_UPDATE,
MINIDUMP_NO_CMD
};
#define MAX_NAME_LENGTH 12
/* md_region - Minidump table entry
@ -27,8 +35,19 @@ struct md_region {
};
struct md_pending_region {
struct list_head list;
struct md_region entry;
struct list_head list;
struct md_region entry;
};
struct md_rm_region {
char name[MAX_NAME_LENGTH];
u32 slot_num;
};
struct md_rm_request {
struct md_region entry;
struct work_struct work;
enum minidump_entry_cmd work_cmd;
};
/*
@ -49,7 +68,7 @@ extern int msm_minidump_remove_region(const struct md_region *entry);
*/
extern int msm_minidump_update_region(int regno, const struct md_region *entry);
extern bool msm_minidump_enabled(void);
extern struct md_region *md_get_region(char *name);
extern struct md_region md_get_region(char *name);
extern void dump_stack_minidump(u64 sp);
extern int msm_minidump_get_available_region(void);
#else
@ -63,7 +82,11 @@ static inline int msm_minidump_remove_region(const struct md_region *entry)
return 0;
}
static inline bool msm_minidump_enabled(void) { return false; }
static inline struct md_region *md_get_region(char *name) { return NULL; }
static inline struct md_region md_get_region(char *name)
{
struct md_region mdr = {0};
return mdr;
}
static inline void dump_stack_minidump(u64 sp) {}
static inline void add_trace_event(char *buf, size_t size) {}
#endif