adreno_gen7_snapshot.c 56 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2021, The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2022-2024, Qualcomm Innovation Center, Inc. All rights reserved.
  5. */
  6. #include "adreno.h"
  7. #include "adreno_snapshot.h"
  8. #include "adreno_gen7_0_0_snapshot.h"
  9. #include "adreno_gen7_2_0_snapshot.h"
  10. #include "adreno_gen7_9_0_snapshot.h"
  11. #include "adreno_gen7_11_0_snapshot.h"
  12. static struct kgsl_memdesc *gen7_capturescript;
  13. static struct kgsl_memdesc *gen7_crashdump_registers;
  14. static u32 *gen7_cd_reg_end;
  15. static const struct gen7_snapshot_block_list *gen7_snapshot_block_list;
  16. static bool gen7_crashdump_timedout;
  17. /* Starting kernel virtual address for QDSS TMC register block */
  18. static void __iomem *tmc_virt;
  19. const struct gen7_snapshot_block_list gen7_0_0_snapshot_block_list = {
  20. .pre_crashdumper_regs = gen7_0_0_pre_crashdumper_gpu_registers,
  21. .debugbus_blocks = gen7_0_0_debugbus_blocks,
  22. .debugbus_blocks_len = ARRAY_SIZE(gen7_0_0_debugbus_blocks),
  23. .gbif_debugbus_blocks = gen7_gbif_debugbus_blocks,
  24. .gbif_debugbus_blocks_len = ARRAY_SIZE(gen7_gbif_debugbus_blocks),
  25. .cx_debugbus_blocks = gen7_cx_dbgc_debugbus_blocks,
  26. .cx_debugbus_blocks_len = ARRAY_SIZE(gen7_cx_dbgc_debugbus_blocks),
  27. .external_core_regs = gen7_0_0_external_core_regs,
  28. .num_external_core_regs = ARRAY_SIZE(gen7_0_0_external_core_regs),
  29. .gmu_regs = gen7_0_0_gmu_registers,
  30. .gmu_gx_regs = gen7_0_0_gmugx_registers,
  31. .rscc_regs = gen7_0_0_rscc_registers,
  32. .reg_list = gen7_0_0_reg_list,
  33. .cx_misc_regs = gen7_0_0_cx_misc_registers,
  34. .shader_blocks = gen7_0_0_shader_blocks,
  35. .num_shader_blocks = ARRAY_SIZE(gen7_0_0_shader_blocks),
  36. .clusters = gen7_0_0_clusters,
  37. .num_clusters = ARRAY_SIZE(gen7_0_0_clusters),
  38. .sptp_clusters = gen7_0_0_sptp_clusters,
  39. .num_sptp_clusters = ARRAY_SIZE(gen7_0_0_sptp_clusters),
  40. .post_crashdumper_regs = gen7_0_0_post_crashdumper_registers,
  41. .index_registers = gen7_cp_indexed_reg_list,
  42. .index_registers_len = ARRAY_SIZE(gen7_cp_indexed_reg_list),
  43. };
  44. const struct gen7_snapshot_block_list gen7_2_0_snapshot_block_list = {
  45. .pre_crashdumper_regs = gen7_0_0_pre_crashdumper_gpu_registers,
  46. .debugbus_blocks = gen7_2_0_debugbus_blocks,
  47. .debugbus_blocks_len = ARRAY_SIZE(gen7_2_0_debugbus_blocks),
  48. .gbif_debugbus_blocks = gen7_gbif_debugbus_blocks,
  49. .gbif_debugbus_blocks_len = ARRAY_SIZE(gen7_gbif_debugbus_blocks),
  50. .cx_debugbus_blocks = gen7_cx_dbgc_debugbus_blocks,
  51. .cx_debugbus_blocks_len = ARRAY_SIZE(gen7_cx_dbgc_debugbus_blocks),
  52. .external_core_regs = gen7_2_0_external_core_regs,
  53. .num_external_core_regs = ARRAY_SIZE(gen7_2_0_external_core_regs),
  54. .gmu_regs = gen7_2_0_gmu_registers,
  55. .gmu_gx_regs = gen7_2_0_gmugx_registers,
  56. .rscc_regs = gen7_2_0_rscc_registers,
  57. .reg_list = gen7_2_0_reg_list,
  58. .cx_misc_regs = gen7_0_0_cx_misc_registers,
  59. .shader_blocks = gen7_2_0_shader_blocks,
  60. .num_shader_blocks = ARRAY_SIZE(gen7_2_0_shader_blocks),
  61. .clusters = gen7_2_0_clusters,
  62. .num_clusters = ARRAY_SIZE(gen7_2_0_clusters),
  63. .sptp_clusters = gen7_2_0_sptp_clusters,
  64. .num_sptp_clusters = ARRAY_SIZE(gen7_2_0_sptp_clusters),
  65. .post_crashdumper_regs = gen7_0_0_post_crashdumper_registers,
  66. .index_registers = gen7_cp_indexed_reg_list,
  67. .index_registers_len = ARRAY_SIZE(gen7_cp_indexed_reg_list),
  68. };
  69. const struct gen7_snapshot_block_list gen7_9_0_snapshot_block_list = {
  70. .pre_crashdumper_regs = gen7_9_0_pre_crashdumper_gpu_registers,
  71. .debugbus_blocks = gen7_9_0_debugbus_blocks,
  72. .debugbus_blocks_len = ARRAY_SIZE(gen7_9_0_debugbus_blocks),
  73. .gbif_debugbus_blocks = gen7_9_0_gbif_debugbus_blocks,
  74. .gbif_debugbus_blocks_len = ARRAY_SIZE(gen7_9_0_gbif_debugbus_blocks),
  75. .cx_debugbus_blocks = gen7_9_0_cx_debugbus_blocks,
  76. .cx_debugbus_blocks_len = ARRAY_SIZE(gen7_9_0_cx_debugbus_blocks),
  77. .external_core_regs = gen7_9_0_external_core_regs,
  78. .num_external_core_regs = ARRAY_SIZE(gen7_9_0_external_core_regs),
  79. .gmu_regs = gen7_9_0_gmu_registers,
  80. .gmu_gx_regs = gen7_9_0_gmugx_registers,
  81. .rscc_regs = gen7_9_0_rscc_registers,
  82. .reg_list = gen7_9_0_reg_list,
  83. .cx_misc_regs = gen7_9_0_cx_misc_registers,
  84. .shader_blocks = gen7_9_0_shader_blocks,
  85. .num_shader_blocks = ARRAY_SIZE(gen7_9_0_shader_blocks),
  86. .clusters = gen7_9_0_clusters,
  87. .num_clusters = ARRAY_SIZE(gen7_9_0_clusters),
  88. .sptp_clusters = gen7_9_0_sptp_clusters,
  89. .num_sptp_clusters = ARRAY_SIZE(gen7_9_0_sptp_clusters),
  90. .post_crashdumper_regs = gen7_0_0_post_crashdumper_registers,
  91. .index_registers = gen7_9_0_cp_indexed_reg_list,
  92. .index_registers_len = ARRAY_SIZE(gen7_9_0_cp_indexed_reg_list),
  93. };
  94. const struct gen7_snapshot_block_list gen7_11_0_snapshot_block_list = {
  95. .pre_crashdumper_regs = gen7_0_0_pre_crashdumper_gpu_registers,
  96. .debugbus_blocks = gen7_11_0_debugbus_blocks,
  97. .debugbus_blocks_len = ARRAY_SIZE(gen7_11_0_debugbus_blocks),
  98. .gbif_debugbus_blocks = gen7_11_0_gbif_debugbus_blocks,
  99. .gbif_debugbus_blocks_len = ARRAY_SIZE(gen7_11_0_gbif_debugbus_blocks),
  100. .cx_debugbus_blocks = gen7_11_0_cx_debugbus_blocks,
  101. .cx_debugbus_blocks_len = ARRAY_SIZE(gen7_11_0_cx_debugbus_blocks),
  102. .external_core_regs = gen7_11_0_external_core_regs,
  103. .num_external_core_regs = ARRAY_SIZE(gen7_11_0_external_core_regs),
  104. .gmu_regs = gen7_11_0_gmu_registers,
  105. .gmu_gx_regs = gen7_11_0_gmugx_registers,
  106. .rscc_regs = gen7_11_0_rscc_registers,
  107. .reg_list = gen7_11_0_reg_list,
  108. .cx_misc_regs = gen7_11_0_cx_misc_registers,
  109. .shader_blocks = gen7_11_0_shader_blocks,
  110. .num_shader_blocks = ARRAY_SIZE(gen7_11_0_shader_blocks),
  111. .clusters = gen7_11_0_clusters,
  112. .num_clusters = ARRAY_SIZE(gen7_11_0_clusters),
  113. .sptp_clusters = gen7_11_0_sptp_clusters,
  114. .num_sptp_clusters = ARRAY_SIZE(gen7_11_0_sptp_clusters),
  115. .post_crashdumper_regs = gen7_0_0_post_crashdumper_registers,
  116. .index_registers = gen7_11_0_cp_indexed_reg_list,
  117. .index_registers_len = ARRAY_SIZE(gen7_11_0_cp_indexed_reg_list),
  118. };
  119. #define GEN7_SP_READ_SEL_VAL(_location, _pipe, _statetype, _usptp, _sptp) \
  120. (FIELD_PREP(GENMASK(19, 18), _location) | \
  121. FIELD_PREP(GENMASK(17, 16), _pipe) | \
  122. FIELD_PREP(GENMASK(15, 8), _statetype) | \
  123. FIELD_PREP(GENMASK(7, 4), _usptp) | \
  124. FIELD_PREP(GENMASK(3, 0), _sptp))
  125. #define GEN7_CP_APERTURE_REG_VAL(_pipe, _cluster, _context) \
  126. (FIELD_PREP(GENMASK(13, 12), _pipe) | \
  127. FIELD_PREP(GENMASK(10, 8), _cluster) | \
  128. FIELD_PREP(GENMASK(5, 4), _context))
  129. #define GEN7_DEBUGBUS_SECTION_SIZE (sizeof(struct kgsl_snapshot_debugbus) \
  130. + (GEN7_DEBUGBUS_BLOCK_SIZE << 3))
  131. #define CD_REG_END 0xaaaaaaaa
  132. static int CD_WRITE(u64 *ptr, u32 offset, u64 val)
  133. {
  134. ptr[0] = val;
  135. ptr[1] = FIELD_PREP(GENMASK(63, 44), offset) | BIT(21) | BIT(0);
  136. return 2;
  137. }
  138. static int CD_READ(u64 *ptr, u32 offset, u32 size, u64 target)
  139. {
  140. ptr[0] = target;
  141. ptr[1] = FIELD_PREP(GENMASK(63, 44), offset) | size;
  142. return 2;
  143. }
  144. static void CD_FINISH(u64 *ptr, u32 offset)
  145. {
  146. gen7_cd_reg_end = gen7_crashdump_registers->hostptr + offset;
  147. *gen7_cd_reg_end = CD_REG_END;
  148. ptr[0] = gen7_crashdump_registers->gpuaddr + offset;
  149. ptr[1] = FIELD_PREP(GENMASK(63, 44), GEN7_CP_CRASH_DUMP_STATUS) | BIT(0);
  150. ptr[2] = 0;
  151. ptr[3] = 0;
  152. }
  153. static bool CD_SCRIPT_CHECK(struct kgsl_device *device)
  154. {
  155. return (adreno_smmu_is_stalled(ADRENO_DEVICE(device)) || (!device->snapshot_crashdumper) ||
  156. IS_ERR_OR_NULL(gen7_capturescript) ||
  157. IS_ERR_OR_NULL(gen7_crashdump_registers) ||
  158. gen7_crashdump_timedout);
  159. }
  160. static bool _gen7_do_crashdump(struct kgsl_device *device)
  161. {
  162. unsigned int reg = 0;
  163. ktime_t timeout;
  164. if (CD_SCRIPT_CHECK(device))
  165. return false;
  166. kgsl_regwrite(device, GEN7_CP_CRASH_SCRIPT_BASE_LO,
  167. lower_32_bits(gen7_capturescript->gpuaddr));
  168. kgsl_regwrite(device, GEN7_CP_CRASH_SCRIPT_BASE_HI,
  169. upper_32_bits(gen7_capturescript->gpuaddr));
  170. kgsl_regwrite(device, GEN7_CP_CRASH_DUMP_CNTL, 1);
  171. timeout = ktime_add_ms(ktime_get(), CP_CRASH_DUMPER_TIMEOUT);
  172. if (!device->snapshot_atomic)
  173. might_sleep();
  174. for (;;) {
  175. /* make sure we're reading the latest value */
  176. rmb();
  177. if ((*gen7_cd_reg_end) != CD_REG_END)
  178. break;
  179. if (ktime_compare(ktime_get(), timeout) > 0)
  180. break;
  181. /* Wait 1msec to avoid unnecessary looping */
  182. if (!device->snapshot_atomic)
  183. usleep_range(100, 1000);
  184. }
  185. kgsl_regread(device, GEN7_CP_CRASH_DUMP_STATUS, &reg);
  186. /*
  187. * Writing to the GEN7_CP_CRASH_DUMP_CNTL also resets the
  188. * GEN7_CP_CRASH_DUMP_STATUS. Make sure the read above is
  189. * complete before we change the value
  190. */
  191. rmb();
  192. kgsl_regwrite(device, GEN7_CP_CRASH_DUMP_CNTL, 0);
  193. if (WARN(!(reg & 0x2), "Crashdumper timed out\n")) {
  194. /*
  195. * Gen7 crash dumper script is broken down into multiple chunks
  196. * and script will be invoked multiple times to capture snapshot
  197. * of different sections of GPU. If crashdumper fails once, it is
  198. * highly likely it will fail subsequently as well. Hence update
  199. * gen7_crashdump_timedout variable to avoid running crashdumper
  200. * after it fails once.
  201. */
  202. gen7_crashdump_timedout = true;
  203. return false;
  204. }
  205. return true;
  206. }
  207. static size_t gen7_legacy_snapshot_registers(struct kgsl_device *device,
  208. u8 *buf, size_t remain, void *priv)
  209. {
  210. struct gen7_reg_list *regs = priv;
  211. if (regs->sel)
  212. kgsl_regwrite(device, regs->sel->host_reg, regs->sel->val);
  213. return adreno_snapshot_registers_v2(device, buf, remain, (void *)regs->regs);
  214. }
  215. static size_t gen7_snapshot_registers(struct kgsl_device *device, u8 *buf,
  216. size_t remain, void *priv)
  217. {
  218. struct gen7_reg_list *regs = (struct gen7_reg_list *)priv;
  219. const u32 *ptr = regs->regs;
  220. unsigned int *data = (unsigned int *)buf;
  221. unsigned int *src;
  222. unsigned int size = adreno_snapshot_regs_count(ptr) * 4;
  223. if (remain < size) {
  224. SNAPSHOT_ERR_NOMEM(device, "REGISTERS");
  225. return 0;
  226. }
  227. src = gen7_crashdump_registers->hostptr + regs->offset;
  228. for (ptr = regs->regs; ptr[0] != UINT_MAX; ptr += 2) {
  229. unsigned int cnt = REG_COUNT(ptr);
  230. if (cnt == 1)
  231. *data++ = BIT(31) | ptr[0];
  232. else {
  233. *data++ = ptr[0];
  234. *data++ = cnt;
  235. }
  236. memcpy(data, src, cnt << 2);
  237. data += cnt;
  238. src += cnt;
  239. }
  240. /* Return the size of the section */
  241. return size;
  242. }
  243. static size_t gen7_legacy_snapshot_shader(struct kgsl_device *device,
  244. u8 *buf, size_t remain, void *priv)
  245. {
  246. struct adreno_device *adreno_dev = ADRENO_DEVICE(device);
  247. struct kgsl_snapshot_shader_v2 *header =
  248. (struct kgsl_snapshot_shader_v2 *) buf;
  249. struct gen7_shader_block_info *info = (struct gen7_shader_block_info *) priv;
  250. struct gen7_shader_block *block = info->block;
  251. unsigned int *data = (unsigned int *)(buf + sizeof(*header));
  252. unsigned int read_sel;
  253. int i;
  254. if (remain < (sizeof(*header) + (block->size << 2))) {
  255. SNAPSHOT_ERR_NOMEM(device, "SHADER MEMORY");
  256. return 0;
  257. }
  258. /*
  259. * If crashdumper times out, accessing some readback states from
  260. * AHB path might fail. Hence, skip SP_INST_TAG and SP_INST_DATA*
  261. * state types during snapshot dump in legacy flow.
  262. */
  263. if (adreno_is_gen7_0_0(adreno_dev) || adreno_is_gen7_0_1(adreno_dev) ||
  264. adreno_is_gen7_4_0(adreno_dev)) {
  265. if (block->statetype == SP_INST_TAG ||
  266. block->statetype == SP_INST_DATA ||
  267. block->statetype == SP_INST_DATA_1 ||
  268. block->statetype == SP_INST_DATA_2)
  269. return 0;
  270. }
  271. header->type = block->statetype;
  272. header->index = info->sp_id;
  273. header->size = block->size;
  274. header->usptp = info->usptp;
  275. header->location = block->location;
  276. header->pipe_id = block->pipeid;
  277. read_sel = GEN7_SP_READ_SEL_VAL(block->location, block->pipeid,
  278. block->statetype, info->usptp, info->sp_id);
  279. kgsl_regwrite(device, GEN7_SP_READ_SEL, read_sel);
  280. /*
  281. * An explicit barrier is needed so that reads do not happen before
  282. * the register write.
  283. */
  284. mb();
  285. for (i = 0; i < block->size; i++)
  286. data[i] = kgsl_regmap_read(&device->regmap, GEN7_SP_AHB_READ_APERTURE + i);
  287. return (sizeof(*header) + (block->size << 2));
  288. }
  289. static size_t gen7_snapshot_shader_memory(struct kgsl_device *device,
  290. u8 *buf, size_t remain, void *priv)
  291. {
  292. struct kgsl_snapshot_shader_v2 *header =
  293. (struct kgsl_snapshot_shader_v2 *) buf;
  294. struct gen7_shader_block_info *info = (struct gen7_shader_block_info *) priv;
  295. struct gen7_shader_block *block = info->block;
  296. unsigned int *data = (unsigned int *) (buf + sizeof(*header));
  297. if (remain < (sizeof(*header) + (block->size << 2))) {
  298. SNAPSHOT_ERR_NOMEM(device, "SHADER MEMORY");
  299. return 0;
  300. }
  301. header->type = block->statetype;
  302. header->index = info->sp_id;
  303. header->size = block->size;
  304. header->usptp = info->usptp;
  305. header->location = block->location;
  306. header->pipe_id = block->pipeid;
  307. memcpy(data, gen7_crashdump_registers->hostptr + info->offset,
  308. (block->size << 2));
  309. return (sizeof(*header) + (block->size << 2));
  310. }
  311. static void qdss_regwrite(void __iomem *regbase, u32 offsetbytes, u32 value)
  312. {
  313. void __iomem *reg;
  314. reg = regbase + offsetbytes;
  315. /* Ensure previous write is committed */
  316. wmb();
  317. __raw_writel(value, reg);
  318. }
  319. static u32 qdss_regread(void __iomem *regbase, u32 offsetbytes)
  320. {
  321. void __iomem *reg;
  322. u32 val;
  323. reg = regbase + offsetbytes;
  324. val = __raw_readl(reg);
  325. /* Make sure memory is updated before next access */
  326. rmb();
  327. return val;
  328. }
  329. static size_t gen7_snapshot_trace_buffer_gfx_trace(struct kgsl_device *device,
  330. u8 *buf, size_t remain, void *priv)
  331. {
  332. u32 start_idx = 0, status = 0, count = 0, wrap_count = 0, write_ptr = 0;
  333. struct kgsl_snapshot_trace_buffer *header =
  334. (struct kgsl_snapshot_trace_buffer *) buf;
  335. u32 *data = (u32 *)(buf + sizeof(*header));
  336. struct gen7_trace_buffer_info *info =
  337. (struct gen7_trace_buffer_info *) priv;
  338. if (remain < SZ_2K + sizeof(*header)) {
  339. SNAPSHOT_ERR_NOMEM(device, "TRACE 2K BUFFER");
  340. return 0;
  341. }
  342. memcpy(header->ping_blk, info->ping_blk, sizeof(header->ping_blk));
  343. memcpy(header->ping_idx, info->ping_idx, sizeof(header->ping_idx));
  344. header->granularity = info->granularity;
  345. header->segment = info->segment;
  346. header->dbgc_ctrl = info->dbgc_ctrl;
  347. /* Read the status of trace buffer to determine if it's full or empty */
  348. kgsl_regread(device, GEN7_DBGC_TRACE_BUFFER_STATUS, &status);
  349. /*
  350. * wrap_count and write ptr are part of status.
  351. * if status is 0 => wrap_count = 0 and write ptr = 0 buffer is empty.
  352. * if status is non zero and wrap count is 0 read partial buffer.
  353. * if wrap count in non zero read entier 2k buffer.
  354. * Always read the oldest data available.
  355. */
  356. /* if status is 0 then buffer is empty */
  357. if (!status) {
  358. header->size = 0;
  359. return sizeof(*header);
  360. }
  361. /* Number of times the circular buffer has wrapped around */
  362. wrap_count = FIELD_GET(GENMASK(31, 12), status);
  363. write_ptr = FIELD_GET(GENMASK(8, 0), status);
  364. /* Read partial buffer starting from 0 */
  365. if (!wrap_count) {
  366. /* No of dwords to read : (write ptr - 0) of indexed register */
  367. count = write_ptr;
  368. header->size = count << 2;
  369. start_idx = 0;
  370. } else {
  371. /* Read entire 2k buffer starting from write ptr */
  372. start_idx = write_ptr + 1;
  373. count = SZ_512;
  374. header->size = SZ_2K;
  375. }
  376. kgsl_regmap_read_indexed_interleaved(&device->regmap,
  377. GEN7_DBGC_DBG_TRACE_BUFFER_RD_ADDR, GEN7_DBGC_DBG_TRACE_BUFFER_RD_DATA, data,
  378. start_idx, count);
  379. return (sizeof(*header) + header->size);
  380. }
  381. static size_t gen7_snapshot_trace_buffer_etb(struct kgsl_device *device,
  382. u8 *buf, size_t remain, void *priv)
  383. {
  384. u32 read_ptr, count, write_ptr, val, idx = 0;
  385. struct kgsl_snapshot_trace_buffer *header = (struct kgsl_snapshot_trace_buffer *) buf;
  386. u32 *data = (u32 *)(buf + sizeof(*header));
  387. struct gen7_trace_buffer_info *info = (struct gen7_trace_buffer_info *) priv;
  388. /* Unlock ETB buffer */
  389. qdss_regwrite(tmc_virt, QDSS_AOSS_APB_TMC_LAR, 0xC5ACCE55);
  390. /* Make sure unlock goes through before proceeding further */
  391. mb();
  392. /* Flush the QDSS pipeline to ensure completion of pending write to buffer */
  393. val = qdss_regread(tmc_virt, QDSS_AOSS_APB_TMC_FFCR);
  394. qdss_regwrite(tmc_virt, QDSS_AOSS_APB_TMC_FFCR, val | 0x40);
  395. /* Make sure pipeline is flushed before we get read and write pointers */
  396. mb();
  397. /* Disable ETB */
  398. qdss_regwrite(tmc_virt, QDSS_AOSS_APB_TMC_CTRL, 0);
  399. /* Set to circular mode */
  400. qdss_regwrite(tmc_virt, QDSS_AOSS_APB_TMC_MODE, 0);
  401. /* Ensure buffer is set to circular mode before accessing it */
  402. mb();
  403. /* Size of buffer is specified in register TMC_RSZ */
  404. count = qdss_regread(tmc_virt, QDSS_AOSS_APB_TMC_RSZ) << 2;
  405. read_ptr = qdss_regread(tmc_virt, QDSS_AOSS_APB_TMC_RRP);
  406. write_ptr = qdss_regread(tmc_virt, QDSS_AOSS_APB_TMC_RWP);
  407. /* ETB buffer if full read_ptr will be equal to write_ptr else write_ptr leads read_ptr */
  408. count = (read_ptr == write_ptr) ? count : (write_ptr - read_ptr);
  409. if (remain < count + sizeof(*header)) {
  410. SNAPSHOT_ERR_NOMEM(device, "ETB BUFFER");
  411. return 0;
  412. }
  413. /*
  414. * Read pointer is 4 byte aligned and write pointer is 2 byte aligned
  415. * We read 4 bytes of data in one iteration below so aligin it down
  416. * to 4 bytes.
  417. */
  418. count = ALIGN_DOWN(count, 4);
  419. header->size = count;
  420. header->dbgc_ctrl = info->dbgc_ctrl;
  421. memcpy(header->ping_blk, info->ping_blk, sizeof(header->ping_blk));
  422. memcpy(header->ping_idx, info->ping_idx, sizeof(header->ping_idx));
  423. header->granularity = info->granularity;
  424. header->segment = info->segment;
  425. while (count != 0) {
  426. /* This indexed register auto increments index as we read */
  427. data[idx++] = qdss_regread(tmc_virt, QDSS_AOSS_APB_TMC_RRD);
  428. count = count - 4;
  429. }
  430. return (sizeof(*header) + header->size);
  431. }
  432. static void gen7_snapshot_trace_buffer(struct kgsl_device *device,
  433. struct kgsl_snapshot *snapshot)
  434. {
  435. u32 val_tmc_ctrl = 0, val_etr_ctrl = 0, val_etr1_ctrl = 0;
  436. u32 i = 0, sel_gx = 0, sel_cx = 0, val_gx = 0, val_cx = 0, val = 0;
  437. struct gen7_trace_buffer_info info;
  438. struct resource *res1, *res2;
  439. struct clk *clk;
  440. int ret;
  441. void __iomem *etr_virt;
  442. /*
  443. * Data can be collected from CX_DBGC or DBGC and it's mutually exclusive.
  444. * Read the necessary select registers and determine the source of data.
  445. * This loop reads SEL_A to SEL_D of both CX_DBGC and DBGC and accordingly
  446. * updates the header information of trace buffer section.
  447. */
  448. for (i = 0; i < TRACE_BUF_NUM_SIG; i++) {
  449. kgsl_regread(device, GEN7_DBGC_CFG_DBGBUS_SEL_A + i, &sel_gx);
  450. kgsl_regread(device, GEN7_CX_DBGC_CFG_DBGBUS_SEL_A + i, &sel_cx);
  451. val_gx |= sel_gx;
  452. val_cx |= sel_cx;
  453. info.ping_idx[i] = FIELD_GET(GENMASK(7, 0), (sel_gx | sel_cx));
  454. info.ping_blk[i] = FIELD_GET(GENMASK(24, 16), (sel_gx | sel_cx));
  455. }
  456. /* Zero the header if not programmed to export any buffer */
  457. if (!val_gx && !val_cx) {
  458. kgsl_snapshot_add_section(device, KGSL_SNAPSHOT_SECTION_TRACE_BUFFER,
  459. snapshot, NULL, &info);
  460. return;
  461. }
  462. /* Enable APB clock to read data from trace buffer */
  463. clk = clk_get(&device->pdev->dev, "apb_pclk");
  464. if (IS_ERR(clk)) {
  465. dev_err(device->dev, "Unable to get QDSS clock\n");
  466. return;
  467. }
  468. ret = clk_prepare_enable(clk);
  469. if (ret) {
  470. dev_err(device->dev, "QDSS Clock enable error: %d\n", ret);
  471. clk_put(clk);
  472. return;
  473. }
  474. res1 = platform_get_resource_byname(device->pdev, IORESOURCE_MEM, "qdss_etr");
  475. res2 = platform_get_resource_byname(device->pdev, IORESOURCE_MEM, "qdss_tmc");
  476. if (!res1 || !res2)
  477. goto err_clk_put;
  478. etr_virt = ioremap(res1->start, resource_size(res1));
  479. tmc_virt = ioremap(res2->start, resource_size(res2));
  480. if (!etr_virt || !tmc_virt)
  481. goto err_unmap;
  482. /*
  483. * Update header information based on source of data, read necessary CNTLT registers
  484. * for granularity and segment information.
  485. */
  486. if (val_gx) {
  487. info.dbgc_ctrl = GX_DBGC;
  488. kgsl_regread(device, GEN7_DBGC_CFG_DBGBUS_CNTLT, &val);
  489. } else {
  490. info.dbgc_ctrl = CX_DBGC;
  491. kgsl_regread(device, GEN7_CX_DBGC_CFG_DBGBUS_CNTLT, &val);
  492. }
  493. info.granularity = FIELD_GET(GENMASK(14, 12), val);
  494. info.segment = FIELD_GET(GENMASK(31, 28), val);
  495. val_tmc_ctrl = qdss_regread(tmc_virt, QDSS_AOSS_APB_TMC_CTRL);
  496. /*
  497. * Incase TMC CTRL is 0 and val_cx is non zero dump empty buffer.
  498. * Incase TMC CTRL is 0 and val_gx is non zero dump 2k gfx buffer.
  499. * 2k buffer is not present for CX blocks.
  500. * Incase both ETR's CTRL is 0 Dump ETB QDSS buffer and disable QDSS.
  501. * Incase either ETR's CTRL is 1 Disable QDSS dumping ETB buffer to DDR.
  502. */
  503. if (!val_tmc_ctrl) {
  504. if (val_gx)
  505. kgsl_snapshot_add_section(device, KGSL_SNAPSHOT_SECTION_TRACE_BUFFER,
  506. snapshot, gen7_snapshot_trace_buffer_gfx_trace, &info);
  507. else
  508. kgsl_snapshot_add_section(device, KGSL_SNAPSHOT_SECTION_TRACE_BUFFER,
  509. snapshot, NULL, &info);
  510. } else {
  511. val_etr_ctrl = qdss_regread(etr_virt, QDSS_AOSS_APB_ETR_CTRL);
  512. val_etr1_ctrl = qdss_regread(etr_virt, QDSS_AOSS_APB_ETR1_CTRL);
  513. if (!val_etr_ctrl && !val_etr1_ctrl)
  514. kgsl_snapshot_add_section(device, KGSL_SNAPSHOT_SECTION_TRACE_BUFFER,
  515. snapshot, gen7_snapshot_trace_buffer_etb, &info);
  516. qdss_regwrite(tmc_virt, QDSS_AOSS_APB_TMC_CTRL, 0);
  517. }
  518. err_unmap:
  519. iounmap(tmc_virt);
  520. iounmap(etr_virt);
  521. err_clk_put:
  522. clk_disable_unprepare(clk);
  523. clk_put(clk);
  524. }
  525. static void gen7_snapshot_shader(struct kgsl_device *device,
  526. struct kgsl_snapshot *snapshot)
  527. {
  528. unsigned int i;
  529. struct gen7_shader_block_info info;
  530. u64 *ptr;
  531. u32 offset = 0;
  532. struct gen7_shader_block *shader_blocks = gen7_snapshot_block_list->shader_blocks;
  533. size_t num_shader_blocks = gen7_snapshot_block_list->num_shader_blocks;
  534. unsigned int sp;
  535. unsigned int usptp;
  536. size_t (*func)(struct kgsl_device *device, u8 *buf, size_t remain,
  537. void *priv) = gen7_legacy_snapshot_shader;
  538. struct adreno_device *adreno_dev = ADRENO_DEVICE(device);
  539. if (adreno_is_gen7_0_x_family(adreno_dev))
  540. kgsl_regrmw(device, GEN7_SP_DBG_CNTL, GENMASK(1, 0), 3);
  541. if (CD_SCRIPT_CHECK(device)) {
  542. for (i = 0; i < num_shader_blocks; i++) {
  543. struct gen7_shader_block *block = &shader_blocks[i];
  544. for (sp = 0; sp < block->num_sps; sp++) {
  545. for (usptp = 0; usptp < block->num_usptps; usptp++) {
  546. info.block = block;
  547. info.sp_id = sp;
  548. info.usptp = usptp;
  549. info.offset = offset;
  550. offset += block->size << 2;
  551. /* Shader working/shadow memory */
  552. kgsl_snapshot_add_section(device, KGSL_SNAPSHOT_SECTION_SHADER_V2,
  553. snapshot, func, &info);
  554. }
  555. }
  556. }
  557. goto done;
  558. }
  559. for (i = 0; i < num_shader_blocks; i++) {
  560. struct gen7_shader_block *block = &shader_blocks[i];
  561. /* Build the crash script */
  562. ptr = gen7_capturescript->hostptr;
  563. offset = 0;
  564. for (sp = 0; sp < block->num_sps; sp++) {
  565. for (usptp = 0; usptp < block->num_usptps; usptp++) {
  566. /* Program the aperture */
  567. ptr += CD_WRITE(ptr, GEN7_SP_READ_SEL,
  568. GEN7_SP_READ_SEL_VAL(block->location, block->pipeid,
  569. block->statetype, usptp, sp));
  570. /* Read all the data in one chunk */
  571. ptr += CD_READ(ptr, GEN7_SP_AHB_READ_APERTURE, block->size,
  572. gen7_crashdump_registers->gpuaddr + offset);
  573. offset += block->size << 2;
  574. }
  575. }
  576. /* Marker for end of script */
  577. CD_FINISH(ptr, offset);
  578. /* Try to run the crash dumper */
  579. func = gen7_legacy_snapshot_shader;
  580. if (_gen7_do_crashdump(device))
  581. func = gen7_snapshot_shader_memory;
  582. offset = 0;
  583. for (sp = 0; sp < block->num_sps; sp++) {
  584. for (usptp = 0; usptp < block->num_usptps; usptp++) {
  585. info.block = block;
  586. info.sp_id = sp;
  587. info.usptp = usptp;
  588. info.offset = offset;
  589. offset += block->size << 2;
  590. /* Shader working/shadow memory */
  591. kgsl_snapshot_add_section(device, KGSL_SNAPSHOT_SECTION_SHADER_V2,
  592. snapshot, func, &info);
  593. }
  594. }
  595. }
  596. done:
  597. if (adreno_is_gen7_0_x_family(adreno_dev))
  598. kgsl_regrmw(device, GEN7_SP_DBG_CNTL, GENMASK(1, 0), 0x0);
  599. }
  600. static void gen7_snapshot_mempool(struct kgsl_device *device,
  601. struct kgsl_snapshot *snapshot)
  602. {
  603. /* set CP_CHICKEN_DBG[StabilizeMVC] to stabilize it while dumping */
  604. kgsl_regrmw(device, GEN7_CP_CHICKEN_DBG, 0x4, 0x4);
  605. kgsl_regrmw(device, GEN7_CP_BV_CHICKEN_DBG, 0x4, 0x4);
  606. kgsl_snapshot_indexed_registers(device, snapshot,
  607. GEN7_CP_MEM_POOL_DBG_ADDR, GEN7_CP_MEM_POOL_DBG_DATA,
  608. 0, 0x2200);
  609. kgsl_snapshot_indexed_registers(device, snapshot,
  610. GEN7_CP_BV_MEM_POOL_DBG_ADDR, GEN7_CP_BV_MEM_POOL_DBG_DATA,
  611. 0, 0x2200);
  612. kgsl_regrmw(device, GEN7_CP_CHICKEN_DBG, 0x4, 0x0);
  613. kgsl_regrmw(device, GEN7_CP_BV_CHICKEN_DBG, 0x4, 0x0);
  614. }
  615. static unsigned int gen7_read_dbgahb(struct kgsl_device *device,
  616. unsigned int regbase, unsigned int reg)
  617. {
  618. unsigned int val;
  619. kgsl_regread(device, (GEN7_SP_AHB_READ_APERTURE + reg - regbase), &val);
  620. return val;
  621. }
  622. static size_t gen7_legacy_snapshot_cluster_dbgahb(struct kgsl_device *device,
  623. u8 *buf, size_t remain, void *priv)
  624. {
  625. struct kgsl_snapshot_mvc_regs_v2 *header =
  626. (struct kgsl_snapshot_mvc_regs_v2 *)buf;
  627. struct gen7_sptp_cluster_registers *cluster =
  628. (struct gen7_sptp_cluster_registers *)priv;
  629. const u32 *ptr = cluster->regs;
  630. unsigned int read_sel;
  631. unsigned int *data = (unsigned int *)(buf + sizeof(*header));
  632. int j;
  633. unsigned int size = adreno_snapshot_regs_count(ptr) * 4;
  634. if (remain < (sizeof(*header) + size)) {
  635. SNAPSHOT_ERR_NOMEM(device, "MVC REGISTERS");
  636. return 0;
  637. }
  638. header->ctxt_id = cluster->context_id;
  639. header->cluster_id = cluster->cluster_id;
  640. header->pipe_id = cluster->pipe_id;
  641. header->location_id = cluster->location_id;
  642. read_sel = GEN7_SP_READ_SEL_VAL(cluster->location_id, cluster->pipe_id,
  643. cluster->statetype, 0, 0);
  644. kgsl_regwrite(device, GEN7_SP_READ_SEL, read_sel);
  645. /*
  646. * An explicit barrier is needed so that reads do not happen before
  647. * the register write.
  648. */
  649. mb();
  650. for (ptr = cluster->regs; ptr[0] != UINT_MAX; ptr += 2) {
  651. unsigned int count = REG_COUNT(ptr);
  652. if (count == 1)
  653. *data++ = ptr[0];
  654. else {
  655. *data++ = ptr[0] | (1 << 31);
  656. *data++ = ptr[1];
  657. }
  658. for (j = ptr[0]; j <= ptr[1]; j++)
  659. *data++ = gen7_read_dbgahb(device, cluster->regbase, j);
  660. }
  661. return (size + sizeof(*header));
  662. }
  663. static size_t gen7_snapshot_cluster_dbgahb(struct kgsl_device *device, u8 *buf,
  664. size_t remain, void *priv)
  665. {
  666. struct kgsl_snapshot_mvc_regs_v2 *header =
  667. (struct kgsl_snapshot_mvc_regs_v2 *)buf;
  668. struct gen7_sptp_cluster_registers *cluster =
  669. (struct gen7_sptp_cluster_registers *)priv;
  670. const u32 *ptr = cluster->regs;
  671. unsigned int *data = (unsigned int *)(buf + sizeof(*header));
  672. unsigned int *src;
  673. unsigned int size = adreno_snapshot_regs_count(ptr) * 4;
  674. if (remain < (sizeof(*header) + size)) {
  675. SNAPSHOT_ERR_NOMEM(device, "REGISTERS");
  676. return 0;
  677. }
  678. header->ctxt_id = cluster->context_id;
  679. header->cluster_id = cluster->cluster_id;
  680. header->pipe_id = cluster->pipe_id;
  681. header->location_id = cluster->location_id;
  682. src = gen7_crashdump_registers->hostptr + cluster->offset;
  683. for (ptr = cluster->regs; ptr[0] != UINT_MAX; ptr += 2) {
  684. unsigned int cnt = REG_COUNT(ptr);
  685. if (cnt == 1)
  686. *data++ = ptr[0];
  687. else {
  688. *data++ = ptr[0] | (1 << 31);
  689. *data++ = ptr[1];
  690. }
  691. memcpy(data, src, cnt << 2);
  692. data += cnt;
  693. src += cnt;
  694. }
  695. return (size + sizeof(*header));
  696. }
  697. static void gen7_snapshot_dbgahb_regs(struct kgsl_device *device,
  698. struct kgsl_snapshot *snapshot)
  699. {
  700. int i;
  701. u64 *ptr, offset = 0;
  702. unsigned int count;
  703. struct gen7_sptp_cluster_registers *sptp_clusters = gen7_snapshot_block_list->sptp_clusters;
  704. size_t num_sptp_clusters = gen7_snapshot_block_list->num_sptp_clusters;
  705. size_t (*func)(struct kgsl_device *device, u8 *buf, size_t remain,
  706. void *priv) = gen7_legacy_snapshot_cluster_dbgahb;
  707. if (CD_SCRIPT_CHECK(device)) {
  708. for (i = 0; i < num_sptp_clusters; i++)
  709. kgsl_snapshot_add_section(device,
  710. KGSL_SNAPSHOT_SECTION_MVC_V2, snapshot, func,
  711. &sptp_clusters[i]);
  712. return;
  713. }
  714. /* Build the crash script */
  715. ptr = gen7_capturescript->hostptr;
  716. for (i = 0; i < num_sptp_clusters; i++) {
  717. struct gen7_sptp_cluster_registers *cluster = &sptp_clusters[i];
  718. const u32 *regs = cluster->regs;
  719. cluster->offset = offset;
  720. /* Program the aperture */
  721. ptr += CD_WRITE(ptr, GEN7_SP_READ_SEL, GEN7_SP_READ_SEL_VAL
  722. (cluster->location_id, cluster->pipe_id, cluster->statetype, 0, 0));
  723. for (; regs[0] != UINT_MAX; regs += 2) {
  724. count = REG_COUNT(regs);
  725. ptr += CD_READ(ptr, (GEN7_SP_AHB_READ_APERTURE +
  726. regs[0] - cluster->regbase), count,
  727. (gen7_crashdump_registers->gpuaddr + offset));
  728. offset += count * sizeof(unsigned int);
  729. }
  730. }
  731. /* Marker for end of script */
  732. CD_FINISH(ptr, offset);
  733. /* Try to run the crash dumper */
  734. if (_gen7_do_crashdump(device))
  735. func = gen7_snapshot_cluster_dbgahb;
  736. /* Capture the registers in snapshot */
  737. for (i = 0; i < num_sptp_clusters; i++)
  738. kgsl_snapshot_add_section(device,
  739. KGSL_SNAPSHOT_SECTION_MVC_V2, snapshot, func, &sptp_clusters[i]);
  740. }
  741. static size_t gen7_legacy_snapshot_mvc(struct kgsl_device *device, u8 *buf,
  742. size_t remain, void *priv)
  743. {
  744. struct kgsl_snapshot_mvc_regs_v2 *header =
  745. (struct kgsl_snapshot_mvc_regs_v2 *)buf;
  746. unsigned int *data = (unsigned int *)(buf + sizeof(*header));
  747. struct gen7_cluster_registers *cluster =
  748. (struct gen7_cluster_registers *)priv;
  749. const u32 *ptr = cluster->regs;
  750. unsigned int j;
  751. unsigned int size = adreno_snapshot_regs_count(ptr) * 4;
  752. if (remain < (sizeof(*header) + size)) {
  753. SNAPSHOT_ERR_NOMEM(device, "MVC REGISTERS");
  754. return 0;
  755. }
  756. header->ctxt_id = (cluster->context_id == STATE_FORCE_CTXT_1) ? 1 : 0;
  757. header->cluster_id = cluster->cluster_id;
  758. header->pipe_id = cluster->pipe_id;
  759. header->location_id = UINT_MAX;
  760. /*
  761. * Set the AHB control for the Host to read from the
  762. * cluster/context for this iteration.
  763. */
  764. kgsl_regwrite(device, GEN7_CP_APERTURE_CNTL_HOST, GEN7_CP_APERTURE_REG_VAL
  765. (cluster->pipe_id, cluster->cluster_id, cluster->context_id));
  766. if (cluster->sel)
  767. kgsl_regwrite(device, cluster->sel->host_reg, cluster->sel->val);
  768. for (ptr = cluster->regs; ptr[0] != UINT_MAX; ptr += 2) {
  769. unsigned int count = REG_COUNT(ptr);
  770. if (count == 1)
  771. *data++ = ptr[0];
  772. else {
  773. *data++ = ptr[0] | (1 << 31);
  774. *data++ = ptr[1];
  775. }
  776. for (j = ptr[0]; j <= ptr[1]; j++) {
  777. kgsl_regread(device, j, data);
  778. data++;
  779. }
  780. }
  781. return (size + sizeof(*header));
  782. }
  783. static size_t gen7_snapshot_mvc(struct kgsl_device *device, u8 *buf,
  784. size_t remain, void *priv)
  785. {
  786. struct kgsl_snapshot_mvc_regs_v2 *header =
  787. (struct kgsl_snapshot_mvc_regs_v2 *)buf;
  788. struct gen7_cluster_registers *cluster =
  789. (struct gen7_cluster_registers *)priv;
  790. const u32 *ptr = cluster->regs;
  791. unsigned int *data = (unsigned int *)(buf + sizeof(*header));
  792. unsigned int *src;
  793. unsigned int cnt;
  794. unsigned int size = adreno_snapshot_regs_count(ptr) * 4;
  795. if (remain < (sizeof(*header) + size)) {
  796. SNAPSHOT_ERR_NOMEM(device, "MVC REGISTERS");
  797. return 0;
  798. }
  799. header->ctxt_id = (cluster->context_id == STATE_FORCE_CTXT_1) ? 1 : 0;
  800. header->cluster_id = cluster->cluster_id;
  801. header->pipe_id = cluster->pipe_id;
  802. header->location_id = UINT_MAX;
  803. src = gen7_crashdump_registers->hostptr + cluster->offset;
  804. for (ptr = cluster->regs; ptr[0] != UINT_MAX; ptr += 2) {
  805. cnt = REG_COUNT(ptr);
  806. if (cnt == 1)
  807. *data++ = ptr[0];
  808. else {
  809. *data++ = ptr[0] | (1 << 31);
  810. *data++ = ptr[1];
  811. }
  812. memcpy(data, src, cnt << 2);
  813. src += cnt;
  814. data += cnt;
  815. }
  816. return (size + sizeof(*header));
  817. }
  818. static void gen7_snapshot_mvc_regs(struct kgsl_device *device,
  819. struct kgsl_snapshot *snapshot)
  820. {
  821. int i;
  822. u64 *ptr, offset = 0;
  823. unsigned int count;
  824. struct gen7_cluster_registers *clusters = gen7_snapshot_block_list->clusters;
  825. size_t num_clusters = gen7_snapshot_block_list->num_clusters;
  826. size_t (*func)(struct kgsl_device *device, u8 *buf,
  827. size_t remain, void *priv) = gen7_legacy_snapshot_mvc;
  828. if (CD_SCRIPT_CHECK(device)) {
  829. for (i = 0; i < num_clusters; i++)
  830. kgsl_snapshot_add_section(device,
  831. KGSL_SNAPSHOT_SECTION_MVC_V2, snapshot, func, &clusters[i]);
  832. return;
  833. }
  834. /* Build the crash script */
  835. ptr = gen7_capturescript->hostptr;
  836. for (i = 0; i < num_clusters; i++) {
  837. struct gen7_cluster_registers *cluster = &clusters[i];
  838. const u32 *regs = cluster->regs;
  839. cluster->offset = offset;
  840. ptr += CD_WRITE(ptr, GEN7_CP_APERTURE_CNTL_CD, GEN7_CP_APERTURE_REG_VAL
  841. (cluster->pipe_id, cluster->cluster_id, cluster->context_id));
  842. if (cluster->sel)
  843. ptr += CD_WRITE(ptr, cluster->sel->cd_reg, cluster->sel->val);
  844. for (; regs[0] != UINT_MAX; regs += 2) {
  845. count = REG_COUNT(regs);
  846. ptr += CD_READ(ptr, regs[0],
  847. count, (gen7_crashdump_registers->gpuaddr + offset));
  848. offset += count * sizeof(unsigned int);
  849. }
  850. }
  851. /* Marker for end of script */
  852. CD_FINISH(ptr, offset);
  853. /* Try to run the crash dumper */
  854. if (_gen7_do_crashdump(device))
  855. func = gen7_snapshot_mvc;
  856. for (i = 0; i < num_clusters; i++)
  857. kgsl_snapshot_add_section(device,
  858. KGSL_SNAPSHOT_SECTION_MVC_V2, snapshot, func, &clusters[i]);
  859. }
  860. /* gen7_dbgc_debug_bus_read() - Read data from trace bus */
  861. static void gen7_dbgc_debug_bus_read(struct kgsl_device *device,
  862. unsigned int block_id, unsigned int index, unsigned int *val)
  863. {
  864. unsigned int reg;
  865. reg = FIELD_PREP(GENMASK(7, 0), index) |
  866. FIELD_PREP(GENMASK(24, 16), block_id);
  867. kgsl_regwrite(device, GEN7_DBGC_CFG_DBGBUS_SEL_A, reg);
  868. kgsl_regwrite(device, GEN7_DBGC_CFG_DBGBUS_SEL_B, reg);
  869. kgsl_regwrite(device, GEN7_DBGC_CFG_DBGBUS_SEL_C, reg);
  870. kgsl_regwrite(device, GEN7_DBGC_CFG_DBGBUS_SEL_D, reg);
  871. /*
  872. * There needs to be a delay of 1 us to ensure enough time for correct
  873. * data is funneled into the trace buffer
  874. */
  875. udelay(1);
  876. kgsl_regread(device, GEN7_DBGC_CFG_DBGBUS_TRACE_BUF2, val);
  877. val++;
  878. kgsl_regread(device, GEN7_DBGC_CFG_DBGBUS_TRACE_BUF1, val);
  879. }
  880. /* gen7_snapshot_dbgc_debugbus_block() - Capture debug data for a gpu block */
  881. static size_t gen7_snapshot_dbgc_debugbus_block(struct kgsl_device *device,
  882. u8 *buf, size_t remain, void *priv)
  883. {
  884. struct kgsl_snapshot_debugbus *header =
  885. (struct kgsl_snapshot_debugbus *)buf;
  886. const u32 *block = priv;
  887. int i;
  888. unsigned int *data = (unsigned int *)(buf + sizeof(*header));
  889. if (remain < GEN7_DEBUGBUS_SECTION_SIZE) {
  890. SNAPSHOT_ERR_NOMEM(device, "DEBUGBUS");
  891. return 0;
  892. }
  893. header->id = *block;
  894. header->count = GEN7_DEBUGBUS_BLOCK_SIZE * 2;
  895. for (i = 0; i < GEN7_DEBUGBUS_BLOCK_SIZE; i++)
  896. gen7_dbgc_debug_bus_read(device, *block, i, &data[i*2]);
  897. return GEN7_DEBUGBUS_SECTION_SIZE;
  898. }
  899. static u32 gen7_dbgc_side_debug_bus_read(struct kgsl_device *device,
  900. unsigned int block_id, unsigned int index)
  901. {
  902. u32 val;
  903. unsigned int reg = FIELD_PREP(GENMASK(7, 0), index) |
  904. FIELD_PREP(GENMASK(24, 16), block_id);
  905. kgsl_regwrite(device, GEN7_DBGC_CFG_DBGBUS_SEL_A, reg);
  906. kgsl_regwrite(device, GEN7_DBGC_CFG_DBGBUS_SEL_B, reg);
  907. kgsl_regwrite(device, GEN7_DBGC_CFG_DBGBUS_SEL_C, reg);
  908. kgsl_regwrite(device, GEN7_DBGC_CFG_DBGBUS_SEL_D, reg);
  909. /*
  910. * There needs to be a delay of 1 us to ensure enough time for correct
  911. * data is funneled into the trace buffer
  912. */
  913. udelay(1);
  914. val = kgsl_regmap_read(&device->regmap, GEN7_DBGC_CFG_DBGBUS_OVER);
  915. return FIELD_GET(GENMASK(27, 24), val);
  916. }
  917. static size_t gen7_snapshot_dbgc_side_debugbus_block(struct kgsl_device *device,
  918. u8 *buf, size_t remain, void *priv)
  919. {
  920. struct kgsl_snapshot_side_debugbus *header =
  921. (struct kgsl_snapshot_side_debugbus *)buf;
  922. const u32 *block = priv;
  923. int i;
  924. unsigned int *data = (unsigned int *)(buf + sizeof(*header));
  925. size_t size = (GEN7_DEBUGBUS_BLOCK_SIZE * sizeof(unsigned int)) + sizeof(*header);
  926. if (remain < size) {
  927. SNAPSHOT_ERR_NOMEM(device, "DEBUGBUS");
  928. return 0;
  929. }
  930. header->id = *block;
  931. header->size = GEN7_DEBUGBUS_BLOCK_SIZE;
  932. header->valid_data = 0x4;
  933. for (i = 0; i < GEN7_DEBUGBUS_BLOCK_SIZE; i++)
  934. data[i] = gen7_dbgc_side_debug_bus_read(device, *block, i);
  935. return size;
  936. }
  937. /* gen7_cx_dbgc_debug_bus_read() - Read data from trace bus */
  938. static void gen7_cx_debug_bus_read(struct kgsl_device *device,
  939. unsigned int block_id, unsigned int index, unsigned int *val)
  940. {
  941. unsigned int reg;
  942. reg = FIELD_PREP(GENMASK(7, 0), index) |
  943. FIELD_PREP(GENMASK(24, 16), block_id);
  944. kgsl_regwrite(device, GEN7_CX_DBGC_CFG_DBGBUS_SEL_A, reg);
  945. kgsl_regwrite(device, GEN7_CX_DBGC_CFG_DBGBUS_SEL_B, reg);
  946. kgsl_regwrite(device, GEN7_CX_DBGC_CFG_DBGBUS_SEL_C, reg);
  947. kgsl_regwrite(device, GEN7_CX_DBGC_CFG_DBGBUS_SEL_D, reg);
  948. /*
  949. * There needs to be a delay of 1 us to ensure enough time for correct
  950. * data is funneled into the trace buffer
  951. */
  952. udelay(1);
  953. kgsl_regread(device, GEN7_CX_DBGC_CFG_DBGBUS_TRACE_BUF2, val);
  954. val++;
  955. kgsl_regread(device, GEN7_CX_DBGC_CFG_DBGBUS_TRACE_BUF1, val);
  956. }
  957. /*
  958. * gen7_snapshot_cx_dbgc_debugbus_block() - Capture debug data for a gpu
  959. * block from the CX DBGC block
  960. */
  961. static size_t gen7_snapshot_cx_dbgc_debugbus_block(struct kgsl_device *device,
  962. u8 *buf, size_t remain, void *priv)
  963. {
  964. struct kgsl_snapshot_debugbus *header =
  965. (struct kgsl_snapshot_debugbus *)buf;
  966. const u32 *block = priv;
  967. int i;
  968. unsigned int *data = (unsigned int *)(buf + sizeof(*header));
  969. if (remain < GEN7_DEBUGBUS_SECTION_SIZE) {
  970. SNAPSHOT_ERR_NOMEM(device, "DEBUGBUS");
  971. return 0;
  972. }
  973. header->id = *block;
  974. header->count = GEN7_DEBUGBUS_BLOCK_SIZE * 2;
  975. for (i = 0; i < GEN7_DEBUGBUS_BLOCK_SIZE; i++)
  976. gen7_cx_debug_bus_read(device, *block, i, &data[i*2]);
  977. return GEN7_DEBUGBUS_SECTION_SIZE;
  978. }
  979. /* gen7_cx_side_dbgc_debug_bus_read() - Read data from trace bus */
  980. static void gen7_cx_side_debug_bus_read(struct kgsl_device *device,
  981. unsigned int block_id, unsigned int index, unsigned int *val)
  982. {
  983. unsigned int reg = FIELD_PREP(GENMASK(7, 0), index) |
  984. FIELD_PREP(GENMASK(24, 16), block_id);
  985. kgsl_regwrite(device, GEN7_CX_DBGC_CFG_DBGBUS_SEL_A, reg);
  986. kgsl_regwrite(device, GEN7_CX_DBGC_CFG_DBGBUS_SEL_B, reg);
  987. kgsl_regwrite(device, GEN7_CX_DBGC_CFG_DBGBUS_SEL_C, reg);
  988. kgsl_regwrite(device, GEN7_CX_DBGC_CFG_DBGBUS_SEL_D, reg);
  989. /*
  990. * There needs to be a delay of 1 us to ensure enough time for correct
  991. * data is funneled into the trace buffer
  992. */
  993. udelay(1);
  994. kgsl_regread(device, GEN7_CX_DBGC_CFG_DBGBUS_OVER, &reg);
  995. *val = FIELD_GET(GENMASK(27, 24), reg);
  996. }
  997. /*
  998. * gen7_snapshot_cx_dbgc_debugbus_block() - Capture debug data for a gpu
  999. * block from the CX DBGC block
  1000. */
  1001. static size_t gen7_snapshot_cx_side_dbgc_debugbus_block(struct kgsl_device *device,
  1002. u8 *buf, size_t remain, void *priv)
  1003. {
  1004. struct kgsl_snapshot_side_debugbus *header =
  1005. (struct kgsl_snapshot_side_debugbus *)buf;
  1006. const u32 *block = priv;
  1007. int i;
  1008. unsigned int *data = (unsigned int *)(buf + sizeof(*header));
  1009. size_t size = (GEN7_DEBUGBUS_BLOCK_SIZE * sizeof(unsigned int)) + sizeof(*header);
  1010. if (remain < size) {
  1011. SNAPSHOT_ERR_NOMEM(device, "DEBUGBUS");
  1012. return 0;
  1013. }
  1014. header->id = *block;
  1015. header->size = GEN7_DEBUGBUS_BLOCK_SIZE;
  1016. header->valid_data = 0x4;
  1017. for (i = 0; i < GEN7_DEBUGBUS_BLOCK_SIZE; i++)
  1018. gen7_cx_side_debug_bus_read(device, *block, i, &data[i]);
  1019. return size;
  1020. }
  1021. /* gen7_snapshot_debugbus() - Capture debug bus data */
  1022. static void gen7_snapshot_debugbus(struct adreno_device *adreno_dev,
  1023. struct kgsl_snapshot *snapshot)
  1024. {
  1025. int i;
  1026. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  1027. kgsl_regwrite(device, GEN7_DBGC_CFG_DBGBUS_CNTLT,
  1028. FIELD_PREP(GENMASK(31, 28), 0xf));
  1029. kgsl_regwrite(device, GEN7_DBGC_CFG_DBGBUS_CNTLM,
  1030. FIELD_PREP(GENMASK(27, 24), 0xf));
  1031. kgsl_regwrite(device, GEN7_DBGC_CFG_DBGBUS_IVTL_0, 0);
  1032. kgsl_regwrite(device, GEN7_DBGC_CFG_DBGBUS_IVTL_1, 0);
  1033. kgsl_regwrite(device, GEN7_DBGC_CFG_DBGBUS_IVTL_2, 0);
  1034. kgsl_regwrite(device, GEN7_DBGC_CFG_DBGBUS_IVTL_3, 0);
  1035. kgsl_regwrite(device, GEN7_DBGC_CFG_DBGBUS_BYTEL_0,
  1036. FIELD_PREP(GENMASK(3, 0), 0x0) |
  1037. FIELD_PREP(GENMASK(7, 4), 0x1) |
  1038. FIELD_PREP(GENMASK(11, 8), 0x2) |
  1039. FIELD_PREP(GENMASK(15, 12), 0x3) |
  1040. FIELD_PREP(GENMASK(19, 16), 0x4) |
  1041. FIELD_PREP(GENMASK(23, 20), 0x5) |
  1042. FIELD_PREP(GENMASK(27, 24), 0x6) |
  1043. FIELD_PREP(GENMASK(31, 28), 0x7));
  1044. kgsl_regwrite(device, GEN7_DBGC_CFG_DBGBUS_BYTEL_1,
  1045. FIELD_PREP(GENMASK(3, 0), 0x8) |
  1046. FIELD_PREP(GENMASK(7, 4), 0x9) |
  1047. FIELD_PREP(GENMASK(11, 8), 0xa) |
  1048. FIELD_PREP(GENMASK(15, 12), 0xb) |
  1049. FIELD_PREP(GENMASK(19, 16), 0xc) |
  1050. FIELD_PREP(GENMASK(23, 20), 0xd) |
  1051. FIELD_PREP(GENMASK(27, 24), 0xe) |
  1052. FIELD_PREP(GENMASK(31, 28), 0xf));
  1053. kgsl_regwrite(device, GEN7_DBGC_CFG_DBGBUS_MASKL_0, 0);
  1054. kgsl_regwrite(device, GEN7_DBGC_CFG_DBGBUS_MASKL_1, 0);
  1055. kgsl_regwrite(device, GEN7_DBGC_CFG_DBGBUS_MASKL_2, 0);
  1056. kgsl_regwrite(device, GEN7_DBGC_CFG_DBGBUS_MASKL_3, 0);
  1057. kgsl_regwrite(device, GEN7_CX_DBGC_CFG_DBGBUS_CNTLT,
  1058. FIELD_PREP(GENMASK(31, 28), 0xf));
  1059. kgsl_regwrite(device, GEN7_CX_DBGC_CFG_DBGBUS_CNTLM,
  1060. FIELD_PREP(GENMASK(27, 24), 0xf));
  1061. kgsl_regwrite(device, GEN7_CX_DBGC_CFG_DBGBUS_IVTL_0, 0);
  1062. kgsl_regwrite(device, GEN7_CX_DBGC_CFG_DBGBUS_IVTL_1, 0);
  1063. kgsl_regwrite(device, GEN7_CX_DBGC_CFG_DBGBUS_IVTL_2, 0);
  1064. kgsl_regwrite(device, GEN7_CX_DBGC_CFG_DBGBUS_IVTL_3, 0);
  1065. kgsl_regwrite(device, GEN7_CX_DBGC_CFG_DBGBUS_BYTEL_0,
  1066. FIELD_PREP(GENMASK(3, 0), 0x0) |
  1067. FIELD_PREP(GENMASK(7, 4), 0x1) |
  1068. FIELD_PREP(GENMASK(11, 8), 0x2) |
  1069. FIELD_PREP(GENMASK(15, 12), 0x3) |
  1070. FIELD_PREP(GENMASK(19, 16), 0x4) |
  1071. FIELD_PREP(GENMASK(23, 20), 0x5) |
  1072. FIELD_PREP(GENMASK(27, 24), 0x6) |
  1073. FIELD_PREP(GENMASK(31, 28), 0x7));
  1074. kgsl_regwrite(device, GEN7_CX_DBGC_CFG_DBGBUS_BYTEL_1,
  1075. FIELD_PREP(GENMASK(3, 0), 0x8) |
  1076. FIELD_PREP(GENMASK(7, 4), 0x9) |
  1077. FIELD_PREP(GENMASK(11, 8), 0xa) |
  1078. FIELD_PREP(GENMASK(15, 12), 0xb) |
  1079. FIELD_PREP(GENMASK(19, 16), 0xc) |
  1080. FIELD_PREP(GENMASK(23, 20), 0xd) |
  1081. FIELD_PREP(GENMASK(27, 24), 0xe) |
  1082. FIELD_PREP(GENMASK(31, 28), 0xf));
  1083. kgsl_regwrite(device, GEN7_CX_DBGC_CFG_DBGBUS_MASKL_0, 0);
  1084. kgsl_regwrite(device, GEN7_CX_DBGC_CFG_DBGBUS_MASKL_1, 0);
  1085. kgsl_regwrite(device, GEN7_CX_DBGC_CFG_DBGBUS_MASKL_2, 0);
  1086. kgsl_regwrite(device, GEN7_CX_DBGC_CFG_DBGBUS_MASKL_3, 0);
  1087. for (i = 0; i < gen7_snapshot_block_list->debugbus_blocks_len; i++) {
  1088. kgsl_snapshot_add_section(device,
  1089. KGSL_SNAPSHOT_SECTION_DEBUGBUS,
  1090. snapshot, gen7_snapshot_dbgc_debugbus_block,
  1091. (void *) &gen7_snapshot_block_list->debugbus_blocks[i]);
  1092. kgsl_snapshot_add_section(device,
  1093. KGSL_SNAPSHOT_SECTION_SIDE_DEBUGBUS,
  1094. snapshot, gen7_snapshot_dbgc_side_debugbus_block,
  1095. (void *) &gen7_snapshot_block_list->debugbus_blocks[i]);
  1096. }
  1097. for (i = 0; i < gen7_snapshot_block_list->gbif_debugbus_blocks_len; i++) {
  1098. kgsl_snapshot_add_section(device,
  1099. KGSL_SNAPSHOT_SECTION_DEBUGBUS,
  1100. snapshot, gen7_snapshot_dbgc_debugbus_block,
  1101. (void *) &gen7_snapshot_block_list->gbif_debugbus_blocks[i]);
  1102. kgsl_snapshot_add_section(device,
  1103. KGSL_SNAPSHOT_SECTION_SIDE_DEBUGBUS,
  1104. snapshot, gen7_snapshot_dbgc_side_debugbus_block,
  1105. (void *) &gen7_snapshot_block_list->gbif_debugbus_blocks[i]);
  1106. }
  1107. /* Dump the CX debugbus data if the block exists */
  1108. if (kgsl_regmap_valid_offset(&device->regmap, GEN7_CX_DBGC_CFG_DBGBUS_SEL_A)) {
  1109. for (i = 0; i < gen7_snapshot_block_list->cx_debugbus_blocks_len; i++) {
  1110. kgsl_snapshot_add_section(device,
  1111. KGSL_SNAPSHOT_SECTION_DEBUGBUS,
  1112. snapshot, gen7_snapshot_cx_dbgc_debugbus_block,
  1113. (void *) &gen7_snapshot_block_list->cx_debugbus_blocks[i]);
  1114. kgsl_snapshot_add_section(device,
  1115. KGSL_SNAPSHOT_SECTION_SIDE_DEBUGBUS,
  1116. snapshot, gen7_snapshot_cx_side_dbgc_debugbus_block,
  1117. (void *) &gen7_snapshot_block_list->cx_debugbus_blocks[i]);
  1118. }
  1119. }
  1120. }
  1121. /* gen7_snapshot_sqe() - Dump SQE data in snapshot */
  1122. static size_t gen7_snapshot_sqe(struct kgsl_device *device, u8 *buf,
  1123. size_t remain, void *priv)
  1124. {
  1125. struct adreno_device *adreno_dev = ADRENO_DEVICE(device);
  1126. struct kgsl_snapshot_debug *header = (struct kgsl_snapshot_debug *)buf;
  1127. unsigned int *data = (unsigned int *)(buf + sizeof(*header));
  1128. struct adreno_firmware *fw = ADRENO_FW(adreno_dev, ADRENO_FW_SQE);
  1129. if (remain < DEBUG_SECTION_SZ(GEN7_SQE_FW_SNAPSHOT_DWORDS)) {
  1130. SNAPSHOT_ERR_NOMEM(device, "SQE VERSION DEBUG");
  1131. return 0;
  1132. }
  1133. /* Dump the SQE firmware version */
  1134. header->type = SNAPSHOT_DEBUG_SQE_VERSION;
  1135. header->size = GEN7_SQE_FW_SNAPSHOT_DWORDS;
  1136. memcpy(data, fw->memdesc->hostptr, (GEN7_SQE_FW_SNAPSHOT_DWORDS * sizeof(u32)));
  1137. return DEBUG_SECTION_SZ(GEN7_SQE_FW_SNAPSHOT_DWORDS);
  1138. }
  1139. /* gen7_snapshot_aqe() - Dump AQE data in snapshot */
  1140. static size_t gen7_snapshot_aqe(struct kgsl_device *device, u8 *buf,
  1141. size_t remain, void *priv)
  1142. {
  1143. struct adreno_device *adreno_dev = ADRENO_DEVICE(device);
  1144. struct kgsl_snapshot_debug *header = (struct kgsl_snapshot_debug *)buf;
  1145. u32 *data = (unsigned int *)(buf + sizeof(*header));
  1146. struct adreno_firmware *fw = ADRENO_FW(adreno_dev, ADRENO_FW_AQE);
  1147. if (!ADRENO_FEATURE(adreno_dev, ADRENO_AQE))
  1148. return 0;
  1149. if (remain < DEBUG_SECTION_SZ(1)) {
  1150. SNAPSHOT_ERR_NOMEM(device, "AQE VERSION DEBUG");
  1151. return 0;
  1152. }
  1153. /* Dump the AQE firmware version */
  1154. header->type = SNAPSHOT_DEBUG_AQE_VERSION;
  1155. header->size = 1;
  1156. *data = fw->version;
  1157. return DEBUG_SECTION_SZ(1);
  1158. }
  1159. /* Snapshot the preemption related buffers */
  1160. static size_t snapshot_preemption_record(struct kgsl_device *device,
  1161. u8 *buf, size_t remain, void *priv)
  1162. {
  1163. struct kgsl_memdesc *memdesc = priv;
  1164. struct kgsl_snapshot_gpu_object_v2 *header =
  1165. (struct kgsl_snapshot_gpu_object_v2 *)buf;
  1166. u8 *ptr = buf + sizeof(*header);
  1167. const struct adreno_gen7_core *gpucore = to_gen7_core(ADRENO_DEVICE(device));
  1168. u64 ctxt_record_size = GEN7_CP_CTXRECORD_SIZE_IN_BYTES;
  1169. if (gpucore->ctxt_record_size)
  1170. ctxt_record_size = gpucore->ctxt_record_size;
  1171. ctxt_record_size = min_t(u64, ctxt_record_size, device->snapshot_ctxt_record_size);
  1172. if (remain < (ctxt_record_size + sizeof(*header))) {
  1173. SNAPSHOT_ERR_NOMEM(device, "PREEMPTION RECORD");
  1174. return 0;
  1175. }
  1176. header->size = ctxt_record_size >> 2;
  1177. header->gpuaddr = memdesc->gpuaddr;
  1178. header->ptbase =
  1179. kgsl_mmu_pagetable_get_ttbr0(device->mmu.defaultpagetable);
  1180. header->type = SNAPSHOT_GPU_OBJECT_GLOBAL;
  1181. memcpy(ptr, memdesc->hostptr, ctxt_record_size);
  1182. return ctxt_record_size + sizeof(*header);
  1183. }
  1184. static void gen7_reglist_snapshot(struct kgsl_device *device,
  1185. struct kgsl_snapshot *snapshot)
  1186. {
  1187. u64 *ptr, offset = 0;
  1188. int i;
  1189. u32 r;
  1190. struct gen7_reg_list *reg_list = gen7_snapshot_block_list->reg_list;
  1191. size_t (*func)(struct kgsl_device *device, u8 *buf, size_t remain,
  1192. void *priv) = gen7_legacy_snapshot_registers;
  1193. if (CD_SCRIPT_CHECK(device)) {
  1194. for (i = 0; reg_list[i].regs; i++)
  1195. kgsl_snapshot_add_section(device, KGSL_SNAPSHOT_SECTION_REGS_V2,
  1196. snapshot, func, &reg_list[i]);
  1197. return;
  1198. }
  1199. /* Build the crash script */
  1200. ptr = (u64 *)gen7_capturescript->hostptr;
  1201. for (i = 0; reg_list[i].regs; i++) {
  1202. struct gen7_reg_list *regs = &reg_list[i];
  1203. const u32 *regs_ptr = regs->regs;
  1204. regs->offset = offset;
  1205. /* Program the SEL_CNTL_CD register appropriately */
  1206. if (regs->sel)
  1207. ptr += CD_WRITE(ptr, regs->sel->cd_reg, regs->sel->val);
  1208. for (; regs_ptr[0] != UINT_MAX; regs_ptr += 2) {
  1209. r = REG_COUNT(regs_ptr);
  1210. ptr += CD_READ(ptr, regs_ptr[0], r,
  1211. (gen7_crashdump_registers->gpuaddr + offset));
  1212. offset += r * sizeof(u32);
  1213. }
  1214. }
  1215. /* Marker for end of script */
  1216. CD_FINISH(ptr, offset);
  1217. /* Try to run the crash dumper */
  1218. if (_gen7_do_crashdump(device))
  1219. func = gen7_snapshot_registers;
  1220. for (i = 0; reg_list[i].regs; i++)
  1221. kgsl_snapshot_add_section(device, KGSL_SNAPSHOT_SECTION_REGS_V2,
  1222. snapshot, func, &reg_list[i]);
  1223. }
  1224. static size_t gen7_snapshot_cx_misc_registers(struct kgsl_device *device, u8 *buf,
  1225. size_t remain, void *priv)
  1226. {
  1227. const u32 *ptr = (u32 *)priv;
  1228. u32 *src, *data = (unsigned int *)buf;
  1229. size_t size = adreno_snapshot_regs_count(ptr) * sizeof(u32);
  1230. if (remain < size) {
  1231. SNAPSHOT_ERR_NOMEM(device, "CX_MISC REGISTERS");
  1232. return 0;
  1233. }
  1234. src = gen7_crashdump_registers->hostptr;
  1235. for (; ptr[0] != UINT_MAX; ptr += 2) {
  1236. u32 cnt = REG_COUNT(ptr);
  1237. if (cnt == 1)
  1238. *data++ = BIT(31) | ptr[0];
  1239. else {
  1240. *data++ = ptr[0];
  1241. *data++ = cnt;
  1242. }
  1243. memcpy(data, src, cnt << 2);
  1244. data += cnt;
  1245. src += cnt;
  1246. }
  1247. /* Return the size of the section */
  1248. return size;
  1249. }
  1250. static void gen7_cx_misc_regs_snapshot(struct kgsl_device *device,
  1251. struct kgsl_snapshot *snapshot)
  1252. {
  1253. u64 *ptr, offset = 0;
  1254. const u32 *regs_ptr = (const u32 *)gen7_snapshot_block_list->cx_misc_regs;
  1255. if (CD_SCRIPT_CHECK(device) || !adreno_gx_is_on(ADRENO_DEVICE(device)))
  1256. goto done;
  1257. /* Build the crash script */
  1258. ptr = (u64 *)gen7_capturescript->hostptr;
  1259. for (; regs_ptr[0] != UINT_MAX; regs_ptr += 2) {
  1260. u32 r = REG_COUNT(regs_ptr);
  1261. ptr += CD_READ(ptr, regs_ptr[0], r,
  1262. (gen7_crashdump_registers->gpuaddr + offset));
  1263. offset += r * sizeof(u32);
  1264. }
  1265. /* Marker for end of script */
  1266. CD_FINISH(ptr, offset);
  1267. /* Try to run the crash dumper */
  1268. if (_gen7_do_crashdump(device)) {
  1269. kgsl_snapshot_add_section(device, KGSL_SNAPSHOT_SECTION_REGS_V2,
  1270. snapshot, gen7_snapshot_cx_misc_registers,
  1271. (void *)gen7_snapshot_block_list->cx_misc_regs);
  1272. return;
  1273. }
  1274. done:
  1275. kgsl_snapshot_add_section(device, KGSL_SNAPSHOT_SECTION_REGS_V2,
  1276. snapshot, adreno_snapshot_cx_misc_registers,
  1277. (void *)gen7_snapshot_block_list->cx_misc_regs);
  1278. }
  1279. static void gen7_snapshot_br_roq(struct kgsl_device *device,
  1280. struct kgsl_snapshot *snapshot)
  1281. {
  1282. unsigned int roq_size;
  1283. /*
  1284. * CP ROQ dump units is 4 dwords. The number of units is stored
  1285. * in CP_ROQ_THRESHOLDS_2[31:20], but it is not accessible to
  1286. * host. Program the GEN7_CP_SQE_UCODE_DBG_ADDR with 0x70d3 offset
  1287. * and read the value CP_ROQ_THRESHOLDS_2 from
  1288. * GEN7_CP_SQE_UCODE_DBG_DATA
  1289. */
  1290. kgsl_regwrite(device, GEN7_CP_SQE_UCODE_DBG_ADDR, 0x70d3);
  1291. kgsl_regread(device, GEN7_CP_SQE_UCODE_DBG_DATA, &roq_size);
  1292. roq_size = roq_size >> 20;
  1293. kgsl_snapshot_indexed_registers(device, snapshot,
  1294. GEN7_CP_ROQ_DBG_ADDR, GEN7_CP_ROQ_DBG_DATA, 0, (roq_size << 2));
  1295. }
  1296. static void gen7_snapshot_bv_roq(struct kgsl_device *device,
  1297. struct kgsl_snapshot *snapshot)
  1298. {
  1299. unsigned int roq_size;
  1300. /*
  1301. * CP ROQ dump units is 4 dwords. The number of units is stored
  1302. * in CP_BV_ROQ_THRESHOLDS_2[31:20], but it is not accessible to
  1303. * host. Program the GEN7_CP_BV_SQE_UCODE_DBG_ADDR with 0x70d3 offset
  1304. * (at which CP stores the roq values) and read the value of
  1305. * CP_BV_ROQ_THRESHOLDS_2 from GEN7_CP_BV_SQE_UCODE_DBG_DATA
  1306. */
  1307. kgsl_regwrite(device, GEN7_CP_BV_SQE_UCODE_DBG_ADDR, 0x70d3);
  1308. kgsl_regread(device, GEN7_CP_BV_SQE_UCODE_DBG_DATA, &roq_size);
  1309. roq_size = roq_size >> 20;
  1310. kgsl_snapshot_indexed_registers(device, snapshot,
  1311. GEN7_CP_BV_ROQ_DBG_ADDR, GEN7_CP_BV_ROQ_DBG_DATA, 0, (roq_size << 2));
  1312. }
  1313. static void gen7_snapshot_lpac_roq(struct kgsl_device *device,
  1314. struct kgsl_snapshot *snapshot)
  1315. {
  1316. unsigned int roq_size;
  1317. /*
  1318. * CP ROQ dump units is 4 dwords. The number of units is stored
  1319. * in CP_LPAC_ROQ_THRESHOLDS_2[31:20], but it is not accessible to
  1320. * host. Program the GEN7_CP_SQE_AC_UCODE_DBG_ADDR with 0x70d3 offset
  1321. * (at which CP stores the roq values) and read the value of
  1322. * CP_LPAC_ROQ_THRESHOLDS_2 from GEN7_CP_SQE_AC_UCODE_DBG_DATA
  1323. */
  1324. kgsl_regwrite(device, GEN7_CP_SQE_AC_UCODE_DBG_ADDR, 0x70d3);
  1325. kgsl_regread(device, GEN7_CP_SQE_AC_UCODE_DBG_DATA, &roq_size);
  1326. roq_size = roq_size >> 20;
  1327. kgsl_snapshot_indexed_registers(device, snapshot,
  1328. GEN7_CP_LPAC_ROQ_DBG_ADDR, GEN7_CP_LPAC_ROQ_DBG_DATA, 0, (roq_size << 2));
  1329. }
  1330. void gen7_snapshot_external_core_regs(struct kgsl_device *device,
  1331. struct kgsl_snapshot *snapshot)
  1332. {
  1333. size_t i;
  1334. const u32 **external_core_regs;
  1335. unsigned int num_external_core_regs;
  1336. const struct adreno_gen7_core *gpucore = to_gen7_core(ADRENO_DEVICE(device));
  1337. gen7_snapshot_block_list = gpucore->gen7_snapshot_block_list;
  1338. external_core_regs = gen7_snapshot_block_list->external_core_regs;
  1339. num_external_core_regs = gen7_snapshot_block_list->num_external_core_regs;
  1340. for (i = 0; i < num_external_core_regs; i++) {
  1341. const u32 *regs = external_core_regs[i];
  1342. kgsl_snapshot_add_section(device, KGSL_SNAPSHOT_SECTION_REGS_V2,
  1343. snapshot, adreno_snapshot_registers_v2,
  1344. (void *) regs);
  1345. }
  1346. }
  1347. /*
  1348. * gen7_snapshot() - GEN7 GPU snapshot function
  1349. * @adreno_dev: Device being snapshotted
  1350. * @snapshot: Pointer to the snapshot instance
  1351. *
  1352. * This is where all of the GEN7 specific bits and pieces are grabbed
  1353. * into the snapshot memory
  1354. */
  1355. void gen7_snapshot(struct adreno_device *adreno_dev,
  1356. struct kgsl_snapshot *snapshot)
  1357. {
  1358. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  1359. struct adreno_ringbuffer *rb;
  1360. unsigned int i;
  1361. u32 hi, lo, cgc = 0, cgc1 = 0, cgc2 = 0;
  1362. const struct adreno_gen7_core *gpucore = to_gen7_core(ADRENO_DEVICE(device));
  1363. int is_current_rt;
  1364. gen7_crashdump_timedout = false;
  1365. gen7_snapshot_block_list = gpucore->gen7_snapshot_block_list;
  1366. /* External registers are dumped in the beginning of gmu snapshot */
  1367. if (!gmu_core_isenabled(device))
  1368. gen7_snapshot_external_core_regs(device, snapshot);
  1369. gen7_snapshot_trace_buffer(device, snapshot);
  1370. /*
  1371. * Dump debugbus data here to capture it for both
  1372. * GMU and GPU snapshot. Debugbus data can be accessed
  1373. * even if the gx headswitch is off. If gx
  1374. * headswitch is off, data for gx blocks will show as
  1375. * 0x5c00bd00. Disable clock gating for SP and TP to capture
  1376. * debugbus data.
  1377. */
  1378. if (!adreno_is_gen7_9_x(adreno_dev) && device->ftbl->is_hwcg_on(device)) {
  1379. kgsl_regread(device, GEN7_RBBM_CLOCK_CNTL2_SP0, &cgc);
  1380. kgsl_regread(device, GEN7_RBBM_CLOCK_CNTL_TP0, &cgc1);
  1381. kgsl_regread(device, GEN7_RBBM_CLOCK_CNTL3_TP0, &cgc2);
  1382. kgsl_regrmw(device, GEN7_RBBM_CLOCK_CNTL2_SP0, GENMASK(22, 20), 0);
  1383. kgsl_regrmw(device, GEN7_RBBM_CLOCK_CNTL_TP0, GENMASK(2, 0), 0);
  1384. kgsl_regrmw(device, GEN7_RBBM_CLOCK_CNTL3_TP0, GENMASK(14, 12), 0);
  1385. }
  1386. gen7_snapshot_debugbus(adreno_dev, snapshot);
  1387. /* Restore the value of the clockgating registers */
  1388. if (!adreno_is_gen7_9_x(adreno_dev) && device->ftbl->is_hwcg_on(device)) {
  1389. kgsl_regwrite(device, GEN7_RBBM_CLOCK_CNTL2_SP0, cgc);
  1390. kgsl_regwrite(device, GEN7_RBBM_CLOCK_CNTL_TP0, cgc1);
  1391. kgsl_regwrite(device, GEN7_RBBM_CLOCK_CNTL3_TP0, cgc2);
  1392. }
  1393. gen7_cx_misc_regs_snapshot(device, snapshot);
  1394. /* SQE Firmware */
  1395. kgsl_snapshot_add_section(device, KGSL_SNAPSHOT_SECTION_DEBUG,
  1396. snapshot, gen7_snapshot_sqe, NULL);
  1397. /* AQE Firmware */
  1398. kgsl_snapshot_add_section(device, KGSL_SNAPSHOT_SECTION_DEBUG,
  1399. snapshot, gen7_snapshot_aqe, NULL);
  1400. if (!adreno_gx_is_on(adreno_dev))
  1401. return;
  1402. is_current_rt = rt_task(current);
  1403. if (is_current_rt)
  1404. sched_set_normal(current, 0);
  1405. kgsl_regread(device, GEN7_CP_IB1_BASE, &lo);
  1406. kgsl_regread(device, GEN7_CP_IB1_BASE_HI, &hi);
  1407. snapshot->ib1base = (((u64) hi) << 32) | lo;
  1408. kgsl_regread(device, GEN7_CP_IB2_BASE, &lo);
  1409. kgsl_regread(device, GEN7_CP_IB2_BASE_HI, &hi);
  1410. snapshot->ib2base = (((u64) hi) << 32) | lo;
  1411. kgsl_regread(device, GEN7_CP_IB1_REM_SIZE, &snapshot->ib1size);
  1412. kgsl_regread(device, GEN7_CP_IB2_REM_SIZE, &snapshot->ib2size);
  1413. kgsl_regread(device, GEN7_CP_LPAC_IB1_BASE, &lo);
  1414. kgsl_regread(device, GEN7_CP_LPAC_IB1_BASE_HI, &hi);
  1415. snapshot->ib1base_lpac = (((u64) hi) << 32) | lo;
  1416. kgsl_regread(device, GEN7_CP_LPAC_IB2_BASE, &lo);
  1417. kgsl_regread(device, GEN7_CP_LPAC_IB2_BASE_HI, &hi);
  1418. snapshot->ib2base_lpac = (((u64) hi) << 32) | lo;
  1419. kgsl_regread(device, GEN7_CP_LPAC_IB1_REM_SIZE, &snapshot->ib1size_lpac);
  1420. kgsl_regread(device, GEN7_CP_LPAC_IB2_REM_SIZE, &snapshot->ib2size_lpac);
  1421. /* Assert the isStatic bit before triggering snapshot */
  1422. kgsl_regwrite(device, GEN7_RBBM_SNAPSHOT_STATUS, 0x1);
  1423. /* Dump the registers which get affected by crash dumper trigger */
  1424. kgsl_snapshot_add_section(device, KGSL_SNAPSHOT_SECTION_REGS_V2,
  1425. snapshot, adreno_snapshot_registers_v2,
  1426. (void *) gen7_snapshot_block_list->pre_crashdumper_regs);
  1427. gen7_reglist_snapshot(device, snapshot);
  1428. /*
  1429. * Need to program and save this register before capturing resource table
  1430. * to workaround a CGC issue
  1431. */
  1432. if (device->ftbl->is_hwcg_on(device)) {
  1433. kgsl_regread(device, GEN7_RBBM_CLOCK_MODE_CP, &cgc);
  1434. kgsl_regrmw(device, GEN7_RBBM_CLOCK_MODE_CP, 0x7, 0);
  1435. }
  1436. kgsl_snapshot_indexed_registers(device, snapshot,
  1437. GEN7_CP_RESOURCE_TABLE_DBG_ADDR, GEN7_CP_RESOURCE_TABLE_DBG_DATA,
  1438. 0, 0x4100);
  1439. /* Reprogram the register back to the original stored value */
  1440. if (device->ftbl->is_hwcg_on(device))
  1441. kgsl_regwrite(device, GEN7_RBBM_CLOCK_MODE_CP, cgc);
  1442. for (i = 0; i < gen7_snapshot_block_list->index_registers_len; i++)
  1443. kgsl_snapshot_indexed_registers(device, snapshot,
  1444. gen7_snapshot_block_list->index_registers[i].addr,
  1445. gen7_snapshot_block_list->index_registers[i].data, 0,
  1446. gen7_snapshot_block_list->index_registers[i].size);
  1447. if (!adreno_is_gen7_9_x(adreno_dev)) {
  1448. gen7_snapshot_br_roq(device, snapshot);
  1449. gen7_snapshot_bv_roq(device, snapshot);
  1450. gen7_snapshot_lpac_roq(device, snapshot);
  1451. }
  1452. /* Mempool debug data */
  1453. gen7_snapshot_mempool(device, snapshot);
  1454. /* MVC register section */
  1455. gen7_snapshot_mvc_regs(device, snapshot);
  1456. /* registers dumped through DBG AHB */
  1457. gen7_snapshot_dbgahb_regs(device, snapshot);
  1458. /* Shader memory */
  1459. gen7_snapshot_shader(device, snapshot);
  1460. kgsl_snapshot_add_section(device, KGSL_SNAPSHOT_SECTION_REGS_V2,
  1461. snapshot, adreno_snapshot_registers_v2,
  1462. (void *) gen7_snapshot_block_list->post_crashdumper_regs);
  1463. kgsl_regwrite(device, GEN7_RBBM_SNAPSHOT_STATUS, 0x0);
  1464. /* Preemption record */
  1465. if (adreno_is_preemption_enabled(adreno_dev)) {
  1466. FOR_EACH_RINGBUFFER(adreno_dev, rb, i) {
  1467. kgsl_snapshot_add_section(device,
  1468. KGSL_SNAPSHOT_SECTION_GPU_OBJECT_V2,
  1469. snapshot, snapshot_preemption_record,
  1470. rb->preemption_desc);
  1471. }
  1472. }
  1473. if (is_current_rt)
  1474. sched_set_fifo(current);
  1475. }
  1476. void gen7_crashdump_init(struct adreno_device *adreno_dev)
  1477. {
  1478. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  1479. if (IS_ERR_OR_NULL(gen7_capturescript))
  1480. gen7_capturescript = kgsl_allocate_global(device,
  1481. 3 * PAGE_SIZE, 0, KGSL_MEMFLAGS_GPUREADONLY,
  1482. KGSL_MEMDESC_PRIVILEGED, "capturescript");
  1483. if (IS_ERR(gen7_capturescript))
  1484. return;
  1485. if (IS_ERR_OR_NULL(gen7_crashdump_registers))
  1486. gen7_crashdump_registers = kgsl_allocate_global(device,
  1487. 25 * PAGE_SIZE, 0, 0, KGSL_MEMDESC_PRIVILEGED,
  1488. "capturescript_regs");
  1489. if (IS_ERR(gen7_crashdump_registers))
  1490. return;
  1491. }