Linux Audio

Check our new training course

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