GNU Linux-libre 6.8.7-gnu
[releases.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  * 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
18 static 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
274 static 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
545 static 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
801 static 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
844 static 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
877 static 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
930 static 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
985 static 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
1018 static 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
1101 static 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
1184 static 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
1196 static 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
1279 static 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
1292 static 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
1421 static 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
1449 const 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 }
1456 EXPORT_SYMBOL(ath10k_coredump_get_mem_layout);
1457
1458 const 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
1475 struct 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 }
1490 EXPORT_SYMBOL(ath10k_coredump_new);
1491
1492 static 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
1597 int 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
1616 int 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
1629 int 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
1647 void 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
1654 void 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 }