1f25b9f28SKalle Valo /*
2f25b9f28SKalle Valo  * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
3f25b9f28SKalle Valo  *
4f25b9f28SKalle Valo  * Permission to use, copy, modify, and/or distribute this software for any
5f25b9f28SKalle Valo  * purpose with or without fee is hereby granted, provided that the above
6f25b9f28SKalle Valo  * copyright notice and this permission notice appear in all copies.
7f25b9f28SKalle Valo  *
8f25b9f28SKalle Valo  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9f25b9f28SKalle Valo  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10f25b9f28SKalle Valo  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11f25b9f28SKalle Valo  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12f25b9f28SKalle Valo  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13f25b9f28SKalle Valo  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14f25b9f28SKalle Valo  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15f25b9f28SKalle Valo  */
16f25b9f28SKalle Valo 
17f25b9f28SKalle Valo #ifndef _COREDUMP_H_
18f25b9f28SKalle Valo #define _COREDUMP_H_
19f25b9f28SKalle Valo 
20f25b9f28SKalle Valo #include "core.h"
21f25b9f28SKalle Valo 
22f25b9f28SKalle Valo #define ATH10K_FW_CRASH_DUMP_VERSION 1
23f25b9f28SKalle Valo 
24f25b9f28SKalle Valo /**
25f25b9f28SKalle Valo  * enum ath10k_fw_crash_dump_type - types of data in the dump file
26f25b9f28SKalle Valo  * @ATH10K_FW_CRASH_DUMP_REGDUMP: Register crash dump in binary format
27f25b9f28SKalle Valo  */
28f25b9f28SKalle Valo enum ath10k_fw_crash_dump_type {
29f25b9f28SKalle Valo 	ATH10K_FW_CRASH_DUMP_REGISTERS = 0,
30f25b9f28SKalle Valo 	ATH10K_FW_CRASH_DUMP_CE_DATA = 1,
31f25b9f28SKalle Valo 
32703f261dSAlan Liu 	/* contains multiple struct ath10k_dump_ram_data_hdr */
33703f261dSAlan Liu 	ATH10K_FW_CRASH_DUMP_RAM_DATA = 2,
34703f261dSAlan Liu 
35f25b9f28SKalle Valo 	ATH10K_FW_CRASH_DUMP_MAX,
36f25b9f28SKalle Valo };
37f25b9f28SKalle Valo 
38f25b9f28SKalle Valo struct ath10k_tlv_dump_data {
39f25b9f28SKalle Valo 	/* see ath10k_fw_crash_dump_type above */
40f25b9f28SKalle Valo 	__le32 type;
41f25b9f28SKalle Valo 
42f25b9f28SKalle Valo 	/* in bytes */
43f25b9f28SKalle Valo 	__le32 tlv_len;
44f25b9f28SKalle Valo 
45f25b9f28SKalle Valo 	/* pad to 32-bit boundaries as needed */
46f25b9f28SKalle Valo 	u8 tlv_data[];
47f25b9f28SKalle Valo } __packed;
48f25b9f28SKalle Valo 
49f25b9f28SKalle Valo struct ath10k_dump_file_data {
50f25b9f28SKalle Valo 	/* dump file information */
51f25b9f28SKalle Valo 
52f25b9f28SKalle Valo 	/* "ATH10K-FW-DUMP" */
53f25b9f28SKalle Valo 	char df_magic[16];
54f25b9f28SKalle Valo 
55f25b9f28SKalle Valo 	__le32 len;
56f25b9f28SKalle Valo 
57f25b9f28SKalle Valo 	/* file dump version */
58f25b9f28SKalle Valo 	__le32 version;
59f25b9f28SKalle Valo 
60f25b9f28SKalle Valo 	/* some info we can get from ath10k struct that might help */
61f25b9f28SKalle Valo 
62f25b9f28SKalle Valo 	guid_t guid;
63f25b9f28SKalle Valo 
64f25b9f28SKalle Valo 	__le32 chip_id;
65f25b9f28SKalle Valo 
66f25b9f28SKalle Valo 	/* 0 for now, in place for later hardware */
67f25b9f28SKalle Valo 	__le32 bus_type;
68f25b9f28SKalle Valo 
69f25b9f28SKalle Valo 	__le32 target_version;
70f25b9f28SKalle Valo 	__le32 fw_version_major;
71f25b9f28SKalle Valo 	__le32 fw_version_minor;
72f25b9f28SKalle Valo 	__le32 fw_version_release;
73f25b9f28SKalle Valo 	__le32 fw_version_build;
74f25b9f28SKalle Valo 	__le32 phy_capability;
75f25b9f28SKalle Valo 	__le32 hw_min_tx_power;
76f25b9f28SKalle Valo 	__le32 hw_max_tx_power;
77f25b9f28SKalle Valo 	__le32 ht_cap_info;
78f25b9f28SKalle Valo 	__le32 vht_cap_info;
79f25b9f28SKalle Valo 	__le32 num_rf_chains;
80f25b9f28SKalle Valo 
81f25b9f28SKalle Valo 	/* firmware version string */
82f25b9f28SKalle Valo 	char fw_ver[ETHTOOL_FWVERS_LEN];
83f25b9f28SKalle Valo 
84f25b9f28SKalle Valo 	/* Kernel related information */
85f25b9f28SKalle Valo 
86f25b9f28SKalle Valo 	/* time-of-day stamp */
87f25b9f28SKalle Valo 	__le64 tv_sec;
88f25b9f28SKalle Valo 
89f25b9f28SKalle Valo 	/* time-of-day stamp, nano-seconds */
90f25b9f28SKalle Valo 	__le64 tv_nsec;
91f25b9f28SKalle Valo 
92f25b9f28SKalle Valo 	/* LINUX_VERSION_CODE */
93f25b9f28SKalle Valo 	__le32 kernel_ver_code;
94f25b9f28SKalle Valo 
95f25b9f28SKalle Valo 	/* VERMAGIC_STRING */
96f25b9f28SKalle Valo 	char kernel_ver[64];
97f25b9f28SKalle Valo 
98f25b9f28SKalle Valo 	/* room for growth w/out changing binary format */
99f25b9f28SKalle Valo 	u8 unused[128];
100f25b9f28SKalle Valo 
101f25b9f28SKalle Valo 	/* struct ath10k_tlv_dump_data + more */
102f25b9f28SKalle Valo 	u8 data[0];
103f25b9f28SKalle Valo } __packed;
104f25b9f28SKalle Valo 
105703f261dSAlan Liu struct ath10k_dump_ram_data_hdr {
106703f261dSAlan Liu 	/* enum ath10k_mem_region_type */
107703f261dSAlan Liu 	__le32 region_type;
108703f261dSAlan Liu 
109703f261dSAlan Liu 	__le32 start;
110703f261dSAlan Liu 
111703f261dSAlan Liu 	/* length of payload data, not including this header */
112703f261dSAlan Liu 	__le32 length;
113703f261dSAlan Liu 
114703f261dSAlan Liu 	u8 data[0];
115703f261dSAlan Liu };
116703f261dSAlan Liu 
117703f261dSAlan Liu /* magic number to fill the holes not copied due to sections in regions */
118703f261dSAlan Liu #define ATH10K_MAGIC_NOT_COPIED		0xAA
119703f261dSAlan Liu 
120703f261dSAlan Liu /* part of user space ABI */
121703f261dSAlan Liu enum ath10k_mem_region_type {
122703f261dSAlan Liu 	ATH10K_MEM_REGION_TYPE_REG	= 1,
123703f261dSAlan Liu 	ATH10K_MEM_REGION_TYPE_DRAM	= 2,
124703f261dSAlan Liu 	ATH10K_MEM_REGION_TYPE_AXI	= 3,
125703f261dSAlan Liu 	ATH10K_MEM_REGION_TYPE_IRAM1	= 4,
126703f261dSAlan Liu 	ATH10K_MEM_REGION_TYPE_IRAM2	= 5,
127219cc084SAnilkumar Kolli 	ATH10K_MEM_REGION_TYPE_IOSRAM	= 6,
128219cc084SAnilkumar Kolli 	ATH10K_MEM_REGION_TYPE_IOREG	= 7,
129703f261dSAlan Liu };
130703f261dSAlan Liu 
131703f261dSAlan Liu /* Define a section of the region which should be copied. As not all parts
132703f261dSAlan Liu  * of the memory is possible to copy, for example some of the registers can
133703f261dSAlan Liu  * be like that, sections can be used to define what is safe to copy.
134703f261dSAlan Liu  *
135703f261dSAlan Liu  * To minimize the size of the array, the list must obey the format:
136703f261dSAlan Liu  * '{start0,stop0},{start1,stop1},{start2,stop2}....' The values below must
137703f261dSAlan Liu  * also obey to 'start0 < stop0 < start1 < stop1 < start2 < ...', otherwise
138703f261dSAlan Liu  * we may encouter error in the dump processing.
139703f261dSAlan Liu  */
140703f261dSAlan Liu struct ath10k_mem_section {
141703f261dSAlan Liu 	u32 start;
142703f261dSAlan Liu 	u32 end;
143703f261dSAlan Liu };
144703f261dSAlan Liu 
145703f261dSAlan Liu /* One region of a memory layout. If the sections field is null entire
146703f261dSAlan Liu  * region is copied. If sections is non-null only the areas specified in
147703f261dSAlan Liu  * sections are copied and rest of the areas are filled with
148703f261dSAlan Liu  * ATH10K_MAGIC_NOT_COPIED.
149703f261dSAlan Liu  */
150703f261dSAlan Liu struct ath10k_mem_region {
151703f261dSAlan Liu 	enum ath10k_mem_region_type type;
152703f261dSAlan Liu 	u32 start;
153703f261dSAlan Liu 	u32 len;
154703f261dSAlan Liu 
155703f261dSAlan Liu 	const char *name;
156703f261dSAlan Liu 
157703f261dSAlan Liu 	struct {
158703f261dSAlan Liu 		const struct ath10k_mem_section *sections;
159703f261dSAlan Liu 		u32 size;
160703f261dSAlan Liu 	} section_table;
161703f261dSAlan Liu };
162703f261dSAlan Liu 
163703f261dSAlan Liu /* Contains the memory layout of a hardware version identified with the
164703f261dSAlan Liu  * hardware id, split into regions.
165703f261dSAlan Liu  */
166703f261dSAlan Liu struct ath10k_hw_mem_layout {
167703f261dSAlan Liu 	u32 hw_id;
168703f261dSAlan Liu 
169703f261dSAlan Liu 	struct {
170703f261dSAlan Liu 		const struct ath10k_mem_region *regions;
171703f261dSAlan Liu 		int size;
172703f261dSAlan Liu 	} region_table;
173703f261dSAlan Liu };
174703f261dSAlan Liu 
175703f261dSAlan Liu /* FIXME: where to put this? */
176703f261dSAlan Liu extern unsigned long ath10k_coredump_mask;
177703f261dSAlan Liu 
178f25b9f28SKalle Valo #ifdef CONFIG_DEV_COREDUMP
179f25b9f28SKalle Valo 
180f25b9f28SKalle Valo int ath10k_coredump_submit(struct ath10k *ar);
181f25b9f28SKalle Valo struct ath10k_fw_crash_data *ath10k_coredump_new(struct ath10k *ar);
182e2fcf60cSKalle Valo int ath10k_coredump_create(struct ath10k *ar);
183703f261dSAlan Liu int ath10k_coredump_register(struct ath10k *ar);
184703f261dSAlan Liu void ath10k_coredump_unregister(struct ath10k *ar);
185e2fcf60cSKalle Valo void ath10k_coredump_destroy(struct ath10k *ar);
186f25b9f28SKalle Valo 
187703f261dSAlan Liu const struct ath10k_hw_mem_layout *ath10k_coredump_get_mem_layout(struct ath10k *ar);
188703f261dSAlan Liu 
189f25b9f28SKalle Valo #else /* CONFIG_DEV_COREDUMP */
190f25b9f28SKalle Valo 
191f25b9f28SKalle Valo static inline int ath10k_coredump_submit(struct ath10k *ar)
192f25b9f28SKalle Valo {
193f25b9f28SKalle Valo 	return 0;
194f25b9f28SKalle Valo }
195f25b9f28SKalle Valo 
196f25b9f28SKalle Valo static inline struct ath10k_fw_crash_data *ath10k_coredump_new(struct ath10k *ar)
197f25b9f28SKalle Valo {
198f25b9f28SKalle Valo 	return NULL;
199f25b9f28SKalle Valo }
200f25b9f28SKalle Valo 
201e2fcf60cSKalle Valo static inline int ath10k_coredump_create(struct ath10k *ar)
202e2fcf60cSKalle Valo {
203e2fcf60cSKalle Valo 	return 0;
204e2fcf60cSKalle Valo }
205e2fcf60cSKalle Valo 
206703f261dSAlan Liu static inline int ath10k_coredump_register(struct ath10k *ar)
207703f261dSAlan Liu {
208703f261dSAlan Liu 	return 0;
209703f261dSAlan Liu }
210703f261dSAlan Liu 
211703f261dSAlan Liu static inline void ath10k_coredump_unregister(struct ath10k *ar)
212703f261dSAlan Liu {
213703f261dSAlan Liu }
214703f261dSAlan Liu 
215e2fcf60cSKalle Valo static inline void ath10k_coredump_destroy(struct ath10k *ar)
216e2fcf60cSKalle Valo {
217e2fcf60cSKalle Valo }
218e2fcf60cSKalle Valo 
219703f261dSAlan Liu static inline const struct ath10k_hw_mem_layout *
220703f261dSAlan Liu ath10k_coredump_get_mem_layout(struct ath10k *ar)
221703f261dSAlan Liu {
222703f261dSAlan Liu 	return NULL;
223703f261dSAlan Liu }
224703f261dSAlan Liu 
225f25b9f28SKalle Valo #endif /* CONFIG_DEV_COREDUMP */
226f25b9f28SKalle Valo 
227f25b9f28SKalle Valo #endif /* _COREDUMP_H_ */
228