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