adreno_gen8_hwsched.c 50 KB

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