1// SPDX-License-Identifier: ISC
2/*
3 * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
4 * Copyright (c) 2018, The Linux Foundation. All rights reserved.
5 * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
6 */
7
8#include "coredump.h"
9
10#include <linux/devcoredump.h>
11#include <linux/kernel.h>
12#include <linux/types.h>
13#include <linux/utsname.h>
14
15#include "debug.h"
16#include "hw.h"
17
18static const struct ath10k_mem_section qca6174_hw21_register_sections[] = {
19	{0x800, 0x810},
20	{0x820, 0x82C},
21	{0x830, 0x8F4},
22	{0x90C, 0x91C},
23	{0xA14, 0xA18},
24	{0xA84, 0xA94},
25	{0xAA8, 0xAD4},
26	{0xADC, 0xB40},
27	{0x1000, 0x10A4},
28	{0x10BC, 0x111C},
29	{0x1134, 0x1138},
30	{0x1144, 0x114C},
31	{0x1150, 0x115C},
32	{0x1160, 0x1178},
33	{0x1240, 0x1260},
34	{0x2000, 0x207C},
35	{0x3000, 0x3014},
36	{0x4000, 0x4014},
37	{0x5000, 0x5124},
38	{0x6000, 0x6040},
39	{0x6080, 0x60CC},
40	{0x6100, 0x611C},
41	{0x6140, 0x61D8},
42	{0x6200, 0x6238},
43	{0x6240, 0x628C},
44	{0x62C0, 0x62EC},
45	{0x6380, 0x63E8},
46	{0x6400, 0x6440},
47	{0x6480, 0x64CC},
48	{0x6500, 0x651C},
49	{0x6540, 0x6580},
50	{0x6600, 0x6638},
51	{0x6640, 0x668C},
52	{0x66C0, 0x66EC},
53	{0x6780, 0x67E8},
54	{0x7080, 0x708C},
55	{0x70C0, 0x70C8},
56	{0x7400, 0x741C},
57	{0x7440, 0x7454},
58	{0x7800, 0x7818},
59	{0x8000, 0x8004},
60	{0x8010, 0x8064},
61	{0x8080, 0x8084},
62	{0x80A0, 0x80A4},
63	{0x80C0, 0x80C4},
64	{0x80E0, 0x80F4},
65	{0x8100, 0x8104},
66	{0x8110, 0x812C},
67	{0x9000, 0x9004},
68	{0x9800, 0x982C},
69	{0x9830, 0x9838},
70	{0x9840, 0x986C},
71	{0x9870, 0x9898},
72	{0x9A00, 0x9C00},
73	{0xD580, 0xD59C},
74	{0xF000, 0xF0E0},
75	{0xF140, 0xF190},
76	{0xF250, 0xF25C},
77	{0xF260, 0xF268},
78	{0xF26C, 0xF2A8},
79	{0x10008, 0x1000C},
80	{0x10014, 0x10018},
81	{0x1001C, 0x10020},
82	{0x10024, 0x10028},
83	{0x10030, 0x10034},
84	{0x10040, 0x10054},
85	{0x10058, 0x1007C},
86	{0x10080, 0x100C4},
87	{0x100C8, 0x10114},
88	{0x1012C, 0x10130},
89	{0x10138, 0x10144},
90	{0x10200, 0x10220},
91	{0x10230, 0x10250},
92	{0x10260, 0x10280},
93	{0x10290, 0x102B0},
94	{0x102C0, 0x102DC},
95	{0x102E0, 0x102F4},
96	{0x102FC, 0x1037C},
97	{0x10380, 0x10390},
98	{0x10800, 0x10828},
99	{0x10840, 0x10844},
100	{0x10880, 0x10884},
101	{0x108C0, 0x108E8},
102	{0x10900, 0x10928},
103	{0x10940, 0x10944},
104	{0x10980, 0x10984},
105	{0x109C0, 0x109E8},
106	{0x10A00, 0x10A28},
107	{0x10A40, 0x10A50},
108	{0x11000, 0x11028},
109	{0x11030, 0x11034},
110	{0x11038, 0x11068},
111	{0x11070, 0x11074},
112	{0x11078, 0x110A8},
113	{0x110B0, 0x110B4},
114	{0x110B8, 0x110E8},
115	{0x110F0, 0x110F4},
116	{0x110F8, 0x11128},
117	{0x11138, 0x11144},
118	{0x11178, 0x11180},
119	{0x111B8, 0x111C0},
120	{0x111F8, 0x11200},
121	{0x11238, 0x1123C},
122	{0x11270, 0x11274},
123	{0x11278, 0x1127C},
124	{0x112B0, 0x112B4},
125	{0x112B8, 0x112BC},
126	{0x112F0, 0x112F4},
127	{0x112F8, 0x112FC},
128	{0x11338, 0x1133C},
129	{0x11378, 0x1137C},
130	{0x113B8, 0x113BC},
131	{0x113F8, 0x113FC},
132	{0x11438, 0x11440},
133	{0x11478, 0x11480},
134	{0x114B8, 0x114BC},
135	{0x114F8, 0x114FC},
136	{0x11538, 0x1153C},
137	{0x11578, 0x1157C},
138	{0x115B8, 0x115BC},
139	{0x115F8, 0x115FC},
140	{0x11638, 0x1163C},
141	{0x11678, 0x1167C},
142	{0x116B8, 0x116BC},
143	{0x116F8, 0x116FC},
144	{0x11738, 0x1173C},
145	{0x11778, 0x1177C},
146	{0x117B8, 0x117BC},
147	{0x117F8, 0x117FC},
148	{0x17000, 0x1701C},
149	{0x17020, 0x170AC},
150	{0x18000, 0x18050},
151	{0x18054, 0x18074},
152	{0x18080, 0x180D4},
153	{0x180DC, 0x18104},
154	{0x18108, 0x1813C},
155	{0x18144, 0x18148},
156	{0x18168, 0x18174},
157	{0x18178, 0x18180},
158	{0x181C8, 0x181E0},
159	{0x181E4, 0x181E8},
160	{0x181EC, 0x1820C},
161	{0x1825C, 0x18280},
162	{0x18284, 0x18290},
163	{0x18294, 0x182A0},
164	{0x18300, 0x18304},
165	{0x18314, 0x18320},
166	{0x18328, 0x18350},
167	{0x1835C, 0x1836C},
168	{0x18370, 0x18390},
169	{0x18398, 0x183AC},
170	{0x183BC, 0x183D8},
171	{0x183DC, 0x183F4},
172	{0x18400, 0x186F4},
173	{0x186F8, 0x1871C},
174	{0x18720, 0x18790},
175	{0x19800, 0x19830},
176	{0x19834, 0x19840},
177	{0x19880, 0x1989C},
178	{0x198A4, 0x198B0},
179	{0x198BC, 0x19900},
180	{0x19C00, 0x19C88},
181	{0x19D00, 0x19D20},
182	{0x19E00, 0x19E7C},
183	{0x19E80, 0x19E94},
184	{0x19E98, 0x19EAC},
185	{0x19EB0, 0x19EBC},
186	{0x19F70, 0x19F74},
187	{0x19F80, 0x19F8C},
188	{0x19FA0, 0x19FB4},
189	{0x19FC0, 0x19FD8},
190	{0x1A000, 0x1A200},
191	{0x1A204, 0x1A210},
192	{0x1A228, 0x1A22C},
193	{0x1A230, 0x1A248},
194	{0x1A250, 0x1A270},
195	{0x1A280, 0x1A290},
196	{0x1A2A0, 0x1A2A4},
197	{0x1A2C0, 0x1A2EC},
198	{0x1A300, 0x1A3BC},
199	{0x1A3F0, 0x1A3F4},
200	{0x1A3F8, 0x1A434},
201	{0x1A438, 0x1A444},
202	{0x1A448, 0x1A468},
203	{0x1A580, 0x1A58C},
204	{0x1A644, 0x1A654},
205	{0x1A670, 0x1A698},
206	{0x1A6AC, 0x1A6B0},
207	{0x1A6D0, 0x1A6D4},
208	{0x1A6EC, 0x1A70C},
209	{0x1A710, 0x1A738},
210	{0x1A7C0, 0x1A7D0},
211	{0x1A7D4, 0x1A7D8},
212	{0x1A7DC, 0x1A7E4},
213	{0x1A7F0, 0x1A7F8},
214	{0x1A888, 0x1A89C},
215	{0x1A8A8, 0x1A8AC},
216	{0x1A8C0, 0x1A8DC},
217	{0x1A8F0, 0x1A8FC},
218	{0x1AE04, 0x1AE08},
219	{0x1AE18, 0x1AE24},
220	{0x1AF80, 0x1AF8C},
221	{0x1AFA0, 0x1AFB4},
222	{0x1B000, 0x1B200},
223	{0x1B284, 0x1B288},
224	{0x1B2D0, 0x1B2D8},
225	{0x1B2DC, 0x1B2EC},
226	{0x1B300, 0x1B340},
227	{0x1B374, 0x1B378},
228	{0x1B380, 0x1B384},
229	{0x1B388, 0x1B38C},
230	{0x1B404, 0x1B408},
231	{0x1B420, 0x1B428},
232	{0x1B440, 0x1B444},
233	{0x1B448, 0x1B44C},
234	{0x1B450, 0x1B458},
235	{0x1B45C, 0x1B468},
236	{0x1B584, 0x1B58C},
237	{0x1B68C, 0x1B690},
238	{0x1B6AC, 0x1B6B0},
239	{0x1B7F0, 0x1B7F8},
240	{0x1C800, 0x1CC00},
241	{0x1CE00, 0x1CE04},
242	{0x1CF80, 0x1CF84},
243	{0x1D200, 0x1D800},
244	{0x1E000, 0x20014},
245	{0x20100, 0x20124},
246	{0x21400, 0x217A8},
247	{0x21800, 0x21BA8},
248	{0x21C00, 0x21FA8},
249	{0x22000, 0x223A8},
250	{0x22400, 0x227A8},
251	{0x22800, 0x22BA8},
252	{0x22C00, 0x22FA8},
253	{0x23000, 0x233A8},
254	{0x24000, 0x24034},
255	{0x26000, 0x26064},
256	{0x27000, 0x27024},
257	{0x34000, 0x3400C},
258	{0x34400, 0x3445C},
259	{0x34800, 0x3485C},
260	{0x34C00, 0x34C5C},
261	{0x35000, 0x3505C},
262	{0x35400, 0x3545C},
263	{0x35800, 0x3585C},
264	{0x35C00, 0x35C5C},
265	{0x36000, 0x3605C},
266	{0x38000, 0x38064},
267	{0x38070, 0x380E0},
268	{0x3A000, 0x3A064},
269	{0x40000, 0x400A4},
270	{0x80000, 0x8000C},
271	{0x80010, 0x80020},
272};
273
274static const struct ath10k_mem_section qca6174_hw30_sdio_register_sections[] = {
275	{0x800, 0x810},
276	{0x820, 0x82C},
277	{0x830, 0x8F4},
278	{0x90C, 0x91C},
279	{0xA14, 0xA18},
280	{0xA84, 0xA94},
281	{0xAA8, 0xAD4},
282	{0xADC, 0xB40},
283	{0x1000, 0x10A4},
284	{0x10BC, 0x111C},
285	{0x1134, 0x1138},
286	{0x1144, 0x114C},
287	{0x1150, 0x115C},
288	{0x1160, 0x1178},
289	{0x1240, 0x1260},
290	{0x2000, 0x207C},
291	{0x3000, 0x3014},
292	{0x4000, 0x4014},
293	{0x5000, 0x5124},
294	{0x6000, 0x6040},
295	{0x6080, 0x60CC},
296	{0x6100, 0x611C},
297	{0x6140, 0x61D8},
298	{0x6200, 0x6238},
299	{0x6240, 0x628C},
300	{0x62C0, 0x62EC},
301	{0x6380, 0x63E8},
302	{0x6400, 0x6440},
303	{0x6480, 0x64CC},
304	{0x6500, 0x651C},
305	{0x6540, 0x6580},
306	{0x6600, 0x6638},
307	{0x6640, 0x668C},
308	{0x66C0, 0x66EC},
309	{0x6780, 0x67E8},
310	{0x7080, 0x708C},
311	{0x70C0, 0x70C8},
312	{0x7400, 0x741C},
313	{0x7440, 0x7454},
314	{0x7800, 0x7818},
315	{0x8010, 0x8060},
316	{0x8080, 0x8084},
317	{0x80A0, 0x80A4},
318	{0x80C0, 0x80C4},
319	{0x80E0, 0x80ec},
320	{0x8110, 0x8128},
321	{0x9000, 0x9004},
322	{0xF000, 0xF0E0},
323	{0xF140, 0xF190},
324	{0xF250, 0xF25C},
325	{0xF260, 0xF268},
326	{0xF26C, 0xF2A8},
327	{0x10008, 0x1000C},
328	{0x10014, 0x10018},
329	{0x1001C, 0x10020},
330	{0x10024, 0x10028},
331	{0x10030, 0x10034},
332	{0x10040, 0x10054},
333	{0x10058, 0x1007C},
334	{0x10080, 0x100C4},
335	{0x100C8, 0x10114},
336	{0x1012C, 0x10130},
337	{0x10138, 0x10144},
338	{0x10200, 0x10220},
339	{0x10230, 0x10250},
340	{0x10260, 0x10280},
341	{0x10290, 0x102B0},
342	{0x102C0, 0x102DC},
343	{0x102E0, 0x102F4},
344	{0x102FC, 0x1037C},
345	{0x10380, 0x10390},
346	{0x10800, 0x10828},
347	{0x10840, 0x10844},
348	{0x10880, 0x10884},
349	{0x108C0, 0x108E8},
350	{0x10900, 0x10928},
351	{0x10940, 0x10944},
352	{0x10980, 0x10984},
353	{0x109C0, 0x109E8},
354	{0x10A00, 0x10A28},
355	{0x10A40, 0x10A50},
356	{0x11000, 0x11028},
357	{0x11030, 0x11034},
358	{0x11038, 0x11068},
359	{0x11070, 0x11074},
360	{0x11078, 0x110A8},
361	{0x110B0, 0x110B4},
362	{0x110B8, 0x110E8},
363	{0x110F0, 0x110F4},
364	{0x110F8, 0x11128},
365	{0x11138, 0x11144},
366	{0x11178, 0x11180},
367	{0x111B8, 0x111C0},
368	{0x111F8, 0x11200},
369	{0x11238, 0x1123C},
370	{0x11270, 0x11274},
371	{0x11278, 0x1127C},
372	{0x112B0, 0x112B4},
373	{0x112B8, 0x112BC},
374	{0x112F0, 0x112F4},
375	{0x112F8, 0x112FC},
376	{0x11338, 0x1133C},
377	{0x11378, 0x1137C},
378	{0x113B8, 0x113BC},
379	{0x113F8, 0x113FC},
380	{0x11438, 0x11440},
381	{0x11478, 0x11480},
382	{0x114B8, 0x114BC},
383	{0x114F8, 0x114FC},
384	{0x11538, 0x1153C},
385	{0x11578, 0x1157C},
386	{0x115B8, 0x115BC},
387	{0x115F8, 0x115FC},
388	{0x11638, 0x1163C},
389	{0x11678, 0x1167C},
390	{0x116B8, 0x116BC},
391	{0x116F8, 0x116FC},
392	{0x11738, 0x1173C},
393	{0x11778, 0x1177C},
394	{0x117B8, 0x117BC},
395	{0x117F8, 0x117FC},
396	{0x17000, 0x1701C},
397	{0x17020, 0x170AC},
398	{0x18000, 0x18050},
399	{0x18054, 0x18074},
400	{0x18080, 0x180D4},
401	{0x180DC, 0x18104},
402	{0x18108, 0x1813C},
403	{0x18144, 0x18148},
404	{0x18168, 0x18174},
405	{0x18178, 0x18180},
406	{0x181C8, 0x181E0},
407	{0x181E4, 0x181E8},
408	{0x181EC, 0x1820C},
409	{0x1825C, 0x18280},
410	{0x18284, 0x18290},
411	{0x18294, 0x182A0},
412	{0x18300, 0x18304},
413	{0x18314, 0x18320},
414	{0x18328, 0x18350},
415	{0x1835C, 0x1836C},
416	{0x18370, 0x18390},
417	{0x18398, 0x183AC},
418	{0x183BC, 0x183D8},
419	{0x183DC, 0x183F4},
420	{0x18400, 0x186F4},
421	{0x186F8, 0x1871C},
422	{0x18720, 0x18790},
423	{0x19800, 0x19830},
424	{0x19834, 0x19840},
425	{0x19880, 0x1989C},
426	{0x198A4, 0x198B0},
427	{0x198BC, 0x19900},
428	{0x19C00, 0x19C88},
429	{0x19D00, 0x19D20},
430	{0x19E00, 0x19E7C},
431	{0x19E80, 0x19E94},
432	{0x19E98, 0x19EAC},
433	{0x19EB0, 0x19EBC},
434	{0x19F70, 0x19F74},
435	{0x19F80, 0x19F8C},
436	{0x19FA0, 0x19FB4},
437	{0x19FC0, 0x19FD8},
438	{0x1A000, 0x1A200},
439	{0x1A204, 0x1A210},
440	{0x1A228, 0x1A22C},
441	{0x1A230, 0x1A248},
442	{0x1A250, 0x1A270},
443	{0x1A280, 0x1A290},
444	{0x1A2A0, 0x1A2A4},
445	{0x1A2C0, 0x1A2EC},
446	{0x1A300, 0x1A3BC},
447	{0x1A3F0, 0x1A3F4},
448	{0x1A3F8, 0x1A434},
449	{0x1A438, 0x1A444},
450	{0x1A448, 0x1A468},
451	{0x1A580, 0x1A58C},
452	{0x1A644, 0x1A654},
453	{0x1A670, 0x1A698},
454	{0x1A6AC, 0x1A6B0},
455	{0x1A6D0, 0x1A6D4},
456	{0x1A6EC, 0x1A70C},
457	{0x1A710, 0x1A738},
458	{0x1A7C0, 0x1A7D0},
459	{0x1A7D4, 0x1A7D8},
460	{0x1A7DC, 0x1A7E4},
461	{0x1A7F0, 0x1A7F8},
462	{0x1A888, 0x1A89C},
463	{0x1A8A8, 0x1A8AC},
464	{0x1A8C0, 0x1A8DC},
465	{0x1A8F0, 0x1A8FC},
466	{0x1AE04, 0x1AE08},
467	{0x1AE18, 0x1AE24},
468	{0x1AF80, 0x1AF8C},
469	{0x1AFA0, 0x1AFB4},
470	{0x1B000, 0x1B200},
471	{0x1B284, 0x1B288},
472	{0x1B2D0, 0x1B2D8},
473	{0x1B2DC, 0x1B2EC},
474	{0x1B300, 0x1B340},
475	{0x1B374, 0x1B378},
476	{0x1B380, 0x1B384},
477	{0x1B388, 0x1B38C},
478	{0x1B404, 0x1B408},
479	{0x1B420, 0x1B428},
480	{0x1B440, 0x1B444},
481	{0x1B448, 0x1B44C},
482	{0x1B450, 0x1B458},
483	{0x1B45C, 0x1B468},
484	{0x1B584, 0x1B58C},
485	{0x1B68C, 0x1B690},
486	{0x1B6AC, 0x1B6B0},
487	{0x1B7F0, 0x1B7F8},
488	{0x1C800, 0x1CC00},
489	{0x1CE00, 0x1CE04},
490	{0x1CF80, 0x1CF84},
491	{0x1D200, 0x1D800},
492	{0x1E000, 0x20014},
493	{0x20100, 0x20124},
494	{0x21400, 0x217A8},
495	{0x21800, 0x21BA8},
496	{0x21C00, 0x21FA8},
497	{0x22000, 0x223A8},
498	{0x22400, 0x227A8},
499	{0x22800, 0x22BA8},
500	{0x22C00, 0x22FA8},
501	{0x23000, 0x233A8},
502	{0x24000, 0x24034},
503
504	/* EFUSE0,1,2 is disabled here
505	 * because its state may be reset
506	 *
507	 * {0x24800, 0x24804},
508	 * {0x25000, 0x25004},
509	 * {0x25800, 0x25804},
510	 */
511
512	{0x26000, 0x26064},
513	{0x27000, 0x27024},
514	{0x34000, 0x3400C},
515	{0x34400, 0x3445C},
516	{0x34800, 0x3485C},
517	{0x34C00, 0x34C5C},
518	{0x35000, 0x3505C},
519	{0x35400, 0x3545C},
520	{0x35800, 0x3585C},
521	{0x35C00, 0x35C5C},
522	{0x36000, 0x3605C},
523	{0x38000, 0x38064},
524	{0x38070, 0x380E0},
525	{0x3A000, 0x3A074},
526
527	/* DBI windows is skipped here, it can be only accessed when pcie
528	 * is active (not in reset) and CORE_CTRL_PCIE_LTSSM_EN = 0 &&
529	 * PCIE_CTRL_APP_LTSSM_ENALBE=0.
530	 * {0x3C000 , 0x3C004},
531	 */
532
533	{0x40000, 0x400A4},
534
535	/* SI register is skipped here.
536	 * Because it will cause bus hang
537	 *
538	 * {0x50000, 0x50018},
539	 */
540
541	{0x80000, 0x8000C},
542	{0x80010, 0x80020},
543};
544
545static const struct ath10k_mem_section qca6174_hw30_register_sections[] = {
546	{0x800, 0x810},
547	{0x820, 0x82C},
548	{0x830, 0x8F4},
549	{0x90C, 0x91C},
550	{0xA14, 0xA18},
551	{0xA84, 0xA94},
552	{0xAA8, 0xAD4},
553	{0xADC, 0xB40},
554	{0x1000, 0x10A4},
555	{0x10BC, 0x111C},
556	{0x1134, 0x1138},
557	{0x1144, 0x114C},
558	{0x1150, 0x115C},
559	{0x1160, 0x1178},
560	{0x1240, 0x1260},
561	{0x2000, 0x207C},
562	{0x3000, 0x3014},
563	{0x4000, 0x4014},
564	{0x5000, 0x5124},
565	{0x6000, 0x6040},
566	{0x6080, 0x60CC},
567	{0x6100, 0x611C},
568	{0x6140, 0x61D8},
569	{0x6200, 0x6238},
570	{0x6240, 0x628C},
571	{0x62C0, 0x62EC},
572	{0x6380, 0x63E8},
573	{0x6400, 0x6440},
574	{0x6480, 0x64CC},
575	{0x6500, 0x651C},
576	{0x6540, 0x6580},
577	{0x6600, 0x6638},
578	{0x6640, 0x668C},
579	{0x66C0, 0x66EC},
580	{0x6780, 0x67E8},
581	{0x7080, 0x708C},
582	{0x70C0, 0x70C8},
583	{0x7400, 0x741C},
584	{0x7440, 0x7454},
585	{0x7800, 0x7818},
586	{0x8000, 0x8004},
587	{0x8010, 0x8064},
588	{0x8080, 0x8084},
589	{0x80A0, 0x80A4},
590	{0x80C0, 0x80C4},
591	{0x80E0, 0x80F4},
592	{0x8100, 0x8104},
593	{0x8110, 0x812C},
594	{0x9000, 0x9004},
595	{0x9800, 0x982C},
596	{0x9830, 0x9838},
597	{0x9840, 0x986C},
598	{0x9870, 0x9898},
599	{0x9A00, 0x9C00},
600	{0xD580, 0xD59C},
601	{0xF000, 0xF0E0},
602	{0xF140, 0xF190},
603	{0xF250, 0xF25C},
604	{0xF260, 0xF268},
605	{0xF26C, 0xF2A8},
606	{0x10008, 0x1000C},
607	{0x10014, 0x10018},
608	{0x1001C, 0x10020},
609	{0x10024, 0x10028},
610	{0x10030, 0x10034},
611	{0x10040, 0x10054},
612	{0x10058, 0x1007C},
613	{0x10080, 0x100C4},
614	{0x100C8, 0x10114},
615	{0x1012C, 0x10130},
616	{0x10138, 0x10144},
617	{0x10200, 0x10220},
618	{0x10230, 0x10250},
619	{0x10260, 0x10280},
620	{0x10290, 0x102B0},
621	{0x102C0, 0x102DC},
622	{0x102E0, 0x102F4},
623	{0x102FC, 0x1037C},
624	{0x10380, 0x10390},
625	{0x10800, 0x10828},
626	{0x10840, 0x10844},
627	{0x10880, 0x10884},
628	{0x108C0, 0x108E8},
629	{0x10900, 0x10928},
630	{0x10940, 0x10944},
631	{0x10980, 0x10984},
632	{0x109C0, 0x109E8},
633	{0x10A00, 0x10A28},
634	{0x10A40, 0x10A50},
635	{0x11000, 0x11028},
636	{0x11030, 0x11034},
637	{0x11038, 0x11068},
638	{0x11070, 0x11074},
639	{0x11078, 0x110A8},
640	{0x110B0, 0x110B4},
641	{0x110B8, 0x110E8},
642	{0x110F0, 0x110F4},
643	{0x110F8, 0x11128},
644	{0x11138, 0x11144},
645	{0x11178, 0x11180},
646	{0x111B8, 0x111C0},
647	{0x111F8, 0x11200},
648	{0x11238, 0x1123C},
649	{0x11270, 0x11274},
650	{0x11278, 0x1127C},
651	{0x112B0, 0x112B4},
652	{0x112B8, 0x112BC},
653	{0x112F0, 0x112F4},
654	{0x112F8, 0x112FC},
655	{0x11338, 0x1133C},
656	{0x11378, 0x1137C},
657	{0x113B8, 0x113BC},
658	{0x113F8, 0x113FC},
659	{0x11438, 0x11440},
660	{0x11478, 0x11480},
661	{0x114B8, 0x114BC},
662	{0x114F8, 0x114FC},
663	{0x11538, 0x1153C},
664	{0x11578, 0x1157C},
665	{0x115B8, 0x115BC},
666	{0x115F8, 0x115FC},
667	{0x11638, 0x1163C},
668	{0x11678, 0x1167C},
669	{0x116B8, 0x116BC},
670	{0x116F8, 0x116FC},
671	{0x11738, 0x1173C},
672	{0x11778, 0x1177C},
673	{0x117B8, 0x117BC},
674	{0x117F8, 0x117FC},
675	{0x17000, 0x1701C},
676	{0x17020, 0x170AC},
677	{0x18000, 0x18050},
678	{0x18054, 0x18074},
679	{0x18080, 0x180D4},
680	{0x180DC, 0x18104},
681	{0x18108, 0x1813C},
682	{0x18144, 0x18148},
683	{0x18168, 0x18174},
684	{0x18178, 0x18180},
685	{0x181C8, 0x181E0},
686	{0x181E4, 0x181E8},
687	{0x181EC, 0x1820C},
688	{0x1825C, 0x18280},
689	{0x18284, 0x18290},
690	{0x18294, 0x182A0},
691	{0x18300, 0x18304},
692	{0x18314, 0x18320},
693	{0x18328, 0x18350},
694	{0x1835C, 0x1836C},
695	{0x18370, 0x18390},
696	{0x18398, 0x183AC},
697	{0x183BC, 0x183D8},
698	{0x183DC, 0x183F4},
699	{0x18400, 0x186F4},
700	{0x186F8, 0x1871C},
701	{0x18720, 0x18790},
702	{0x19800, 0x19830},
703	{0x19834, 0x19840},
704	{0x19880, 0x1989C},
705	{0x198A4, 0x198B0},
706	{0x198BC, 0x19900},
707	{0x19C00, 0x19C88},
708	{0x19D00, 0x19D20},
709	{0x19E00, 0x19E7C},
710	{0x19E80, 0x19E94},
711	{0x19E98, 0x19EAC},
712	{0x19EB0, 0x19EBC},
713	{0x19F70, 0x19F74},
714	{0x19F80, 0x19F8C},
715	{0x19FA0, 0x19FB4},
716	{0x19FC0, 0x19FD8},
717	{0x1A000, 0x1A200},
718	{0x1A204, 0x1A210},
719	{0x1A228, 0x1A22C},
720	{0x1A230, 0x1A248},
721	{0x1A250, 0x1A270},
722	{0x1A280, 0x1A290},
723	{0x1A2A0, 0x1A2A4},
724	{0x1A2C0, 0x1A2EC},
725	{0x1A300, 0x1A3BC},
726	{0x1A3F0, 0x1A3F4},
727	{0x1A3F8, 0x1A434},
728	{0x1A438, 0x1A444},
729	{0x1A448, 0x1A468},
730	{0x1A580, 0x1A58C},
731	{0x1A644, 0x1A654},
732	{0x1A670, 0x1A698},
733	{0x1A6AC, 0x1A6B0},
734	{0x1A6D0, 0x1A6D4},
735	{0x1A6EC, 0x1A70C},
736	{0x1A710, 0x1A738},
737	{0x1A7C0, 0x1A7D0},
738	{0x1A7D4, 0x1A7D8},
739	{0x1A7DC, 0x1A7E4},
740	{0x1A7F0, 0x1A7F8},
741	{0x1A888, 0x1A89C},
742	{0x1A8A8, 0x1A8AC},
743	{0x1A8C0, 0x1A8DC},
744	{0x1A8F0, 0x1A8FC},
745	{0x1AE04, 0x1AE08},
746	{0x1AE18, 0x1AE24},
747	{0x1AF80, 0x1AF8C},
748	{0x1AFA0, 0x1AFB4},
749	{0x1B000, 0x1B200},
750	{0x1B284, 0x1B288},
751	{0x1B2D0, 0x1B2D8},
752	{0x1B2DC, 0x1B2EC},
753	{0x1B300, 0x1B340},
754	{0x1B374, 0x1B378},
755	{0x1B380, 0x1B384},
756	{0x1B388, 0x1B38C},
757	{0x1B404, 0x1B408},
758	{0x1B420, 0x1B428},
759	{0x1B440, 0x1B444},
760	{0x1B448, 0x1B44C},
761	{0x1B450, 0x1B458},
762	{0x1B45C, 0x1B468},
763	{0x1B584, 0x1B58C},
764	{0x1B68C, 0x1B690},
765	{0x1B6AC, 0x1B6B0},
766	{0x1B7F0, 0x1B7F8},
767	{0x1C800, 0x1CC00},
768	{0x1CE00, 0x1CE04},
769	{0x1CF80, 0x1CF84},
770	{0x1D200, 0x1D800},
771	{0x1E000, 0x20014},
772	{0x20100, 0x20124},
773	{0x21400, 0x217A8},
774	{0x21800, 0x21BA8},
775	{0x21C00, 0x21FA8},
776	{0x22000, 0x223A8},
777	{0x22400, 0x227A8},
778	{0x22800, 0x22BA8},
779	{0x22C00, 0x22FA8},
780	{0x23000, 0x233A8},
781	{0x24000, 0x24034},
782	{0x26000, 0x26064},
783	{0x27000, 0x27024},
784	{0x34000, 0x3400C},
785	{0x34400, 0x3445C},
786	{0x34800, 0x3485C},
787	{0x34C00, 0x34C5C},
788	{0x35000, 0x3505C},
789	{0x35400, 0x3545C},
790	{0x35800, 0x3585C},
791	{0x35C00, 0x35C5C},
792	{0x36000, 0x3605C},
793	{0x38000, 0x38064},
794	{0x38070, 0x380E0},
795	{0x3A000, 0x3A074},
796	{0x40000, 0x400A4},
797	{0x80000, 0x8000C},
798	{0x80010, 0x80020},
799};
800
801static const struct ath10k_mem_region qca6174_hw10_mem_regions[] = {
802	{
803		.type = ATH10K_MEM_REGION_TYPE_DRAM,
804		.start = 0x400000,
805		.len = 0x70000,
806		.name = "DRAM",
807		.section_table = {
808			.sections = NULL,
809			.size = 0,
810		},
811	},
812	{
813		.type = ATH10K_MEM_REGION_TYPE_REG,
814
815		/* RTC_SOC_BASE_ADDRESS */
816		.start = 0x0,
817
818		/* WLAN_MBOX_BASE_ADDRESS - RTC_SOC_BASE_ADDRESS */
819		.len = 0x800 - 0x0,
820
821		.name = "REG_PART1",
822		.section_table = {
823			.sections = NULL,
824			.size = 0,
825		},
826	},
827	{
828		.type = ATH10K_MEM_REGION_TYPE_REG,
829
830		/* STEREO_BASE_ADDRESS */
831		.start = 0x27000,
832
833		/* USB_BASE_ADDRESS - STEREO_BASE_ADDRESS */
834		.len = 0x60000 - 0x27000,
835
836		.name = "REG_PART2",
837		.section_table = {
838			.sections = NULL,
839			.size = 0,
840		},
841	},
842};
843
844static const struct ath10k_mem_region qca6174_hw21_mem_regions[] = {
845	{
846		.type = ATH10K_MEM_REGION_TYPE_DRAM,
847		.start = 0x400000,
848		.len = 0x70000,
849		.name = "DRAM",
850		.section_table = {
851			.sections = NULL,
852			.size = 0,
853		},
854	},
855	{
856		.type = ATH10K_MEM_REGION_TYPE_AXI,
857		.start = 0xa0000,
858		.len = 0x18000,
859		.name = "AXI",
860		.section_table = {
861			.sections = NULL,
862			.size = 0,
863		},
864	},
865	{
866		.type = ATH10K_MEM_REGION_TYPE_REG,
867		.start = 0x800,
868		.len = 0x80020 - 0x800,
869		.name = "REG_TOTAL",
870		.section_table = {
871			.sections = qca6174_hw21_register_sections,
872			.size = ARRAY_SIZE(qca6174_hw21_register_sections),
873		},
874	},
875};
876
877static const struct ath10k_mem_region qca6174_hw30_sdio_mem_regions[] = {
878	{
879		.type = ATH10K_MEM_REGION_TYPE_DRAM,
880		.start = 0x400000,
881		.len = 0xa8000,
882		.name = "DRAM",
883		.section_table = {
884			.sections = NULL,
885			.size = 0,
886		},
887	},
888	{
889		.type = ATH10K_MEM_REGION_TYPE_AXI,
890		.start = 0xa0000,
891		.len = 0x18000,
892		.name = "AXI",
893		.section_table = {
894			.sections = NULL,
895			.size = 0,
896		},
897	},
898	{
899		.type = ATH10K_MEM_REGION_TYPE_IRAM1,
900		.start = 0x00980000,
901		.len = 0x00080000,
902		.name = "IRAM1",
903		.section_table = {
904			.sections = NULL,
905			.size = 0,
906		},
907	},
908	{
909		.type = ATH10K_MEM_REGION_TYPE_IRAM2,
910		.start = 0x00a00000,
911		.len = 0x00040000,
912		.name = "IRAM2",
913		.section_table = {
914			.sections = NULL,
915			.size = 0,
916		},
917	},
918	{
919		.type = ATH10K_MEM_REGION_TYPE_REG,
920		.start = 0x800,
921		.len = 0x80020 - 0x800,
922		.name = "REG_TOTAL",
923		.section_table = {
924			.sections = qca6174_hw30_sdio_register_sections,
925			.size = ARRAY_SIZE(qca6174_hw30_sdio_register_sections),
926		},
927	},
928};
929
930static const struct ath10k_mem_region qca6174_hw30_mem_regions[] = {
931	{
932		.type = ATH10K_MEM_REGION_TYPE_DRAM,
933		.start = 0x400000,
934		.len = 0xa8000,
935		.name = "DRAM",
936		.section_table = {
937			.sections = NULL,
938			.size = 0,
939		},
940	},
941	{
942		.type = ATH10K_MEM_REGION_TYPE_AXI,
943		.start = 0xa0000,
944		.len = 0x18000,
945		.name = "AXI",
946		.section_table = {
947			.sections = NULL,
948			.size = 0,
949		},
950	},
951	{
952		.type = ATH10K_MEM_REGION_TYPE_REG,
953		.start = 0x800,
954		.len = 0x80020 - 0x800,
955		.name = "REG_TOTAL",
956		.section_table = {
957			.sections = qca6174_hw30_register_sections,
958			.size = ARRAY_SIZE(qca6174_hw30_register_sections),
959		},
960	},
961
962	/* IRAM dump must be put last */
963	{
964		.type = ATH10K_MEM_REGION_TYPE_IRAM1,
965		.start = 0x00980000,
966		.len = 0x00080000,
967		.name = "IRAM1",
968		.section_table = {
969			.sections = NULL,
970			.size = 0,
971		},
972	},
973	{
974		.type = ATH10K_MEM_REGION_TYPE_IRAM2,
975		.start = 0x00a00000,
976		.len = 0x00040000,
977		.name = "IRAM2",
978		.section_table = {
979			.sections = NULL,
980			.size = 0,
981		},
982	},
983};
984
985static const struct ath10k_mem_region qca988x_hw20_mem_regions[] = {
986	{
987		.type = ATH10K_MEM_REGION_TYPE_DRAM,
988		.start = 0x400000,
989		.len = 0x50000,
990		.name = "DRAM",
991		.section_table = {
992			.sections = NULL,
993			.size = 0,
994		},
995	},
996	{
997		.type = ATH10K_MEM_REGION_TYPE_REG,
998		.start = 0x4000,
999		.len = 0x2000,
1000		.name = "REG_PART1",
1001		.section_table = {
1002			.sections = NULL,
1003			.size = 0,
1004		},
1005	},
1006	{
1007		.type = ATH10K_MEM_REGION_TYPE_REG,
1008		.start = 0x8000,
1009		.len = 0x58000,
1010		.name = "REG_PART2",
1011		.section_table = {
1012			.sections = NULL,
1013			.size = 0,
1014		},
1015	},
1016};
1017
1018static const struct ath10k_mem_region qca99x0_hw20_mem_regions[] = {
1019	{
1020		.type = ATH10K_MEM_REGION_TYPE_DRAM,
1021		.start = 0x400000,
1022		.len = 0x60000,
1023		.name = "DRAM",
1024		.section_table = {
1025			.sections = NULL,
1026			.size = 0,
1027		},
1028	},
1029	{
1030		.type = ATH10K_MEM_REGION_TYPE_REG,
1031		.start = 0x980000,
1032		.len = 0x50000,
1033		.name = "IRAM",
1034		.section_table = {
1035			.sections = NULL,
1036			.size = 0,
1037		},
1038	},
1039	{
1040		.type = ATH10K_MEM_REGION_TYPE_IOSRAM,
1041		.start = 0xC0000,
1042		.len = 0x40000,
1043		.name = "SRAM",
1044		.section_table = {
1045			.sections = NULL,
1046			.size = 0,
1047		},
1048	},
1049	{
1050		.type = ATH10K_MEM_REGION_TYPE_IOREG,
1051		.start = 0x30000,
1052		.len = 0x7000,
1053		.name = "APB REG 1",
1054		.section_table = {
1055			.sections = NULL,
1056			.size = 0,
1057		},
1058	},
1059	{
1060		.type = ATH10K_MEM_REGION_TYPE_IOREG,
1061		.start = 0x3f000,
1062		.len = 0x3000,
1063		.name = "APB REG 2",
1064		.section_table = {
1065			.sections = NULL,
1066			.size = 0,
1067		},
1068	},
1069	{
1070		.type = ATH10K_MEM_REGION_TYPE_IOREG,
1071		.start = 0x43000,
1072		.len = 0x3000,
1073		.name = "WIFI REG",
1074		.section_table = {
1075			.sections = NULL,
1076			.size = 0,
1077		},
1078	},
1079	{
1080		.type = ATH10K_MEM_REGION_TYPE_IOREG,
1081		.start = 0x4A000,
1082		.len = 0x5000,
1083		.name = "CE REG",
1084		.section_table = {
1085			.sections = NULL,
1086			.size = 0,
1087		},
1088	},
1089	{
1090		.type = ATH10K_MEM_REGION_TYPE_IOREG,
1091		.start = 0x80000,
1092		.len = 0x6000,
1093		.name = "SOC REG",
1094		.section_table = {
1095			.sections = NULL,
1096			.size = 0,
1097		},
1098	},
1099};
1100
1101static const struct ath10k_mem_region qca9984_hw10_mem_regions[] = {
1102	{
1103		.type = ATH10K_MEM_REGION_TYPE_DRAM,
1104		.start = 0x400000,
1105		.len = 0x80000,
1106		.name = "DRAM",
1107		.section_table = {
1108			.sections = NULL,
1109			.size = 0,
1110		},
1111	},
1112	{
1113		.type = ATH10K_MEM_REGION_TYPE_REG,
1114		.start = 0x980000,
1115		.len = 0x50000,
1116		.name = "IRAM",
1117		.section_table = {
1118			.sections = NULL,
1119			.size = 0,
1120		},
1121	},
1122	{
1123		.type = ATH10K_MEM_REGION_TYPE_IOSRAM,
1124		.start = 0xC0000,
1125		.len = 0x40000,
1126		.name = "SRAM",
1127		.section_table = {
1128			.sections = NULL,
1129			.size = 0,
1130		},
1131	},
1132	{
1133		.type = ATH10K_MEM_REGION_TYPE_IOREG,
1134		.start = 0x30000,
1135		.len = 0x7000,
1136		.name = "APB REG 1",
1137		.section_table = {
1138			.sections = NULL,
1139			.size = 0,
1140		},
1141	},
1142	{
1143		.type = ATH10K_MEM_REGION_TYPE_IOREG,
1144		.start = 0x3f000,
1145		.len = 0x3000,
1146		.name = "APB REG 2",
1147		.section_table = {
1148			.sections = NULL,
1149			.size = 0,
1150		},
1151	},
1152	{
1153		.type = ATH10K_MEM_REGION_TYPE_IOREG,
1154		.start = 0x43000,
1155		.len = 0x3000,
1156		.name = "WIFI REG",
1157		.section_table = {
1158			.sections = NULL,
1159			.size = 0,
1160		},
1161	},
1162	{
1163		.type = ATH10K_MEM_REGION_TYPE_IOREG,
1164		.start = 0x4A000,
1165		.len = 0x5000,
1166		.name = "CE REG",
1167		.section_table = {
1168			.sections = NULL,
1169			.size = 0,
1170		},
1171	},
1172	{
1173		.type = ATH10K_MEM_REGION_TYPE_IOREG,
1174		.start = 0x80000,
1175		.len = 0x6000,
1176		.name = "SOC REG",
1177		.section_table = {
1178			.sections = NULL,
1179			.size = 0,
1180		},
1181	},
1182};
1183
1184static const struct ath10k_mem_section ipq4019_soc_reg_range[] = {
1185	{0x080000, 0x080004},
1186	{0x080020, 0x080024},
1187	{0x080028, 0x080050},
1188	{0x0800d4, 0x0800ec},
1189	{0x08010c, 0x080118},
1190	{0x080284, 0x080290},
1191	{0x0802a8, 0x0802b8},
1192	{0x0802dc, 0x08030c},
1193	{0x082000, 0x083fff}
1194};
1195
1196static const struct ath10k_mem_region qca4019_hw10_mem_regions[] = {
1197	{
1198		.type = ATH10K_MEM_REGION_TYPE_DRAM,
1199		.start = 0x400000,
1200		.len = 0x68000,
1201		.name = "DRAM",
1202		.section_table = {
1203			.sections = NULL,
1204			.size = 0,
1205		},
1206	},
1207	{
1208		.type = ATH10K_MEM_REGION_TYPE_REG,
1209		.start = 0xC0000,
1210		.len = 0x40000,
1211		.name = "SRAM",
1212		.section_table = {
1213			.sections = NULL,
1214			.size = 0,
1215		},
1216	},
1217	{
1218		.type = ATH10K_MEM_REGION_TYPE_REG,
1219		.start = 0x980000,
1220		.len = 0x50000,
1221		.name = "IRAM",
1222		.section_table = {
1223			.sections = NULL,
1224			.size = 0,
1225		},
1226	},
1227	{
1228		.type = ATH10K_MEM_REGION_TYPE_IOREG,
1229		.start = 0x30000,
1230		.len = 0x7000,
1231		.name = "APB REG 1",
1232		.section_table = {
1233			.sections = NULL,
1234			.size = 0,
1235		},
1236	},
1237	{
1238		.type = ATH10K_MEM_REGION_TYPE_IOREG,
1239		.start = 0x3f000,
1240		.len = 0x3000,
1241		.name = "APB REG 2",
1242		.section_table = {
1243			.sections = NULL,
1244			.size = 0,
1245		},
1246	},
1247	{
1248		.type = ATH10K_MEM_REGION_TYPE_IOREG,
1249		.start = 0x43000,
1250		.len = 0x3000,
1251		.name = "WIFI REG",
1252		.section_table = {
1253			.sections = NULL,
1254			.size = 0,
1255		},
1256	},
1257	{
1258		.type = ATH10K_MEM_REGION_TYPE_IOREG,
1259		.start = 0x4A000,
1260		.len = 0x5000,
1261		.name = "CE REG",
1262		.section_table = {
1263			.sections = NULL,
1264			.size = 0,
1265		},
1266	},
1267	{
1268		.type = ATH10K_MEM_REGION_TYPE_REG,
1269		.start = 0x080000,
1270		.len = 0x083fff - 0x080000,
1271		.name = "REG_TOTAL",
1272		.section_table = {
1273			.sections = ipq4019_soc_reg_range,
1274			.size = ARRAY_SIZE(ipq4019_soc_reg_range),
1275		},
1276	},
1277};
1278
1279static const struct ath10k_mem_region wcn399x_hw10_mem_regions[] = {
1280	{
1281		/* MSA region start is not fixed, hence it is assigned at runtime */
1282		.type = ATH10K_MEM_REGION_TYPE_MSA,
1283		.len = 0x100000,
1284		.name = "DRAM",
1285		.section_table = {
1286			.sections = NULL,
1287			.size = 0,
1288		},
1289	},
1290};
1291
1292static const struct ath10k_hw_mem_layout hw_mem_layouts[] = {
1293	{
1294		.hw_id = QCA6174_HW_1_0_VERSION,
1295		.hw_rev = ATH10K_HW_QCA6174,
1296		.bus = ATH10K_BUS_PCI,
1297		.region_table = {
1298			.regions = qca6174_hw10_mem_regions,
1299			.size = ARRAY_SIZE(qca6174_hw10_mem_regions),
1300		},
1301	},
1302	{
1303		.hw_id = QCA6174_HW_1_1_VERSION,
1304		.hw_rev = ATH10K_HW_QCA6174,
1305		.bus = ATH10K_BUS_PCI,
1306		.region_table = {
1307			.regions = qca6174_hw10_mem_regions,
1308			.size = ARRAY_SIZE(qca6174_hw10_mem_regions),
1309		},
1310	},
1311	{
1312		.hw_id = QCA6174_HW_1_3_VERSION,
1313		.hw_rev = ATH10K_HW_QCA6174,
1314		.bus = ATH10K_BUS_PCI,
1315		.region_table = {
1316			.regions = qca6174_hw10_mem_regions,
1317			.size = ARRAY_SIZE(qca6174_hw10_mem_regions),
1318		},
1319	},
1320	{
1321		.hw_id = QCA6174_HW_2_1_VERSION,
1322		.hw_rev = ATH10K_HW_QCA6174,
1323		.bus = ATH10K_BUS_PCI,
1324		.region_table = {
1325			.regions = qca6174_hw21_mem_regions,
1326			.size = ARRAY_SIZE(qca6174_hw21_mem_regions),
1327		},
1328	},
1329	{
1330		.hw_id = QCA6174_HW_3_0_VERSION,
1331		.hw_rev = ATH10K_HW_QCA6174,
1332		.bus = ATH10K_BUS_PCI,
1333		.region_table = {
1334			.regions = qca6174_hw30_mem_regions,
1335			.size = ARRAY_SIZE(qca6174_hw30_mem_regions),
1336		},
1337	},
1338	{
1339		.hw_id = QCA6174_HW_3_2_VERSION,
1340		.hw_rev = ATH10K_HW_QCA6174,
1341		.bus = ATH10K_BUS_PCI,
1342		.region_table = {
1343			.regions = qca6174_hw30_mem_regions,
1344			.size = ARRAY_SIZE(qca6174_hw30_mem_regions),
1345		},
1346	},
1347	{
1348		.hw_id = QCA6174_HW_3_2_VERSION,
1349		.hw_rev = ATH10K_HW_QCA6174,
1350		.bus = ATH10K_BUS_SDIO,
1351		.region_table = {
1352			.regions = qca6174_hw30_sdio_mem_regions,
1353			.size = ARRAY_SIZE(qca6174_hw30_sdio_mem_regions),
1354		},
1355	},
1356	{
1357		.hw_id = QCA9377_HW_1_1_DEV_VERSION,
1358		.hw_rev = ATH10K_HW_QCA9377,
1359		.bus = ATH10K_BUS_PCI,
1360		.region_table = {
1361			.regions = qca6174_hw30_mem_regions,
1362			.size = ARRAY_SIZE(qca6174_hw30_mem_regions),
1363		},
1364	},
1365	{
1366		.hw_id = QCA988X_HW_2_0_VERSION,
1367		.hw_rev = ATH10K_HW_QCA988X,
1368		.bus = ATH10K_BUS_PCI,
1369		.region_table = {
1370			.regions = qca988x_hw20_mem_regions,
1371			.size = ARRAY_SIZE(qca988x_hw20_mem_regions),
1372		},
1373	},
1374	{
1375		.hw_id = QCA9984_HW_1_0_DEV_VERSION,
1376		.hw_rev = ATH10K_HW_QCA9984,
1377		.bus = ATH10K_BUS_PCI,
1378		.region_table = {
1379			.regions = qca9984_hw10_mem_regions,
1380			.size = ARRAY_SIZE(qca9984_hw10_mem_regions),
1381		},
1382	},
1383	{
1384		.hw_id = QCA9888_HW_2_0_DEV_VERSION,
1385		.hw_rev = ATH10K_HW_QCA9888,
1386		.bus = ATH10K_BUS_PCI,
1387		.region_table = {
1388			.regions = qca9984_hw10_mem_regions,
1389			.size = ARRAY_SIZE(qca9984_hw10_mem_regions),
1390		},
1391	},
1392	{
1393		.hw_id = QCA99X0_HW_2_0_DEV_VERSION,
1394		.hw_rev = ATH10K_HW_QCA99X0,
1395		.bus = ATH10K_BUS_PCI,
1396		.region_table = {
1397			.regions = qca99x0_hw20_mem_regions,
1398			.size = ARRAY_SIZE(qca99x0_hw20_mem_regions),
1399		},
1400	},
1401	{
1402		.hw_id = QCA4019_HW_1_0_DEV_VERSION,
1403		.hw_rev = ATH10K_HW_QCA4019,
1404		.bus = ATH10K_BUS_AHB,
1405		.region_table = {
1406			.regions = qca4019_hw10_mem_regions,
1407			.size = ARRAY_SIZE(qca4019_hw10_mem_regions),
1408		},
1409	},
1410	{
1411		.hw_id = WCN3990_HW_1_0_DEV_VERSION,
1412		.hw_rev = ATH10K_HW_WCN3990,
1413		.bus = ATH10K_BUS_SNOC,
1414		.region_table = {
1415			.regions = wcn399x_hw10_mem_regions,
1416			.size = ARRAY_SIZE(wcn399x_hw10_mem_regions),
1417		},
1418	},
1419};
1420
1421static u32 ath10k_coredump_get_ramdump_size(struct ath10k *ar)
1422{
1423	const struct ath10k_hw_mem_layout *hw;
1424	const struct ath10k_mem_region *mem_region;
1425	size_t size = 0;
1426	int i;
1427
1428	hw = ath10k_coredump_get_mem_layout(ar);
1429
1430	if (!hw)
1431		return 0;
1432
1433	mem_region = &hw->region_table.regions[0];
1434
1435	for (i = 0; i < hw->region_table.size; i++) {
1436		size += mem_region->len;
1437		mem_region++;
1438	}
1439
1440	/* reserve space for the headers */
1441	size += hw->region_table.size * sizeof(struct ath10k_dump_ram_data_hdr);
1442
1443	/* make sure it is aligned 16 bytes for debug message print out */
1444	size = ALIGN(size, 16);
1445
1446	return size;
1447}
1448
1449const struct ath10k_hw_mem_layout *ath10k_coredump_get_mem_layout(struct ath10k *ar)
1450{
1451	if (!test_bit(ATH10K_FW_CRASH_DUMP_RAM_DATA, &ath10k_coredump_mask))
1452		return NULL;
1453
1454	return _ath10k_coredump_get_mem_layout(ar);
1455}
1456EXPORT_SYMBOL(ath10k_coredump_get_mem_layout);
1457
1458const struct ath10k_hw_mem_layout *_ath10k_coredump_get_mem_layout(struct ath10k *ar)
1459{
1460	int i;
1461
1462	if (WARN_ON(ar->target_version == 0))
1463		return NULL;
1464
1465	for (i = 0; i < ARRAY_SIZE(hw_mem_layouts); i++) {
1466		if (ar->target_version == hw_mem_layouts[i].hw_id &&
1467		    ar->hw_rev == hw_mem_layouts[i].hw_rev &&
1468		    hw_mem_layouts[i].bus == ar->hif.bus)
1469			return &hw_mem_layouts[i];
1470	}
1471
1472	return NULL;
1473}
1474
1475struct ath10k_fw_crash_data *ath10k_coredump_new(struct ath10k *ar)
1476{
1477	struct ath10k_fw_crash_data *crash_data = ar->coredump.fw_crash_data;
1478
1479	lockdep_assert_held(&ar->dump_mutex);
1480
1481	if (ath10k_coredump_mask == 0)
1482		/* coredump disabled */
1483		return NULL;
1484
1485	guid_gen(&crash_data->guid);
1486	ktime_get_real_ts64(&crash_data->timestamp);
1487
1488	return crash_data;
1489}
1490EXPORT_SYMBOL(ath10k_coredump_new);
1491
1492static struct ath10k_dump_file_data *ath10k_coredump_build(struct ath10k *ar)
1493{
1494	struct ath10k_fw_crash_data *crash_data = ar->coredump.fw_crash_data;
1495	struct ath10k_ce_crash_hdr *ce_hdr;
1496	struct ath10k_dump_file_data *dump_data;
1497	struct ath10k_tlv_dump_data *dump_tlv;
1498	size_t hdr_len = sizeof(*dump_data);
1499	size_t len, sofar = 0;
1500	unsigned char *buf;
1501
1502	len = hdr_len;
1503
1504	if (test_bit(ATH10K_FW_CRASH_DUMP_REGISTERS, &ath10k_coredump_mask))
1505		len += sizeof(*dump_tlv) + sizeof(crash_data->registers);
1506
1507	if (test_bit(ATH10K_FW_CRASH_DUMP_CE_DATA, &ath10k_coredump_mask))
1508		len += sizeof(*dump_tlv) + sizeof(*ce_hdr) +
1509			CE_COUNT * sizeof(ce_hdr->entries[0]);
1510
1511	if (test_bit(ATH10K_FW_CRASH_DUMP_RAM_DATA, &ath10k_coredump_mask))
1512		len += sizeof(*dump_tlv) + crash_data->ramdump_buf_len;
1513
1514	sofar += hdr_len;
1515
1516	/* This is going to get big when we start dumping FW RAM and such,
1517	 * so go ahead and use vmalloc.
1518	 */
1519	buf = vzalloc(len);
1520	if (!buf)
1521		return NULL;
1522
1523	mutex_lock(&ar->dump_mutex);
1524
1525	dump_data = (struct ath10k_dump_file_data *)(buf);
1526	strscpy(dump_data->df_magic, "ATH10K-FW-DUMP",
1527		sizeof(dump_data->df_magic));
1528	dump_data->len = cpu_to_le32(len);
1529
1530	dump_data->version = cpu_to_le32(ATH10K_FW_CRASH_DUMP_VERSION);
1531
1532	guid_copy(&dump_data->guid, &crash_data->guid);
1533	dump_data->chip_id = cpu_to_le32(ar->bus_param.chip_id);
1534	dump_data->bus_type = cpu_to_le32(0);
1535	dump_data->target_version = cpu_to_le32(ar->target_version);
1536	dump_data->fw_version_major = cpu_to_le32(ar->fw_version_major);
1537	dump_data->fw_version_minor = cpu_to_le32(ar->fw_version_minor);
1538	dump_data->fw_version_release = cpu_to_le32(ar->fw_version_release);
1539	dump_data->fw_version_build = cpu_to_le32(ar->fw_version_build);
1540	dump_data->phy_capability = cpu_to_le32(ar->phy_capability);
1541	dump_data->hw_min_tx_power = cpu_to_le32(ar->hw_min_tx_power);
1542	dump_data->hw_max_tx_power = cpu_to_le32(ar->hw_max_tx_power);
1543	dump_data->ht_cap_info = cpu_to_le32(ar->ht_cap_info);
1544	dump_data->vht_cap_info = cpu_to_le32(ar->vht_cap_info);
1545	dump_data->num_rf_chains = cpu_to_le32(ar->num_rf_chains);
1546
1547	strscpy(dump_data->fw_ver, ar->hw->wiphy->fw_version,
1548		sizeof(dump_data->fw_ver));
1549
1550	dump_data->kernel_ver_code = 0;
1551	strscpy(dump_data->kernel_ver, init_utsname()->release,
1552		sizeof(dump_data->kernel_ver));
1553
1554	dump_data->tv_sec = cpu_to_le64(crash_data->timestamp.tv_sec);
1555	dump_data->tv_nsec = cpu_to_le64(crash_data->timestamp.tv_nsec);
1556
1557	if (test_bit(ATH10K_FW_CRASH_DUMP_REGISTERS, &ath10k_coredump_mask)) {
1558		dump_tlv = (struct ath10k_tlv_dump_data *)(buf + sofar);
1559		dump_tlv->type = cpu_to_le32(ATH10K_FW_CRASH_DUMP_REGISTERS);
1560		dump_tlv->tlv_len = cpu_to_le32(sizeof(crash_data->registers));
1561		memcpy(dump_tlv->tlv_data, &crash_data->registers,
1562		       sizeof(crash_data->registers));
1563		sofar += sizeof(*dump_tlv) + sizeof(crash_data->registers);
1564	}
1565
1566	if (test_bit(ATH10K_FW_CRASH_DUMP_CE_DATA, &ath10k_coredump_mask)) {
1567		dump_tlv = (struct ath10k_tlv_dump_data *)(buf + sofar);
1568		dump_tlv->type = cpu_to_le32(ATH10K_FW_CRASH_DUMP_CE_DATA);
1569		dump_tlv->tlv_len = cpu_to_le32(struct_size(ce_hdr, entries,
1570							    CE_COUNT));
1571		ce_hdr = (struct ath10k_ce_crash_hdr *)(dump_tlv->tlv_data);
1572		ce_hdr->ce_count = cpu_to_le32(CE_COUNT);
1573		memset(ce_hdr->reserved, 0, sizeof(ce_hdr->reserved));
1574		memcpy(ce_hdr->entries, crash_data->ce_crash_data,
1575		       CE_COUNT * sizeof(ce_hdr->entries[0]));
1576		sofar += sizeof(*dump_tlv) + sizeof(*ce_hdr) +
1577			CE_COUNT * sizeof(ce_hdr->entries[0]);
1578	}
1579
1580	/* Gather ram dump */
1581	if (test_bit(ATH10K_FW_CRASH_DUMP_RAM_DATA, &ath10k_coredump_mask)) {
1582		dump_tlv = (struct ath10k_tlv_dump_data *)(buf + sofar);
1583		dump_tlv->type = cpu_to_le32(ATH10K_FW_CRASH_DUMP_RAM_DATA);
1584		dump_tlv->tlv_len = cpu_to_le32(crash_data->ramdump_buf_len);
1585		if (crash_data->ramdump_buf_len) {
1586			memcpy(dump_tlv->tlv_data, crash_data->ramdump_buf,
1587			       crash_data->ramdump_buf_len);
1588			sofar += sizeof(*dump_tlv) + crash_data->ramdump_buf_len;
1589		}
1590	}
1591
1592	mutex_unlock(&ar->dump_mutex);
1593
1594	return dump_data;
1595}
1596
1597int ath10k_coredump_submit(struct ath10k *ar)
1598{
1599	struct ath10k_dump_file_data *dump;
1600
1601	if (ath10k_coredump_mask == 0)
1602		/* coredump disabled */
1603		return 0;
1604
1605	dump = ath10k_coredump_build(ar);
1606	if (!dump) {
1607		ath10k_warn(ar, "no crash dump data found for devcoredump");
1608		return -ENODATA;
1609	}
1610
1611	dev_coredumpv(ar->dev, dump, le32_to_cpu(dump->len), GFP_KERNEL);
1612
1613	return 0;
1614}
1615
1616int ath10k_coredump_create(struct ath10k *ar)
1617{
1618	if (ath10k_coredump_mask == 0)
1619		/* coredump disabled */
1620		return 0;
1621
1622	ar->coredump.fw_crash_data = vzalloc(sizeof(*ar->coredump.fw_crash_data));
1623	if (!ar->coredump.fw_crash_data)
1624		return -ENOMEM;
1625
1626	return 0;
1627}
1628
1629int ath10k_coredump_register(struct ath10k *ar)
1630{
1631	struct ath10k_fw_crash_data *crash_data = ar->coredump.fw_crash_data;
1632
1633	if (test_bit(ATH10K_FW_CRASH_DUMP_RAM_DATA, &ath10k_coredump_mask)) {
1634		crash_data->ramdump_buf_len = ath10k_coredump_get_ramdump_size(ar);
1635
1636		if (!crash_data->ramdump_buf_len)
1637			return 0;
1638
1639		crash_data->ramdump_buf = vzalloc(crash_data->ramdump_buf_len);
1640		if (!crash_data->ramdump_buf)
1641			return -ENOMEM;
1642	}
1643
1644	return 0;
1645}
1646
1647void ath10k_coredump_unregister(struct ath10k *ar)
1648{
1649	struct ath10k_fw_crash_data *crash_data = ar->coredump.fw_crash_data;
1650
1651	vfree(crash_data->ramdump_buf);
1652}
1653
1654void ath10k_coredump_destroy(struct ath10k *ar)
1655{
1656	if (ar->coredump.fw_crash_data->ramdump_buf) {
1657		vfree(ar->coredump.fw_crash_data->ramdump_buf);
1658		ar->coredump.fw_crash_data->ramdump_buf = NULL;
1659		ar->coredump.fw_crash_data->ramdump_buf_len = 0;
1660	}
1661
1662	vfree(ar->coredump.fw_crash_data);
1663	ar->coredump.fw_crash_data = NULL;
1664}
1665