adreno_gen7_hwsched.c 54 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063
  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 <linux/clk.h>
  7. #include <linux/component.h>
  8. #include <linux/cpufreq.h>
  9. #include <linux/interconnect.h>
  10. #include <linux/pm_qos.h>
  11. #include "adreno.h"
  12. #include "adreno_gen7.h"
  13. #include "adreno_gen7_hwsched.h"
  14. #include "adreno_snapshot.h"
  15. #include "kgsl_bus.h"
  16. #include "kgsl_device.h"
  17. #include "kgsl_trace.h"
  18. static void _wakeup_hw_fence_waiters(struct adreno_device *adreno_dev, u32 fault)
  19. {
  20. struct gen7_hwsched_hfi *hfi = to_gen7_hwsched_hfi(adreno_dev);
  21. bool lock = !in_interrupt();
  22. if (!test_bit(ADRENO_HWSCHED_HW_FENCE, &adreno_dev->hwsched.flags))
  23. return;
  24. /*
  25. * We could be in interrupt context here, which means we need to use spin_lock_irqsave
  26. * (which disables interrupts) everywhere we take this lock. Instead of that, simply
  27. * avoid taking this lock if we are recording a fault from an interrupt handler.
  28. */
  29. if (lock)
  30. spin_lock(&hfi->hw_fence.lock);
  31. clear_bit(GEN7_HWSCHED_HW_FENCE_SLEEP_BIT, &hfi->hw_fence.flags);
  32. /* Avoid creating new hardware fences until recovery is complete */
  33. set_bit(GEN7_HWSCHED_HW_FENCE_ABORT_BIT, &hfi->hw_fence.flags);
  34. if (!lock)
  35. /*
  36. * This barrier ensures that the above bitops complete before we wake up the waiters
  37. */
  38. smp_wmb();
  39. else
  40. spin_unlock(&hfi->hw_fence.lock);
  41. wake_up_all(&hfi->hw_fence.unack_wq);
  42. del_timer_sync(&hfi->hw_fence_timer);
  43. }
  44. void gen7_hwsched_fault(struct adreno_device *adreno_dev, u32 fault)
  45. {
  46. /*
  47. * Wake up any threads that may be sleeping waiting for the hardware fence unack count to
  48. * drop to a desired threshold.
  49. */
  50. _wakeup_hw_fence_waiters(adreno_dev, fault);
  51. adreno_hwsched_fault(adreno_dev, fault);
  52. }
  53. static size_t adreno_hwsched_snapshot_rb(struct kgsl_device *device, u8 *buf,
  54. size_t remain, void *priv)
  55. {
  56. struct kgsl_snapshot_rb_v2 *header = (struct kgsl_snapshot_rb_v2 *)buf;
  57. u32 *data = (u32 *)(buf + sizeof(*header));
  58. struct kgsl_memdesc *rb = (struct kgsl_memdesc *)priv;
  59. if (remain < rb->size + sizeof(*header)) {
  60. SNAPSHOT_ERR_NOMEM(device, "RB");
  61. return 0;
  62. }
  63. header->start = 0;
  64. header->end = rb->size >> 2;
  65. header->rptr = 0;
  66. header->rbsize = rb->size >> 2;
  67. header->count = rb->size >> 2;
  68. header->timestamp_queued = 0;
  69. header->timestamp_retired = 0;
  70. header->gpuaddr = rb->gpuaddr;
  71. header->id = 0;
  72. memcpy(data, rb->hostptr, rb->size);
  73. return rb->size + sizeof(*header);
  74. }
  75. static void gen7_hwsched_snapshot_preemption_record(struct kgsl_device *device,
  76. struct kgsl_snapshot *snapshot, struct kgsl_memdesc *md, u64 offset)
  77. {
  78. struct kgsl_snapshot_section_header *section_header =
  79. (struct kgsl_snapshot_section_header *)snapshot->ptr;
  80. u8 *dest = snapshot->ptr + sizeof(*section_header);
  81. struct kgsl_snapshot_gpu_object_v2 *header =
  82. (struct kgsl_snapshot_gpu_object_v2 *)dest;
  83. const struct adreno_gen7_core *gen7_core = to_gen7_core(ADRENO_DEVICE(device));
  84. u64 ctxt_record_size = GEN7_CP_CTXRECORD_SIZE_IN_BYTES;
  85. size_t section_size;
  86. if (gen7_core->ctxt_record_size)
  87. ctxt_record_size = gen7_core->ctxt_record_size;
  88. ctxt_record_size = min_t(u64, ctxt_record_size, device->snapshot_ctxt_record_size);
  89. section_size = sizeof(*section_header) + sizeof(*header) + ctxt_record_size;
  90. if (snapshot->remain < section_size) {
  91. SNAPSHOT_ERR_NOMEM(device, "PREEMPTION RECORD");
  92. return;
  93. }
  94. section_header->magic = SNAPSHOT_SECTION_MAGIC;
  95. section_header->id = KGSL_SNAPSHOT_SECTION_GPU_OBJECT_V2;
  96. section_header->size = section_size;
  97. header->size = ctxt_record_size >> 2;
  98. header->gpuaddr = md->gpuaddr + offset;
  99. header->ptbase =
  100. kgsl_mmu_pagetable_get_ttbr0(device->mmu.defaultpagetable);
  101. header->type = SNAPSHOT_GPU_OBJECT_GLOBAL;
  102. dest += sizeof(*header);
  103. memcpy(dest, md->hostptr + offset, ctxt_record_size);
  104. snapshot->ptr += section_header->size;
  105. snapshot->remain -= section_header->size;
  106. snapshot->size += section_header->size;
  107. }
  108. static void snapshot_preemption_records(struct kgsl_device *device,
  109. struct kgsl_snapshot *snapshot, struct kgsl_memdesc *md)
  110. {
  111. const struct adreno_gen7_core *gen7_core =
  112. to_gen7_core(ADRENO_DEVICE(device));
  113. u64 ctxt_record_size = GEN7_CP_CTXRECORD_SIZE_IN_BYTES;
  114. u64 offset;
  115. if (gen7_core->ctxt_record_size)
  116. ctxt_record_size = gen7_core->ctxt_record_size;
  117. /* All preemption records exist as a single mem alloc entry */
  118. for (offset = 0; offset < md->size; offset += ctxt_record_size)
  119. gen7_hwsched_snapshot_preemption_record(device, snapshot, md,
  120. offset);
  121. }
  122. static void *get_rb_hostptr(struct adreno_device *adreno_dev,
  123. u64 gpuaddr, u32 size)
  124. {
  125. struct gen7_hwsched_hfi *hw_hfi = to_gen7_hwsched_hfi(adreno_dev);
  126. u64 offset;
  127. u32 i;
  128. for (i = 0; i < hw_hfi->mem_alloc_entries; i++) {
  129. struct kgsl_memdesc *md = hw_hfi->mem_alloc_table[i].md;
  130. if (md && (gpuaddr >= md->gpuaddr) &&
  131. ((gpuaddr + size) <= (md->gpuaddr + md->size))) {
  132. offset = gpuaddr - md->gpuaddr;
  133. return md->hostptr + offset;
  134. }
  135. }
  136. return NULL;
  137. }
  138. static u32 gen7_copy_gpu_global(void *out, void *in, u32 size)
  139. {
  140. if (out && in) {
  141. memcpy(out, in, size);
  142. return size;
  143. }
  144. return 0;
  145. }
  146. static void adreno_hwsched_snapshot_rb_payload(struct adreno_device *adreno_dev,
  147. struct kgsl_snapshot *snapshot, struct payload_section *payload)
  148. {
  149. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  150. struct kgsl_snapshot_section_header *section_header =
  151. (struct kgsl_snapshot_section_header *)snapshot->ptr;
  152. u8 *buf = snapshot->ptr + sizeof(*section_header);
  153. struct kgsl_snapshot_rb_v2 *header = (struct kgsl_snapshot_rb_v2 *)buf;
  154. u32 *data = (u32 *)(buf + sizeof(*header));
  155. u32 size = adreno_hwsched_parse_payload(payload, KEY_RB_SIZEDWORDS) << 2;
  156. u64 lo, hi, gpuaddr;
  157. void *rb_hostptr;
  158. char str[16];
  159. lo = adreno_hwsched_parse_payload(payload, KEY_RB_GPUADDR_LO);
  160. hi = adreno_hwsched_parse_payload(payload, KEY_RB_GPUADDR_HI);
  161. gpuaddr = hi << 32 | lo;
  162. /* Sanity check to make sure there is enough for the header */
  163. if (snapshot->remain < sizeof(*section_header))
  164. goto err;
  165. rb_hostptr = get_rb_hostptr(adreno_dev, gpuaddr, size);
  166. /* If the gpuaddress and size don't match any allocation, then abort */
  167. if (((snapshot->remain - sizeof(*section_header)) <
  168. (size + sizeof(*header))) ||
  169. !gen7_copy_gpu_global(data, rb_hostptr, size))
  170. goto err;
  171. if (device->dump_all_ibs) {
  172. u64 rbaddr, lpac_rbaddr;
  173. kgsl_regread64(device, GEN7_CP_RB_BASE,
  174. GEN7_CP_RB_BASE_HI, &rbaddr);
  175. kgsl_regread64(device, GEN7_CP_LPAC_RB_BASE,
  176. GEN7_CP_LPAC_RB_BASE_HI, &lpac_rbaddr);
  177. /* Parse all IBs from current RB */
  178. if ((rbaddr == gpuaddr) || (lpac_rbaddr == gpuaddr))
  179. adreno_snapshot_dump_all_ibs(device, rb_hostptr, snapshot);
  180. }
  181. header->start = 0;
  182. header->end = size >> 2;
  183. header->rptr = adreno_hwsched_parse_payload(payload, KEY_RB_RPTR);
  184. header->wptr = adreno_hwsched_parse_payload(payload, KEY_RB_WPTR);
  185. header->rbsize = size >> 2;
  186. header->count = size >> 2;
  187. header->timestamp_queued = adreno_hwsched_parse_payload(payload,
  188. KEY_RB_QUEUED_TS);
  189. header->timestamp_retired = adreno_hwsched_parse_payload(payload,
  190. KEY_RB_RETIRED_TS);
  191. header->gpuaddr = gpuaddr;
  192. header->id = adreno_hwsched_parse_payload(payload, KEY_RB_ID);
  193. section_header->magic = SNAPSHOT_SECTION_MAGIC;
  194. section_header->id = KGSL_SNAPSHOT_SECTION_RB_V2;
  195. section_header->size = size + sizeof(*header) + sizeof(*section_header);
  196. snapshot->ptr += section_header->size;
  197. snapshot->remain -= section_header->size;
  198. snapshot->size += section_header->size;
  199. return;
  200. err:
  201. snprintf(str, sizeof(str), "RB addr:0x%llx", gpuaddr);
  202. SNAPSHOT_ERR_NOMEM(device, str);
  203. }
  204. static bool parse_payload_rb_legacy(struct adreno_device *adreno_dev,
  205. struct kgsl_snapshot *snapshot)
  206. {
  207. struct hfi_context_bad_cmd_legacy *cmd = adreno_dev->hwsched.ctxt_bad;
  208. u32 i = 0, payload_bytes;
  209. void *start;
  210. bool ret = false;
  211. /* Skip if we didn't receive a context bad HFI */
  212. if (!cmd->hdr)
  213. return false;
  214. payload_bytes = (MSG_HDR_GET_SIZE(cmd->hdr) << 2) -
  215. offsetof(struct hfi_context_bad_cmd_legacy, payload);
  216. start = &cmd->payload[0];
  217. while (i < payload_bytes) {
  218. struct payload_section *payload = start + i;
  219. if (payload->type == PAYLOAD_RB) {
  220. adreno_hwsched_snapshot_rb_payload(adreno_dev,
  221. snapshot, payload);
  222. ret = true;
  223. }
  224. i += sizeof(*payload) + (payload->dwords << 2);
  225. }
  226. return ret;
  227. }
  228. static bool parse_payload_rb(struct adreno_device *adreno_dev,
  229. struct kgsl_snapshot *snapshot)
  230. {
  231. struct hfi_context_bad_cmd *cmd = adreno_dev->hwsched.ctxt_bad;
  232. u32 i = 0, payload_bytes;
  233. void *start;
  234. bool ret = false;
  235. /* Skip if we didn't receive a context bad HFI */
  236. if (!cmd->hdr)
  237. return false;
  238. payload_bytes = (MSG_HDR_GET_SIZE(cmd->hdr) << 2) -
  239. offsetof(struct hfi_context_bad_cmd, payload);
  240. start = &cmd->payload[0];
  241. while (i < payload_bytes) {
  242. struct payload_section *payload = start + i;
  243. if (payload->type == PAYLOAD_RB) {
  244. adreno_hwsched_snapshot_rb_payload(adreno_dev,
  245. snapshot, payload);
  246. ret = true;
  247. }
  248. i += sizeof(*payload) + (payload->dwords << 2);
  249. }
  250. return ret;
  251. }
  252. static int snapshot_context_queue(int id, void *ptr, void *data)
  253. {
  254. struct kgsl_snapshot *snapshot = data;
  255. struct kgsl_context *context = ptr;
  256. struct adreno_context *drawctxt = ADRENO_CONTEXT(context);
  257. struct gmu_mem_type_desc desc;
  258. if (!context->gmu_registered)
  259. return 0;
  260. desc.memdesc = &drawctxt->gmu_context_queue;
  261. desc.type = SNAPSHOT_GMU_MEM_CONTEXT_QUEUE;
  262. kgsl_snapshot_add_section(context->device,
  263. KGSL_SNAPSHOT_SECTION_GMU_MEMORY,
  264. snapshot, gen7_snapshot_gmu_mem, &desc);
  265. return 0;
  266. }
  267. /* Snapshot AQE buffer */
  268. static size_t snapshot_aqe_buffer(struct kgsl_device *device, u8 *buf,
  269. size_t remain, void *priv)
  270. {
  271. struct kgsl_memdesc *memdesc = priv;
  272. struct kgsl_snapshot_gpu_object_v2 *header =
  273. (struct kgsl_snapshot_gpu_object_v2 *)buf;
  274. u8 *ptr = buf + sizeof(*header);
  275. if (IS_ERR_OR_NULL(memdesc) || memdesc->size == 0)
  276. return 0;
  277. if (remain < (memdesc->size + sizeof(*header))) {
  278. SNAPSHOT_ERR_NOMEM(device, "AQE BUFFER");
  279. return 0;
  280. }
  281. header->size = memdesc->size >> 2;
  282. header->gpuaddr = memdesc->gpuaddr;
  283. header->ptbase = MMU_DEFAULT_TTBR0(device);
  284. header->type = SNAPSHOT_GPU_OBJECT_GLOBAL;
  285. memcpy(ptr, memdesc->hostptr, memdesc->size);
  286. return memdesc->size + sizeof(*header);
  287. }
  288. void gen7_hwsched_snapshot(struct adreno_device *adreno_dev,
  289. struct kgsl_snapshot *snapshot)
  290. {
  291. struct gen7_gmu_device *gmu = to_gen7_gmu(adreno_dev);
  292. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  293. struct gen7_hwsched_hfi *hw_hfi = to_gen7_hwsched_hfi(adreno_dev);
  294. bool skip_memkind_rb = false;
  295. u32 i;
  296. bool parse_payload;
  297. gen7_gmu_snapshot(adreno_dev, snapshot);
  298. adreno_hwsched_parse_fault_cmdobj(adreno_dev, snapshot);
  299. /*
  300. * First try to dump ringbuffers using context bad HFI payloads
  301. * because they have all the ringbuffer parameters. If ringbuffer
  302. * payloads are not present, fall back to dumping ringbuffers
  303. * based on MEMKIND_RB
  304. */
  305. if (GMU_VER_MINOR(gmu->ver.hfi) < 2)
  306. parse_payload = parse_payload_rb_legacy(adreno_dev, snapshot);
  307. else
  308. parse_payload = parse_payload_rb(adreno_dev, snapshot);
  309. if (parse_payload)
  310. skip_memkind_rb = true;
  311. for (i = 0; i < hw_hfi->mem_alloc_entries; i++) {
  312. struct hfi_mem_alloc_entry *entry = &hw_hfi->mem_alloc_table[i];
  313. if (entry->desc.mem_kind == HFI_MEMKIND_RB && !skip_memkind_rb)
  314. kgsl_snapshot_add_section(device,
  315. KGSL_SNAPSHOT_SECTION_RB_V2,
  316. snapshot, adreno_hwsched_snapshot_rb,
  317. entry->md);
  318. if (entry->desc.mem_kind == HFI_MEMKIND_SCRATCH)
  319. kgsl_snapshot_add_section(device,
  320. KGSL_SNAPSHOT_SECTION_GPU_OBJECT_V2,
  321. snapshot, adreno_snapshot_global,
  322. entry->md);
  323. if (entry->desc.mem_kind == HFI_MEMKIND_PROFILE)
  324. kgsl_snapshot_add_section(device,
  325. KGSL_SNAPSHOT_SECTION_GPU_OBJECT_V2,
  326. snapshot, adreno_snapshot_global,
  327. entry->md);
  328. if (entry->desc.mem_kind == HFI_MEMKIND_CSW_SMMU_INFO)
  329. kgsl_snapshot_add_section(device,
  330. KGSL_SNAPSHOT_SECTION_GPU_OBJECT_V2,
  331. snapshot, adreno_snapshot_global,
  332. entry->md);
  333. if (entry->desc.mem_kind == HFI_MEMKIND_CSW_PRIV_NON_SECURE)
  334. snapshot_preemption_records(device, snapshot,
  335. entry->md);
  336. if (entry->desc.mem_kind == HFI_MEMKIND_PREEMPT_SCRATCH)
  337. kgsl_snapshot_add_section(device,
  338. KGSL_SNAPSHOT_SECTION_GPU_OBJECT_V2,
  339. snapshot, adreno_snapshot_global,
  340. entry->md);
  341. if (entry->desc.mem_kind == HFI_MEMKIND_AQE_BUFFER)
  342. kgsl_snapshot_add_section(device,
  343. KGSL_SNAPSHOT_SECTION_GPU_OBJECT_V2,
  344. snapshot, snapshot_aqe_buffer,
  345. entry->md);
  346. if (entry->desc.mem_kind == HFI_MEMKIND_HW_FENCE) {
  347. struct gmu_mem_type_desc desc;
  348. desc.memdesc = entry->md;
  349. desc.type = SNAPSHOT_GMU_MEM_HW_FENCE;
  350. kgsl_snapshot_add_section(device,
  351. KGSL_SNAPSHOT_SECTION_GMU_MEMORY,
  352. snapshot, gen7_snapshot_gmu_mem, &desc);
  353. }
  354. }
  355. if (!adreno_hwsched_context_queue_enabled(adreno_dev))
  356. return;
  357. read_lock(&device->context_lock);
  358. idr_for_each(&device->context_idr, snapshot_context_queue, snapshot);
  359. read_unlock(&device->context_lock);
  360. }
  361. static int gmu_clock_set_rate(struct adreno_device *adreno_dev)
  362. {
  363. struct gen7_gmu_device *gmu = to_gen7_gmu(adreno_dev);
  364. int ret = 0;
  365. /* Switch to min GMU clock */
  366. gen7_rdpm_cx_freq_update(gmu, gmu->freqs[0] / 1000);
  367. ret = kgsl_clk_set_rate(gmu->clks, gmu->num_clks, "gmu_clk",
  368. gmu->freqs[0]);
  369. if (ret)
  370. dev_err(&gmu->pdev->dev, "GMU clock:%d set failed:%d\n",
  371. gmu->freqs[0], ret);
  372. trace_kgsl_gmu_pwrlevel(gmu->freqs[0], gmu->freqs[GMU_MAX_PWRLEVELS - 1]);
  373. return ret;
  374. }
  375. static int gen7_hwsched_gmu_first_boot(struct adreno_device *adreno_dev)
  376. {
  377. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  378. struct kgsl_pwrctrl *pwr = &device->pwrctrl;
  379. struct gen7_gmu_device *gmu = to_gen7_gmu(adreno_dev);
  380. int level, ret = 0;
  381. kgsl_pwrctrl_request_state(device, KGSL_STATE_AWARE);
  382. gen7_gmu_aop_send_acd_state(gmu, adreno_dev->acd_enabled);
  383. ret = kgsl_pwrctrl_enable_cx_gdsc(device);
  384. if (ret)
  385. return ret;
  386. ret = gen7_gmu_enable_clks(adreno_dev, GMU_MAX_PWRLEVELS - 1);
  387. if (ret)
  388. goto gdsc_off;
  389. /*
  390. * Enable AHB timeout detection to catch any register access taking longer
  391. * time before NOC timeout gets detected. Enable this logic before any
  392. * register access which happens to be just after enabling clocks.
  393. */
  394. gen7_enable_ahb_timeout_detection(adreno_dev);
  395. /* Initialize the CX timer */
  396. gen7_cx_timer_init(adreno_dev);
  397. ret = gen7_gmu_load_fw(adreno_dev);
  398. if (ret)
  399. goto clks_gdsc_off;
  400. ret = gen7_gmu_itcm_shadow(adreno_dev);
  401. if (ret)
  402. goto clks_gdsc_off;
  403. if (!test_bit(GMU_PRIV_PDC_RSC_LOADED, &gmu->flags)) {
  404. ret = gen7_load_pdc_ucode(adreno_dev);
  405. if (ret)
  406. goto clks_gdsc_off;
  407. gen7_load_rsc_ucode(adreno_dev);
  408. set_bit(GMU_PRIV_PDC_RSC_LOADED, &gmu->flags);
  409. }
  410. ret = gen7_scm_gpu_init_cx_regs(adreno_dev);
  411. if (ret)
  412. goto clks_gdsc_off;
  413. gen7_gmu_register_config(adreno_dev);
  414. ret = gen7_gmu_version_info(adreno_dev);
  415. if (ret)
  416. goto clks_gdsc_off;
  417. if (GMU_VER_MINOR(gmu->ver.hfi) < 2)
  418. set_bit(ADRENO_HWSCHED_CTX_BAD_LEGACY, &adreno_dev->hwsched.flags);
  419. gen7_gmu_irq_enable(adreno_dev);
  420. /* Vote for minimal DDR BW for GMU to init */
  421. level = pwr->pwrlevels[pwr->default_pwrlevel].bus_min;
  422. /* From this GMU FW all RBBM interrupts are handled at GMU */
  423. if (gmu->ver.core >= GMU_VERSION(5, 01, 06))
  424. adreno_irq_free(adreno_dev);
  425. icc_set_bw(pwr->icc_path, 0, kBps_to_icc(pwr->ddr_table[level]));
  426. /* Clear any hwsched faults that might have been left over */
  427. adreno_hwsched_clear_fault(adreno_dev);
  428. ret = gen7_gmu_device_start(adreno_dev);
  429. if (ret)
  430. goto err;
  431. gen7_get_gpu_feature_info(adreno_dev);
  432. ret = gen7_hwsched_hfi_start(adreno_dev);
  433. if (ret)
  434. goto err;
  435. ret = gmu_clock_set_rate(adreno_dev);
  436. if (ret) {
  437. gen7_hwsched_hfi_stop(adreno_dev);
  438. goto err;
  439. }
  440. if (gen7_hwsched_hfi_get_value(adreno_dev, HFI_VALUE_GMU_AB_VOTE) == 1 &&
  441. !WARN_ONCE(!adreno_dev->gpucore->num_ddr_channels,
  442. "Number of DDR channel is not specified in gpu core")) {
  443. adreno_dev->gmu_ab = true;
  444. set_bit(ADRENO_DEVICE_GMU_AB, &adreno_dev->priv);
  445. }
  446. icc_set_bw(pwr->icc_path, 0, 0);
  447. device->gmu_fault = false;
  448. kgsl_pwrctrl_set_state(device, KGSL_STATE_AWARE);
  449. return 0;
  450. err:
  451. gen7_gmu_irq_disable(adreno_dev);
  452. if (device->gmu_fault) {
  453. gen7_gmu_suspend(adreno_dev);
  454. return ret;
  455. }
  456. clks_gdsc_off:
  457. clk_bulk_disable_unprepare(gmu->num_clks, gmu->clks);
  458. gdsc_off:
  459. kgsl_pwrctrl_disable_cx_gdsc(device);
  460. gen7_rdpm_cx_freq_update(gmu, 0);
  461. return ret;
  462. }
  463. static int gen7_hwsched_gmu_boot(struct adreno_device *adreno_dev)
  464. {
  465. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  466. struct gen7_gmu_device *gmu = to_gen7_gmu(adreno_dev);
  467. int ret = 0;
  468. kgsl_pwrctrl_request_state(device, KGSL_STATE_AWARE);
  469. ret = kgsl_pwrctrl_enable_cx_gdsc(device);
  470. if (ret)
  471. return ret;
  472. ret = gen7_gmu_enable_clks(adreno_dev, GMU_MAX_PWRLEVELS - 1);
  473. if (ret)
  474. goto gdsc_off;
  475. /*
  476. * Enable AHB timeout detection to catch any register access taking longer
  477. * time before NOC timeout gets detected. Enable this logic before any
  478. * register access which happens to be just after enabling clocks.
  479. */
  480. gen7_enable_ahb_timeout_detection(adreno_dev);
  481. /* Initialize the CX timer */
  482. gen7_cx_timer_init(adreno_dev);
  483. ret = gen7_rscc_wakeup_sequence(adreno_dev);
  484. if (ret)
  485. goto clks_gdsc_off;
  486. ret = gen7_gmu_load_fw(adreno_dev);
  487. if (ret)
  488. goto clks_gdsc_off;
  489. gen7_gmu_register_config(adreno_dev);
  490. gen7_gmu_irq_enable(adreno_dev);
  491. /* Clear any hwsched faults that might have been left over */
  492. adreno_hwsched_clear_fault(adreno_dev);
  493. ret = gen7_gmu_device_start(adreno_dev);
  494. if (ret)
  495. goto err;
  496. ret = gen7_hwsched_hfi_start(adreno_dev);
  497. if (ret)
  498. goto err;
  499. ret = gmu_clock_set_rate(adreno_dev);
  500. if (ret) {
  501. gen7_hwsched_hfi_stop(adreno_dev);
  502. goto err;
  503. }
  504. device->gmu_fault = false;
  505. kgsl_pwrctrl_set_state(device, KGSL_STATE_AWARE);
  506. return 0;
  507. err:
  508. gen7_gmu_irq_disable(adreno_dev);
  509. if (device->gmu_fault) {
  510. gen7_gmu_suspend(adreno_dev);
  511. return ret;
  512. }
  513. clks_gdsc_off:
  514. clk_bulk_disable_unprepare(gmu->num_clks, gmu->clks);
  515. gdsc_off:
  516. kgsl_pwrctrl_disable_cx_gdsc(device);
  517. gen7_rdpm_cx_freq_update(gmu, 0);
  518. return ret;
  519. }
  520. void gen7_hwsched_active_count_put(struct adreno_device *adreno_dev)
  521. {
  522. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  523. if (WARN_ON(!mutex_is_locked(&device->mutex)))
  524. return;
  525. if (WARN(atomic_read(&device->active_cnt) == 0,
  526. "Unbalanced get/put calls to KGSL active count\n"))
  527. return;
  528. if (atomic_dec_and_test(&device->active_cnt)) {
  529. kgsl_pwrscale_update_stats(device);
  530. kgsl_pwrscale_update(device);
  531. kgsl_start_idle_timer(device);
  532. }
  533. trace_kgsl_active_count(device,
  534. (unsigned long) __builtin_return_address(0));
  535. wake_up(&device->active_cnt_wq);
  536. }
  537. static int gen7_hwsched_notify_slumber(struct adreno_device *adreno_dev)
  538. {
  539. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  540. struct kgsl_pwrctrl *pwr = &device->pwrctrl;
  541. struct gen7_gmu_device *gmu = to_gen7_gmu(adreno_dev);
  542. struct hfi_prep_slumber_cmd req;
  543. int ret;
  544. ret = CMD_MSG_HDR(req, H2F_MSG_PREPARE_SLUMBER);
  545. if (ret)
  546. return ret;
  547. req.freq = gmu->dcvs_table.gpu_level_num - pwr->default_pwrlevel - 1;
  548. req.bw = pwr->pwrlevels[pwr->default_pwrlevel].bus_freq;
  549. req.bw |= gen7_bus_ab_quantize(adreno_dev, 0);
  550. /* Disable the power counter so that the GMU is not busy */
  551. gmu_core_regwrite(device, GEN7_GMU_CX_GMU_POWER_COUNTER_ENABLE, 0);
  552. ret = gen7_hfi_send_cmd_async(adreno_dev, &req, sizeof(req));
  553. /*
  554. * GEMNOC can enter power collapse state during GPU power down sequence.
  555. * This could abort CX GDSC collapse. Assert Qactive to avoid this.
  556. */
  557. gmu_core_regwrite(device, GEN7_GPU_GMU_CX_GMU_CX_FALNEXT_INTF, 0x1);
  558. return ret;
  559. }
  560. static int gen7_hwsched_gmu_power_off(struct adreno_device *adreno_dev)
  561. {
  562. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  563. struct gen7_gmu_device *gmu = to_gen7_gmu(adreno_dev);
  564. int ret = 0;
  565. if (device->gmu_fault)
  566. goto error;
  567. /* Wait for the lowest idle level we requested */
  568. ret = gen7_gmu_wait_for_lowest_idle(adreno_dev);
  569. if (ret)
  570. goto error;
  571. ret = gen7_hwsched_notify_slumber(adreno_dev);
  572. if (ret)
  573. goto error;
  574. ret = gen7_gmu_wait_for_idle(adreno_dev);
  575. if (ret)
  576. goto error;
  577. ret = gen7_rscc_sleep_sequence(adreno_dev);
  578. gen7_rdpm_mx_freq_update(gmu, 0);
  579. /* Now that we are done with GMU and GPU, Clear the GBIF */
  580. ret = gen7_halt_gbif(adreno_dev);
  581. gen7_gmu_irq_disable(adreno_dev);
  582. gen7_hwsched_hfi_stop(adreno_dev);
  583. clk_bulk_disable_unprepare(gmu->num_clks, gmu->clks);
  584. kgsl_pwrctrl_disable_cx_gdsc(device);
  585. gen7_rdpm_cx_freq_update(gmu, 0);
  586. kgsl_pwrctrl_set_state(device, KGSL_STATE_NONE);
  587. return ret;
  588. error:
  589. gen7_gmu_irq_disable(adreno_dev);
  590. gen7_hwsched_hfi_stop(adreno_dev);
  591. gen7_gmu_suspend(adreno_dev);
  592. return ret;
  593. }
  594. static void gen7_hwsched_init_ucode_regs(struct adreno_device *adreno_dev)
  595. {
  596. struct adreno_firmware *fw = ADRENO_FW(adreno_dev, ADRENO_FW_SQE);
  597. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  598. /* Program the ucode base for CP */
  599. kgsl_regwrite(device, GEN7_CP_SQE_INSTR_BASE_LO,
  600. lower_32_bits(fw->memdesc->gpuaddr));
  601. kgsl_regwrite(device, GEN7_CP_SQE_INSTR_BASE_HI,
  602. upper_32_bits(fw->memdesc->gpuaddr));
  603. if (ADRENO_FEATURE(adreno_dev, ADRENO_AQE)) {
  604. fw = ADRENO_FW(adreno_dev, ADRENO_FW_AQE);
  605. /* Program the ucode base for AQE0 (BV coprocessor) */
  606. kgsl_regwrite(device, GEN7_CP_AQE_INSTR_BASE_LO_0,
  607. lower_32_bits(fw->memdesc->gpuaddr));
  608. kgsl_regwrite(device, GEN7_CP_AQE_INSTR_BASE_HI_0,
  609. upper_32_bits(fw->memdesc->gpuaddr));
  610. /* Program the ucode base for AQE1 (LPAC coprocessor) */
  611. if (adreno_dev->lpac_enabled) {
  612. kgsl_regwrite(device, GEN7_CP_AQE_INSTR_BASE_LO_1,
  613. lower_32_bits(fw->memdesc->gpuaddr));
  614. kgsl_regwrite(device, GEN7_CP_AQE_INSTR_BASE_HI_1,
  615. upper_32_bits(fw->memdesc->gpuaddr));
  616. }
  617. }
  618. }
  619. static int gen7_hwsched_gpu_boot(struct adreno_device *adreno_dev)
  620. {
  621. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  622. int ret;
  623. ret = kgsl_mmu_start(device);
  624. if (ret)
  625. goto err;
  626. ret = gen7_gmu_oob_set(device, oob_gpu);
  627. if (ret)
  628. goto err;
  629. /* Clear the busy_data stats - we're starting over from scratch */
  630. memset(&adreno_dev->busy_data, 0, sizeof(adreno_dev->busy_data));
  631. gen7_start(adreno_dev);
  632. /* Re-initialize the coresight registers if applicable */
  633. adreno_coresight_start(adreno_dev);
  634. adreno_perfcounter_start(adreno_dev);
  635. /* Clear FSR here in case it is set from a previous pagefault */
  636. kgsl_mmu_clear_fsr(&device->mmu);
  637. gen7_enable_gpu_irq(adreno_dev);
  638. gen7_hwsched_init_ucode_regs(adreno_dev);
  639. ret = gen7_hwsched_boot_gpu(adreno_dev);
  640. if (ret)
  641. goto err;
  642. /*
  643. * At this point it is safe to assume that we recovered. Setting
  644. * this field allows us to take a new snapshot for the next failure
  645. * if we are prioritizing the first unrecoverable snapshot.
  646. */
  647. if (device->snapshot)
  648. device->snapshot->recovered = true;
  649. device->reset_counter++;
  650. /*
  651. * If warmboot is enabled and we switched a sysfs node, we will do a coldboot
  652. * in the subseqent slumber exit. Once that is done we need to mark this bool
  653. * as false so that in the next run we can do warmboot
  654. */
  655. clear_bit(ADRENO_DEVICE_FORCE_COLDBOOT, &adreno_dev->priv);
  656. err:
  657. gen7_gmu_oob_clear(device, oob_gpu);
  658. if (ret)
  659. gen7_hwsched_gmu_power_off(adreno_dev);
  660. return ret;
  661. }
  662. static void hwsched_idle_timer(struct timer_list *t)
  663. {
  664. struct kgsl_device *device = container_of(t, struct kgsl_device,
  665. idle_timer);
  666. kgsl_schedule_work(&device->idle_check_ws);
  667. }
  668. static int gen7_gmu_warmboot_init(struct adreno_device *adreno_dev)
  669. {
  670. struct gen7_gmu_device *gmu = to_gen7_gmu(adreno_dev);
  671. int ret = 0;
  672. if (!ADRENO_FEATURE(adreno_dev, ADRENO_GMU_WARMBOOT))
  673. return ret;
  674. if (IS_ERR_OR_NULL(gmu->gmu_init_scratch)) {
  675. gmu->gmu_init_scratch = gen7_reserve_gmu_kernel_block(gmu, 0,
  676. SZ_4K, GMU_CACHE, 0);
  677. ret = PTR_ERR_OR_ZERO(gmu->gmu_init_scratch);
  678. if (ret)
  679. return ret;
  680. }
  681. if (IS_ERR_OR_NULL(gmu->gpu_boot_scratch)) {
  682. gmu->gpu_boot_scratch = gen7_reserve_gmu_kernel_block(gmu, 0,
  683. SZ_4K, GMU_CACHE, 0);
  684. ret = PTR_ERR_OR_ZERO(gmu->gpu_boot_scratch);
  685. }
  686. return ret;
  687. }
  688. static int gen7_hwsched_gmu_memory_init(struct adreno_device *adreno_dev)
  689. {
  690. struct gen7_gmu_device *gmu = to_gen7_gmu(adreno_dev);
  691. /* GMU Virtual register bank */
  692. if (IS_ERR_OR_NULL(gmu->vrb)) {
  693. gmu->vrb = gen7_reserve_gmu_kernel_block(gmu, 0, GMU_VRB_SIZE,
  694. GMU_NONCACHED_KERNEL, 0);
  695. if (IS_ERR(gmu->vrb))
  696. return PTR_ERR(gmu->vrb);
  697. /* Populate size of the virtual register bank */
  698. gmu_core_set_vrb_register(gmu->vrb->hostptr, VRB_SIZE_IDX,
  699. gmu->vrb->size >> 2);
  700. }
  701. /* GMU trace log */
  702. if (IS_ERR_OR_NULL(gmu->trace.md)) {
  703. gmu->trace.md = gen7_reserve_gmu_kernel_block(gmu, 0,
  704. GMU_TRACE_SIZE, GMU_NONCACHED_KERNEL, 0);
  705. if (IS_ERR(gmu->trace.md))
  706. return PTR_ERR(gmu->trace.md);
  707. /* Pass trace buffer address to GMU through the VRB */
  708. gmu_core_set_vrb_register(gmu->vrb->hostptr,
  709. VRB_TRACE_BUFFER_ADDR_IDX,
  710. gmu->trace.md->gmuaddr);
  711. /* Initialize the GMU trace buffer header */
  712. gmu_core_trace_header_init(&gmu->trace);
  713. }
  714. return 0;
  715. }
  716. static int gen7_hwsched_gmu_init(struct adreno_device *adreno_dev)
  717. {
  718. int ret;
  719. ret = gen7_gmu_parse_fw(adreno_dev);
  720. if (ret)
  721. return ret;
  722. ret = gen7_gmu_memory_init(adreno_dev);
  723. if (ret)
  724. return ret;
  725. ret = gen7_gmu_warmboot_init(adreno_dev);
  726. if (ret)
  727. return ret;
  728. ret = gen7_hwsched_gmu_memory_init(adreno_dev);
  729. if (ret)
  730. return ret;
  731. return gen7_hwsched_hfi_init(adreno_dev);
  732. }
  733. static void gen7_hwsched_touch_wakeup(struct adreno_device *adreno_dev)
  734. {
  735. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  736. struct gen7_gmu_device *gmu = to_gen7_gmu(adreno_dev);
  737. int ret;
  738. /*
  739. * Do not wake up a suspended device or until the first boot sequence
  740. * has been completed.
  741. */
  742. if (test_bit(GMU_PRIV_PM_SUSPEND, &gmu->flags) ||
  743. !test_bit(GMU_PRIV_FIRST_BOOT_DONE, &gmu->flags))
  744. return;
  745. if (test_bit(GMU_PRIV_GPU_STARTED, &gmu->flags))
  746. goto done;
  747. kgsl_pwrctrl_request_state(device, KGSL_STATE_ACTIVE);
  748. ret = gen7_hwsched_gmu_boot(adreno_dev);
  749. if (ret)
  750. return;
  751. ret = gen7_hwsched_gpu_boot(adreno_dev);
  752. if (ret)
  753. return;
  754. kgsl_pwrscale_wake(device);
  755. set_bit(GMU_PRIV_GPU_STARTED, &gmu->flags);
  756. device->pwrctrl.last_stat_updated = ktime_get();
  757. kgsl_pwrctrl_set_state(device, KGSL_STATE_ACTIVE);
  758. done:
  759. /*
  760. * When waking up from a touch event we want to stay active long enough
  761. * for the user to send a draw command. The default idle timer timeout
  762. * is shorter than we want so go ahead and push the idle timer out
  763. * further for this special case
  764. */
  765. mod_timer(&device->idle_timer, jiffies +
  766. msecs_to_jiffies(adreno_wake_timeout));
  767. }
  768. static int gen7_hwsched_boot(struct adreno_device *adreno_dev)
  769. {
  770. struct gen7_gmu_device *gmu = to_gen7_gmu(adreno_dev);
  771. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  772. int ret;
  773. if (test_bit(GMU_PRIV_GPU_STARTED, &gmu->flags))
  774. return 0;
  775. kgsl_pwrctrl_request_state(device, KGSL_STATE_ACTIVE);
  776. adreno_hwsched_start(adreno_dev);
  777. ret = gen7_hwsched_gmu_boot(adreno_dev);
  778. if (ret)
  779. return ret;
  780. ret = gen7_hwsched_gpu_boot(adreno_dev);
  781. if (ret)
  782. return ret;
  783. kgsl_start_idle_timer(device);
  784. kgsl_pwrscale_wake(device);
  785. set_bit(GMU_PRIV_GPU_STARTED, &gmu->flags);
  786. device->pwrctrl.last_stat_updated = ktime_get();
  787. kgsl_pwrctrl_set_state(device, KGSL_STATE_ACTIVE);
  788. return ret;
  789. }
  790. static int gen7_aqe_microcode_read(struct adreno_device *adreno_dev)
  791. {
  792. struct adreno_firmware *aqe_fw = ADRENO_FW(adreno_dev, ADRENO_FW_AQE);
  793. const struct adreno_gen7_core *gen7_core = to_gen7_core(adreno_dev);
  794. if (!ADRENO_FEATURE(adreno_dev, ADRENO_AQE))
  795. return 0;
  796. return adreno_get_firmware(adreno_dev, gen7_core->aqefw_name, aqe_fw);
  797. }
  798. static int gen7_hwsched_first_boot(struct adreno_device *adreno_dev)
  799. {
  800. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  801. struct gen7_gmu_device *gmu = to_gen7_gmu(adreno_dev);
  802. int ret;
  803. if (test_bit(GMU_PRIV_FIRST_BOOT_DONE, &gmu->flags))
  804. return gen7_hwsched_boot(adreno_dev);
  805. adreno_hwsched_start(adreno_dev);
  806. ret = gen7_microcode_read(adreno_dev);
  807. if (ret)
  808. return ret;
  809. ret = gen7_aqe_microcode_read(adreno_dev);
  810. if (ret)
  811. return ret;
  812. ret = gen7_init(adreno_dev);
  813. if (ret)
  814. return ret;
  815. ret = gen7_hwsched_gmu_init(adreno_dev);
  816. if (ret)
  817. return ret;
  818. kgsl_pwrctrl_request_state(device, KGSL_STATE_ACTIVE);
  819. ret = gen7_hwsched_gmu_first_boot(adreno_dev);
  820. if (ret)
  821. return ret;
  822. ret = gen7_hwsched_gpu_boot(adreno_dev);
  823. if (ret)
  824. return ret;
  825. adreno_get_bus_counters(adreno_dev);
  826. adreno_dev->cooperative_reset = ADRENO_FEATURE(adreno_dev,
  827. ADRENO_COOP_RESET);
  828. set_bit(GMU_PRIV_FIRST_BOOT_DONE, &gmu->flags);
  829. set_bit(GMU_PRIV_GPU_STARTED, &gmu->flags);
  830. /*
  831. * BCL needs respective Central Broadcast register to
  832. * be programed from TZ. This programing happens only
  833. * when zap shader firmware load is successful. Zap firmware
  834. * load can fail in boot up path hence enable BCL only after we
  835. * successfully complete first boot to ensure that Central
  836. * Broadcast register was programed before enabling BCL.
  837. */
  838. if (ADRENO_FEATURE(adreno_dev, ADRENO_BCL))
  839. adreno_dev->bcl_enabled = true;
  840. /*
  841. * There is a possible deadlock scenario during kgsl firmware reading
  842. * (request_firmware) and devfreq update calls. During first boot, kgsl
  843. * device mutex is held and then request_firmware is called for reading
  844. * firmware. request_firmware internally takes dev_pm_qos_mtx lock.
  845. * Whereas in case of devfreq update calls triggered by thermal/bcl or
  846. * devfreq sysfs, it first takes the same dev_pm_qos_mtx lock and then
  847. * tries to take kgsl device mutex as part of get_dev_status/target
  848. * calls. This results in deadlock when both thread are unable to acquire
  849. * the mutex held by other thread. Enable devfreq updates now as we are
  850. * done reading all firmware files.
  851. */
  852. device->pwrscale.devfreq_enabled = true;
  853. device->pwrctrl.last_stat_updated = ktime_get();
  854. kgsl_pwrctrl_set_state(device, KGSL_STATE_ACTIVE);
  855. return 0;
  856. }
  857. /**
  858. * drain_ctx_hw_fences_cpu - Force trigger the hardware fences that
  859. * were not sent to TxQueue by the GMU
  860. */
  861. static void drain_ctx_hw_fences_cpu(struct adreno_device *adreno_dev,
  862. struct adreno_context *drawctxt)
  863. {
  864. struct adreno_hw_fence_entry *entry, *tmp;
  865. spin_lock(&drawctxt->lock);
  866. list_for_each_entry_safe(entry, tmp, &drawctxt->hw_fence_inflight_list, node) {
  867. gen7_trigger_hw_fence_cpu(adreno_dev, entry);
  868. gen7_remove_hw_fence_entry(adreno_dev, entry);
  869. }
  870. spin_unlock(&drawctxt->lock);
  871. }
  872. static void drain_hw_fences_cpu(struct adreno_device *adreno_dev)
  873. {
  874. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  875. struct kgsl_context *context;
  876. int id;
  877. read_lock(&device->context_lock);
  878. idr_for_each_entry(&device->context_idr, context, id) {
  879. if (context->gmu_registered)
  880. drain_ctx_hw_fences_cpu(adreno_dev, ADRENO_CONTEXT(context));
  881. }
  882. read_unlock(&device->context_lock);
  883. }
  884. /**
  885. * check_inflight_hw_fences - During SLUMBER entry, we must make sure all hardware fences across
  886. * all registered contexts have been sent to TxQueue. If not, take a snapshot
  887. */
  888. static int check_inflight_hw_fences(struct adreno_device *adreno_dev)
  889. {
  890. struct adreno_hwsched *hwsched = &adreno_dev->hwsched;
  891. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  892. struct kgsl_context *context;
  893. int id, ret = 0;
  894. if (!test_bit(ADRENO_HWSCHED_HW_FENCE, &hwsched->flags))
  895. return 0;
  896. read_lock(&device->context_lock);
  897. idr_for_each_entry(&device->context_idr, context, id) {
  898. if (context->gmu_registered) {
  899. ret = gen7_hwsched_check_context_inflight_hw_fences(adreno_dev,
  900. ADRENO_CONTEXT(context));
  901. if (ret)
  902. break;
  903. }
  904. }
  905. read_unlock(&device->context_lock);
  906. if (ret)
  907. gmu_core_fault_snapshot(device);
  908. return ret;
  909. }
  910. static int gen7_hwsched_power_off(struct adreno_device *adreno_dev)
  911. {
  912. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  913. struct gen7_gmu_device *gmu = to_gen7_gmu(adreno_dev);
  914. int ret = 0;
  915. bool drain_cpu = false;
  916. if (!test_bit(GMU_PRIV_GPU_STARTED, &gmu->flags))
  917. return 0;
  918. kgsl_pwrctrl_request_state(device, KGSL_STATE_SLUMBER);
  919. ret = gen7_gmu_oob_set(device, oob_gpu);
  920. if (ret) {
  921. gen7_gmu_oob_clear(device, oob_gpu);
  922. goto no_gx_power;
  923. }
  924. kgsl_pwrscale_update_stats(device);
  925. /* Save active coresight registers if applicable */
  926. adreno_coresight_stop(adreno_dev);
  927. adreno_irqctrl(adreno_dev, 0);
  928. gen7_gmu_oob_clear(device, oob_gpu);
  929. no_gx_power:
  930. kgsl_pwrctrl_irq(device, false);
  931. /* Make sure GMU has sent all hardware fences to TxQueue */
  932. if (check_inflight_hw_fences(adreno_dev))
  933. drain_cpu = true;
  934. gen7_hwsched_gmu_power_off(adreno_dev);
  935. /* Now that we are sure that GMU is powered off, drain pending fences */
  936. if (drain_cpu)
  937. drain_hw_fences_cpu(adreno_dev);
  938. adreno_hwsched_unregister_contexts(adreno_dev);
  939. adreno_llcc_slice_deactivate(adreno_dev);
  940. clear_bit(GMU_PRIV_GPU_STARTED, &gmu->flags);
  941. del_timer_sync(&device->idle_timer);
  942. kgsl_pwrscale_sleep(device);
  943. kgsl_pwrctrl_clear_l3_vote(device);
  944. kgsl_pwrctrl_set_state(device, KGSL_STATE_SLUMBER);
  945. return ret;
  946. }
  947. static void check_hw_fence_unack_count(struct adreno_device *adreno_dev)
  948. {
  949. struct gen7_hwsched_hfi *hfi = to_gen7_hwsched_hfi(adreno_dev);
  950. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  951. struct gen7_gmu_device *gmu = to_gen7_gmu(adreno_dev);
  952. u32 unack_count;
  953. if (!test_bit(ADRENO_HWSCHED_HW_FENCE, &adreno_dev->hwsched.flags))
  954. return;
  955. gen7_hwsched_process_msgq(adreno_dev);
  956. spin_lock(&hfi->hw_fence.lock);
  957. unack_count = hfi->hw_fence.unack_count;
  958. spin_unlock(&hfi->hw_fence.lock);
  959. if (!unack_count)
  960. return;
  961. dev_err(&gmu->pdev->dev, "hardware fence unack_count(%d) isn't zero before SLUMBER\n",
  962. unack_count);
  963. gmu_core_fault_snapshot(device);
  964. }
  965. static void hwsched_idle_check(struct work_struct *work)
  966. {
  967. struct kgsl_device *device = container_of(work,
  968. struct kgsl_device, idle_check_ws);
  969. struct adreno_device *adreno_dev = ADRENO_DEVICE(device);
  970. mutex_lock(&device->mutex);
  971. if (test_bit(GMU_DISABLE_SLUMBER, &device->gmu_core.flags))
  972. goto done;
  973. if (atomic_read(&device->active_cnt) || time_is_after_jiffies(device->idle_jiffies)) {
  974. kgsl_pwrscale_update(device);
  975. kgsl_start_idle_timer(device);
  976. goto done;
  977. }
  978. spin_lock(&device->submit_lock);
  979. if (device->submit_now) {
  980. spin_unlock(&device->submit_lock);
  981. kgsl_pwrscale_update(device);
  982. kgsl_start_idle_timer(device);
  983. goto done;
  984. }
  985. device->skip_inline_submit = true;
  986. spin_unlock(&device->submit_lock);
  987. if (!gen7_hw_isidle(adreno_dev)) {
  988. dev_err(device->dev, "GPU isn't idle before SLUMBER\n");
  989. gmu_core_fault_snapshot(device);
  990. }
  991. check_hw_fence_unack_count(adreno_dev);
  992. gen7_hwsched_power_off(adreno_dev);
  993. done:
  994. mutex_unlock(&device->mutex);
  995. }
  996. static int gen7_hwsched_first_open(struct adreno_device *adreno_dev)
  997. {
  998. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  999. int ret;
  1000. /*
  1001. * Do the one time settings that need to happen when we
  1002. * attempt to boot the gpu the very first time
  1003. */
  1004. ret = gen7_hwsched_first_boot(adreno_dev);
  1005. if (ret)
  1006. return ret;
  1007. /*
  1008. * A client that does a first_open but never closes the device
  1009. * may prevent us from going back to SLUMBER. So trigger the idle
  1010. * check by incrementing the active count and immediately releasing it.
  1011. */
  1012. atomic_inc(&device->active_cnt);
  1013. gen7_hwsched_active_count_put(adreno_dev);
  1014. return 0;
  1015. }
  1016. int gen7_hwsched_active_count_get(struct adreno_device *adreno_dev)
  1017. {
  1018. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  1019. struct gen7_gmu_device *gmu = to_gen7_gmu(adreno_dev);
  1020. int ret = 0;
  1021. if (WARN_ON(!mutex_is_locked(&device->mutex)))
  1022. return -EINVAL;
  1023. if (test_bit(GMU_PRIV_PM_SUSPEND, &gmu->flags))
  1024. return -EINVAL;
  1025. if ((atomic_read(&device->active_cnt) == 0))
  1026. ret = gen7_hwsched_boot(adreno_dev);
  1027. if (ret == 0)
  1028. atomic_inc(&device->active_cnt);
  1029. trace_kgsl_active_count(device,
  1030. (unsigned long) __builtin_return_address(0));
  1031. return ret;
  1032. }
  1033. static DEFINE_PER_CPU(struct freq_qos_request, qos_min_req);
  1034. #define GEN7_9_X_GPU_BUSY_THRESHOLD (65)
  1035. #define GEN7_9_X_GPU_FREQ_THRESHOLD_KHZ (700 * 1000)
  1036. #define GEN7_9_X_FREQ_QOS_CPUID_0_KHZ 960000
  1037. #define GEN7_9_X_FREQ_QOS_CPUID_5_KHZ 1132800
  1038. #define CPUID_0 0
  1039. #define CPUID_5 5
  1040. static void _cpu_perf_vote_req_init(u32 cpu)
  1041. {
  1042. struct cpufreq_policy *policy;
  1043. struct freq_qos_request *req;
  1044. policy = cpufreq_cpu_get(cpu);
  1045. if (!policy)
  1046. return;
  1047. req = &per_cpu(qos_min_req, cpu);
  1048. freq_qos_add_request(&policy->constraints, req, FREQ_QOS_MIN, FREQ_QOS_MIN_DEFAULT_VALUE);
  1049. cpufreq_cpu_put(policy);
  1050. }
  1051. static void _cpu_perf_vote_update(u32 cpu, u32 freq)
  1052. {
  1053. freq_qos_update_request(&per_cpu(qos_min_req, cpu), freq);
  1054. }
  1055. /*
  1056. * Make the vote based on the enable/disable param.
  1057. * Return true on enable, false if skipped or disabled.
  1058. */
  1059. static bool _cpu_perf_vote_req(struct adreno_device *adreno_dev, bool enable)
  1060. {
  1061. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  1062. struct kgsl_clk_stats *stats = &device->pwrctrl.clk_stats;
  1063. u32 busy_percent = 0;
  1064. /* Get GPU busy percentage */
  1065. if (stats->total_old != 0)
  1066. busy_percent = (stats->busy_old * 100) / stats->total_old;
  1067. /* Skip if enabling AND we aren't busy */
  1068. if (enable && (busy_percent <= GEN7_9_X_GPU_BUSY_THRESHOLD))
  1069. return false;
  1070. _cpu_perf_vote_update(CPUID_0, enable ? GEN7_9_X_FREQ_QOS_CPUID_0_KHZ :
  1071. FREQ_QOS_MIN_DEFAULT_VALUE);
  1072. _cpu_perf_vote_update(CPUID_5, enable ? GEN7_9_X_FREQ_QOS_CPUID_5_KHZ :
  1073. FREQ_QOS_MIN_DEFAULT_VALUE);
  1074. /* Return the requested enablement */
  1075. return enable;
  1076. }
  1077. static void _cpu_perf_vote_init(void)
  1078. {
  1079. static bool init_done;
  1080. if (init_done)
  1081. return;
  1082. _cpu_perf_vote_req_init(CPUID_0);
  1083. _cpu_perf_vote_req_init(CPUID_5);
  1084. init_done = true;
  1085. }
  1086. static void _cpu_perf_vote(struct adreno_device *adreno_dev, u32 req_freq)
  1087. {
  1088. struct gen7_gmu_device *gmu = to_gen7_gmu(adreno_dev);
  1089. static bool cpu_vote_state;
  1090. u32 freq;
  1091. if (!adreno_is_gen7_9_x(adreno_dev))
  1092. return;
  1093. _cpu_perf_vote_init();
  1094. freq = gmu->dcvs_table.gx_votes[req_freq].freq;
  1095. if (!cpu_vote_state && (freq >= GEN7_9_X_GPU_FREQ_THRESHOLD_KHZ))
  1096. cpu_vote_state = _cpu_perf_vote_req(adreno_dev, true);
  1097. else if (cpu_vote_state && (freq < GEN7_9_X_GPU_FREQ_THRESHOLD_KHZ))
  1098. cpu_vote_state = _cpu_perf_vote_req(adreno_dev, false);
  1099. }
  1100. static int gen7_hwsched_dcvs_set(struct adreno_device *adreno_dev,
  1101. int gpu_pwrlevel, int bus_level, u32 ab)
  1102. {
  1103. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  1104. struct kgsl_pwrctrl *pwr = &device->pwrctrl;
  1105. struct gen7_gmu_device *gmu = to_gen7_gmu(adreno_dev);
  1106. struct gen7_dcvs_table *table = &gmu->dcvs_table;
  1107. struct hfi_gx_bw_perf_vote_cmd req = {
  1108. .ack_type = DCVS_ACK_BLOCK,
  1109. .freq = INVALID_DCVS_IDX,
  1110. .bw = INVALID_DCVS_IDX,
  1111. };
  1112. int ret;
  1113. if (!test_bit(GMU_PRIV_HFI_STARTED, &gmu->flags))
  1114. return 0;
  1115. /* Do not set to XO and lower GPU clock vote from GMU */
  1116. if ((gpu_pwrlevel != INVALID_DCVS_IDX) &&
  1117. (gpu_pwrlevel >= table->gpu_level_num - 1)) {
  1118. dev_err(&gmu->pdev->dev, "Invalid gpu dcvs request: %d\n",
  1119. gpu_pwrlevel);
  1120. return -EINVAL;
  1121. }
  1122. if (gpu_pwrlevel < table->gpu_level_num - 1)
  1123. req.freq = table->gpu_level_num - gpu_pwrlevel - 1;
  1124. if (bus_level < pwr->ddr_table_count && bus_level > 0)
  1125. req.bw = bus_level;
  1126. req.bw |= gen7_bus_ab_quantize(adreno_dev, ab);
  1127. /* GMU will vote for slumber levels through the sleep sequence */
  1128. if ((req.freq == INVALID_DCVS_IDX) && (req.bw == INVALID_BW_VOTE))
  1129. return 0;
  1130. ret = CMD_MSG_HDR(req, H2F_MSG_GX_BW_PERF_VOTE);
  1131. if (ret)
  1132. return ret;
  1133. ret = gen7_hfi_send_cmd_async(adreno_dev, &req, sizeof(req));
  1134. if (ret) {
  1135. dev_err_ratelimited(&gmu->pdev->dev,
  1136. "Failed to set GPU perf idx %u, bw idx %u\n",
  1137. req.freq, req.bw);
  1138. /*
  1139. * If this was a dcvs request along side an active gpu, request
  1140. * dispatcher based reset and recovery.
  1141. */
  1142. if (test_bit(GMU_PRIV_GPU_STARTED, &gmu->flags))
  1143. gen7_hwsched_fault(adreno_dev, ADRENO_GMU_FAULT);
  1144. }
  1145. if (!ret && req.freq != INVALID_DCVS_IDX) {
  1146. gen7_rdpm_mx_freq_update(gmu, gmu->dcvs_table.gx_votes[req.freq].freq);
  1147. _cpu_perf_vote(adreno_dev, req.freq);
  1148. }
  1149. return ret;
  1150. }
  1151. static int gen7_hwsched_clock_set(struct adreno_device *adreno_dev,
  1152. u32 pwrlevel)
  1153. {
  1154. return gen7_hwsched_dcvs_set(adreno_dev, pwrlevel, INVALID_DCVS_IDX, INVALID_AB_VALUE);
  1155. }
  1156. static void scale_gmu_frequency(struct adreno_device *adreno_dev, int buslevel)
  1157. {
  1158. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  1159. struct kgsl_pwrctrl *pwr = &device->pwrctrl;
  1160. struct gen7_gmu_device *gmu = to_gen7_gmu(adreno_dev);
  1161. static unsigned long prev_freq;
  1162. unsigned long freq = gmu->freqs[0];
  1163. if (!gmu->perf_ddr_bw)
  1164. return;
  1165. /*
  1166. * Scale the GMU if DDR is at a CX corner at which GMU can run at
  1167. * a higher frequency
  1168. */
  1169. if (pwr->ddr_table[buslevel] >= gmu->perf_ddr_bw)
  1170. freq = gmu->freqs[GMU_MAX_PWRLEVELS - 1];
  1171. if (prev_freq == freq)
  1172. return;
  1173. if (kgsl_clk_set_rate(gmu->clks, gmu->num_clks, "gmu_clk", freq)) {
  1174. dev_err(&gmu->pdev->dev, "Unable to set the GMU clock to %ld\n",
  1175. freq);
  1176. return;
  1177. }
  1178. gen7_rdpm_cx_freq_update(gmu, freq / 1000);
  1179. trace_kgsl_gmu_pwrlevel(freq, prev_freq);
  1180. prev_freq = freq;
  1181. }
  1182. static int gen7_hwsched_bus_set(struct adreno_device *adreno_dev, int buslevel,
  1183. u32 ab)
  1184. {
  1185. const struct adreno_gen7_core *gen7_core = to_gen7_core(adreno_dev);
  1186. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  1187. struct kgsl_pwrctrl *pwr = &device->pwrctrl;
  1188. int ret = 0;
  1189. /* Skip icc path for targets that supports ACV vote from GMU */
  1190. if (!gen7_core->acv_perfmode_vote)
  1191. kgsl_icc_set_tag(pwr, buslevel);
  1192. if (buslevel == pwr->cur_buslevel)
  1193. buslevel = INVALID_DCVS_IDX;
  1194. if ((ab == pwr->cur_ab) || (ab == 0))
  1195. ab = INVALID_AB_VALUE;
  1196. if ((ab == INVALID_AB_VALUE) && (buslevel == INVALID_DCVS_IDX))
  1197. return 0;
  1198. ret = gen7_hwsched_dcvs_set(adreno_dev, INVALID_DCVS_IDX,
  1199. buslevel, ab);
  1200. if (ret)
  1201. return ret;
  1202. if (buslevel != INVALID_DCVS_IDX) {
  1203. scale_gmu_frequency(adreno_dev, buslevel);
  1204. pwr->cur_buslevel = buslevel;
  1205. }
  1206. if (ab != INVALID_AB_VALUE) {
  1207. if (!adreno_dev->gmu_ab)
  1208. icc_set_bw(pwr->icc_path, MBps_to_icc(ab), 0);
  1209. pwr->cur_ab = ab;
  1210. }
  1211. trace_kgsl_buslevel(device, pwr->active_pwrlevel, pwr->cur_buslevel, pwr->cur_ab);
  1212. return ret;
  1213. }
  1214. static int gen7_hwsched_pm_suspend(struct adreno_device *adreno_dev)
  1215. {
  1216. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  1217. struct gen7_gmu_device *gmu = to_gen7_gmu(adreno_dev);
  1218. int ret;
  1219. if (test_bit(GMU_PRIV_PM_SUSPEND, &gmu->flags))
  1220. return 0;
  1221. kgsl_pwrctrl_request_state(device, KGSL_STATE_SUSPEND);
  1222. /* Halt any new submissions */
  1223. reinit_completion(&device->halt_gate);
  1224. /*
  1225. * Wait for the dispatcher to retire everything by waiting
  1226. * for the active count to go to zero.
  1227. */
  1228. ret = kgsl_active_count_wait(device, 0, msecs_to_jiffies(100));
  1229. if (ret) {
  1230. dev_err(device->dev, "Timed out waiting for the active count\n");
  1231. goto err;
  1232. }
  1233. ret = adreno_hwsched_idle(adreno_dev);
  1234. if (ret)
  1235. goto err;
  1236. gen7_hwsched_power_off(adreno_dev);
  1237. adreno_get_gpu_halt(adreno_dev);
  1238. set_bit(GMU_PRIV_PM_SUSPEND, &gmu->flags);
  1239. kgsl_pwrctrl_set_state(device, KGSL_STATE_SUSPEND);
  1240. return 0;
  1241. err:
  1242. adreno_hwsched_start(adreno_dev);
  1243. return ret;
  1244. }
  1245. static void gen7_hwsched_pm_resume(struct adreno_device *adreno_dev)
  1246. {
  1247. struct gen7_gmu_device *gmu = to_gen7_gmu(adreno_dev);
  1248. if (WARN(!test_bit(GMU_PRIV_PM_SUSPEND, &gmu->flags),
  1249. "resume invoked without a suspend\n"))
  1250. return;
  1251. adreno_put_gpu_halt(adreno_dev);
  1252. adreno_hwsched_start(adreno_dev);
  1253. clear_bit(GMU_PRIV_PM_SUSPEND, &gmu->flags);
  1254. }
  1255. void gen7_hwsched_handle_watchdog(struct adreno_device *adreno_dev)
  1256. {
  1257. struct gen7_gmu_device *gmu = to_gen7_gmu(adreno_dev);
  1258. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  1259. u32 mask;
  1260. /* Temporarily mask the watchdog interrupt to prevent a storm */
  1261. gmu_core_regread(device, GEN7_GMU_AO_HOST_INTERRUPT_MASK,
  1262. &mask);
  1263. gmu_core_regwrite(device, GEN7_GMU_AO_HOST_INTERRUPT_MASK,
  1264. (mask | GMU_INT_WDOG_BITE));
  1265. gen7_gmu_send_nmi(device, false);
  1266. dev_err_ratelimited(&gmu->pdev->dev,
  1267. "GMU watchdog expired interrupt received\n");
  1268. gen7_hwsched_fault(adreno_dev, ADRENO_GMU_FAULT);
  1269. }
  1270. static void gen7_hwsched_drain_ctxt_unregister(struct adreno_device *adreno_dev)
  1271. {
  1272. struct gen7_hwsched_hfi *hfi = to_gen7_hwsched_hfi(adreno_dev);
  1273. struct pending_cmd *cmd = NULL;
  1274. read_lock(&hfi->msglock);
  1275. list_for_each_entry(cmd, &hfi->msglist, node) {
  1276. if (MSG_HDR_GET_ID(cmd->sent_hdr) == H2F_MSG_UNREGISTER_CONTEXT)
  1277. complete(&cmd->complete);
  1278. }
  1279. read_unlock(&hfi->msglock);
  1280. }
  1281. /**
  1282. * process_context_hw_fences_after_reset - This function processes all hardware fences that were
  1283. * sent to GMU prior to recovery. If a fence is not retired by the GPU, and the context is still
  1284. * good, then move them to the reset list.
  1285. */
  1286. static void process_context_hw_fences_after_reset(struct adreno_device *adreno_dev,
  1287. struct adreno_context *drawctxt, struct list_head *reset_list)
  1288. {
  1289. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  1290. struct adreno_hw_fence_entry *entry, *tmp;
  1291. spin_lock(&drawctxt->lock);
  1292. list_for_each_entry_safe(entry, tmp, &drawctxt->hw_fence_inflight_list, node) {
  1293. struct adreno_context *drawctxt = entry->drawctxt;
  1294. struct gmu_context_queue_header *hdr = drawctxt->gmu_context_queue.hostptr;
  1295. bool retired = kgsl_check_timestamp(device, &drawctxt->base, (u32)entry->cmd.ts);
  1296. /* Delete the fences that GMU has sent to the TxQueue */
  1297. if (timestamp_cmp(hdr->out_fence_ts, (u32)entry->cmd.ts) >= 0) {
  1298. gen7_remove_hw_fence_entry(adreno_dev, entry);
  1299. continue;
  1300. }
  1301. /*
  1302. * Force retire the fences if the corresponding submission is retired by GPU
  1303. * or if the context has gone bad
  1304. */
  1305. if (retired || kgsl_context_is_bad(&drawctxt->base))
  1306. entry->cmd.flags |= HW_FENCE_FLAG_SKIP_MEMSTORE;
  1307. list_add_tail(&entry->reset_node, reset_list);
  1308. }
  1309. spin_unlock(&drawctxt->lock);
  1310. }
  1311. /**
  1312. * process_inflight_hw_fences_after_reset - Send hardware fences from all contexts back to the GMU
  1313. * after fault recovery. We must wait for ack when sending each of these fences to GMU so as to
  1314. * avoid sending a large number of hardware fences in a short span of time.
  1315. */
  1316. static int process_inflight_hw_fences_after_reset(struct adreno_device *adreno_dev)
  1317. {
  1318. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  1319. struct kgsl_context *context = NULL;
  1320. int id, ret = 0;
  1321. struct list_head hw_fence_list;
  1322. struct adreno_hw_fence_entry *entry, *tmp;
  1323. /*
  1324. * Since we need to wait for ack from GMU when sending each inflight fence back to GMU, we
  1325. * cannot send them from within atomic context. Hence, walk list of such hardware fences
  1326. * for each context and add it to this local list and then walk this list to send all these
  1327. * fences to GMU.
  1328. */
  1329. INIT_LIST_HEAD(&hw_fence_list);
  1330. read_lock(&device->context_lock);
  1331. idr_for_each_entry(&device->context_idr, context, id) {
  1332. process_context_hw_fences_after_reset(adreno_dev, ADRENO_CONTEXT(context),
  1333. &hw_fence_list);
  1334. }
  1335. read_unlock(&device->context_lock);
  1336. list_for_each_entry_safe(entry, tmp, &hw_fence_list, reset_node) {
  1337. /*
  1338. * This is part of the reset sequence and any error in this path will be handled by
  1339. * the caller.
  1340. */
  1341. ret = gen7_send_hw_fence_hfi_wait_ack(adreno_dev, entry, 0);
  1342. if (ret)
  1343. break;
  1344. list_del_init(&entry->reset_node);
  1345. }
  1346. return ret;
  1347. }
  1348. /**
  1349. * process_detached_hw_fences_after_reset - Send fences that couldn't be sent to GMU when a context
  1350. * got detached. We must wait for ack when sending each of these fences to GMU so as to avoid
  1351. * sending a large number of hardware fences in a short span of time.
  1352. */
  1353. static int process_detached_hw_fences_after_reset(struct adreno_device *adreno_dev)
  1354. {
  1355. struct adreno_hw_fence_entry *entry, *tmp;
  1356. struct gen7_hwsched_hfi *hfi = to_gen7_hwsched_hfi(adreno_dev);
  1357. struct kgsl_context *context = NULL;
  1358. int ret = 0;
  1359. list_for_each_entry_safe(entry, tmp, &hfi->detached_hw_fence_list, node) {
  1360. /*
  1361. * This is part of the reset sequence and any error in this path will be handled by
  1362. * the caller.
  1363. */
  1364. ret = gen7_send_hw_fence_hfi_wait_ack(adreno_dev, entry,
  1365. HW_FENCE_FLAG_SKIP_MEMSTORE);
  1366. if (ret)
  1367. return ret;
  1368. context = &entry->drawctxt->base;
  1369. gen7_remove_hw_fence_entry(adreno_dev, entry);
  1370. kgsl_context_put(context);
  1371. }
  1372. return ret;
  1373. }
  1374. static int drain_guilty_context_hw_fences(struct adreno_device *adreno_dev)
  1375. {
  1376. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  1377. struct kgsl_context *context = NULL;
  1378. struct adreno_context *guilty = NULL;
  1379. int id, ret = 0;
  1380. read_lock(&device->context_lock);
  1381. idr_for_each_entry(&device->context_idr, context, id) {
  1382. if (test_bit(KGSL_CONTEXT_PRIV_INVALID, &context->priv) &&
  1383. _kgsl_context_get(context)) {
  1384. guilty = ADRENO_CONTEXT(context);
  1385. break;
  1386. }
  1387. }
  1388. read_unlock(&device->context_lock);
  1389. if (!guilty)
  1390. return 0;
  1391. /*
  1392. * We don't need drawctxt spinlock to signal these fences since the only other place
  1393. * which can access these fences is the context detach path and device mutex
  1394. * ensures mutual exclusion between recovery thread and detach thread.
  1395. */
  1396. ret = gen7_hwsched_drain_context_hw_fences(adreno_dev, guilty);
  1397. kgsl_context_put(&guilty->base);
  1398. return ret;
  1399. }
  1400. static int handle_hw_fences_after_reset(struct adreno_device *adreno_dev)
  1401. {
  1402. int ret;
  1403. ret = drain_guilty_context_hw_fences(adreno_dev);
  1404. if (ret)
  1405. return ret;
  1406. /*
  1407. * We must do this after adreno_hwsched_replay() so that context registration
  1408. * is done before we re-send the un-retired hardware fences to the GMU
  1409. */
  1410. ret = process_inflight_hw_fences_after_reset(adreno_dev);
  1411. if (ret)
  1412. return ret;
  1413. ret = process_detached_hw_fences_after_reset(adreno_dev);
  1414. if (ret)
  1415. return ret;
  1416. return gen7_hwsched_disable_hw_fence_throttle(adreno_dev);
  1417. }
  1418. int gen7_hwsched_reset_replay(struct adreno_device *adreno_dev)
  1419. {
  1420. struct gen7_gmu_device *gmu = to_gen7_gmu(adreno_dev);
  1421. struct gen7_hwsched_hfi *hfi = to_gen7_hwsched_hfi(adreno_dev);
  1422. int ret;
  1423. /*
  1424. * Any pending context unregister packets will be lost
  1425. * since we hard reset the GMU. This means any threads waiting
  1426. * for context unregister hfi ack will timeout. Wake them
  1427. * to avoid false positive ack timeout messages later.
  1428. */
  1429. gen7_hwsched_drain_ctxt_unregister(adreno_dev);
  1430. if (!test_bit(GMU_PRIV_GPU_STARTED, &gmu->flags))
  1431. return 0;
  1432. gen7_disable_gpu_irq(adreno_dev);
  1433. gen7_gmu_irq_disable(adreno_dev);
  1434. gen7_hwsched_hfi_stop(adreno_dev);
  1435. gen7_gmu_suspend(adreno_dev);
  1436. adreno_hwsched_unregister_contexts(adreno_dev);
  1437. adreno_llcc_slice_deactivate(adreno_dev);
  1438. clear_bit(GMU_PRIV_GPU_STARTED, &gmu->flags);
  1439. spin_lock(&hfi->hw_fence.lock);
  1440. /* Reset the unack count back to zero as we start afresh */
  1441. hfi->hw_fence.unack_count = 0;
  1442. spin_unlock(&hfi->hw_fence.lock);
  1443. /*
  1444. * When we reset, we want to coldboot incase any scratch corruption
  1445. * has occurred before we faulted.
  1446. */
  1447. adreno_mark_for_coldboot(adreno_dev);
  1448. ret = gen7_hwsched_boot(adreno_dev);
  1449. if (ret)
  1450. goto done;
  1451. adreno_hwsched_replay(adreno_dev);
  1452. ret = handle_hw_fences_after_reset(adreno_dev);
  1453. done:
  1454. BUG_ON(ret);
  1455. return ret;
  1456. }
  1457. const struct adreno_power_ops gen7_hwsched_power_ops = {
  1458. .first_open = gen7_hwsched_first_open,
  1459. .last_close = gen7_hwsched_power_off,
  1460. .active_count_get = gen7_hwsched_active_count_get,
  1461. .active_count_put = gen7_hwsched_active_count_put,
  1462. .touch_wakeup = gen7_hwsched_touch_wakeup,
  1463. .pm_suspend = gen7_hwsched_pm_suspend,
  1464. .pm_resume = gen7_hwsched_pm_resume,
  1465. .gpu_clock_set = gen7_hwsched_clock_set,
  1466. .gpu_bus_set = gen7_hwsched_bus_set,
  1467. };
  1468. const struct adreno_hwsched_ops gen7_hwsched_ops = {
  1469. .submit_drawobj = gen7_hwsched_submit_drawobj,
  1470. .preempt_count = gen7_hwsched_preempt_count_get,
  1471. .create_hw_fence = gen7_hwsched_create_hw_fence,
  1472. };
  1473. int gen7_hwsched_probe(struct platform_device *pdev,
  1474. u32 chipid, const struct adreno_gpu_core *gpucore)
  1475. {
  1476. struct adreno_device *adreno_dev;
  1477. struct kgsl_device *device;
  1478. struct gen7_hwsched_device *gen7_hwsched_dev;
  1479. int ret;
  1480. gen7_hwsched_dev = devm_kzalloc(&pdev->dev, sizeof(*gen7_hwsched_dev),
  1481. GFP_KERNEL);
  1482. if (!gen7_hwsched_dev)
  1483. return -ENOMEM;
  1484. adreno_dev = &gen7_hwsched_dev->gen7_dev.adreno_dev;
  1485. adreno_dev->hwsched_enabled = true;
  1486. adreno_dev->irq_mask = GEN7_HWSCHED_INT_MASK;
  1487. ret = gen7_probe_common(pdev, adreno_dev, chipid, gpucore);
  1488. if (ret)
  1489. return ret;
  1490. device = KGSL_DEVICE(adreno_dev);
  1491. INIT_WORK(&device->idle_check_ws, hwsched_idle_check);
  1492. timer_setup(&device->idle_timer, hwsched_idle_timer, 0);
  1493. if (ADRENO_FEATURE(adreno_dev, ADRENO_LPAC))
  1494. adreno_dev->lpac_enabled = true;
  1495. if (ADRENO_FEATURE(adreno_dev, ADRENO_DMS)) {
  1496. set_bit(ADRENO_DEVICE_DMS, &adreno_dev->priv);
  1497. adreno_dev->dms_enabled = true;
  1498. }
  1499. kgsl_mmu_set_feature(device, KGSL_MMU_PAGEFAULT_TERMINATE);
  1500. ret = adreno_hwsched_init(adreno_dev, &gen7_hwsched_ops);
  1501. if (ret)
  1502. dev_err(&pdev->dev, "adreno hardware scheduler init failed ret %d\n", ret);
  1503. return ret;
  1504. }
  1505. int gen7_hwsched_add_to_minidump(struct adreno_device *adreno_dev)
  1506. {
  1507. struct gen7_device *gen7_dev = container_of(adreno_dev,
  1508. struct gen7_device, adreno_dev);
  1509. struct gen7_hwsched_device *gen7_hwsched = container_of(gen7_dev,
  1510. struct gen7_hwsched_device, gen7_dev);
  1511. struct gen7_hwsched_hfi *hw_hfi = &gen7_hwsched->hwsched_hfi;
  1512. int ret, i;
  1513. ret = kgsl_add_va_to_minidump(adreno_dev->dev.dev, KGSL_HWSCHED_DEVICE,
  1514. (void *)(gen7_hwsched), sizeof(struct gen7_hwsched_device));
  1515. if (ret)
  1516. return ret;
  1517. if (!IS_ERR_OR_NULL(gen7_dev->gmu.gmu_log)) {
  1518. ret = kgsl_add_va_to_minidump(adreno_dev->dev.dev,
  1519. KGSL_GMU_LOG_ENTRY,
  1520. gen7_dev->gmu.gmu_log->hostptr,
  1521. gen7_dev->gmu.gmu_log->size);
  1522. if (ret)
  1523. return ret;
  1524. }
  1525. if (!IS_ERR_OR_NULL(gen7_dev->gmu.hfi.hfi_mem)) {
  1526. ret = kgsl_add_va_to_minidump(adreno_dev->dev.dev,
  1527. KGSL_HFIMEM_ENTRY,
  1528. gen7_dev->gmu.hfi.hfi_mem->hostptr,
  1529. gen7_dev->gmu.hfi.hfi_mem->size);
  1530. if (ret)
  1531. return ret;
  1532. }
  1533. if (!IS_ERR_OR_NULL(gen7_dev->gmu.vrb)) {
  1534. ret = kgsl_add_va_to_minidump(adreno_dev->dev.dev,
  1535. KGSL_GMU_VRB_ENTRY,
  1536. gen7_dev->gmu.vrb->hostptr,
  1537. gen7_dev->gmu.vrb->size);
  1538. if (ret)
  1539. return ret;
  1540. }
  1541. if (!IS_ERR_OR_NULL(gen7_dev->gmu.trace.md)) {
  1542. ret = kgsl_add_va_to_minidump(adreno_dev->dev.dev,
  1543. KGSL_GMU_TRACE_ENTRY,
  1544. gen7_dev->gmu.trace.md->hostptr,
  1545. gen7_dev->gmu.trace.md->size);
  1546. if (ret)
  1547. return ret;
  1548. }
  1549. /* Dump HFI hwsched global mem alloc entries */
  1550. for (i = 0; i < hw_hfi->mem_alloc_entries; i++) {
  1551. struct hfi_mem_alloc_entry *entry = &hw_hfi->mem_alloc_table[i];
  1552. char hfi_minidump_str[MAX_VA_MINIDUMP_STR_LEN] = {0};
  1553. u32 rb_id = 0;
  1554. if (!hfi_get_minidump_string(entry->desc.mem_kind,
  1555. &hfi_minidump_str[0],
  1556. sizeof(hfi_minidump_str), &rb_id)) {
  1557. ret = kgsl_add_va_to_minidump(adreno_dev->dev.dev,
  1558. hfi_minidump_str,
  1559. entry->md->hostptr,
  1560. entry->md->size);
  1561. if (ret)
  1562. return ret;
  1563. }
  1564. }
  1565. if (!IS_ERR_OR_NULL(hw_hfi->big_ib)) {
  1566. ret = kgsl_add_va_to_minidump(adreno_dev->dev.dev,
  1567. KGSL_HFI_BIG_IB_ENTRY,
  1568. hw_hfi->big_ib->hostptr,
  1569. hw_hfi->big_ib->size);
  1570. if (ret)
  1571. return ret;
  1572. }
  1573. if (!IS_ERR_OR_NULL(hw_hfi->big_ib_recurring))
  1574. ret = kgsl_add_va_to_minidump(adreno_dev->dev.dev,
  1575. KGSL_HFI_BIG_IB_REC_ENTRY,
  1576. hw_hfi->big_ib_recurring->hostptr,
  1577. hw_hfi->big_ib_recurring->size);
  1578. return ret;
  1579. }