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