1cbb3ec25SBjoern A. Zeeb /* SPDX-License-Identifier: ISC */
2cbb3ec25SBjoern A. Zeeb /* Copyright (C) 2022 MediaTek Inc. */
3cbb3ec25SBjoern A. Zeeb 
4cbb3ec25SBjoern A. Zeeb #ifndef _COREDUMP_H_
5cbb3ec25SBjoern A. Zeeb #define _COREDUMP_H_
6cbb3ec25SBjoern A. Zeeb 
7cbb3ec25SBjoern A. Zeeb #if defined(__FreeBSD__)
8cbb3ec25SBjoern A. Zeeb #include <linux/uuid.h>
9cbb3ec25SBjoern A. Zeeb #endif
10cbb3ec25SBjoern A. Zeeb #include "mt7915.h"
11cbb3ec25SBjoern A. Zeeb 
12cbb3ec25SBjoern A. Zeeb struct trace {
13cbb3ec25SBjoern A. Zeeb 	u32 id;
14cbb3ec25SBjoern A. Zeeb 	u32 timestamp;
15cbb3ec25SBjoern A. Zeeb };
16cbb3ec25SBjoern A. Zeeb 
17cbb3ec25SBjoern A. Zeeb struct mt7915_coredump {
18cbb3ec25SBjoern A. Zeeb 	char magic[16];
19cbb3ec25SBjoern A. Zeeb 
20cbb3ec25SBjoern A. Zeeb 	u32 len;
21cbb3ec25SBjoern A. Zeeb 
22cbb3ec25SBjoern A. Zeeb 	guid_t guid;
23cbb3ec25SBjoern A. Zeeb 
24cbb3ec25SBjoern A. Zeeb 	/* time-of-day stamp */
25cbb3ec25SBjoern A. Zeeb 	u64 tv_sec;
26cbb3ec25SBjoern A. Zeeb 	/* time-of-day stamp, nano-seconds */
27cbb3ec25SBjoern A. Zeeb 	u64 tv_nsec;
28cbb3ec25SBjoern A. Zeeb 	/* kernel version */
29cbb3ec25SBjoern A. Zeeb 	char kernel[64];
30cbb3ec25SBjoern A. Zeeb 	/* firmware version */
31cbb3ec25SBjoern A. Zeeb 	char fw_ver[ETHTOOL_FWVERS_LEN];
32cbb3ec25SBjoern A. Zeeb 
33cbb3ec25SBjoern A. Zeeb 	u32 device_id;
34cbb3ec25SBjoern A. Zeeb 
35cbb3ec25SBjoern A. Zeeb 	/* exception state */
36cbb3ec25SBjoern A. Zeeb 	char fw_state[12];
37cbb3ec25SBjoern A. Zeeb 
38cbb3ec25SBjoern A. Zeeb 	u32 last_msg_id;
39cbb3ec25SBjoern A. Zeeb 	u32 eint_info_idx;
40cbb3ec25SBjoern A. Zeeb 	u32 irq_info_idx;
41cbb3ec25SBjoern A. Zeeb 	u32 sched_info_idx;
42cbb3ec25SBjoern A. Zeeb 
43cbb3ec25SBjoern A. Zeeb 	/* schedule info */
44cbb3ec25SBjoern A. Zeeb 	char trace_sched[32];
45cbb3ec25SBjoern A. Zeeb 	struct {
46cbb3ec25SBjoern A. Zeeb 		struct trace t;
47cbb3ec25SBjoern A. Zeeb 		u32 pc;
48cbb3ec25SBjoern A. Zeeb 	} sched[60];
49cbb3ec25SBjoern A. Zeeb 
50cbb3ec25SBjoern A. Zeeb 	/* irq info */
51cbb3ec25SBjoern A. Zeeb 	char trace_irq[32];
52cbb3ec25SBjoern A. Zeeb 	struct trace irq[60];
53cbb3ec25SBjoern A. Zeeb 
54cbb3ec25SBjoern A. Zeeb 	/* task queue status */
55cbb3ec25SBjoern A. Zeeb 	char task_qid[32];
56cbb3ec25SBjoern A. Zeeb 	struct {
57cbb3ec25SBjoern A. Zeeb 		u32 read;
58cbb3ec25SBjoern A. Zeeb 		u32 write;
59cbb3ec25SBjoern A. Zeeb 	} taskq[2];
60cbb3ec25SBjoern A. Zeeb 
61cbb3ec25SBjoern A. Zeeb 	/* task stack info */
62cbb3ec25SBjoern A. Zeeb 	char task_info[32];
63cbb3ec25SBjoern A. Zeeb 	struct {
64cbb3ec25SBjoern A. Zeeb 		u32 start;
65cbb3ec25SBjoern A. Zeeb 		u32 end;
66cbb3ec25SBjoern A. Zeeb 		u32 size;
67cbb3ec25SBjoern A. Zeeb 	} taski[2];
68cbb3ec25SBjoern A. Zeeb 
69cbb3ec25SBjoern A. Zeeb 	/* firmware context */
70cbb3ec25SBjoern A. Zeeb 	char fw_context[24];
71cbb3ec25SBjoern A. Zeeb 	struct {
72cbb3ec25SBjoern A. Zeeb 		u32 idx;
73cbb3ec25SBjoern A. Zeeb 		u32 handler;
74cbb3ec25SBjoern A. Zeeb 	} context;
75cbb3ec25SBjoern A. Zeeb 
76cbb3ec25SBjoern A. Zeeb 	/* link registers calltrace */
77cbb3ec25SBjoern A. Zeeb 	u32 call_stack[16];
78cbb3ec25SBjoern A. Zeeb 
79cbb3ec25SBjoern A. Zeeb 	/* memory content */
80cbb3ec25SBjoern A. Zeeb 	u8 data[];
81cbb3ec25SBjoern A. Zeeb } __packed;
82cbb3ec25SBjoern A. Zeeb 
83cbb3ec25SBjoern A. Zeeb struct mt7915_coredump_mem {
84cbb3ec25SBjoern A. Zeeb 	u32 len;
85cbb3ec25SBjoern A. Zeeb 	u8 data[];
86cbb3ec25SBjoern A. Zeeb } __packed;
87cbb3ec25SBjoern A. Zeeb 
88cbb3ec25SBjoern A. Zeeb struct mt7915_mem_hdr {
89cbb3ec25SBjoern A. Zeeb 	u32 start;
90cbb3ec25SBjoern A. Zeeb 	u32 len;
91cbb3ec25SBjoern A. Zeeb 	u8 data[];
92cbb3ec25SBjoern A. Zeeb };
93cbb3ec25SBjoern A. Zeeb 
94cbb3ec25SBjoern A. Zeeb struct mt7915_mem_region {
95cbb3ec25SBjoern A. Zeeb 	u32 start;
96cbb3ec25SBjoern A. Zeeb 	size_t len;
97cbb3ec25SBjoern A. Zeeb 
98cbb3ec25SBjoern A. Zeeb 	const char *name;
99cbb3ec25SBjoern A. Zeeb };
100cbb3ec25SBjoern A. Zeeb 
101cbb3ec25SBjoern A. Zeeb #ifdef CONFIG_DEV_COREDUMP
102cbb3ec25SBjoern A. Zeeb 
103cbb3ec25SBjoern A. Zeeb const struct mt7915_mem_region *
104cbb3ec25SBjoern A. Zeeb mt7915_coredump_get_mem_layout(struct mt7915_dev *dev, u32 *num);
105cbb3ec25SBjoern A. Zeeb struct mt7915_crash_data *mt7915_coredump_new(struct mt7915_dev *dev);
106cbb3ec25SBjoern A. Zeeb int mt7915_coredump_submit(struct mt7915_dev *dev);
107cbb3ec25SBjoern A. Zeeb int mt7915_coredump_register(struct mt7915_dev *dev);
108cbb3ec25SBjoern A. Zeeb void mt7915_coredump_unregister(struct mt7915_dev *dev);
109cbb3ec25SBjoern A. Zeeb 
110cbb3ec25SBjoern A. Zeeb #else /* CONFIG_DEV_COREDUMP */
111cbb3ec25SBjoern A. Zeeb 
112cbb3ec25SBjoern A. Zeeb static inline const struct mt7915_mem_region *
mt7915_coredump_get_mem_layout(struct mt7915_dev * dev,u32 * num)113cbb3ec25SBjoern A. Zeeb mt7915_coredump_get_mem_layout(struct mt7915_dev *dev, u32 *num)
114cbb3ec25SBjoern A. Zeeb {
115cbb3ec25SBjoern A. Zeeb 	return NULL;
116cbb3ec25SBjoern A. Zeeb }
117cbb3ec25SBjoern A. Zeeb 
mt7915_coredump_submit(struct mt7915_dev * dev)118cbb3ec25SBjoern A. Zeeb static inline int mt7915_coredump_submit(struct mt7915_dev *dev)
119cbb3ec25SBjoern A. Zeeb {
120cbb3ec25SBjoern A. Zeeb 	return 0;
121cbb3ec25SBjoern A. Zeeb }
122cbb3ec25SBjoern A. Zeeb 
mt7915_coredump_new(struct mt7915_dev * dev)123cbb3ec25SBjoern A. Zeeb static inline struct mt7915_crash_data *mt7915_coredump_new(struct mt7915_dev *dev)
124cbb3ec25SBjoern A. Zeeb {
125cbb3ec25SBjoern A. Zeeb 	return NULL;
126cbb3ec25SBjoern A. Zeeb }
127cbb3ec25SBjoern A. Zeeb 
mt7915_coredump_register(struct mt7915_dev * dev)128cbb3ec25SBjoern A. Zeeb static inline int mt7915_coredump_register(struct mt7915_dev *dev)
129cbb3ec25SBjoern A. Zeeb {
130cbb3ec25SBjoern A. Zeeb 	return 0;
131cbb3ec25SBjoern A. Zeeb }
132cbb3ec25SBjoern A. Zeeb 
mt7915_coredump_unregister(struct mt7915_dev * dev)133cbb3ec25SBjoern A. Zeeb static inline void mt7915_coredump_unregister(struct mt7915_dev *dev)
134cbb3ec25SBjoern A. Zeeb {
135cbb3ec25SBjoern A. Zeeb }
136cbb3ec25SBjoern A. Zeeb 
137cbb3ec25SBjoern A. Zeeb #endif /* CONFIG_DEV_COREDUMP */
138cbb3ec25SBjoern A. Zeeb 
139cbb3ec25SBjoern A. Zeeb #endif /* _COREDUMP_H_ */
140