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