aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/drivers/net/wireless/mediatek/mt76/mt7915/coredump.h
blob: 709f8e9c795cbe1dbfe6f24fe584eec66b4d7514 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/* SPDX-License-Identifier: ISC */
/* Copyright (C) 2022 MediaTek Inc. */

#ifndef _COREDUMP_H_
#define _COREDUMP_H_

#include "mt7915.h"

struct trace {
	u32 id;
	u32 timestamp;
};

struct mt7915_coredump {
	char magic[16];

	u32 len;

	guid_t guid;

	/* time-of-day stamp */
	u64 tv_sec;
	/* time-of-day stamp, nano-seconds */
	u64 tv_nsec;
	/* kernel version */
	char kernel[64];
	/* firmware version */
	char fw_ver[ETHTOOL_FWVERS_LEN];

	u32 device_id;

	/* exception state */
	char fw_state[12];

	u32 last_msg_id;
	u32 eint_info_idx;
	u32 irq_info_idx;
	u32 sched_info_idx;

	/* schedule info */
	char trace_sched[32];
	struct {
		struct trace t;
		u32 pc;
	} sched[60];

	/* irq info */
	char trace_irq[32];
	struct trace irq[60];

	/* task queue status */
	char task_qid[32];
	struct {
		u32 read;
		u32 write;
	} taskq[2];

	/* task stack info */
	char task_info[32];
	struct {
		u32 start;
		u32 end;
		u32 size;
	} taski[2];

	/* firmware context */
	char fw_context[24];
	struct {
		u32 idx;
		u32 handler;
	} context;

	/* link registers calltrace */
	u32 call_stack[16];

	/* memory content */
	u8 data[];
} __packed;

struct mt7915_coredump_mem {
	u32 len;
	u8 data[];
} __packed;

struct mt7915_mem_hdr {
	u32 start;
	u32 len;
	u8 data[];
};

struct mt7915_mem_region {
	u32 start;
	size_t len;

	const char *name;
};

#ifdef CONFIG_DEV_COREDUMP

const struct mt7915_mem_region *
mt7915_coredump_get_mem_layout(struct mt7915_dev *dev, u32 *num);
struct mt7915_crash_data *mt7915_coredump_new(struct mt7915_dev *dev);
int mt7915_coredump_submit(struct mt7915_dev *dev);
int mt7915_coredump_register(struct mt7915_dev *dev);
void mt7915_coredump_unregister(struct mt7915_dev *dev);

#else /* CONFIG_DEV_COREDUMP */

static inline const struct mt7915_mem_region *
mt7915_coredump_get_mem_layout(struct mt7915_dev *dev, u32 *num)
{
	return NULL;
}

static inline int mt7915_coredump_submit(struct mt7915_dev *dev)
{
	return 0;
}

static inline struct mt7915_crash_data *mt7915_coredump_new(struct mt7915_dev *dev)
{
	return NULL;
}

static inline int mt7915_coredump_register(struct mt7915_dev *dev)
{
	return 0;
}

static inline void mt7915_coredump_unregister(struct mt7915_dev *dev)
{
}

#endif /* CONFIG_DEV_COREDUMP */

#endif /* _COREDUMP_H_ */