uvd_v4_2.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810
  1. /*
  2. * Copyright 2013 Advanced Micro Devices, Inc.
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a
  5. * copy of this software and associated documentation files (the "Software"),
  6. * to deal in the Software without restriction, including without limitation
  7. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8. * and/or sell copies of the Software, and to permit persons to whom the
  9. * Software is furnished to do so, subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice shall be included in
  12. * all copies or substantial portions of the Software.
  13. *
  14. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  17. * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  18. * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  19. * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  20. * OTHER DEALINGS IN THE SOFTWARE.
  21. *
  22. * Authors: Christian König <christian.koenig@amd.com>
  23. */
  24. #include <linux/firmware.h>
  25. #include <drm/drmP.h>
  26. #include "amdgpu.h"
  27. #include "amdgpu_uvd.h"
  28. #include "cikd.h"
  29. #include "uvd/uvd_4_2_d.h"
  30. #include "uvd/uvd_4_2_sh_mask.h"
  31. #include "oss/oss_2_0_d.h"
  32. #include "oss/oss_2_0_sh_mask.h"
  33. #include "bif/bif_4_1_d.h"
  34. #include "smu/smu_7_0_1_d.h"
  35. #include "smu/smu_7_0_1_sh_mask.h"
  36. static void uvd_v4_2_mc_resume(struct amdgpu_device *adev);
  37. static void uvd_v4_2_init_cg(struct amdgpu_device *adev);
  38. static void uvd_v4_2_set_ring_funcs(struct amdgpu_device *adev);
  39. static void uvd_v4_2_set_irq_funcs(struct amdgpu_device *adev);
  40. static int uvd_v4_2_start(struct amdgpu_device *adev);
  41. static void uvd_v4_2_stop(struct amdgpu_device *adev);
  42. /**
  43. * uvd_v4_2_ring_get_rptr - get read pointer
  44. *
  45. * @ring: amdgpu_ring pointer
  46. *
  47. * Returns the current hardware read pointer
  48. */
  49. static uint32_t uvd_v4_2_ring_get_rptr(struct amdgpu_ring *ring)
  50. {
  51. struct amdgpu_device *adev = ring->adev;
  52. return RREG32(mmUVD_RBC_RB_RPTR);
  53. }
  54. /**
  55. * uvd_v4_2_ring_get_wptr - get write pointer
  56. *
  57. * @ring: amdgpu_ring pointer
  58. *
  59. * Returns the current hardware write pointer
  60. */
  61. static uint32_t uvd_v4_2_ring_get_wptr(struct amdgpu_ring *ring)
  62. {
  63. struct amdgpu_device *adev = ring->adev;
  64. return RREG32(mmUVD_RBC_RB_WPTR);
  65. }
  66. /**
  67. * uvd_v4_2_ring_set_wptr - set write pointer
  68. *
  69. * @ring: amdgpu_ring pointer
  70. *
  71. * Commits the write pointer to the hardware
  72. */
  73. static void uvd_v4_2_ring_set_wptr(struct amdgpu_ring *ring)
  74. {
  75. struct amdgpu_device *adev = ring->adev;
  76. WREG32(mmUVD_RBC_RB_WPTR, ring->wptr);
  77. }
  78. static int uvd_v4_2_early_init(void *handle)
  79. {
  80. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  81. uvd_v4_2_set_ring_funcs(adev);
  82. uvd_v4_2_set_irq_funcs(adev);
  83. return 0;
  84. }
  85. static int uvd_v4_2_sw_init(void *handle)
  86. {
  87. struct amdgpu_ring *ring;
  88. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  89. int r;
  90. /* UVD TRAP */
  91. r = amdgpu_irq_add_id(adev, 124, &adev->uvd.irq);
  92. if (r)
  93. return r;
  94. r = amdgpu_uvd_sw_init(adev);
  95. if (r)
  96. return r;
  97. r = amdgpu_uvd_resume(adev);
  98. if (r)
  99. return r;
  100. ring = &adev->uvd.ring;
  101. sprintf(ring->name, "uvd");
  102. r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.irq, 0);
  103. return r;
  104. }
  105. static int uvd_v4_2_sw_fini(void *handle)
  106. {
  107. int r;
  108. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  109. r = amdgpu_uvd_suspend(adev);
  110. if (r)
  111. return r;
  112. r = amdgpu_uvd_sw_fini(adev);
  113. if (r)
  114. return r;
  115. return r;
  116. }
  117. /**
  118. * uvd_v4_2_hw_init - start and test UVD block
  119. *
  120. * @adev: amdgpu_device pointer
  121. *
  122. * Initialize the hardware, boot up the VCPU and do some testing
  123. */
  124. static int uvd_v4_2_hw_init(void *handle)
  125. {
  126. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  127. struct amdgpu_ring *ring = &adev->uvd.ring;
  128. uint32_t tmp;
  129. int r;
  130. /* raise clocks while booting up the VCPU */
  131. amdgpu_asic_set_uvd_clocks(adev, 53300, 40000);
  132. r = uvd_v4_2_start(adev);
  133. if (r)
  134. goto done;
  135. ring->ready = true;
  136. r = amdgpu_ring_test_ring(ring);
  137. if (r) {
  138. ring->ready = false;
  139. goto done;
  140. }
  141. r = amdgpu_ring_alloc(ring, 10);
  142. if (r) {
  143. DRM_ERROR("amdgpu: ring failed to lock UVD ring (%d).\n", r);
  144. goto done;
  145. }
  146. tmp = PACKET0(mmUVD_SEMA_WAIT_FAULT_TIMEOUT_CNTL, 0);
  147. amdgpu_ring_write(ring, tmp);
  148. amdgpu_ring_write(ring, 0xFFFFF);
  149. tmp = PACKET0(mmUVD_SEMA_WAIT_INCOMPLETE_TIMEOUT_CNTL, 0);
  150. amdgpu_ring_write(ring, tmp);
  151. amdgpu_ring_write(ring, 0xFFFFF);
  152. tmp = PACKET0(mmUVD_SEMA_SIGNAL_INCOMPLETE_TIMEOUT_CNTL, 0);
  153. amdgpu_ring_write(ring, tmp);
  154. amdgpu_ring_write(ring, 0xFFFFF);
  155. /* Clear timeout status bits */
  156. amdgpu_ring_write(ring, PACKET0(mmUVD_SEMA_TIMEOUT_STATUS, 0));
  157. amdgpu_ring_write(ring, 0x8);
  158. amdgpu_ring_write(ring, PACKET0(mmUVD_SEMA_CNTL, 0));
  159. amdgpu_ring_write(ring, 3);
  160. amdgpu_ring_commit(ring);
  161. done:
  162. /* lower clocks again */
  163. amdgpu_asic_set_uvd_clocks(adev, 0, 0);
  164. if (!r)
  165. DRM_INFO("UVD initialized successfully.\n");
  166. return r;
  167. }
  168. /**
  169. * uvd_v4_2_hw_fini - stop the hardware block
  170. *
  171. * @adev: amdgpu_device pointer
  172. *
  173. * Stop the UVD block, mark ring as not ready any more
  174. */
  175. static int uvd_v4_2_hw_fini(void *handle)
  176. {
  177. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  178. struct amdgpu_ring *ring = &adev->uvd.ring;
  179. uvd_v4_2_stop(adev);
  180. ring->ready = false;
  181. return 0;
  182. }
  183. static int uvd_v4_2_suspend(void *handle)
  184. {
  185. int r;
  186. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  187. r = uvd_v4_2_hw_fini(adev);
  188. if (r)
  189. return r;
  190. r = amdgpu_uvd_suspend(adev);
  191. if (r)
  192. return r;
  193. return r;
  194. }
  195. static int uvd_v4_2_resume(void *handle)
  196. {
  197. int r;
  198. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  199. r = amdgpu_uvd_resume(adev);
  200. if (r)
  201. return r;
  202. r = uvd_v4_2_hw_init(adev);
  203. if (r)
  204. return r;
  205. return r;
  206. }
  207. /**
  208. * uvd_v4_2_start - start UVD block
  209. *
  210. * @adev: amdgpu_device pointer
  211. *
  212. * Setup and start the UVD block
  213. */
  214. static int uvd_v4_2_start(struct amdgpu_device *adev)
  215. {
  216. struct amdgpu_ring *ring = &adev->uvd.ring;
  217. uint32_t rb_bufsz;
  218. int i, j, r;
  219. /* disable byte swapping */
  220. u32 lmi_swap_cntl = 0;
  221. u32 mp_swap_cntl = 0;
  222. uvd_v4_2_mc_resume(adev);
  223. /* disable clock gating */
  224. WREG32(mmUVD_CGC_GATE, 0);
  225. /* disable interupt */
  226. WREG32_P(mmUVD_MASTINT_EN, 0, ~(1 << 1));
  227. /* Stall UMC and register bus before resetting VCPU */
  228. WREG32_P(mmUVD_LMI_CTRL2, 1 << 8, ~(1 << 8));
  229. mdelay(1);
  230. /* put LMI, VCPU, RBC etc... into reset */
  231. WREG32(mmUVD_SOFT_RESET, UVD_SOFT_RESET__LMI_SOFT_RESET_MASK |
  232. UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK | UVD_SOFT_RESET__LBSI_SOFT_RESET_MASK |
  233. UVD_SOFT_RESET__RBC_SOFT_RESET_MASK | UVD_SOFT_RESET__CSM_SOFT_RESET_MASK |
  234. UVD_SOFT_RESET__CXW_SOFT_RESET_MASK | UVD_SOFT_RESET__TAP_SOFT_RESET_MASK |
  235. UVD_SOFT_RESET__LMI_UMC_SOFT_RESET_MASK);
  236. mdelay(5);
  237. /* take UVD block out of reset */
  238. WREG32_P(mmSRBM_SOFT_RESET, 0, ~SRBM_SOFT_RESET__SOFT_RESET_UVD_MASK);
  239. mdelay(5);
  240. /* initialize UVD memory controller */
  241. WREG32(mmUVD_LMI_CTRL, 0x40 | (1 << 8) | (1 << 13) |
  242. (1 << 21) | (1 << 9) | (1 << 20));
  243. #ifdef __BIG_ENDIAN
  244. /* swap (8 in 32) RB and IB */
  245. lmi_swap_cntl = 0xa;
  246. mp_swap_cntl = 0;
  247. #endif
  248. WREG32(mmUVD_LMI_SWAP_CNTL, lmi_swap_cntl);
  249. WREG32(mmUVD_MP_SWAP_CNTL, mp_swap_cntl);
  250. WREG32(mmUVD_MPC_SET_MUXA0, 0x40c2040);
  251. WREG32(mmUVD_MPC_SET_MUXA1, 0x0);
  252. WREG32(mmUVD_MPC_SET_MUXB0, 0x40c2040);
  253. WREG32(mmUVD_MPC_SET_MUXB1, 0x0);
  254. WREG32(mmUVD_MPC_SET_ALU, 0);
  255. WREG32(mmUVD_MPC_SET_MUX, 0x88);
  256. /* take all subblocks out of reset, except VCPU */
  257. WREG32(mmUVD_SOFT_RESET, UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK);
  258. mdelay(5);
  259. /* enable VCPU clock */
  260. WREG32(mmUVD_VCPU_CNTL, 1 << 9);
  261. /* enable UMC */
  262. WREG32_P(mmUVD_LMI_CTRL2, 0, ~(1 << 8));
  263. /* boot up the VCPU */
  264. WREG32(mmUVD_SOFT_RESET, 0);
  265. mdelay(10);
  266. for (i = 0; i < 10; ++i) {
  267. uint32_t status;
  268. for (j = 0; j < 100; ++j) {
  269. status = RREG32(mmUVD_STATUS);
  270. if (status & 2)
  271. break;
  272. mdelay(10);
  273. }
  274. r = 0;
  275. if (status & 2)
  276. break;
  277. DRM_ERROR("UVD not responding, trying to reset the VCPU!!!\n");
  278. WREG32_P(mmUVD_SOFT_RESET, UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK,
  279. ~UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK);
  280. mdelay(10);
  281. WREG32_P(mmUVD_SOFT_RESET, 0, ~UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK);
  282. mdelay(10);
  283. r = -1;
  284. }
  285. if (r) {
  286. DRM_ERROR("UVD not responding, giving up!!!\n");
  287. return r;
  288. }
  289. /* enable interupt */
  290. WREG32_P(mmUVD_MASTINT_EN, 3<<1, ~(3 << 1));
  291. /* force RBC into idle state */
  292. WREG32(mmUVD_RBC_RB_CNTL, 0x11010101);
  293. /* Set the write pointer delay */
  294. WREG32(mmUVD_RBC_RB_WPTR_CNTL, 0);
  295. /* programm the 4GB memory segment for rptr and ring buffer */
  296. WREG32(mmUVD_LMI_EXT40_ADDR, upper_32_bits(ring->gpu_addr) |
  297. (0x7 << 16) | (0x1 << 31));
  298. /* Initialize the ring buffer's read and write pointers */
  299. WREG32(mmUVD_RBC_RB_RPTR, 0x0);
  300. ring->wptr = RREG32(mmUVD_RBC_RB_RPTR);
  301. WREG32(mmUVD_RBC_RB_WPTR, ring->wptr);
  302. /* set the ring address */
  303. WREG32(mmUVD_RBC_RB_BASE, ring->gpu_addr);
  304. /* Set ring buffer size */
  305. rb_bufsz = order_base_2(ring->ring_size);
  306. rb_bufsz = (0x1 << 8) | rb_bufsz;
  307. WREG32_P(mmUVD_RBC_RB_CNTL, rb_bufsz, ~0x11f1f);
  308. return 0;
  309. }
  310. /**
  311. * uvd_v4_2_stop - stop UVD block
  312. *
  313. * @adev: amdgpu_device pointer
  314. *
  315. * stop the UVD block
  316. */
  317. static void uvd_v4_2_stop(struct amdgpu_device *adev)
  318. {
  319. /* force RBC into idle state */
  320. WREG32(mmUVD_RBC_RB_CNTL, 0x11010101);
  321. /* Stall UMC and register bus before resetting VCPU */
  322. WREG32_P(mmUVD_LMI_CTRL2, 1 << 8, ~(1 << 8));
  323. mdelay(1);
  324. /* put VCPU into reset */
  325. WREG32(mmUVD_SOFT_RESET, UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK);
  326. mdelay(5);
  327. /* disable VCPU clock */
  328. WREG32(mmUVD_VCPU_CNTL, 0x0);
  329. /* Unstall UMC and register bus */
  330. WREG32_P(mmUVD_LMI_CTRL2, 0, ~(1 << 8));
  331. }
  332. /**
  333. * uvd_v4_2_ring_emit_fence - emit an fence & trap command
  334. *
  335. * @ring: amdgpu_ring pointer
  336. * @fence: fence to emit
  337. *
  338. * Write a fence and a trap command to the ring.
  339. */
  340. static void uvd_v4_2_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq,
  341. unsigned flags)
  342. {
  343. WARN_ON(flags & AMDGPU_FENCE_FLAG_64BIT);
  344. amdgpu_ring_write(ring, PACKET0(mmUVD_CONTEXT_ID, 0));
  345. amdgpu_ring_write(ring, seq);
  346. amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_DATA0, 0));
  347. amdgpu_ring_write(ring, addr & 0xffffffff);
  348. amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_DATA1, 0));
  349. amdgpu_ring_write(ring, upper_32_bits(addr) & 0xff);
  350. amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_CMD, 0));
  351. amdgpu_ring_write(ring, 0);
  352. amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_DATA0, 0));
  353. amdgpu_ring_write(ring, 0);
  354. amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_DATA1, 0));
  355. amdgpu_ring_write(ring, 0);
  356. amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_CMD, 0));
  357. amdgpu_ring_write(ring, 2);
  358. }
  359. /**
  360. * uvd_v4_2_ring_emit_hdp_flush - emit an hdp flush
  361. *
  362. * @ring: amdgpu_ring pointer
  363. *
  364. * Emits an hdp flush.
  365. */
  366. static void uvd_v4_2_ring_emit_hdp_flush(struct amdgpu_ring *ring)
  367. {
  368. amdgpu_ring_write(ring, PACKET0(mmHDP_MEM_COHERENCY_FLUSH_CNTL, 0));
  369. amdgpu_ring_write(ring, 0);
  370. }
  371. /**
  372. * uvd_v4_2_ring_hdp_invalidate - emit an hdp invalidate
  373. *
  374. * @ring: amdgpu_ring pointer
  375. *
  376. * Emits an hdp invalidate.
  377. */
  378. static void uvd_v4_2_ring_emit_hdp_invalidate(struct amdgpu_ring *ring)
  379. {
  380. amdgpu_ring_write(ring, PACKET0(mmHDP_DEBUG0, 0));
  381. amdgpu_ring_write(ring, 1);
  382. }
  383. /**
  384. * uvd_v4_2_ring_test_ring - register write test
  385. *
  386. * @ring: amdgpu_ring pointer
  387. *
  388. * Test if we can successfully write to the context register
  389. */
  390. static int uvd_v4_2_ring_test_ring(struct amdgpu_ring *ring)
  391. {
  392. struct amdgpu_device *adev = ring->adev;
  393. uint32_t tmp = 0;
  394. unsigned i;
  395. int r;
  396. WREG32(mmUVD_CONTEXT_ID, 0xCAFEDEAD);
  397. r = amdgpu_ring_alloc(ring, 3);
  398. if (r) {
  399. DRM_ERROR("amdgpu: cp failed to lock ring %d (%d).\n",
  400. ring->idx, r);
  401. return r;
  402. }
  403. amdgpu_ring_write(ring, PACKET0(mmUVD_CONTEXT_ID, 0));
  404. amdgpu_ring_write(ring, 0xDEADBEEF);
  405. amdgpu_ring_commit(ring);
  406. for (i = 0; i < adev->usec_timeout; i++) {
  407. tmp = RREG32(mmUVD_CONTEXT_ID);
  408. if (tmp == 0xDEADBEEF)
  409. break;
  410. DRM_UDELAY(1);
  411. }
  412. if (i < adev->usec_timeout) {
  413. DRM_INFO("ring test on %d succeeded in %d usecs\n",
  414. ring->idx, i);
  415. } else {
  416. DRM_ERROR("amdgpu: ring %d test failed (0x%08X)\n",
  417. ring->idx, tmp);
  418. r = -EINVAL;
  419. }
  420. return r;
  421. }
  422. /**
  423. * uvd_v4_2_ring_emit_ib - execute indirect buffer
  424. *
  425. * @ring: amdgpu_ring pointer
  426. * @ib: indirect buffer to execute
  427. *
  428. * Write ring commands to execute the indirect buffer
  429. */
  430. static void uvd_v4_2_ring_emit_ib(struct amdgpu_ring *ring,
  431. struct amdgpu_ib *ib,
  432. unsigned vm_id, bool ctx_switch)
  433. {
  434. amdgpu_ring_write(ring, PACKET0(mmUVD_RBC_IB_BASE, 0));
  435. amdgpu_ring_write(ring, ib->gpu_addr);
  436. amdgpu_ring_write(ring, PACKET0(mmUVD_RBC_IB_SIZE, 0));
  437. amdgpu_ring_write(ring, ib->length_dw);
  438. }
  439. /**
  440. * uvd_v4_2_mc_resume - memory controller programming
  441. *
  442. * @adev: amdgpu_device pointer
  443. *
  444. * Let the UVD memory controller know it's offsets
  445. */
  446. static void uvd_v4_2_mc_resume(struct amdgpu_device *adev)
  447. {
  448. uint64_t addr;
  449. uint32_t size;
  450. /* programm the VCPU memory controller bits 0-27 */
  451. addr = (adev->uvd.gpu_addr + AMDGPU_UVD_FIRMWARE_OFFSET) >> 3;
  452. size = AMDGPU_GPU_PAGE_ALIGN(adev->uvd.fw->size + 4) >> 3;
  453. WREG32(mmUVD_VCPU_CACHE_OFFSET0, addr);
  454. WREG32(mmUVD_VCPU_CACHE_SIZE0, size);
  455. addr += size;
  456. size = AMDGPU_UVD_HEAP_SIZE >> 3;
  457. WREG32(mmUVD_VCPU_CACHE_OFFSET1, addr);
  458. WREG32(mmUVD_VCPU_CACHE_SIZE1, size);
  459. addr += size;
  460. size = (AMDGPU_UVD_STACK_SIZE +
  461. (AMDGPU_UVD_SESSION_SIZE * adev->uvd.max_handles)) >> 3;
  462. WREG32(mmUVD_VCPU_CACHE_OFFSET2, addr);
  463. WREG32(mmUVD_VCPU_CACHE_SIZE2, size);
  464. /* bits 28-31 */
  465. addr = (adev->uvd.gpu_addr >> 28) & 0xF;
  466. WREG32(mmUVD_LMI_ADDR_EXT, (addr << 12) | (addr << 0));
  467. /* bits 32-39 */
  468. addr = (adev->uvd.gpu_addr >> 32) & 0xFF;
  469. WREG32(mmUVD_LMI_EXT40_ADDR, addr | (0x9 << 16) | (0x1 << 31));
  470. WREG32(mmUVD_UDEC_ADDR_CONFIG, adev->gfx.config.gb_addr_config);
  471. WREG32(mmUVD_UDEC_DB_ADDR_CONFIG, adev->gfx.config.gb_addr_config);
  472. WREG32(mmUVD_UDEC_DBW_ADDR_CONFIG, adev->gfx.config.gb_addr_config);
  473. uvd_v4_2_init_cg(adev);
  474. }
  475. static void uvd_v4_2_enable_mgcg(struct amdgpu_device *adev,
  476. bool enable)
  477. {
  478. u32 orig, data;
  479. if (enable && (adev->cg_flags & AMD_CG_SUPPORT_UVD_MGCG)) {
  480. data = RREG32_UVD_CTX(ixUVD_CGC_MEM_CTRL);
  481. data = 0xfff;
  482. WREG32_UVD_CTX(ixUVD_CGC_MEM_CTRL, data);
  483. orig = data = RREG32(mmUVD_CGC_CTRL);
  484. data |= UVD_CGC_CTRL__DYN_CLOCK_MODE_MASK;
  485. if (orig != data)
  486. WREG32(mmUVD_CGC_CTRL, data);
  487. } else {
  488. data = RREG32_UVD_CTX(ixUVD_CGC_MEM_CTRL);
  489. data &= ~0xfff;
  490. WREG32_UVD_CTX(ixUVD_CGC_MEM_CTRL, data);
  491. orig = data = RREG32(mmUVD_CGC_CTRL);
  492. data &= ~UVD_CGC_CTRL__DYN_CLOCK_MODE_MASK;
  493. if (orig != data)
  494. WREG32(mmUVD_CGC_CTRL, data);
  495. }
  496. }
  497. static void uvd_v4_2_set_dcm(struct amdgpu_device *adev,
  498. bool sw_mode)
  499. {
  500. u32 tmp, tmp2;
  501. tmp = RREG32(mmUVD_CGC_CTRL);
  502. tmp &= ~(UVD_CGC_CTRL__CLK_OFF_DELAY_MASK | UVD_CGC_CTRL__CLK_GATE_DLY_TIMER_MASK);
  503. tmp |= UVD_CGC_CTRL__DYN_CLOCK_MODE_MASK |
  504. (1 << UVD_CGC_CTRL__CLK_GATE_DLY_TIMER__SHIFT) |
  505. (4 << UVD_CGC_CTRL__CLK_OFF_DELAY__SHIFT);
  506. if (sw_mode) {
  507. tmp &= ~0x7ffff800;
  508. tmp2 = UVD_CGC_CTRL2__DYN_OCLK_RAMP_EN_MASK |
  509. UVD_CGC_CTRL2__DYN_RCLK_RAMP_EN_MASK |
  510. (7 << UVD_CGC_CTRL2__GATER_DIV_ID__SHIFT);
  511. } else {
  512. tmp |= 0x7ffff800;
  513. tmp2 = 0;
  514. }
  515. WREG32(mmUVD_CGC_CTRL, tmp);
  516. WREG32_UVD_CTX(ixUVD_CGC_CTRL2, tmp2);
  517. }
  518. static void uvd_v4_2_init_cg(struct amdgpu_device *adev)
  519. {
  520. bool hw_mode = true;
  521. if (hw_mode) {
  522. uvd_v4_2_set_dcm(adev, false);
  523. } else {
  524. u32 tmp = RREG32(mmUVD_CGC_CTRL);
  525. tmp &= ~UVD_CGC_CTRL__DYN_CLOCK_MODE_MASK;
  526. WREG32(mmUVD_CGC_CTRL, tmp);
  527. }
  528. }
  529. static bool uvd_v4_2_is_idle(void *handle)
  530. {
  531. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  532. return !(RREG32(mmSRBM_STATUS) & SRBM_STATUS__UVD_BUSY_MASK);
  533. }
  534. static int uvd_v4_2_wait_for_idle(void *handle)
  535. {
  536. unsigned i;
  537. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  538. for (i = 0; i < adev->usec_timeout; i++) {
  539. if (!(RREG32(mmSRBM_STATUS) & SRBM_STATUS__UVD_BUSY_MASK))
  540. return 0;
  541. }
  542. return -ETIMEDOUT;
  543. }
  544. static int uvd_v4_2_soft_reset(void *handle)
  545. {
  546. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  547. uvd_v4_2_stop(adev);
  548. WREG32_P(mmSRBM_SOFT_RESET, SRBM_SOFT_RESET__SOFT_RESET_UVD_MASK,
  549. ~SRBM_SOFT_RESET__SOFT_RESET_UVD_MASK);
  550. mdelay(5);
  551. return uvd_v4_2_start(adev);
  552. }
  553. static int uvd_v4_2_set_interrupt_state(struct amdgpu_device *adev,
  554. struct amdgpu_irq_src *source,
  555. unsigned type,
  556. enum amdgpu_interrupt_state state)
  557. {
  558. // TODO
  559. return 0;
  560. }
  561. static int uvd_v4_2_process_interrupt(struct amdgpu_device *adev,
  562. struct amdgpu_irq_src *source,
  563. struct amdgpu_iv_entry *entry)
  564. {
  565. DRM_DEBUG("IH: UVD TRAP\n");
  566. amdgpu_fence_process(&adev->uvd.ring);
  567. return 0;
  568. }
  569. static void uvd_v5_0_set_bypass_mode(struct amdgpu_device *adev, bool enable)
  570. {
  571. u32 tmp = RREG32_SMC(ixGCK_DFS_BYPASS_CNTL);
  572. if (enable)
  573. tmp |= (GCK_DFS_BYPASS_CNTL__BYPASSDCLK_MASK |
  574. GCK_DFS_BYPASS_CNTL__BYPASSVCLK_MASK);
  575. else
  576. tmp &= ~(GCK_DFS_BYPASS_CNTL__BYPASSDCLK_MASK |
  577. GCK_DFS_BYPASS_CNTL__BYPASSVCLK_MASK);
  578. WREG32_SMC(ixGCK_DFS_BYPASS_CNTL, tmp);
  579. }
  580. static int uvd_v4_2_set_clockgating_state(void *handle,
  581. enum amd_clockgating_state state)
  582. {
  583. bool gate = false;
  584. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  585. if (state == AMD_CG_STATE_GATE)
  586. gate = true;
  587. uvd_v5_0_set_bypass_mode(adev, gate);
  588. if (!(adev->cg_flags & AMD_CG_SUPPORT_UVD_MGCG))
  589. return 0;
  590. uvd_v4_2_enable_mgcg(adev, gate);
  591. return 0;
  592. }
  593. static int uvd_v4_2_set_powergating_state(void *handle,
  594. enum amd_powergating_state state)
  595. {
  596. /* This doesn't actually powergate the UVD block.
  597. * That's done in the dpm code via the SMC. This
  598. * just re-inits the block as necessary. The actual
  599. * gating still happens in the dpm code. We should
  600. * revisit this when there is a cleaner line between
  601. * the smc and the hw blocks
  602. */
  603. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  604. if (!(adev->pg_flags & AMD_PG_SUPPORT_UVD))
  605. return 0;
  606. if (state == AMD_PG_STATE_GATE) {
  607. uvd_v4_2_stop(adev);
  608. return 0;
  609. } else {
  610. return uvd_v4_2_start(adev);
  611. }
  612. }
  613. static const struct amd_ip_funcs uvd_v4_2_ip_funcs = {
  614. .name = "uvd_v4_2",
  615. .early_init = uvd_v4_2_early_init,
  616. .late_init = NULL,
  617. .sw_init = uvd_v4_2_sw_init,
  618. .sw_fini = uvd_v4_2_sw_fini,
  619. .hw_init = uvd_v4_2_hw_init,
  620. .hw_fini = uvd_v4_2_hw_fini,
  621. .suspend = uvd_v4_2_suspend,
  622. .resume = uvd_v4_2_resume,
  623. .is_idle = uvd_v4_2_is_idle,
  624. .wait_for_idle = uvd_v4_2_wait_for_idle,
  625. .soft_reset = uvd_v4_2_soft_reset,
  626. .set_clockgating_state = uvd_v4_2_set_clockgating_state,
  627. .set_powergating_state = uvd_v4_2_set_powergating_state,
  628. };
  629. static const struct amdgpu_ring_funcs uvd_v4_2_ring_funcs = {
  630. .type = AMDGPU_RING_TYPE_UVD,
  631. .align_mask = 0xf,
  632. .nop = PACKET0(mmUVD_NO_OP, 0),
  633. .get_rptr = uvd_v4_2_ring_get_rptr,
  634. .get_wptr = uvd_v4_2_ring_get_wptr,
  635. .set_wptr = uvd_v4_2_ring_set_wptr,
  636. .parse_cs = amdgpu_uvd_ring_parse_cs,
  637. .emit_frame_size =
  638. 2 + /* uvd_v4_2_ring_emit_hdp_flush */
  639. 2 + /* uvd_v4_2_ring_emit_hdp_invalidate */
  640. 14, /* uvd_v4_2_ring_emit_fence x1 no user fence */
  641. .emit_ib_size = 4, /* uvd_v4_2_ring_emit_ib */
  642. .emit_ib = uvd_v4_2_ring_emit_ib,
  643. .emit_fence = uvd_v4_2_ring_emit_fence,
  644. .emit_hdp_flush = uvd_v4_2_ring_emit_hdp_flush,
  645. .emit_hdp_invalidate = uvd_v4_2_ring_emit_hdp_invalidate,
  646. .test_ring = uvd_v4_2_ring_test_ring,
  647. .test_ib = amdgpu_uvd_ring_test_ib,
  648. .insert_nop = amdgpu_ring_insert_nop,
  649. .pad_ib = amdgpu_ring_generic_pad_ib,
  650. .begin_use = amdgpu_uvd_ring_begin_use,
  651. .end_use = amdgpu_uvd_ring_end_use,
  652. };
  653. static void uvd_v4_2_set_ring_funcs(struct amdgpu_device *adev)
  654. {
  655. adev->uvd.ring.funcs = &uvd_v4_2_ring_funcs;
  656. }
  657. static const struct amdgpu_irq_src_funcs uvd_v4_2_irq_funcs = {
  658. .set = uvd_v4_2_set_interrupt_state,
  659. .process = uvd_v4_2_process_interrupt,
  660. };
  661. static void uvd_v4_2_set_irq_funcs(struct amdgpu_device *adev)
  662. {
  663. adev->uvd.irq.num_types = 1;
  664. adev->uvd.irq.funcs = &uvd_v4_2_irq_funcs;
  665. }
  666. const struct amdgpu_ip_block_version uvd_v4_2_ip_block =
  667. {
  668. .type = AMD_IP_BLOCK_TYPE_UVD,
  669. .major = 4,
  670. .minor = 2,
  671. .rev = 0,
  672. .funcs = &uvd_v4_2_ip_funcs,
  673. };