1cbb3ec25SBjoern A. Zeeb /* SPDX-License-Identifier: ISC */
2cbb3ec25SBjoern A. Zeeb /* Copyright (C) 2023 MediaTek Inc. */
3cbb3ec25SBjoern A. Zeeb 
4cbb3ec25SBjoern A. Zeeb #ifndef _COREDUMP_H_
5cbb3ec25SBjoern A. Zeeb #define _COREDUMP_H_
6cbb3ec25SBjoern A. Zeeb 
7cbb3ec25SBjoern A. Zeeb #include "mt7996.h"
8cbb3ec25SBjoern A. Zeeb 
9cbb3ec25SBjoern A. Zeeb struct mt7996_coredump {
10cbb3ec25SBjoern A. Zeeb 	char magic[16];
11cbb3ec25SBjoern A. Zeeb 
12cbb3ec25SBjoern A. Zeeb 	u32 len;
13cbb3ec25SBjoern A. Zeeb 
14cbb3ec25SBjoern A. Zeeb 	guid_t guid;
15cbb3ec25SBjoern A. Zeeb 
16cbb3ec25SBjoern A. Zeeb 	/* time-of-day stamp */
17cbb3ec25SBjoern A. Zeeb 	u64 tv_sec;
18cbb3ec25SBjoern A. Zeeb 	/* time-of-day stamp, nano-seconds */
19cbb3ec25SBjoern A. Zeeb 	u64 tv_nsec;
20cbb3ec25SBjoern A. Zeeb 	/* kernel version */
21cbb3ec25SBjoern A. Zeeb 	char kernel[64];
22cbb3ec25SBjoern A. Zeeb 	/* firmware version */
23cbb3ec25SBjoern A. Zeeb 	char fw_ver[ETHTOOL_FWVERS_LEN];
24cbb3ec25SBjoern A. Zeeb 
25cbb3ec25SBjoern A. Zeeb 	u32 device_id;
26cbb3ec25SBjoern A. Zeeb 
27cbb3ec25SBjoern A. Zeeb 	/* exception state */
28cbb3ec25SBjoern A. Zeeb 	char fw_state[12];
29cbb3ec25SBjoern A. Zeeb 
30cbb3ec25SBjoern A. Zeeb 	/* program counters */
31cbb3ec25SBjoern A. Zeeb 	char pc_current[16];
32cbb3ec25SBjoern A. Zeeb 	u32 pc_stack[17];
33cbb3ec25SBjoern A. Zeeb 	/* link registers */
34cbb3ec25SBjoern A. Zeeb 	u32 lr_stack[16];
35cbb3ec25SBjoern A. Zeeb 
36cbb3ec25SBjoern A. Zeeb 	/* memory content */
37cbb3ec25SBjoern A. Zeeb 	u8 data[];
38cbb3ec25SBjoern A. Zeeb } __packed;
39cbb3ec25SBjoern A. Zeeb 
40cbb3ec25SBjoern A. Zeeb struct mt7996_coredump_mem {
41cbb3ec25SBjoern A. Zeeb 	u32 len;
42cbb3ec25SBjoern A. Zeeb 	u8 data[];
43cbb3ec25SBjoern A. Zeeb } __packed;
44cbb3ec25SBjoern A. Zeeb 
45cbb3ec25SBjoern A. Zeeb struct mt7996_mem_hdr {
46cbb3ec25SBjoern A. Zeeb 	u32 start;
47cbb3ec25SBjoern A. Zeeb 	u32 len;
48cbb3ec25SBjoern A. Zeeb 	u8 data[];
49cbb3ec25SBjoern A. Zeeb };
50cbb3ec25SBjoern A. Zeeb 
51cbb3ec25SBjoern A. Zeeb struct mt7996_mem_region {
52cbb3ec25SBjoern A. Zeeb 	u32 start;
53cbb3ec25SBjoern A. Zeeb 	size_t len;
54cbb3ec25SBjoern A. Zeeb 
55cbb3ec25SBjoern A. Zeeb 	const char *name;
56cbb3ec25SBjoern A. Zeeb };
57cbb3ec25SBjoern A. Zeeb 
58cbb3ec25SBjoern A. Zeeb #ifdef CONFIG_DEV_COREDUMP
59cbb3ec25SBjoern A. Zeeb 
60cbb3ec25SBjoern A. Zeeb const struct mt7996_mem_region *
61cbb3ec25SBjoern A. Zeeb mt7996_coredump_get_mem_layout(struct mt7996_dev *dev, u32 *num);
62cbb3ec25SBjoern A. Zeeb struct mt7996_crash_data *mt7996_coredump_new(struct mt7996_dev *dev);
63cbb3ec25SBjoern A. Zeeb int mt7996_coredump_submit(struct mt7996_dev *dev);
64cbb3ec25SBjoern A. Zeeb int mt7996_coredump_register(struct mt7996_dev *dev);
65cbb3ec25SBjoern A. Zeeb void mt7996_coredump_unregister(struct mt7996_dev *dev);
66cbb3ec25SBjoern A. Zeeb 
67cbb3ec25SBjoern A. Zeeb #else /* CONFIG_DEV_COREDUMP */
68cbb3ec25SBjoern A. Zeeb 
69cbb3ec25SBjoern A. Zeeb static inline const struct mt7996_mem_region *
mt7996_coredump_get_mem_layout(struct mt7996_dev * dev,u32 * num)70cbb3ec25SBjoern A. Zeeb mt7996_coredump_get_mem_layout(struct mt7996_dev *dev, u32 *num)
71cbb3ec25SBjoern A. Zeeb {
72cbb3ec25SBjoern A. Zeeb 	return NULL;
73cbb3ec25SBjoern A. Zeeb }
74cbb3ec25SBjoern A. Zeeb 
mt7996_coredump_submit(struct mt7996_dev * dev)75cbb3ec25SBjoern A. Zeeb static inline int mt7996_coredump_submit(struct mt7996_dev *dev)
76cbb3ec25SBjoern A. Zeeb {
77cbb3ec25SBjoern A. Zeeb 	return 0;
78cbb3ec25SBjoern A. Zeeb }
79cbb3ec25SBjoern A. Zeeb 
80cbb3ec25SBjoern A. Zeeb static inline struct
mt7996_coredump_new(struct mt7996_dev * dev)81cbb3ec25SBjoern A. Zeeb mt7996_crash_data *mt7996_coredump_new(struct mt7996_dev *dev)
82cbb3ec25SBjoern A. Zeeb {
83cbb3ec25SBjoern A. Zeeb 	return NULL;
84cbb3ec25SBjoern A. Zeeb }
85cbb3ec25SBjoern A. Zeeb 
mt7996_coredump_register(struct mt7996_dev * dev)86cbb3ec25SBjoern A. Zeeb static inline int mt7996_coredump_register(struct mt7996_dev *dev)
87cbb3ec25SBjoern A. Zeeb {
88cbb3ec25SBjoern A. Zeeb 	return 0;
89cbb3ec25SBjoern A. Zeeb }
90cbb3ec25SBjoern A. Zeeb 
mt7996_coredump_unregister(struct mt7996_dev * dev)91cbb3ec25SBjoern A. Zeeb static inline void mt7996_coredump_unregister(struct mt7996_dev *dev)
92cbb3ec25SBjoern A. Zeeb {
93cbb3ec25SBjoern A. Zeeb }
94cbb3ec25SBjoern A. Zeeb 
95cbb3ec25SBjoern A. Zeeb #endif /* CONFIG_DEV_COREDUMP */
96cbb3ec25SBjoern A. Zeeb 
97cbb3ec25SBjoern A. Zeeb #endif /* _COREDUMP_H_ */
98