adreno_gen7_preempt.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2021, The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved.
  5. */
  6. #include "adreno.h"
  7. #include "adreno_gen7.h"
  8. #include "adreno_pm4types.h"
  9. #include "adreno_trace.h"
  10. #define PREEMPT_RECORD(_field) \
  11. offsetof(struct gen7_cp_preemption_record, _field)
  12. #define PREEMPT_SMMU_RECORD(_field) \
  13. offsetof(struct gen7_cp_smmu_info, _field)
  14. static void _update_wptr(struct adreno_device *adreno_dev, bool reset_timer,
  15. bool atomic)
  16. {
  17. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  18. struct adreno_ringbuffer *rb = adreno_dev->cur_rb;
  19. unsigned long flags;
  20. int ret = 0;
  21. spin_lock_irqsave(&rb->preempt_lock, flags);
  22. if (!atomic) {
  23. /*
  24. * We might have skipped updating the wptr in case we are in
  25. * dispatcher context. Do it now.
  26. */
  27. if (rb->skip_inline_wptr) {
  28. ret = gen7_fenced_write(adreno_dev,
  29. GEN7_CP_RB_WPTR, rb->wptr,
  30. FENCE_STATUS_WRITEDROPPED0_MASK);
  31. reset_timer = true;
  32. rb->skip_inline_wptr = false;
  33. }
  34. } else {
  35. unsigned int wptr;
  36. kgsl_regread(device, GEN7_CP_RB_WPTR, &wptr);
  37. if (wptr != rb->wptr) {
  38. kgsl_regwrite(device, GEN7_CP_RB_WPTR, rb->wptr);
  39. reset_timer = true;
  40. }
  41. }
  42. if (reset_timer)
  43. rb->dispatch_q.expires = jiffies +
  44. msecs_to_jiffies(adreno_drawobj_timeout);
  45. spin_unlock_irqrestore(&rb->preempt_lock, flags);
  46. if (!atomic) {
  47. /* If WPTR update fails, set the fault and trigger recovery */
  48. if (ret) {
  49. gmu_core_fault_snapshot(device);
  50. adreno_dispatcher_fault(adreno_dev,
  51. ADRENO_GMU_FAULT_SKIP_SNAPSHOT);
  52. }
  53. }
  54. }
  55. static void _power_collapse_set(struct adreno_device *adreno_dev, bool val)
  56. {
  57. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  58. gmu_core_regwrite(device,
  59. GEN7_GMU_PWR_COL_PREEMPT_KEEPALIVE, (val ? 1 : 0));
  60. }
  61. static void _gen7_preemption_done(struct adreno_device *adreno_dev)
  62. {
  63. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  64. unsigned int status;
  65. /*
  66. * In the very unlikely case that the power is off, do nothing - the
  67. * state will be reset on power up and everybody will be happy
  68. */
  69. if (!kgsl_state_is_awake(device))
  70. return;
  71. kgsl_regread(device, GEN7_CP_CONTEXT_SWITCH_CNTL, &status);
  72. if (status & 0x1) {
  73. dev_err(device->dev,
  74. "Preemption not complete: status=%X cur=%d R/W=%X/%X next=%d R/W=%X/%X\n",
  75. status, adreno_dev->cur_rb->id,
  76. adreno_get_rptr(adreno_dev->cur_rb),
  77. adreno_dev->cur_rb->wptr,
  78. adreno_dev->next_rb->id,
  79. adreno_get_rptr(adreno_dev->next_rb),
  80. adreno_dev->next_rb->wptr);
  81. /* Set a fault and restart */
  82. adreno_dispatcher_fault(adreno_dev, ADRENO_PREEMPT_FAULT);
  83. return;
  84. }
  85. adreno_dev->preempt.count++;
  86. del_timer_sync(&adreno_dev->preempt.timer);
  87. kgsl_regread(device, GEN7_CP_CONTEXT_SWITCH_LEVEL_STATUS, &status);
  88. trace_adreno_preempt_done(adreno_dev->cur_rb->id, adreno_dev->next_rb->id,
  89. status, 0);
  90. /* Clean up all the bits */
  91. adreno_dev->prev_rb = adreno_dev->cur_rb;
  92. adreno_dev->cur_rb = adreno_dev->next_rb;
  93. adreno_dev->next_rb = NULL;
  94. /* Update the wptr for the new command queue */
  95. _update_wptr(adreno_dev, true, false);
  96. /* Update the dispatcher timer for the new command queue */
  97. mod_timer(&adreno_dev->dispatcher.timer,
  98. adreno_dev->cur_rb->dispatch_q.expires);
  99. /* Clear the preempt state */
  100. adreno_set_preempt_state(adreno_dev, ADRENO_PREEMPT_NONE);
  101. }
  102. static void _gen7_preemption_fault(struct adreno_device *adreno_dev)
  103. {
  104. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  105. unsigned int status;
  106. /*
  107. * If the power is on check the preemption status one more time - if it
  108. * was successful then just transition to the complete state
  109. */
  110. if (kgsl_state_is_awake(device)) {
  111. kgsl_regread(device, GEN7_CP_CONTEXT_SWITCH_CNTL, &status);
  112. if (!(status & 0x1)) {
  113. adreno_set_preempt_state(adreno_dev,
  114. ADRENO_PREEMPT_COMPLETE);
  115. adreno_dispatcher_schedule(device);
  116. return;
  117. }
  118. }
  119. dev_err(device->dev,
  120. "Preemption Fault: cur=%d R/W=0x%x/0x%x, next=%d R/W=0x%x/0x%x\n",
  121. adreno_dev->cur_rb->id,
  122. adreno_get_rptr(adreno_dev->cur_rb),
  123. adreno_dev->cur_rb->wptr,
  124. adreno_dev->next_rb->id,
  125. adreno_get_rptr(adreno_dev->next_rb),
  126. adreno_dev->next_rb->wptr);
  127. adreno_dispatcher_fault(adreno_dev, ADRENO_PREEMPT_FAULT);
  128. }
  129. static void _gen7_preemption_worker(struct work_struct *work)
  130. {
  131. struct adreno_preemption *preempt = container_of(work,
  132. struct adreno_preemption, work);
  133. struct adreno_device *adreno_dev = container_of(preempt,
  134. struct adreno_device, preempt);
  135. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  136. /* Need to take the mutex to make sure that the power stays on */
  137. mutex_lock(&device->mutex);
  138. if (adreno_in_preempt_state(adreno_dev, ADRENO_PREEMPT_FAULTED))
  139. _gen7_preemption_fault(adreno_dev);
  140. mutex_unlock(&device->mutex);
  141. }
  142. /* Find the highest priority active ringbuffer */
  143. static struct adreno_ringbuffer *gen7_next_ringbuffer(
  144. struct adreno_device *adreno_dev)
  145. {
  146. struct adreno_ringbuffer *rb;
  147. unsigned long flags;
  148. unsigned int i;
  149. FOR_EACH_RINGBUFFER(adreno_dev, rb, i) {
  150. bool empty;
  151. spin_lock_irqsave(&rb->preempt_lock, flags);
  152. empty = adreno_rb_empty(rb);
  153. spin_unlock_irqrestore(&rb->preempt_lock, flags);
  154. if (!empty)
  155. return rb;
  156. }
  157. return NULL;
  158. }
  159. void gen7_preemption_trigger(struct adreno_device *adreno_dev, bool atomic)
  160. {
  161. const struct adreno_gen7_core *gen7_core = to_gen7_core(adreno_dev);
  162. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  163. struct kgsl_iommu *iommu = KGSL_IOMMU(device);
  164. struct adreno_ringbuffer *next;
  165. u64 ttbr0, gpuaddr;
  166. u32 contextidr, cntl;
  167. unsigned long flags;
  168. struct adreno_preemption *preempt = &adreno_dev->preempt;
  169. /* Put ourselves into a possible trigger state */
  170. if (!adreno_move_preempt_state(adreno_dev,
  171. ADRENO_PREEMPT_NONE, ADRENO_PREEMPT_START))
  172. return;
  173. /* Get the next ringbuffer to preempt in */
  174. next = gen7_next_ringbuffer(adreno_dev);
  175. /*
  176. * Nothing to do if every ringbuffer is empty or if the current
  177. * ringbuffer is the only active one
  178. */
  179. if (next == NULL || next == adreno_dev->cur_rb) {
  180. /*
  181. * Update any critical things that might have been skipped while
  182. * we were looking for a new ringbuffer
  183. */
  184. if (next != NULL) {
  185. _update_wptr(adreno_dev, false, atomic);
  186. mod_timer(&adreno_dev->dispatcher.timer,
  187. adreno_dev->cur_rb->dispatch_q.expires);
  188. }
  189. adreno_set_preempt_state(adreno_dev, ADRENO_PREEMPT_NONE);
  190. return;
  191. }
  192. /* Turn off the dispatcher timer */
  193. del_timer(&adreno_dev->dispatcher.timer);
  194. /*
  195. * This is the most critical section - we need to take care not to race
  196. * until we have programmed the CP for the switch
  197. */
  198. spin_lock_irqsave(&next->preempt_lock, flags);
  199. /* Get the pagetable from the pagetable info. */
  200. kgsl_sharedmem_readq(device->scratch, &ttbr0,
  201. SCRATCH_RB_OFFSET(next->id, ttbr0));
  202. kgsl_sharedmem_readl(device->scratch, &contextidr,
  203. SCRATCH_RB_OFFSET(next->id, contextidr));
  204. kgsl_sharedmem_writel(next->preemption_desc,
  205. PREEMPT_RECORD(wptr), next->wptr);
  206. spin_unlock_irqrestore(&next->preempt_lock, flags);
  207. /* And write it to the smmu info */
  208. if (kgsl_mmu_is_perprocess(&device->mmu)) {
  209. kgsl_sharedmem_writeq(iommu->smmu_info,
  210. PREEMPT_SMMU_RECORD(ttbr0), ttbr0);
  211. kgsl_sharedmem_writel(iommu->smmu_info,
  212. PREEMPT_SMMU_RECORD(context_idr), contextidr);
  213. }
  214. kgsl_sharedmem_readq(preempt->scratch, &gpuaddr,
  215. next->id * sizeof(u64));
  216. /*
  217. * Set a keepalive bit before the first preemption register write.
  218. * This is required since while each individual write to the context
  219. * switch registers will wake the GPU from collapse, it will not in
  220. * itself cause GPU activity. Thus, the GPU could technically be
  221. * re-collapsed between subsequent register writes leading to a
  222. * prolonged preemption sequence. The keepalive bit prevents any
  223. * further power collapse while it is set.
  224. * It is more efficient to use a keepalive+wake-on-fence approach here
  225. * rather than an OOB. Both keepalive and the fence are effectively
  226. * free when the GPU is already powered on, whereas an OOB requires an
  227. * unconditional handshake with the GMU.
  228. */
  229. _power_collapse_set(adreno_dev, true);
  230. /*
  231. * Fenced writes on this path will make sure the GPU is woken up
  232. * in case it was power collapsed by the GMU.
  233. */
  234. if (gen7_fenced_write(adreno_dev,
  235. GEN7_CP_CONTEXT_SWITCH_PRIV_NON_SECURE_RESTORE_ADDR_LO,
  236. lower_32_bits(next->preemption_desc->gpuaddr),
  237. FENCE_STATUS_WRITEDROPPED1_MASK))
  238. goto err;
  239. /*
  240. * Above fence writes will make sure GMU comes out of
  241. * IFPC state if its was in IFPC state but it doesn't
  242. * guarantee that GMU FW actually moved to ACTIVE state
  243. * i.e. wake-up from IFPC is complete.
  244. * Wait for GMU to move to ACTIVE state before triggering
  245. * preemption. This is require to make sure CP doesn't
  246. * interrupt GMU during wake-up from IFPC.
  247. */
  248. if (!atomic && gmu_core_dev_wait_for_active_transition(device))
  249. goto err;
  250. if (gen7_fenced_write(adreno_dev,
  251. GEN7_CP_CONTEXT_SWITCH_PRIV_NON_SECURE_RESTORE_ADDR_HI,
  252. upper_32_bits(next->preemption_desc->gpuaddr),
  253. FENCE_STATUS_WRITEDROPPED1_MASK))
  254. goto err;
  255. if (gen7_fenced_write(adreno_dev,
  256. GEN7_CP_CONTEXT_SWITCH_PRIV_SECURE_RESTORE_ADDR_LO,
  257. lower_32_bits(next->secure_preemption_desc->gpuaddr),
  258. FENCE_STATUS_WRITEDROPPED1_MASK))
  259. goto err;
  260. if (gen7_fenced_write(adreno_dev,
  261. GEN7_CP_CONTEXT_SWITCH_PRIV_SECURE_RESTORE_ADDR_HI,
  262. upper_32_bits(next->secure_preemption_desc->gpuaddr),
  263. FENCE_STATUS_WRITEDROPPED1_MASK))
  264. goto err;
  265. if (gen7_fenced_write(adreno_dev,
  266. GEN7_CP_CONTEXT_SWITCH_NON_PRIV_RESTORE_ADDR_LO,
  267. lower_32_bits(gpuaddr),
  268. FENCE_STATUS_WRITEDROPPED1_MASK))
  269. goto err;
  270. if (gen7_fenced_write(adreno_dev,
  271. GEN7_CP_CONTEXT_SWITCH_NON_PRIV_RESTORE_ADDR_HI,
  272. upper_32_bits(gpuaddr),
  273. FENCE_STATUS_WRITEDROPPED1_MASK))
  274. goto err;
  275. adreno_dev->next_rb = next;
  276. /* Start the timer to detect a stuck preemption */
  277. mod_timer(&adreno_dev->preempt.timer,
  278. jiffies + msecs_to_jiffies(ADRENO_PREEMPT_TIMEOUT));
  279. cntl = (preempt->preempt_level << 6) | 0x01;
  280. /* Skip save/restore during L1 preemption */
  281. if (preempt->skipsaverestore)
  282. cntl |= (1 << 9);
  283. /* Enable GMEM save/restore across preemption */
  284. if (preempt->usesgmem)
  285. cntl |= (1 << 8);
  286. trace_adreno_preempt_trigger(adreno_dev->cur_rb->id, adreno_dev->next_rb->id,
  287. cntl, 0);
  288. adreno_set_preempt_state(adreno_dev, ADRENO_PREEMPT_TRIGGERED);
  289. if (gen7_core->qos_value)
  290. kgsl_sharedmem_writel(preempt->scratch,
  291. PREEMPT_SCRATCH_OFFSET(QOS_VALUE_IDX),
  292. gen7_core->qos_value[next->id]);
  293. /* Trigger the preemption */
  294. if (gen7_fenced_write(adreno_dev, GEN7_CP_CONTEXT_SWITCH_CNTL, cntl,
  295. FENCE_STATUS_WRITEDROPPED1_MASK)) {
  296. adreno_dev->next_rb = NULL;
  297. del_timer(&adreno_dev->preempt.timer);
  298. goto err;
  299. }
  300. return;
  301. err:
  302. /* If fenced write fails, take inline snapshot and trigger recovery */
  303. if (!in_interrupt()) {
  304. gmu_core_fault_snapshot(device);
  305. adreno_dispatcher_fault(adreno_dev,
  306. ADRENO_GMU_FAULT_SKIP_SNAPSHOT);
  307. } else {
  308. adreno_dispatcher_fault(adreno_dev, ADRENO_GMU_FAULT);
  309. }
  310. adreno_set_preempt_state(adreno_dev, ADRENO_PREEMPT_NONE);
  311. /* Clear the keep alive */
  312. _power_collapse_set(adreno_dev, false);
  313. }
  314. void gen7_preemption_callback(struct adreno_device *adreno_dev, int bit)
  315. {
  316. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  317. unsigned int status;
  318. if (!adreno_move_preempt_state(adreno_dev,
  319. ADRENO_PREEMPT_TRIGGERED, ADRENO_PREEMPT_PENDING))
  320. return;
  321. kgsl_regread(device, GEN7_CP_CONTEXT_SWITCH_CNTL, &status);
  322. if (status & 0x1) {
  323. dev_err(KGSL_DEVICE(adreno_dev)->dev,
  324. "preempt interrupt with non-zero status: %X\n",
  325. status);
  326. /*
  327. * Under the assumption that this is a race between the
  328. * interrupt and the register, schedule the worker to clean up.
  329. * If the status still hasn't resolved itself by the time we get
  330. * there then we have to assume something bad happened
  331. */
  332. adreno_set_preempt_state(adreno_dev, ADRENO_PREEMPT_COMPLETE);
  333. adreno_dispatcher_schedule(KGSL_DEVICE(adreno_dev));
  334. return;
  335. }
  336. adreno_dev->preempt.count++;
  337. /*
  338. * We can now safely clear the preemption keepalive bit, allowing
  339. * power collapse to resume its regular activity.
  340. */
  341. _power_collapse_set(adreno_dev, false);
  342. del_timer(&adreno_dev->preempt.timer);
  343. kgsl_regread(device, GEN7_CP_CONTEXT_SWITCH_LEVEL_STATUS, &status);
  344. trace_adreno_preempt_done(adreno_dev->cur_rb->id, adreno_dev->next_rb->id,
  345. status, 0);
  346. adreno_dev->prev_rb = adreno_dev->cur_rb;
  347. adreno_dev->cur_rb = adreno_dev->next_rb;
  348. adreno_dev->next_rb = NULL;
  349. /* Update the wptr if it changed while preemption was ongoing */
  350. _update_wptr(adreno_dev, true, true);
  351. /* Update the dispatcher timer for the new command queue */
  352. mod_timer(&adreno_dev->dispatcher.timer,
  353. adreno_dev->cur_rb->dispatch_q.expires);
  354. adreno_set_preempt_state(adreno_dev, ADRENO_PREEMPT_NONE);
  355. gen7_preemption_trigger(adreno_dev, true);
  356. }
  357. void gen7_preemption_prepare_postamble(struct adreno_device *adreno_dev)
  358. {
  359. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  360. const struct adreno_gen7_core *gen7_core = to_gen7_core(adreno_dev);
  361. struct adreno_preemption *preempt = &adreno_dev->preempt;
  362. u32 *postamble, count = 0;
  363. /*
  364. * First 28 dwords of the device scratch buffer are used to store shadow rb data.
  365. * Reserve 15 dwords in the device scratch buffer from SCRATCH_POSTAMBLE_OFFSET for
  366. * KMD postamble pm4 packets. This should be in *device->scratch* so that userspace
  367. * cannot access it.
  368. */
  369. postamble = device->scratch->hostptr + SCRATCH_POSTAMBLE_OFFSET;
  370. /*
  371. * Reserve 4 dwords in the scratch buffer for dynamic QOS control feature. To ensure QOS
  372. * value is updated for first preemption, send it during bootup
  373. */
  374. if (gen7_core->qos_value) {
  375. postamble[count++] = cp_type7_packet(CP_MEM_TO_REG, 3);
  376. postamble[count++] = GEN7_RBBM_GBIF_CLIENT_QOS_CNTL;
  377. postamble[count++] = lower_32_bits(PREEMPT_SCRATCH_ADDR(adreno_dev, QOS_VALUE_IDX));
  378. postamble[count++] = upper_32_bits(PREEMPT_SCRATCH_ADDR(adreno_dev, QOS_VALUE_IDX));
  379. }
  380. /*
  381. * Since postambles are not preserved across slumber, necessary packets
  382. * must be sent to GPU before first submission.
  383. *
  384. * If a packet needs to be sent before first submission, add it above this.
  385. */
  386. preempt->postamble_bootup_len = count;
  387. /* Reserve 11 dwords in the device scratch buffer to clear perfcounters */
  388. if (!adreno_dev->perfcounter) {
  389. postamble[count++] = cp_type7_packet(CP_REG_RMW, 3);
  390. postamble[count++] = GEN7_RBBM_PERFCTR_SRAM_INIT_CMD;
  391. postamble[count++] = 0x0;
  392. postamble[count++] = 0x1;
  393. postamble[count++] = cp_type7_packet(CP_WAIT_REG_MEM, 6);
  394. postamble[count++] = 0x3;
  395. postamble[count++] = GEN7_RBBM_PERFCTR_SRAM_INIT_STATUS;
  396. postamble[count++] = 0x0;
  397. postamble[count++] = 0x1;
  398. postamble[count++] = 0x1;
  399. postamble[count++] = 0x0;
  400. }
  401. preempt->postamble_len = count;
  402. }
  403. void gen7_preemption_schedule(struct adreno_device *adreno_dev)
  404. {
  405. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  406. if (!adreno_is_preemption_enabled(adreno_dev))
  407. return;
  408. mutex_lock(&device->mutex);
  409. if (adreno_in_preempt_state(adreno_dev, ADRENO_PREEMPT_COMPLETE))
  410. _gen7_preemption_done(adreno_dev);
  411. gen7_preemption_trigger(adreno_dev, false);
  412. mutex_unlock(&device->mutex);
  413. }
  414. u32 gen7_preemption_pre_ibsubmit(struct adreno_device *adreno_dev,
  415. struct adreno_ringbuffer *rb, struct adreno_context *drawctxt,
  416. u32 *cmds)
  417. {
  418. u32 *cmds_orig = cmds;
  419. if (!adreno_is_preemption_enabled(adreno_dev))
  420. return 0;
  421. if (test_and_set_bit(ADRENO_RB_SET_PSEUDO_DONE, &rb->flags))
  422. goto done;
  423. *cmds++ = cp_type7_packet(CP_THREAD_CONTROL, 1);
  424. *cmds++ = CP_SET_THREAD_BR;
  425. *cmds++ = cp_type7_packet(CP_SET_PSEUDO_REGISTER, 12);
  426. /* NULL SMMU_INFO buffer - we track in KMD */
  427. *cmds++ = SET_PSEUDO_SMMU_INFO;
  428. cmds += cp_gpuaddr(adreno_dev, cmds, 0x0);
  429. *cmds++ = SET_PSEUDO_PRIV_NON_SECURE_SAVE_ADDR;
  430. cmds += cp_gpuaddr(adreno_dev, cmds, rb->preemption_desc->gpuaddr);
  431. *cmds++ = SET_PSEUDO_PRIV_SECURE_SAVE_ADDR;
  432. cmds += cp_gpuaddr(adreno_dev, cmds,
  433. rb->secure_preemption_desc->gpuaddr);
  434. /*
  435. * There is no need to specify this address when we are about to
  436. * trigger preemption. This is because CP internally stores this
  437. * address specified here in the CP_SET_PSEUDO_REGISTER payload to
  438. * the context record and thus knows from where to restore
  439. * the saved perfcounters for the new ringbuffer.
  440. */
  441. *cmds++ = SET_PSEUDO_COUNTER;
  442. cmds += cp_gpuaddr(adreno_dev, cmds,
  443. rb->perfcounter_save_restore_desc->gpuaddr);
  444. done:
  445. if (drawctxt) {
  446. struct adreno_ringbuffer *rb = drawctxt->rb;
  447. u64 dest = PREEMPT_SCRATCH_ADDR(adreno_dev, rb->id);
  448. u64 gpuaddr = drawctxt->base.user_ctxt_record->memdesc.gpuaddr;
  449. *cmds++ = cp_mem_packet(adreno_dev, CP_MEM_WRITE, 2, 2);
  450. cmds += cp_gpuaddr(adreno_dev, cmds, dest);
  451. *cmds++ = lower_32_bits(gpuaddr);
  452. *cmds++ = upper_32_bits(gpuaddr);
  453. if (adreno_dev->preempt.postamble_len) {
  454. u64 kmd_postamble_addr = SCRATCH_POSTAMBLE_ADDR(KGSL_DEVICE(adreno_dev));
  455. *cmds++ = cp_type7_packet(CP_SET_AMBLE, 3);
  456. *cmds++ = lower_32_bits(kmd_postamble_addr);
  457. *cmds++ = upper_32_bits(kmd_postamble_addr);
  458. *cmds++ = FIELD_PREP(GENMASK(22, 20), CP_KMD_AMBLE_TYPE)
  459. | (FIELD_PREP(GENMASK(19, 0), adreno_dev->preempt.postamble_len));
  460. }
  461. }
  462. return (unsigned int) (cmds - cmds_orig);
  463. }
  464. u32 gen7_preemption_post_ibsubmit(struct adreno_device *adreno_dev,
  465. u32 *cmds)
  466. {
  467. u32 index = 0;
  468. if (!adreno_is_preemption_enabled(adreno_dev))
  469. return 0;
  470. if (adreno_dev->cur_rb) {
  471. u64 dest = PREEMPT_SCRATCH_ADDR(adreno_dev, adreno_dev->cur_rb->id);
  472. cmds[index++] = cp_type7_packet(CP_MEM_WRITE, 4);
  473. cmds[index++] = lower_32_bits(dest);
  474. cmds[index++] = upper_32_bits(dest);
  475. cmds[index++] = 0;
  476. cmds[index++] = 0;
  477. }
  478. cmds[index++] = cp_type7_packet(CP_THREAD_CONTROL, 1);
  479. cmds[index++] = CP_SET_THREAD_BOTH;
  480. cmds[index++] = cp_type7_packet(CP_CONTEXT_SWITCH_YIELD, 4);
  481. cmds[index++] = 0;
  482. cmds[index++] = 0;
  483. cmds[index++] = 1;
  484. cmds[index++] = 0;
  485. return index;
  486. }
  487. void gen7_preemption_start(struct adreno_device *adreno_dev)
  488. {
  489. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  490. struct kgsl_iommu *iommu = KGSL_IOMMU(device);
  491. struct adreno_ringbuffer *rb;
  492. unsigned int i;
  493. if (!adreno_is_preemption_enabled(adreno_dev))
  494. return;
  495. /* Force the state to be clear */
  496. adreno_set_preempt_state(adreno_dev, ADRENO_PREEMPT_NONE);
  497. if (kgsl_mmu_is_perprocess(&device->mmu)) {
  498. /* smmu_info is allocated and mapped in gen7_preemption_iommu_init */
  499. kgsl_sharedmem_writel(iommu->smmu_info,
  500. PREEMPT_SMMU_RECORD(magic), GEN7_CP_SMMU_INFO_MAGIC_REF);
  501. kgsl_sharedmem_writeq(iommu->smmu_info,
  502. PREEMPT_SMMU_RECORD(ttbr0), MMU_DEFAULT_TTBR0(device));
  503. /* The CP doesn't use the asid record, so poison it */
  504. kgsl_sharedmem_writel(iommu->smmu_info,
  505. PREEMPT_SMMU_RECORD(asid), 0xdecafbad);
  506. kgsl_sharedmem_writel(iommu->smmu_info,
  507. PREEMPT_SMMU_RECORD(context_idr), 0);
  508. kgsl_regwrite(device, GEN7_CP_CONTEXT_SWITCH_SMMU_INFO_LO,
  509. lower_32_bits(iommu->smmu_info->gpuaddr));
  510. kgsl_regwrite(device, GEN7_CP_CONTEXT_SWITCH_SMMU_INFO_HI,
  511. upper_32_bits(iommu->smmu_info->gpuaddr));
  512. }
  513. FOR_EACH_RINGBUFFER(adreno_dev, rb, i) {
  514. kgsl_sharedmem_writel(rb->preemption_desc,
  515. PREEMPT_RECORD(rptr), 0);
  516. kgsl_sharedmem_writel(rb->preemption_desc,
  517. PREEMPT_RECORD(wptr), 0);
  518. adreno_ringbuffer_set_pagetable(device, rb,
  519. device->mmu.defaultpagetable);
  520. clear_bit(ADRENO_RB_SET_PSEUDO_DONE, &rb->flags);
  521. }
  522. }
  523. static void reset_rb_preempt_record(struct adreno_device *adreno_dev,
  524. struct adreno_ringbuffer *rb)
  525. {
  526. memset(rb->preemption_desc->hostptr, 0x0, rb->preemption_desc->size);
  527. kgsl_sharedmem_writel(rb->preemption_desc,
  528. PREEMPT_RECORD(magic), GEN7_CP_CTXRECORD_MAGIC_REF);
  529. kgsl_sharedmem_writel(rb->preemption_desc,
  530. PREEMPT_RECORD(cntl), GEN7_CP_RB_CNTL_DEFAULT);
  531. kgsl_sharedmem_writeq(rb->preemption_desc,
  532. PREEMPT_RECORD(rptr_addr), SCRATCH_RB_GPU_ADDR(
  533. KGSL_DEVICE(adreno_dev), rb->id, rptr));
  534. kgsl_sharedmem_writeq(rb->preemption_desc,
  535. PREEMPT_RECORD(rbase), rb->buffer_desc->gpuaddr);
  536. kgsl_sharedmem_writeq(rb->preemption_desc,
  537. PREEMPT_RECORD(bv_rptr_addr), SCRATCH_RB_GPU_ADDR(
  538. KGSL_DEVICE(adreno_dev), rb->id, bv_rptr));
  539. }
  540. void gen7_reset_preempt_records(struct adreno_device *adreno_dev)
  541. {
  542. int i;
  543. struct adreno_ringbuffer *rb;
  544. if (!adreno_is_preemption_enabled(adreno_dev))
  545. return;
  546. FOR_EACH_RINGBUFFER(adreno_dev, rb, i) {
  547. reset_rb_preempt_record(adreno_dev, rb);
  548. }
  549. }
  550. static int gen7_preemption_ringbuffer_init(struct adreno_device *adreno_dev,
  551. struct adreno_ringbuffer *rb)
  552. {
  553. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  554. const struct adreno_gen7_core *gen7_core = to_gen7_core(adreno_dev);
  555. u64 ctxt_record_size = GEN7_CP_CTXRECORD_SIZE_IN_BYTES;
  556. int ret;
  557. if (gen7_core->ctxt_record_size)
  558. ctxt_record_size = gen7_core->ctxt_record_size;
  559. ret = adreno_allocate_global(device, &rb->preemption_desc,
  560. ctxt_record_size, SZ_16K, 0,
  561. KGSL_MEMDESC_PRIVILEGED, "preemption_desc");
  562. if (ret)
  563. return ret;
  564. ret = adreno_allocate_global(device, &rb->secure_preemption_desc,
  565. ctxt_record_size, 0,
  566. KGSL_MEMFLAGS_SECURE, KGSL_MEMDESC_PRIVILEGED,
  567. "secure_preemption_desc");
  568. if (ret)
  569. return ret;
  570. ret = adreno_allocate_global(device, &rb->perfcounter_save_restore_desc,
  571. GEN7_CP_PERFCOUNTER_SAVE_RESTORE_SIZE, 0, 0,
  572. KGSL_MEMDESC_PRIVILEGED,
  573. "perfcounter_save_restore_desc");
  574. if (ret)
  575. return ret;
  576. reset_rb_preempt_record(adreno_dev, rb);
  577. return 0;
  578. }
  579. int gen7_preemption_init(struct adreno_device *adreno_dev)
  580. {
  581. u32 flags = ADRENO_FEATURE(adreno_dev, ADRENO_APRIV) ? KGSL_MEMDESC_PRIVILEGED : 0;
  582. struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
  583. struct kgsl_iommu *iommu = KGSL_IOMMU(device);
  584. struct adreno_preemption *preempt = &adreno_dev->preempt;
  585. struct adreno_ringbuffer *rb;
  586. int ret;
  587. unsigned int i;
  588. /* We are dependent on IOMMU to make preemption go on the CP side */
  589. if (kgsl_mmu_get_mmutype(device) != KGSL_MMU_TYPE_IOMMU) {
  590. ret = -ENODEV;
  591. goto done;
  592. }
  593. INIT_WORK(&preempt->work, _gen7_preemption_worker);
  594. /* Allocate mem for storing preemption switch record */
  595. FOR_EACH_RINGBUFFER(adreno_dev, rb, i) {
  596. ret = gen7_preemption_ringbuffer_init(adreno_dev, rb);
  597. if (ret)
  598. goto done;
  599. }
  600. ret = adreno_allocate_global(device, &preempt->scratch, PAGE_SIZE,
  601. 0, 0, flags, "preempt_scratch");
  602. if (ret)
  603. goto done;
  604. /* Allocate mem for storing preemption smmu record */
  605. if (kgsl_mmu_is_perprocess(&device->mmu)) {
  606. ret = adreno_allocate_global(device, &iommu->smmu_info, PAGE_SIZE, 0,
  607. KGSL_MEMFLAGS_GPUREADONLY, KGSL_MEMDESC_PRIVILEGED,
  608. "smmu_info");
  609. if (ret)
  610. goto done;
  611. }
  612. return 0;
  613. done:
  614. clear_bit(ADRENO_DEVICE_PREEMPTION, &adreno_dev->priv);
  615. return ret;
  616. }
  617. int gen7_preemption_context_init(struct kgsl_context *context)
  618. {
  619. struct kgsl_device *device = context->device;
  620. struct adreno_device *adreno_dev = ADRENO_DEVICE(device);
  621. u64 flags = 0;
  622. if (!adreno_preemption_feature_set(adreno_dev))
  623. return 0;
  624. if (context->flags & KGSL_CONTEXT_SECURE)
  625. flags |= KGSL_MEMFLAGS_SECURE;
  626. if (is_compat_task())
  627. flags |= KGSL_MEMFLAGS_FORCE_32BIT;
  628. /*
  629. * gpumem_alloc_entry takes an extra refcount. Put it only when
  630. * destroying the context to keep the context record valid
  631. */
  632. context->user_ctxt_record = gpumem_alloc_entry(context->dev_priv,
  633. GEN7_CP_CTXRECORD_USER_RESTORE_SIZE, flags);
  634. if (IS_ERR(context->user_ctxt_record)) {
  635. int ret = PTR_ERR(context->user_ctxt_record);
  636. context->user_ctxt_record = NULL;
  637. return ret;
  638. }
  639. return 0;
  640. }