uvd_v7_0.c 51 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793
  1. /*
  2. * Copyright 2016 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. */
  23. #include <linux/firmware.h>
  24. #include <drm/drmP.h>
  25. #include "amdgpu.h"
  26. #include "amdgpu_uvd.h"
  27. #include "soc15d.h"
  28. #include "soc15_common.h"
  29. #include "mmsch_v1_0.h"
  30. #include "uvd/uvd_7_0_offset.h"
  31. #include "uvd/uvd_7_0_sh_mask.h"
  32. #include "vce/vce_4_0_offset.h"
  33. #include "vce/vce_4_0_default.h"
  34. #include "vce/vce_4_0_sh_mask.h"
  35. #include "nbif/nbif_6_1_offset.h"
  36. #include "hdp/hdp_4_0_offset.h"
  37. #include "mmhub/mmhub_1_0_offset.h"
  38. #include "mmhub/mmhub_1_0_sh_mask.h"
  39. static void uvd_v7_0_set_ring_funcs(struct amdgpu_device *adev);
  40. static void uvd_v7_0_set_enc_ring_funcs(struct amdgpu_device *adev);
  41. static void uvd_v7_0_set_irq_funcs(struct amdgpu_device *adev);
  42. static int uvd_v7_0_start(struct amdgpu_device *adev);
  43. static void uvd_v7_0_stop(struct amdgpu_device *adev);
  44. static int uvd_v7_0_sriov_start(struct amdgpu_device *adev);
  45. /**
  46. * uvd_v7_0_ring_get_rptr - get read pointer
  47. *
  48. * @ring: amdgpu_ring pointer
  49. *
  50. * Returns the current hardware read pointer
  51. */
  52. static uint64_t uvd_v7_0_ring_get_rptr(struct amdgpu_ring *ring)
  53. {
  54. struct amdgpu_device *adev = ring->adev;
  55. return RREG32_SOC15(UVD, 0, mmUVD_RBC_RB_RPTR);
  56. }
  57. /**
  58. * uvd_v7_0_enc_ring_get_rptr - get enc read pointer
  59. *
  60. * @ring: amdgpu_ring pointer
  61. *
  62. * Returns the current hardware enc read pointer
  63. */
  64. static uint64_t uvd_v7_0_enc_ring_get_rptr(struct amdgpu_ring *ring)
  65. {
  66. struct amdgpu_device *adev = ring->adev;
  67. if (ring == &adev->uvd.ring_enc[0])
  68. return RREG32_SOC15(UVD, 0, mmUVD_RB_RPTR);
  69. else
  70. return RREG32_SOC15(UVD, 0, mmUVD_RB_RPTR2);
  71. }
  72. /**
  73. * uvd_v7_0_ring_get_wptr - get write pointer
  74. *
  75. * @ring: amdgpu_ring pointer
  76. *
  77. * Returns the current hardware write pointer
  78. */
  79. static uint64_t uvd_v7_0_ring_get_wptr(struct amdgpu_ring *ring)
  80. {
  81. struct amdgpu_device *adev = ring->adev;
  82. return RREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR);
  83. }
  84. /**
  85. * uvd_v7_0_enc_ring_get_wptr - get enc write pointer
  86. *
  87. * @ring: amdgpu_ring pointer
  88. *
  89. * Returns the current hardware enc write pointer
  90. */
  91. static uint64_t uvd_v7_0_enc_ring_get_wptr(struct amdgpu_ring *ring)
  92. {
  93. struct amdgpu_device *adev = ring->adev;
  94. if (ring->use_doorbell)
  95. return adev->wb.wb[ring->wptr_offs];
  96. if (ring == &adev->uvd.ring_enc[0])
  97. return RREG32_SOC15(UVD, 0, mmUVD_RB_WPTR);
  98. else
  99. return RREG32_SOC15(UVD, 0, mmUVD_RB_WPTR2);
  100. }
  101. /**
  102. * uvd_v7_0_ring_set_wptr - set write pointer
  103. *
  104. * @ring: amdgpu_ring pointer
  105. *
  106. * Commits the write pointer to the hardware
  107. */
  108. static void uvd_v7_0_ring_set_wptr(struct amdgpu_ring *ring)
  109. {
  110. struct amdgpu_device *adev = ring->adev;
  111. WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR, lower_32_bits(ring->wptr));
  112. }
  113. /**
  114. * uvd_v7_0_enc_ring_set_wptr - set enc write pointer
  115. *
  116. * @ring: amdgpu_ring pointer
  117. *
  118. * Commits the enc write pointer to the hardware
  119. */
  120. static void uvd_v7_0_enc_ring_set_wptr(struct amdgpu_ring *ring)
  121. {
  122. struct amdgpu_device *adev = ring->adev;
  123. if (ring->use_doorbell) {
  124. /* XXX check if swapping is necessary on BE */
  125. adev->wb.wb[ring->wptr_offs] = lower_32_bits(ring->wptr);
  126. WDOORBELL32(ring->doorbell_index, lower_32_bits(ring->wptr));
  127. return;
  128. }
  129. if (ring == &adev->uvd.ring_enc[0])
  130. WREG32_SOC15(UVD, 0, mmUVD_RB_WPTR,
  131. lower_32_bits(ring->wptr));
  132. else
  133. WREG32_SOC15(UVD, 0, mmUVD_RB_WPTR2,
  134. lower_32_bits(ring->wptr));
  135. }
  136. /**
  137. * uvd_v7_0_enc_ring_test_ring - test if UVD ENC ring is working
  138. *
  139. * @ring: the engine to test on
  140. *
  141. */
  142. static int uvd_v7_0_enc_ring_test_ring(struct amdgpu_ring *ring)
  143. {
  144. struct amdgpu_device *adev = ring->adev;
  145. uint32_t rptr = amdgpu_ring_get_rptr(ring);
  146. unsigned i;
  147. int r;
  148. if (amdgpu_sriov_vf(adev))
  149. return 0;
  150. r = amdgpu_ring_alloc(ring, 16);
  151. if (r) {
  152. DRM_ERROR("amdgpu: uvd enc failed to lock ring %d (%d).\n",
  153. ring->idx, r);
  154. return r;
  155. }
  156. amdgpu_ring_write(ring, HEVC_ENC_CMD_END);
  157. amdgpu_ring_commit(ring);
  158. for (i = 0; i < adev->usec_timeout; i++) {
  159. if (amdgpu_ring_get_rptr(ring) != rptr)
  160. break;
  161. DRM_UDELAY(1);
  162. }
  163. if (i < adev->usec_timeout) {
  164. DRM_DEBUG("ring test on %d succeeded in %d usecs\n",
  165. ring->idx, i);
  166. } else {
  167. DRM_ERROR("amdgpu: ring %d test failed\n",
  168. ring->idx);
  169. r = -ETIMEDOUT;
  170. }
  171. return r;
  172. }
  173. /**
  174. * uvd_v7_0_enc_get_create_msg - generate a UVD ENC create msg
  175. *
  176. * @adev: amdgpu_device pointer
  177. * @ring: ring we should submit the msg to
  178. * @handle: session handle to use
  179. * @fence: optional fence to return
  180. *
  181. * Open up a stream for HW test
  182. */
  183. static int uvd_v7_0_enc_get_create_msg(struct amdgpu_ring *ring, uint32_t handle,
  184. struct dma_fence **fence)
  185. {
  186. const unsigned ib_size_dw = 16;
  187. struct amdgpu_job *job;
  188. struct amdgpu_ib *ib;
  189. struct dma_fence *f = NULL;
  190. uint64_t dummy;
  191. int i, r;
  192. r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, &job);
  193. if (r)
  194. return r;
  195. ib = &job->ibs[0];
  196. dummy = ib->gpu_addr + 1024;
  197. ib->length_dw = 0;
  198. ib->ptr[ib->length_dw++] = 0x00000018;
  199. ib->ptr[ib->length_dw++] = 0x00000001; /* session info */
  200. ib->ptr[ib->length_dw++] = handle;
  201. ib->ptr[ib->length_dw++] = 0x00000000;
  202. ib->ptr[ib->length_dw++] = upper_32_bits(dummy);
  203. ib->ptr[ib->length_dw++] = dummy;
  204. ib->ptr[ib->length_dw++] = 0x00000014;
  205. ib->ptr[ib->length_dw++] = 0x00000002; /* task info */
  206. ib->ptr[ib->length_dw++] = 0x0000001c;
  207. ib->ptr[ib->length_dw++] = 0x00000000;
  208. ib->ptr[ib->length_dw++] = 0x00000000;
  209. ib->ptr[ib->length_dw++] = 0x00000008;
  210. ib->ptr[ib->length_dw++] = 0x08000001; /* op initialize */
  211. for (i = ib->length_dw; i < ib_size_dw; ++i)
  212. ib->ptr[i] = 0x0;
  213. r = amdgpu_ib_schedule(ring, 1, ib, NULL, &f);
  214. job->fence = dma_fence_get(f);
  215. if (r)
  216. goto err;
  217. amdgpu_job_free(job);
  218. if (fence)
  219. *fence = dma_fence_get(f);
  220. dma_fence_put(f);
  221. return 0;
  222. err:
  223. amdgpu_job_free(job);
  224. return r;
  225. }
  226. /**
  227. * uvd_v7_0_enc_get_destroy_msg - generate a UVD ENC destroy msg
  228. *
  229. * @adev: amdgpu_device pointer
  230. * @ring: ring we should submit the msg to
  231. * @handle: session handle to use
  232. * @fence: optional fence to return
  233. *
  234. * Close up a stream for HW test or if userspace failed to do so
  235. */
  236. int uvd_v7_0_enc_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle,
  237. bool direct, struct dma_fence **fence)
  238. {
  239. const unsigned ib_size_dw = 16;
  240. struct amdgpu_job *job;
  241. struct amdgpu_ib *ib;
  242. struct dma_fence *f = NULL;
  243. uint64_t dummy;
  244. int i, r;
  245. r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, &job);
  246. if (r)
  247. return r;
  248. ib = &job->ibs[0];
  249. dummy = ib->gpu_addr + 1024;
  250. ib->length_dw = 0;
  251. ib->ptr[ib->length_dw++] = 0x00000018;
  252. ib->ptr[ib->length_dw++] = 0x00000001;
  253. ib->ptr[ib->length_dw++] = handle;
  254. ib->ptr[ib->length_dw++] = 0x00000000;
  255. ib->ptr[ib->length_dw++] = upper_32_bits(dummy);
  256. ib->ptr[ib->length_dw++] = dummy;
  257. ib->ptr[ib->length_dw++] = 0x00000014;
  258. ib->ptr[ib->length_dw++] = 0x00000002;
  259. ib->ptr[ib->length_dw++] = 0x0000001c;
  260. ib->ptr[ib->length_dw++] = 0x00000000;
  261. ib->ptr[ib->length_dw++] = 0x00000000;
  262. ib->ptr[ib->length_dw++] = 0x00000008;
  263. ib->ptr[ib->length_dw++] = 0x08000002; /* op close session */
  264. for (i = ib->length_dw; i < ib_size_dw; ++i)
  265. ib->ptr[i] = 0x0;
  266. if (direct) {
  267. r = amdgpu_ib_schedule(ring, 1, ib, NULL, &f);
  268. job->fence = dma_fence_get(f);
  269. if (r)
  270. goto err;
  271. amdgpu_job_free(job);
  272. } else {
  273. r = amdgpu_job_submit(job, ring, &ring->adev->vce.entity,
  274. AMDGPU_FENCE_OWNER_UNDEFINED, &f);
  275. if (r)
  276. goto err;
  277. }
  278. if (fence)
  279. *fence = dma_fence_get(f);
  280. dma_fence_put(f);
  281. return 0;
  282. err:
  283. amdgpu_job_free(job);
  284. return r;
  285. }
  286. /**
  287. * uvd_v7_0_enc_ring_test_ib - test if UVD ENC IBs are working
  288. *
  289. * @ring: the engine to test on
  290. *
  291. */
  292. static int uvd_v7_0_enc_ring_test_ib(struct amdgpu_ring *ring, long timeout)
  293. {
  294. struct dma_fence *fence = NULL;
  295. long r;
  296. r = uvd_v7_0_enc_get_create_msg(ring, 1, NULL);
  297. if (r) {
  298. DRM_ERROR("amdgpu: failed to get create msg (%ld).\n", r);
  299. goto error;
  300. }
  301. r = uvd_v7_0_enc_get_destroy_msg(ring, 1, true, &fence);
  302. if (r) {
  303. DRM_ERROR("amdgpu: failed to get destroy ib (%ld).\n", r);
  304. goto error;
  305. }
  306. r = dma_fence_wait_timeout(fence, false, timeout);
  307. if (r == 0) {
  308. DRM_ERROR("amdgpu: IB test timed out.\n");
  309. r = -ETIMEDOUT;
  310. } else if (r < 0) {
  311. DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
  312. } else {
  313. DRM_DEBUG("ib test on ring %d succeeded\n", ring->idx);
  314. r = 0;
  315. }
  316. error:
  317. dma_fence_put(fence);
  318. return r;
  319. }
  320. static int uvd_v7_0_early_init(void *handle)
  321. {
  322. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  323. if (amdgpu_sriov_vf(adev))
  324. adev->uvd.num_enc_rings = 1;
  325. else
  326. adev->uvd.num_enc_rings = 2;
  327. uvd_v7_0_set_ring_funcs(adev);
  328. uvd_v7_0_set_enc_ring_funcs(adev);
  329. uvd_v7_0_set_irq_funcs(adev);
  330. return 0;
  331. }
  332. static int uvd_v7_0_sw_init(void *handle)
  333. {
  334. struct amdgpu_ring *ring;
  335. struct drm_sched_rq *rq;
  336. int i, r;
  337. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  338. /* UVD TRAP */
  339. r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_UVD, 124, &adev->uvd.irq);
  340. if (r)
  341. return r;
  342. /* UVD ENC TRAP */
  343. for (i = 0; i < adev->uvd.num_enc_rings; ++i) {
  344. r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_UVD, i + 119, &adev->uvd.irq);
  345. if (r)
  346. return r;
  347. }
  348. r = amdgpu_uvd_sw_init(adev);
  349. if (r)
  350. return r;
  351. if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
  352. const struct common_firmware_header *hdr;
  353. hdr = (const struct common_firmware_header *)adev->uvd.fw->data;
  354. adev->firmware.ucode[AMDGPU_UCODE_ID_UVD].ucode_id = AMDGPU_UCODE_ID_UVD;
  355. adev->firmware.ucode[AMDGPU_UCODE_ID_UVD].fw = adev->uvd.fw;
  356. adev->firmware.fw_size +=
  357. ALIGN(le32_to_cpu(hdr->ucode_size_bytes), PAGE_SIZE);
  358. DRM_INFO("PSP loading UVD firmware\n");
  359. }
  360. ring = &adev->uvd.ring_enc[0];
  361. rq = &ring->sched.sched_rq[DRM_SCHED_PRIORITY_NORMAL];
  362. r = drm_sched_entity_init(&ring->sched, &adev->uvd.entity_enc,
  363. rq, amdgpu_sched_jobs, NULL);
  364. if (r) {
  365. DRM_ERROR("Failed setting up UVD ENC run queue.\n");
  366. return r;
  367. }
  368. r = amdgpu_uvd_resume(adev);
  369. if (r)
  370. return r;
  371. if (!amdgpu_sriov_vf(adev)) {
  372. ring = &adev->uvd.ring;
  373. sprintf(ring->name, "uvd");
  374. r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.irq, 0);
  375. if (r)
  376. return r;
  377. }
  378. for (i = 0; i < adev->uvd.num_enc_rings; ++i) {
  379. ring = &adev->uvd.ring_enc[i];
  380. sprintf(ring->name, "uvd_enc%d", i);
  381. if (amdgpu_sriov_vf(adev)) {
  382. ring->use_doorbell = true;
  383. /* currently only use the first enconding ring for
  384. * sriov, so set unused location for other unused rings.
  385. */
  386. if (i == 0)
  387. ring->doorbell_index = AMDGPU_DOORBELL64_UVD_RING0_1 * 2;
  388. else
  389. ring->doorbell_index = AMDGPU_DOORBELL64_UVD_RING2_3 * 2 + 1;
  390. }
  391. r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.irq, 0);
  392. if (r)
  393. return r;
  394. }
  395. r = amdgpu_virt_alloc_mm_table(adev);
  396. if (r)
  397. return r;
  398. return r;
  399. }
  400. static int uvd_v7_0_sw_fini(void *handle)
  401. {
  402. int i, r;
  403. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  404. amdgpu_virt_free_mm_table(adev);
  405. r = amdgpu_uvd_suspend(adev);
  406. if (r)
  407. return r;
  408. drm_sched_entity_fini(&adev->uvd.ring_enc[0].sched, &adev->uvd.entity_enc);
  409. for (i = 0; i < adev->uvd.num_enc_rings; ++i)
  410. amdgpu_ring_fini(&adev->uvd.ring_enc[i]);
  411. return amdgpu_uvd_sw_fini(adev);
  412. }
  413. /**
  414. * uvd_v7_0_hw_init - start and test UVD block
  415. *
  416. * @adev: amdgpu_device pointer
  417. *
  418. * Initialize the hardware, boot up the VCPU and do some testing
  419. */
  420. static int uvd_v7_0_hw_init(void *handle)
  421. {
  422. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  423. struct amdgpu_ring *ring = &adev->uvd.ring;
  424. uint32_t tmp;
  425. int i, r;
  426. if (amdgpu_sriov_vf(adev))
  427. r = uvd_v7_0_sriov_start(adev);
  428. else
  429. r = uvd_v7_0_start(adev);
  430. if (r)
  431. goto done;
  432. if (!amdgpu_sriov_vf(adev)) {
  433. ring->ready = true;
  434. r = amdgpu_ring_test_ring(ring);
  435. if (r) {
  436. ring->ready = false;
  437. goto done;
  438. }
  439. r = amdgpu_ring_alloc(ring, 10);
  440. if (r) {
  441. DRM_ERROR("amdgpu: ring failed to lock UVD ring (%d).\n", r);
  442. goto done;
  443. }
  444. tmp = PACKET0(SOC15_REG_OFFSET(UVD, 0,
  445. mmUVD_SEMA_WAIT_FAULT_TIMEOUT_CNTL), 0);
  446. amdgpu_ring_write(ring, tmp);
  447. amdgpu_ring_write(ring, 0xFFFFF);
  448. tmp = PACKET0(SOC15_REG_OFFSET(UVD, 0,
  449. mmUVD_SEMA_WAIT_INCOMPLETE_TIMEOUT_CNTL), 0);
  450. amdgpu_ring_write(ring, tmp);
  451. amdgpu_ring_write(ring, 0xFFFFF);
  452. tmp = PACKET0(SOC15_REG_OFFSET(UVD, 0,
  453. mmUVD_SEMA_SIGNAL_INCOMPLETE_TIMEOUT_CNTL), 0);
  454. amdgpu_ring_write(ring, tmp);
  455. amdgpu_ring_write(ring, 0xFFFFF);
  456. /* Clear timeout status bits */
  457. amdgpu_ring_write(ring, PACKET0(SOC15_REG_OFFSET(UVD, 0,
  458. mmUVD_SEMA_TIMEOUT_STATUS), 0));
  459. amdgpu_ring_write(ring, 0x8);
  460. amdgpu_ring_write(ring, PACKET0(SOC15_REG_OFFSET(UVD, 0,
  461. mmUVD_SEMA_CNTL), 0));
  462. amdgpu_ring_write(ring, 3);
  463. amdgpu_ring_commit(ring);
  464. }
  465. for (i = 0; i < adev->uvd.num_enc_rings; ++i) {
  466. ring = &adev->uvd.ring_enc[i];
  467. ring->ready = true;
  468. r = amdgpu_ring_test_ring(ring);
  469. if (r) {
  470. ring->ready = false;
  471. goto done;
  472. }
  473. }
  474. done:
  475. if (!r)
  476. DRM_INFO("UVD and UVD ENC initialized successfully.\n");
  477. return r;
  478. }
  479. /**
  480. * uvd_v7_0_hw_fini - stop the hardware block
  481. *
  482. * @adev: amdgpu_device pointer
  483. *
  484. * Stop the UVD block, mark ring as not ready any more
  485. */
  486. static int uvd_v7_0_hw_fini(void *handle)
  487. {
  488. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  489. struct amdgpu_ring *ring = &adev->uvd.ring;
  490. if (!amdgpu_sriov_vf(adev))
  491. uvd_v7_0_stop(adev);
  492. else {
  493. /* full access mode, so don't touch any UVD register */
  494. DRM_DEBUG("For SRIOV client, shouldn't do anything.\n");
  495. }
  496. ring->ready = false;
  497. return 0;
  498. }
  499. static int uvd_v7_0_suspend(void *handle)
  500. {
  501. int r;
  502. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  503. r = uvd_v7_0_hw_fini(adev);
  504. if (r)
  505. return r;
  506. return amdgpu_uvd_suspend(adev);
  507. }
  508. static int uvd_v7_0_resume(void *handle)
  509. {
  510. int r;
  511. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  512. r = amdgpu_uvd_resume(adev);
  513. if (r)
  514. return r;
  515. return uvd_v7_0_hw_init(adev);
  516. }
  517. /**
  518. * uvd_v7_0_mc_resume - memory controller programming
  519. *
  520. * @adev: amdgpu_device pointer
  521. *
  522. * Let the UVD memory controller know it's offsets
  523. */
  524. static void uvd_v7_0_mc_resume(struct amdgpu_device *adev)
  525. {
  526. uint32_t size = AMDGPU_UVD_FIRMWARE_SIZE(adev);
  527. uint32_t offset;
  528. if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
  529. WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW,
  530. lower_32_bits(adev->firmware.ucode[AMDGPU_UCODE_ID_UVD].mc_addr));
  531. WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH,
  532. upper_32_bits(adev->firmware.ucode[AMDGPU_UCODE_ID_UVD].mc_addr));
  533. offset = 0;
  534. } else {
  535. WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW,
  536. lower_32_bits(adev->uvd.gpu_addr));
  537. WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH,
  538. upper_32_bits(adev->uvd.gpu_addr));
  539. offset = size;
  540. }
  541. WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_OFFSET0,
  542. AMDGPU_UVD_FIRMWARE_OFFSET >> 3);
  543. WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_SIZE0, size);
  544. WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW,
  545. lower_32_bits(adev->uvd.gpu_addr + offset));
  546. WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH,
  547. upper_32_bits(adev->uvd.gpu_addr + offset));
  548. WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_OFFSET1, (1 << 21));
  549. WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_SIZE1, AMDGPU_UVD_HEAP_SIZE);
  550. WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW,
  551. lower_32_bits(adev->uvd.gpu_addr + offset + AMDGPU_UVD_HEAP_SIZE));
  552. WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH,
  553. upper_32_bits(adev->uvd.gpu_addr + offset + AMDGPU_UVD_HEAP_SIZE));
  554. WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_OFFSET2, (2 << 21));
  555. WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_SIZE2,
  556. AMDGPU_UVD_STACK_SIZE + (AMDGPU_UVD_SESSION_SIZE * 40));
  557. WREG32_SOC15(UVD, 0, mmUVD_UDEC_ADDR_CONFIG,
  558. adev->gfx.config.gb_addr_config);
  559. WREG32_SOC15(UVD, 0, mmUVD_UDEC_DB_ADDR_CONFIG,
  560. adev->gfx.config.gb_addr_config);
  561. WREG32_SOC15(UVD, 0, mmUVD_UDEC_DBW_ADDR_CONFIG,
  562. adev->gfx.config.gb_addr_config);
  563. WREG32_SOC15(UVD, 0, mmUVD_GP_SCRATCH4, adev->uvd.max_handles);
  564. }
  565. static int uvd_v7_0_mmsch_start(struct amdgpu_device *adev,
  566. struct amdgpu_mm_table *table)
  567. {
  568. uint32_t data = 0, loop;
  569. uint64_t addr = table->gpu_addr;
  570. struct mmsch_v1_0_init_header *header = (struct mmsch_v1_0_init_header *)table->cpu_addr;
  571. uint32_t size;
  572. size = header->header_size + header->vce_table_size + header->uvd_table_size;
  573. /* 1, write to vce_mmsch_vf_ctx_addr_lo/hi register with GPU mc addr of memory descriptor location */
  574. WREG32_SOC15(VCE, 0, mmVCE_MMSCH_VF_CTX_ADDR_LO, lower_32_bits(addr));
  575. WREG32_SOC15(VCE, 0, mmVCE_MMSCH_VF_CTX_ADDR_HI, upper_32_bits(addr));
  576. /* 2, update vmid of descriptor */
  577. data = RREG32_SOC15(VCE, 0, mmVCE_MMSCH_VF_VMID);
  578. data &= ~VCE_MMSCH_VF_VMID__VF_CTX_VMID_MASK;
  579. data |= (0 << VCE_MMSCH_VF_VMID__VF_CTX_VMID__SHIFT); /* use domain0 for MM scheduler */
  580. WREG32_SOC15(VCE, 0, mmVCE_MMSCH_VF_VMID, data);
  581. /* 3, notify mmsch about the size of this descriptor */
  582. WREG32_SOC15(VCE, 0, mmVCE_MMSCH_VF_CTX_SIZE, size);
  583. /* 4, set resp to zero */
  584. WREG32_SOC15(VCE, 0, mmVCE_MMSCH_VF_MAILBOX_RESP, 0);
  585. WDOORBELL32(adev->uvd.ring_enc[0].doorbell_index, 0);
  586. adev->wb.wb[adev->uvd.ring_enc[0].wptr_offs] = 0;
  587. adev->uvd.ring_enc[0].wptr = 0;
  588. adev->uvd.ring_enc[0].wptr_old = 0;
  589. /* 5, kick off the initialization and wait until VCE_MMSCH_VF_MAILBOX_RESP becomes non-zero */
  590. WREG32_SOC15(VCE, 0, mmVCE_MMSCH_VF_MAILBOX_HOST, 0x10000001);
  591. data = RREG32_SOC15(VCE, 0, mmVCE_MMSCH_VF_MAILBOX_RESP);
  592. loop = 1000;
  593. while ((data & 0x10000002) != 0x10000002) {
  594. udelay(10);
  595. data = RREG32_SOC15(VCE, 0, mmVCE_MMSCH_VF_MAILBOX_RESP);
  596. loop--;
  597. if (!loop)
  598. break;
  599. }
  600. if (!loop) {
  601. dev_err(adev->dev, "failed to init MMSCH, mmVCE_MMSCH_VF_MAILBOX_RESP = %x\n", data);
  602. return -EBUSY;
  603. }
  604. return 0;
  605. }
  606. static int uvd_v7_0_sriov_start(struct amdgpu_device *adev)
  607. {
  608. struct amdgpu_ring *ring;
  609. uint32_t offset, size, tmp;
  610. uint32_t table_size = 0;
  611. struct mmsch_v1_0_cmd_direct_write direct_wt = { {0} };
  612. struct mmsch_v1_0_cmd_direct_read_modify_write direct_rd_mod_wt = { {0} };
  613. struct mmsch_v1_0_cmd_direct_polling direct_poll = { {0} };
  614. struct mmsch_v1_0_cmd_end end = { {0} };
  615. uint32_t *init_table = adev->virt.mm_table.cpu_addr;
  616. struct mmsch_v1_0_init_header *header = (struct mmsch_v1_0_init_header *)init_table;
  617. direct_wt.cmd_header.command_type = MMSCH_COMMAND__DIRECT_REG_WRITE;
  618. direct_rd_mod_wt.cmd_header.command_type = MMSCH_COMMAND__DIRECT_REG_READ_MODIFY_WRITE;
  619. direct_poll.cmd_header.command_type = MMSCH_COMMAND__DIRECT_REG_POLLING;
  620. end.cmd_header.command_type = MMSCH_COMMAND__END;
  621. if (header->uvd_table_offset == 0 && header->uvd_table_size == 0) {
  622. header->version = MMSCH_VERSION;
  623. header->header_size = sizeof(struct mmsch_v1_0_init_header) >> 2;
  624. if (header->vce_table_offset == 0 && header->vce_table_size == 0)
  625. header->uvd_table_offset = header->header_size;
  626. else
  627. header->uvd_table_offset = header->vce_table_size + header->vce_table_offset;
  628. init_table += header->uvd_table_offset;
  629. ring = &adev->uvd.ring;
  630. ring->wptr = 0;
  631. size = AMDGPU_GPU_PAGE_ALIGN(adev->uvd.fw->size + 4);
  632. MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_STATUS),
  633. 0xFFFFFFFF, 0x00000004);
  634. /* mc resume*/
  635. if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
  636. MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW),
  637. lower_32_bits(adev->firmware.ucode[AMDGPU_UCODE_ID_UVD].mc_addr));
  638. MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH),
  639. upper_32_bits(adev->firmware.ucode[AMDGPU_UCODE_ID_UVD].mc_addr));
  640. offset = 0;
  641. } else {
  642. MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW),
  643. lower_32_bits(adev->uvd.gpu_addr));
  644. MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH),
  645. upper_32_bits(adev->uvd.gpu_addr));
  646. offset = size;
  647. }
  648. MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_VCPU_CACHE_OFFSET0),
  649. AMDGPU_UVD_FIRMWARE_OFFSET >> 3);
  650. MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_VCPU_CACHE_SIZE0), size);
  651. MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW),
  652. lower_32_bits(adev->uvd.gpu_addr + offset));
  653. MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH),
  654. upper_32_bits(adev->uvd.gpu_addr + offset));
  655. MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_VCPU_CACHE_OFFSET1), (1 << 21));
  656. MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_VCPU_CACHE_SIZE1), AMDGPU_UVD_HEAP_SIZE);
  657. MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW),
  658. lower_32_bits(adev->uvd.gpu_addr + offset + AMDGPU_UVD_HEAP_SIZE));
  659. MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH),
  660. upper_32_bits(adev->uvd.gpu_addr + offset + AMDGPU_UVD_HEAP_SIZE));
  661. MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_VCPU_CACHE_OFFSET2), (2 << 21));
  662. MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_VCPU_CACHE_SIZE2),
  663. AMDGPU_UVD_STACK_SIZE + (AMDGPU_UVD_SESSION_SIZE * 40));
  664. MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_GP_SCRATCH4), adev->uvd.max_handles);
  665. /* mc resume end*/
  666. /* disable clock gating */
  667. MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_CGC_CTRL),
  668. ~UVD_CGC_CTRL__DYN_CLOCK_MODE_MASK, 0);
  669. /* disable interupt */
  670. MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_MASTINT_EN),
  671. ~UVD_MASTINT_EN__VCPU_EN_MASK, 0);
  672. /* stall UMC and register bus before resetting VCPU */
  673. MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_CTRL2),
  674. ~UVD_LMI_CTRL2__STALL_ARB_UMC_MASK,
  675. UVD_LMI_CTRL2__STALL_ARB_UMC_MASK);
  676. /* put LMI, VCPU, RBC etc... into reset */
  677. MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_SOFT_RESET),
  678. (uint32_t)(UVD_SOFT_RESET__LMI_SOFT_RESET_MASK |
  679. UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK |
  680. UVD_SOFT_RESET__LBSI_SOFT_RESET_MASK |
  681. UVD_SOFT_RESET__RBC_SOFT_RESET_MASK |
  682. UVD_SOFT_RESET__CSM_SOFT_RESET_MASK |
  683. UVD_SOFT_RESET__CXW_SOFT_RESET_MASK |
  684. UVD_SOFT_RESET__TAP_SOFT_RESET_MASK |
  685. UVD_SOFT_RESET__LMI_UMC_SOFT_RESET_MASK));
  686. /* initialize UVD memory controller */
  687. MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_CTRL),
  688. (uint32_t)((0x40 << UVD_LMI_CTRL__WRITE_CLEAN_TIMER__SHIFT) |
  689. UVD_LMI_CTRL__WRITE_CLEAN_TIMER_EN_MASK |
  690. UVD_LMI_CTRL__DATA_COHERENCY_EN_MASK |
  691. UVD_LMI_CTRL__VCPU_DATA_COHERENCY_EN_MASK |
  692. UVD_LMI_CTRL__REQ_MODE_MASK |
  693. 0x00100000L));
  694. /* take all subblocks out of reset, except VCPU */
  695. MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_SOFT_RESET),
  696. UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK);
  697. /* enable VCPU clock */
  698. MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_VCPU_CNTL),
  699. UVD_VCPU_CNTL__CLK_EN_MASK);
  700. /* enable master interrupt */
  701. MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_MASTINT_EN),
  702. ~(UVD_MASTINT_EN__VCPU_EN_MASK|UVD_MASTINT_EN__SYS_EN_MASK),
  703. (UVD_MASTINT_EN__VCPU_EN_MASK|UVD_MASTINT_EN__SYS_EN_MASK));
  704. /* clear the bit 4 of UVD_STATUS */
  705. MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_STATUS),
  706. ~(2 << UVD_STATUS__VCPU_REPORT__SHIFT), 0);
  707. /* force RBC into idle state */
  708. size = order_base_2(ring->ring_size);
  709. tmp = REG_SET_FIELD(0, UVD_RBC_RB_CNTL, RB_BUFSZ, size);
  710. tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_NO_FETCH, 1);
  711. MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_RBC_RB_CNTL), tmp);
  712. ring = &adev->uvd.ring_enc[0];
  713. ring->wptr = 0;
  714. MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_RB_BASE_LO), ring->gpu_addr);
  715. MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_RB_BASE_HI), upper_32_bits(ring->gpu_addr));
  716. MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_RB_SIZE), ring->ring_size / 4);
  717. /* boot up the VCPU */
  718. MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_SOFT_RESET), 0);
  719. /* enable UMC */
  720. MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_CTRL2),
  721. ~UVD_LMI_CTRL2__STALL_ARB_UMC_MASK, 0);
  722. MMSCH_V1_0_INSERT_DIRECT_POLL(SOC15_REG_OFFSET(UVD, 0, mmUVD_STATUS), 0x02, 0x02);
  723. /* add end packet */
  724. memcpy((void *)init_table, &end, sizeof(struct mmsch_v1_0_cmd_end));
  725. table_size += sizeof(struct mmsch_v1_0_cmd_end) / 4;
  726. header->uvd_table_size = table_size;
  727. }
  728. return uvd_v7_0_mmsch_start(adev, &adev->virt.mm_table);
  729. }
  730. /**
  731. * uvd_v7_0_start - start UVD block
  732. *
  733. * @adev: amdgpu_device pointer
  734. *
  735. * Setup and start the UVD block
  736. */
  737. static int uvd_v7_0_start(struct amdgpu_device *adev)
  738. {
  739. struct amdgpu_ring *ring = &adev->uvd.ring;
  740. uint32_t rb_bufsz, tmp;
  741. uint32_t lmi_swap_cntl;
  742. uint32_t mp_swap_cntl;
  743. int i, j, r;
  744. /* disable DPG */
  745. WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_POWER_STATUS), 0,
  746. ~UVD_POWER_STATUS__UVD_PG_MODE_MASK);
  747. /* disable byte swapping */
  748. lmi_swap_cntl = 0;
  749. mp_swap_cntl = 0;
  750. uvd_v7_0_mc_resume(adev);
  751. /* disable clock gating */
  752. WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_CGC_CTRL), 0,
  753. ~UVD_CGC_CTRL__DYN_CLOCK_MODE_MASK);
  754. /* disable interupt */
  755. WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_MASTINT_EN), 0,
  756. ~UVD_MASTINT_EN__VCPU_EN_MASK);
  757. /* stall UMC and register bus before resetting VCPU */
  758. WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_CTRL2),
  759. UVD_LMI_CTRL2__STALL_ARB_UMC_MASK,
  760. ~UVD_LMI_CTRL2__STALL_ARB_UMC_MASK);
  761. mdelay(1);
  762. /* put LMI, VCPU, RBC etc... into reset */
  763. WREG32_SOC15(UVD, 0, mmUVD_SOFT_RESET,
  764. UVD_SOFT_RESET__LMI_SOFT_RESET_MASK |
  765. UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK |
  766. UVD_SOFT_RESET__LBSI_SOFT_RESET_MASK |
  767. UVD_SOFT_RESET__RBC_SOFT_RESET_MASK |
  768. UVD_SOFT_RESET__CSM_SOFT_RESET_MASK |
  769. UVD_SOFT_RESET__CXW_SOFT_RESET_MASK |
  770. UVD_SOFT_RESET__TAP_SOFT_RESET_MASK |
  771. UVD_SOFT_RESET__LMI_UMC_SOFT_RESET_MASK);
  772. mdelay(5);
  773. /* initialize UVD memory controller */
  774. WREG32_SOC15(UVD, 0, mmUVD_LMI_CTRL,
  775. (0x40 << UVD_LMI_CTRL__WRITE_CLEAN_TIMER__SHIFT) |
  776. UVD_LMI_CTRL__WRITE_CLEAN_TIMER_EN_MASK |
  777. UVD_LMI_CTRL__DATA_COHERENCY_EN_MASK |
  778. UVD_LMI_CTRL__VCPU_DATA_COHERENCY_EN_MASK |
  779. UVD_LMI_CTRL__REQ_MODE_MASK |
  780. 0x00100000L);
  781. #ifdef __BIG_ENDIAN
  782. /* swap (8 in 32) RB and IB */
  783. lmi_swap_cntl = 0xa;
  784. mp_swap_cntl = 0;
  785. #endif
  786. WREG32_SOC15(UVD, 0, mmUVD_LMI_SWAP_CNTL, lmi_swap_cntl);
  787. WREG32_SOC15(UVD, 0, mmUVD_MP_SWAP_CNTL, mp_swap_cntl);
  788. WREG32_SOC15(UVD, 0, mmUVD_MPC_SET_MUXA0, 0x40c2040);
  789. WREG32_SOC15(UVD, 0, mmUVD_MPC_SET_MUXA1, 0x0);
  790. WREG32_SOC15(UVD, 0, mmUVD_MPC_SET_MUXB0, 0x40c2040);
  791. WREG32_SOC15(UVD, 0, mmUVD_MPC_SET_MUXB1, 0x0);
  792. WREG32_SOC15(UVD, 0, mmUVD_MPC_SET_ALU, 0);
  793. WREG32_SOC15(UVD, 0, mmUVD_MPC_SET_MUX, 0x88);
  794. /* take all subblocks out of reset, except VCPU */
  795. WREG32_SOC15(UVD, 0, mmUVD_SOFT_RESET,
  796. UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK);
  797. mdelay(5);
  798. /* enable VCPU clock */
  799. WREG32_SOC15(UVD, 0, mmUVD_VCPU_CNTL,
  800. UVD_VCPU_CNTL__CLK_EN_MASK);
  801. /* enable UMC */
  802. WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_CTRL2), 0,
  803. ~UVD_LMI_CTRL2__STALL_ARB_UMC_MASK);
  804. /* boot up the VCPU */
  805. WREG32_SOC15(UVD, 0, mmUVD_SOFT_RESET, 0);
  806. mdelay(10);
  807. for (i = 0; i < 10; ++i) {
  808. uint32_t status;
  809. for (j = 0; j < 100; ++j) {
  810. status = RREG32_SOC15(UVD, 0, mmUVD_STATUS);
  811. if (status & 2)
  812. break;
  813. mdelay(10);
  814. }
  815. r = 0;
  816. if (status & 2)
  817. break;
  818. DRM_ERROR("UVD not responding, trying to reset the VCPU!!!\n");
  819. WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_SOFT_RESET),
  820. UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK,
  821. ~UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK);
  822. mdelay(10);
  823. WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_SOFT_RESET), 0,
  824. ~UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK);
  825. mdelay(10);
  826. r = -1;
  827. }
  828. if (r) {
  829. DRM_ERROR("UVD not responding, giving up!!!\n");
  830. return r;
  831. }
  832. /* enable master interrupt */
  833. WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_MASTINT_EN),
  834. (UVD_MASTINT_EN__VCPU_EN_MASK|UVD_MASTINT_EN__SYS_EN_MASK),
  835. ~(UVD_MASTINT_EN__VCPU_EN_MASK|UVD_MASTINT_EN__SYS_EN_MASK));
  836. /* clear the bit 4 of UVD_STATUS */
  837. WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_STATUS), 0,
  838. ~(2 << UVD_STATUS__VCPU_REPORT__SHIFT));
  839. /* force RBC into idle state */
  840. rb_bufsz = order_base_2(ring->ring_size);
  841. tmp = REG_SET_FIELD(0, UVD_RBC_RB_CNTL, RB_BUFSZ, rb_bufsz);
  842. tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_BLKSZ, 1);
  843. tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_NO_FETCH, 1);
  844. tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_WPTR_POLL_EN, 0);
  845. tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_NO_UPDATE, 1);
  846. tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_RPTR_WR_EN, 1);
  847. WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_CNTL, tmp);
  848. /* set the write pointer delay */
  849. WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR_CNTL, 0);
  850. /* set the wb address */
  851. WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_RPTR_ADDR,
  852. (upper_32_bits(ring->gpu_addr) >> 2));
  853. /* programm the RB_BASE for ring buffer */
  854. WREG32_SOC15(UVD, 0, mmUVD_LMI_RBC_RB_64BIT_BAR_LOW,
  855. lower_32_bits(ring->gpu_addr));
  856. WREG32_SOC15(UVD, 0, mmUVD_LMI_RBC_RB_64BIT_BAR_HIGH,
  857. upper_32_bits(ring->gpu_addr));
  858. /* Initialize the ring buffer's read and write pointers */
  859. WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_RPTR, 0);
  860. ring->wptr = RREG32_SOC15(UVD, 0, mmUVD_RBC_RB_RPTR);
  861. WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR,
  862. lower_32_bits(ring->wptr));
  863. WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_RBC_RB_CNTL), 0,
  864. ~UVD_RBC_RB_CNTL__RB_NO_FETCH_MASK);
  865. ring = &adev->uvd.ring_enc[0];
  866. WREG32_SOC15(UVD, 0, mmUVD_RB_RPTR, lower_32_bits(ring->wptr));
  867. WREG32_SOC15(UVD, 0, mmUVD_RB_WPTR, lower_32_bits(ring->wptr));
  868. WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_LO, ring->gpu_addr);
  869. WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_HI, upper_32_bits(ring->gpu_addr));
  870. WREG32_SOC15(UVD, 0, mmUVD_RB_SIZE, ring->ring_size / 4);
  871. ring = &adev->uvd.ring_enc[1];
  872. WREG32_SOC15(UVD, 0, mmUVD_RB_RPTR2, lower_32_bits(ring->wptr));
  873. WREG32_SOC15(UVD, 0, mmUVD_RB_WPTR2, lower_32_bits(ring->wptr));
  874. WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_LO2, ring->gpu_addr);
  875. WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_HI2, upper_32_bits(ring->gpu_addr));
  876. WREG32_SOC15(UVD, 0, mmUVD_RB_SIZE2, ring->ring_size / 4);
  877. return 0;
  878. }
  879. /**
  880. * uvd_v7_0_stop - stop UVD block
  881. *
  882. * @adev: amdgpu_device pointer
  883. *
  884. * stop the UVD block
  885. */
  886. static void uvd_v7_0_stop(struct amdgpu_device *adev)
  887. {
  888. /* force RBC into idle state */
  889. WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_CNTL, 0x11010101);
  890. /* Stall UMC and register bus before resetting VCPU */
  891. WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_CTRL2),
  892. UVD_LMI_CTRL2__STALL_ARB_UMC_MASK,
  893. ~UVD_LMI_CTRL2__STALL_ARB_UMC_MASK);
  894. mdelay(1);
  895. /* put VCPU into reset */
  896. WREG32_SOC15(UVD, 0, mmUVD_SOFT_RESET,
  897. UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK);
  898. mdelay(5);
  899. /* disable VCPU clock */
  900. WREG32_SOC15(UVD, 0, mmUVD_VCPU_CNTL, 0x0);
  901. /* Unstall UMC and register bus */
  902. WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_CTRL2), 0,
  903. ~UVD_LMI_CTRL2__STALL_ARB_UMC_MASK);
  904. }
  905. /**
  906. * uvd_v7_0_ring_emit_fence - emit an fence & trap command
  907. *
  908. * @ring: amdgpu_ring pointer
  909. * @fence: fence to emit
  910. *
  911. * Write a fence and a trap command to the ring.
  912. */
  913. static void uvd_v7_0_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq,
  914. unsigned flags)
  915. {
  916. struct amdgpu_device *adev = ring->adev;
  917. WARN_ON(flags & AMDGPU_FENCE_FLAG_64BIT);
  918. amdgpu_ring_write(ring,
  919. PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_CONTEXT_ID), 0));
  920. amdgpu_ring_write(ring, seq);
  921. amdgpu_ring_write(ring,
  922. PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_DATA0), 0));
  923. amdgpu_ring_write(ring, addr & 0xffffffff);
  924. amdgpu_ring_write(ring,
  925. PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_DATA1), 0));
  926. amdgpu_ring_write(ring, upper_32_bits(addr) & 0xff);
  927. amdgpu_ring_write(ring,
  928. PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_CMD), 0));
  929. amdgpu_ring_write(ring, 0);
  930. amdgpu_ring_write(ring,
  931. PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_DATA0), 0));
  932. amdgpu_ring_write(ring, 0);
  933. amdgpu_ring_write(ring,
  934. PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_DATA1), 0));
  935. amdgpu_ring_write(ring, 0);
  936. amdgpu_ring_write(ring,
  937. PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_CMD), 0));
  938. amdgpu_ring_write(ring, 2);
  939. }
  940. /**
  941. * uvd_v7_0_enc_ring_emit_fence - emit an enc fence & trap command
  942. *
  943. * @ring: amdgpu_ring pointer
  944. * @fence: fence to emit
  945. *
  946. * Write enc a fence and a trap command to the ring.
  947. */
  948. static void uvd_v7_0_enc_ring_emit_fence(struct amdgpu_ring *ring, u64 addr,
  949. u64 seq, unsigned flags)
  950. {
  951. WARN_ON(flags & AMDGPU_FENCE_FLAG_64BIT);
  952. amdgpu_ring_write(ring, HEVC_ENC_CMD_FENCE);
  953. amdgpu_ring_write(ring, addr);
  954. amdgpu_ring_write(ring, upper_32_bits(addr));
  955. amdgpu_ring_write(ring, seq);
  956. amdgpu_ring_write(ring, HEVC_ENC_CMD_TRAP);
  957. }
  958. /**
  959. * uvd_v7_0_ring_emit_hdp_flush - emit an hdp flush
  960. *
  961. * @ring: amdgpu_ring pointer
  962. *
  963. * Emits an hdp flush.
  964. */
  965. static void uvd_v7_0_ring_emit_hdp_flush(struct amdgpu_ring *ring)
  966. {
  967. struct amdgpu_device *adev = ring->adev;
  968. amdgpu_ring_write(ring, PACKET0(SOC15_REG_OFFSET(NBIF, 0,
  969. mmHDP_MEM_COHERENCY_FLUSH_CNTL), 0));
  970. amdgpu_ring_write(ring, 0);
  971. }
  972. /**
  973. * uvd_v7_0_ring_hdp_invalidate - emit an hdp invalidate
  974. *
  975. * @ring: amdgpu_ring pointer
  976. *
  977. * Emits an hdp invalidate.
  978. */
  979. static void uvd_v7_0_ring_emit_hdp_invalidate(struct amdgpu_ring *ring)
  980. {
  981. struct amdgpu_device *adev = ring->adev;
  982. amdgpu_ring_write(ring, PACKET0(SOC15_REG_OFFSET(HDP, 0, mmHDP_READ_CACHE_INVALIDATE), 0));
  983. amdgpu_ring_write(ring, 1);
  984. }
  985. /**
  986. * uvd_v7_0_ring_test_ring - register write test
  987. *
  988. * @ring: amdgpu_ring pointer
  989. *
  990. * Test if we can successfully write to the context register
  991. */
  992. static int uvd_v7_0_ring_test_ring(struct amdgpu_ring *ring)
  993. {
  994. struct amdgpu_device *adev = ring->adev;
  995. uint32_t tmp = 0;
  996. unsigned i;
  997. int r;
  998. WREG32_SOC15(UVD, 0, mmUVD_CONTEXT_ID, 0xCAFEDEAD);
  999. r = amdgpu_ring_alloc(ring, 3);
  1000. if (r) {
  1001. DRM_ERROR("amdgpu: cp failed to lock ring %d (%d).\n",
  1002. ring->idx, r);
  1003. return r;
  1004. }
  1005. amdgpu_ring_write(ring,
  1006. PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_CONTEXT_ID), 0));
  1007. amdgpu_ring_write(ring, 0xDEADBEEF);
  1008. amdgpu_ring_commit(ring);
  1009. for (i = 0; i < adev->usec_timeout; i++) {
  1010. tmp = RREG32_SOC15(UVD, 0, mmUVD_CONTEXT_ID);
  1011. if (tmp == 0xDEADBEEF)
  1012. break;
  1013. DRM_UDELAY(1);
  1014. }
  1015. if (i < adev->usec_timeout) {
  1016. DRM_DEBUG("ring test on %d succeeded in %d usecs\n",
  1017. ring->idx, i);
  1018. } else {
  1019. DRM_ERROR("amdgpu: ring %d test failed (0x%08X)\n",
  1020. ring->idx, tmp);
  1021. r = -EINVAL;
  1022. }
  1023. return r;
  1024. }
  1025. /**
  1026. * uvd_v7_0_ring_emit_ib - execute indirect buffer
  1027. *
  1028. * @ring: amdgpu_ring pointer
  1029. * @ib: indirect buffer to execute
  1030. *
  1031. * Write ring commands to execute the indirect buffer
  1032. */
  1033. static void uvd_v7_0_ring_emit_ib(struct amdgpu_ring *ring,
  1034. struct amdgpu_ib *ib,
  1035. unsigned vmid, bool ctx_switch)
  1036. {
  1037. struct amdgpu_device *adev = ring->adev;
  1038. amdgpu_ring_write(ring,
  1039. PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_RBC_IB_VMID), 0));
  1040. amdgpu_ring_write(ring, vmid);
  1041. amdgpu_ring_write(ring,
  1042. PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_RBC_IB_64BIT_BAR_LOW), 0));
  1043. amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr));
  1044. amdgpu_ring_write(ring,
  1045. PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_RBC_IB_64BIT_BAR_HIGH), 0));
  1046. amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr));
  1047. amdgpu_ring_write(ring,
  1048. PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_RBC_IB_SIZE), 0));
  1049. amdgpu_ring_write(ring, ib->length_dw);
  1050. }
  1051. /**
  1052. * uvd_v7_0_enc_ring_emit_ib - enc execute indirect buffer
  1053. *
  1054. * @ring: amdgpu_ring pointer
  1055. * @ib: indirect buffer to execute
  1056. *
  1057. * Write enc ring commands to execute the indirect buffer
  1058. */
  1059. static void uvd_v7_0_enc_ring_emit_ib(struct amdgpu_ring *ring,
  1060. struct amdgpu_ib *ib, unsigned int vmid, bool ctx_switch)
  1061. {
  1062. amdgpu_ring_write(ring, HEVC_ENC_CMD_IB_VM);
  1063. amdgpu_ring_write(ring, vmid);
  1064. amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr));
  1065. amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr));
  1066. amdgpu_ring_write(ring, ib->length_dw);
  1067. }
  1068. static void uvd_v7_0_vm_reg_write(struct amdgpu_ring *ring,
  1069. uint32_t data0, uint32_t data1)
  1070. {
  1071. struct amdgpu_device *adev = ring->adev;
  1072. amdgpu_ring_write(ring,
  1073. PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_DATA0), 0));
  1074. amdgpu_ring_write(ring, data0);
  1075. amdgpu_ring_write(ring,
  1076. PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_DATA1), 0));
  1077. amdgpu_ring_write(ring, data1);
  1078. amdgpu_ring_write(ring,
  1079. PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_CMD), 0));
  1080. amdgpu_ring_write(ring, 8);
  1081. }
  1082. static void uvd_v7_0_vm_reg_wait(struct amdgpu_ring *ring,
  1083. uint32_t data0, uint32_t data1, uint32_t mask)
  1084. {
  1085. struct amdgpu_device *adev = ring->adev;
  1086. amdgpu_ring_write(ring,
  1087. PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_DATA0), 0));
  1088. amdgpu_ring_write(ring, data0);
  1089. amdgpu_ring_write(ring,
  1090. PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_DATA1), 0));
  1091. amdgpu_ring_write(ring, data1);
  1092. amdgpu_ring_write(ring,
  1093. PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_GP_SCRATCH8), 0));
  1094. amdgpu_ring_write(ring, mask);
  1095. amdgpu_ring_write(ring,
  1096. PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_CMD), 0));
  1097. amdgpu_ring_write(ring, 12);
  1098. }
  1099. static void uvd_v7_0_ring_emit_vm_flush(struct amdgpu_ring *ring,
  1100. unsigned vmid, uint64_t pd_addr)
  1101. {
  1102. struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub];
  1103. uint32_t req = ring->adev->gart.gart_funcs->get_invalidate_req(vmid);
  1104. uint64_t flags = AMDGPU_PTE_VALID;
  1105. unsigned eng = ring->vm_inv_eng;
  1106. uint32_t data0, data1, mask;
  1107. amdgpu_gart_get_vm_pde(ring->adev, -1, &pd_addr, &flags);
  1108. pd_addr |= flags;
  1109. data0 = (hub->ctx0_ptb_addr_hi32 + vmid * 2) << 2;
  1110. data1 = upper_32_bits(pd_addr);
  1111. uvd_v7_0_vm_reg_write(ring, data0, data1);
  1112. data0 = (hub->ctx0_ptb_addr_lo32 + vmid * 2) << 2;
  1113. data1 = lower_32_bits(pd_addr);
  1114. uvd_v7_0_vm_reg_write(ring, data0, data1);
  1115. data0 = (hub->ctx0_ptb_addr_lo32 + vmid * 2) << 2;
  1116. data1 = lower_32_bits(pd_addr);
  1117. mask = 0xffffffff;
  1118. uvd_v7_0_vm_reg_wait(ring, data0, data1, mask);
  1119. /* flush TLB */
  1120. data0 = (hub->vm_inv_eng0_req + eng) << 2;
  1121. data1 = req;
  1122. uvd_v7_0_vm_reg_write(ring, data0, data1);
  1123. /* wait for flush */
  1124. data0 = (hub->vm_inv_eng0_ack + eng) << 2;
  1125. data1 = 1 << vmid;
  1126. mask = 1 << vmid;
  1127. uvd_v7_0_vm_reg_wait(ring, data0, data1, mask);
  1128. }
  1129. static void uvd_v7_0_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
  1130. {
  1131. int i;
  1132. struct amdgpu_device *adev = ring->adev;
  1133. for (i = 0; i < count; i++)
  1134. amdgpu_ring_write(ring, PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_NO_OP), 0));
  1135. }
  1136. static void uvd_v7_0_enc_ring_insert_end(struct amdgpu_ring *ring)
  1137. {
  1138. amdgpu_ring_write(ring, HEVC_ENC_CMD_END);
  1139. }
  1140. static void uvd_v7_0_enc_ring_emit_vm_flush(struct amdgpu_ring *ring,
  1141. unsigned int vmid, uint64_t pd_addr)
  1142. {
  1143. struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub];
  1144. uint32_t req = ring->adev->gart.gart_funcs->get_invalidate_req(vmid);
  1145. uint64_t flags = AMDGPU_PTE_VALID;
  1146. unsigned eng = ring->vm_inv_eng;
  1147. amdgpu_gart_get_vm_pde(ring->adev, -1, &pd_addr, &flags);
  1148. pd_addr |= flags;
  1149. amdgpu_ring_write(ring, HEVC_ENC_CMD_REG_WRITE);
  1150. amdgpu_ring_write(ring, (hub->ctx0_ptb_addr_hi32 + vmid * 2) << 2);
  1151. amdgpu_ring_write(ring, upper_32_bits(pd_addr));
  1152. amdgpu_ring_write(ring, HEVC_ENC_CMD_REG_WRITE);
  1153. amdgpu_ring_write(ring, (hub->ctx0_ptb_addr_lo32 + vmid * 2) << 2);
  1154. amdgpu_ring_write(ring, lower_32_bits(pd_addr));
  1155. amdgpu_ring_write(ring, HEVC_ENC_CMD_REG_WAIT);
  1156. amdgpu_ring_write(ring, (hub->ctx0_ptb_addr_lo32 + vmid * 2) << 2);
  1157. amdgpu_ring_write(ring, 0xffffffff);
  1158. amdgpu_ring_write(ring, lower_32_bits(pd_addr));
  1159. /* flush TLB */
  1160. amdgpu_ring_write(ring, HEVC_ENC_CMD_REG_WRITE);
  1161. amdgpu_ring_write(ring, (hub->vm_inv_eng0_req + eng) << 2);
  1162. amdgpu_ring_write(ring, req);
  1163. /* wait for flush */
  1164. amdgpu_ring_write(ring, HEVC_ENC_CMD_REG_WAIT);
  1165. amdgpu_ring_write(ring, (hub->vm_inv_eng0_ack + eng) << 2);
  1166. amdgpu_ring_write(ring, 1 << vmid);
  1167. amdgpu_ring_write(ring, 1 << vmid);
  1168. }
  1169. #if 0
  1170. static bool uvd_v7_0_is_idle(void *handle)
  1171. {
  1172. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  1173. return !(RREG32(mmSRBM_STATUS) & SRBM_STATUS__UVD_BUSY_MASK);
  1174. }
  1175. static int uvd_v7_0_wait_for_idle(void *handle)
  1176. {
  1177. unsigned i;
  1178. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  1179. for (i = 0; i < adev->usec_timeout; i++) {
  1180. if (uvd_v7_0_is_idle(handle))
  1181. return 0;
  1182. }
  1183. return -ETIMEDOUT;
  1184. }
  1185. #define AMDGPU_UVD_STATUS_BUSY_MASK 0xfd
  1186. static bool uvd_v7_0_check_soft_reset(void *handle)
  1187. {
  1188. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  1189. u32 srbm_soft_reset = 0;
  1190. u32 tmp = RREG32(mmSRBM_STATUS);
  1191. if (REG_GET_FIELD(tmp, SRBM_STATUS, UVD_RQ_PENDING) ||
  1192. REG_GET_FIELD(tmp, SRBM_STATUS, UVD_BUSY) ||
  1193. (RREG32_SOC15(UVD, 0, mmUVD_STATUS) &
  1194. AMDGPU_UVD_STATUS_BUSY_MASK))
  1195. srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset,
  1196. SRBM_SOFT_RESET, SOFT_RESET_UVD, 1);
  1197. if (srbm_soft_reset) {
  1198. adev->uvd.srbm_soft_reset = srbm_soft_reset;
  1199. return true;
  1200. } else {
  1201. adev->uvd.srbm_soft_reset = 0;
  1202. return false;
  1203. }
  1204. }
  1205. static int uvd_v7_0_pre_soft_reset(void *handle)
  1206. {
  1207. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  1208. if (!adev->uvd.srbm_soft_reset)
  1209. return 0;
  1210. uvd_v7_0_stop(adev);
  1211. return 0;
  1212. }
  1213. static int uvd_v7_0_soft_reset(void *handle)
  1214. {
  1215. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  1216. u32 srbm_soft_reset;
  1217. if (!adev->uvd.srbm_soft_reset)
  1218. return 0;
  1219. srbm_soft_reset = adev->uvd.srbm_soft_reset;
  1220. if (srbm_soft_reset) {
  1221. u32 tmp;
  1222. tmp = RREG32(mmSRBM_SOFT_RESET);
  1223. tmp |= srbm_soft_reset;
  1224. dev_info(adev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
  1225. WREG32(mmSRBM_SOFT_RESET, tmp);
  1226. tmp = RREG32(mmSRBM_SOFT_RESET);
  1227. udelay(50);
  1228. tmp &= ~srbm_soft_reset;
  1229. WREG32(mmSRBM_SOFT_RESET, tmp);
  1230. tmp = RREG32(mmSRBM_SOFT_RESET);
  1231. /* Wait a little for things to settle down */
  1232. udelay(50);
  1233. }
  1234. return 0;
  1235. }
  1236. static int uvd_v7_0_post_soft_reset(void *handle)
  1237. {
  1238. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  1239. if (!adev->uvd.srbm_soft_reset)
  1240. return 0;
  1241. mdelay(5);
  1242. return uvd_v7_0_start(adev);
  1243. }
  1244. #endif
  1245. static int uvd_v7_0_set_interrupt_state(struct amdgpu_device *adev,
  1246. struct amdgpu_irq_src *source,
  1247. unsigned type,
  1248. enum amdgpu_interrupt_state state)
  1249. {
  1250. // TODO
  1251. return 0;
  1252. }
  1253. static int uvd_v7_0_process_interrupt(struct amdgpu_device *adev,
  1254. struct amdgpu_irq_src *source,
  1255. struct amdgpu_iv_entry *entry)
  1256. {
  1257. DRM_DEBUG("IH: UVD TRAP\n");
  1258. switch (entry->src_id) {
  1259. case 124:
  1260. amdgpu_fence_process(&adev->uvd.ring);
  1261. break;
  1262. case 119:
  1263. amdgpu_fence_process(&adev->uvd.ring_enc[0]);
  1264. break;
  1265. case 120:
  1266. if (!amdgpu_sriov_vf(adev))
  1267. amdgpu_fence_process(&adev->uvd.ring_enc[1]);
  1268. break;
  1269. default:
  1270. DRM_ERROR("Unhandled interrupt: %d %d\n",
  1271. entry->src_id, entry->src_data[0]);
  1272. break;
  1273. }
  1274. return 0;
  1275. }
  1276. #if 0
  1277. static void uvd_v7_0_set_sw_clock_gating(struct amdgpu_device *adev)
  1278. {
  1279. uint32_t data, data1, data2, suvd_flags;
  1280. data = RREG32_SOC15(UVD, 0, mmUVD_CGC_CTRL);
  1281. data1 = RREG32_SOC15(UVD, 0, mmUVD_SUVD_CGC_GATE);
  1282. data2 = RREG32_SOC15(UVD, 0, mmUVD_SUVD_CGC_CTRL);
  1283. data &= ~(UVD_CGC_CTRL__CLK_OFF_DELAY_MASK |
  1284. UVD_CGC_CTRL__CLK_GATE_DLY_TIMER_MASK);
  1285. suvd_flags = UVD_SUVD_CGC_GATE__SRE_MASK |
  1286. UVD_SUVD_CGC_GATE__SIT_MASK |
  1287. UVD_SUVD_CGC_GATE__SMP_MASK |
  1288. UVD_SUVD_CGC_GATE__SCM_MASK |
  1289. UVD_SUVD_CGC_GATE__SDB_MASK;
  1290. data |= UVD_CGC_CTRL__DYN_CLOCK_MODE_MASK |
  1291. (1 << REG_FIELD_SHIFT(UVD_CGC_CTRL, CLK_GATE_DLY_TIMER)) |
  1292. (4 << REG_FIELD_SHIFT(UVD_CGC_CTRL, CLK_OFF_DELAY));
  1293. data &= ~(UVD_CGC_CTRL__UDEC_RE_MODE_MASK |
  1294. UVD_CGC_CTRL__UDEC_CM_MODE_MASK |
  1295. UVD_CGC_CTRL__UDEC_IT_MODE_MASK |
  1296. UVD_CGC_CTRL__UDEC_DB_MODE_MASK |
  1297. UVD_CGC_CTRL__UDEC_MP_MODE_MASK |
  1298. UVD_CGC_CTRL__SYS_MODE_MASK |
  1299. UVD_CGC_CTRL__UDEC_MODE_MASK |
  1300. UVD_CGC_CTRL__MPEG2_MODE_MASK |
  1301. UVD_CGC_CTRL__REGS_MODE_MASK |
  1302. UVD_CGC_CTRL__RBC_MODE_MASK |
  1303. UVD_CGC_CTRL__LMI_MC_MODE_MASK |
  1304. UVD_CGC_CTRL__LMI_UMC_MODE_MASK |
  1305. UVD_CGC_CTRL__IDCT_MODE_MASK |
  1306. UVD_CGC_CTRL__MPRD_MODE_MASK |
  1307. UVD_CGC_CTRL__MPC_MODE_MASK |
  1308. UVD_CGC_CTRL__LBSI_MODE_MASK |
  1309. UVD_CGC_CTRL__LRBBM_MODE_MASK |
  1310. UVD_CGC_CTRL__WCB_MODE_MASK |
  1311. UVD_CGC_CTRL__VCPU_MODE_MASK |
  1312. UVD_CGC_CTRL__JPEG_MODE_MASK |
  1313. UVD_CGC_CTRL__JPEG2_MODE_MASK |
  1314. UVD_CGC_CTRL__SCPU_MODE_MASK);
  1315. data2 &= ~(UVD_SUVD_CGC_CTRL__SRE_MODE_MASK |
  1316. UVD_SUVD_CGC_CTRL__SIT_MODE_MASK |
  1317. UVD_SUVD_CGC_CTRL__SMP_MODE_MASK |
  1318. UVD_SUVD_CGC_CTRL__SCM_MODE_MASK |
  1319. UVD_SUVD_CGC_CTRL__SDB_MODE_MASK);
  1320. data1 |= suvd_flags;
  1321. WREG32_SOC15(UVD, 0, mmUVD_CGC_CTRL, data);
  1322. WREG32_SOC15(UVD, 0, mmUVD_CGC_GATE, 0);
  1323. WREG32_SOC15(UVD, 0, mmUVD_SUVD_CGC_GATE, data1);
  1324. WREG32_SOC15(UVD, 0, mmUVD_SUVD_CGC_CTRL, data2);
  1325. }
  1326. static void uvd_v7_0_set_hw_clock_gating(struct amdgpu_device *adev)
  1327. {
  1328. uint32_t data, data1, cgc_flags, suvd_flags;
  1329. data = RREG32_SOC15(UVD, 0, mmUVD_CGC_GATE);
  1330. data1 = RREG32_SOC15(UVD, 0, mmUVD_SUVD_CGC_GATE);
  1331. cgc_flags = UVD_CGC_GATE__SYS_MASK |
  1332. UVD_CGC_GATE__UDEC_MASK |
  1333. UVD_CGC_GATE__MPEG2_MASK |
  1334. UVD_CGC_GATE__RBC_MASK |
  1335. UVD_CGC_GATE__LMI_MC_MASK |
  1336. UVD_CGC_GATE__IDCT_MASK |
  1337. UVD_CGC_GATE__MPRD_MASK |
  1338. UVD_CGC_GATE__MPC_MASK |
  1339. UVD_CGC_GATE__LBSI_MASK |
  1340. UVD_CGC_GATE__LRBBM_MASK |
  1341. UVD_CGC_GATE__UDEC_RE_MASK |
  1342. UVD_CGC_GATE__UDEC_CM_MASK |
  1343. UVD_CGC_GATE__UDEC_IT_MASK |
  1344. UVD_CGC_GATE__UDEC_DB_MASK |
  1345. UVD_CGC_GATE__UDEC_MP_MASK |
  1346. UVD_CGC_GATE__WCB_MASK |
  1347. UVD_CGC_GATE__VCPU_MASK |
  1348. UVD_CGC_GATE__SCPU_MASK |
  1349. UVD_CGC_GATE__JPEG_MASK |
  1350. UVD_CGC_GATE__JPEG2_MASK;
  1351. suvd_flags = UVD_SUVD_CGC_GATE__SRE_MASK |
  1352. UVD_SUVD_CGC_GATE__SIT_MASK |
  1353. UVD_SUVD_CGC_GATE__SMP_MASK |
  1354. UVD_SUVD_CGC_GATE__SCM_MASK |
  1355. UVD_SUVD_CGC_GATE__SDB_MASK;
  1356. data |= cgc_flags;
  1357. data1 |= suvd_flags;
  1358. WREG32_SOC15(UVD, 0, mmUVD_CGC_GATE, data);
  1359. WREG32_SOC15(UVD, 0, mmUVD_SUVD_CGC_GATE, data1);
  1360. }
  1361. static void uvd_v7_0_set_bypass_mode(struct amdgpu_device *adev, bool enable)
  1362. {
  1363. u32 tmp = RREG32_SMC(ixGCK_DFS_BYPASS_CNTL);
  1364. if (enable)
  1365. tmp |= (GCK_DFS_BYPASS_CNTL__BYPASSDCLK_MASK |
  1366. GCK_DFS_BYPASS_CNTL__BYPASSVCLK_MASK);
  1367. else
  1368. tmp &= ~(GCK_DFS_BYPASS_CNTL__BYPASSDCLK_MASK |
  1369. GCK_DFS_BYPASS_CNTL__BYPASSVCLK_MASK);
  1370. WREG32_SMC(ixGCK_DFS_BYPASS_CNTL, tmp);
  1371. }
  1372. static int uvd_v7_0_set_clockgating_state(void *handle,
  1373. enum amd_clockgating_state state)
  1374. {
  1375. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  1376. bool enable = (state == AMD_CG_STATE_GATE) ? true : false;
  1377. uvd_v7_0_set_bypass_mode(adev, enable);
  1378. if (!(adev->cg_flags & AMD_CG_SUPPORT_UVD_MGCG))
  1379. return 0;
  1380. if (enable) {
  1381. /* disable HW gating and enable Sw gating */
  1382. uvd_v7_0_set_sw_clock_gating(adev);
  1383. } else {
  1384. /* wait for STATUS to clear */
  1385. if (uvd_v7_0_wait_for_idle(handle))
  1386. return -EBUSY;
  1387. /* enable HW gates because UVD is idle */
  1388. /* uvd_v7_0_set_hw_clock_gating(adev); */
  1389. }
  1390. return 0;
  1391. }
  1392. static int uvd_v7_0_set_powergating_state(void *handle,
  1393. enum amd_powergating_state state)
  1394. {
  1395. /* This doesn't actually powergate the UVD block.
  1396. * That's done in the dpm code via the SMC. This
  1397. * just re-inits the block as necessary. The actual
  1398. * gating still happens in the dpm code. We should
  1399. * revisit this when there is a cleaner line between
  1400. * the smc and the hw blocks
  1401. */
  1402. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  1403. if (!(adev->pg_flags & AMD_PG_SUPPORT_UVD))
  1404. return 0;
  1405. WREG32_SOC15(UVD, 0, mmUVD_POWER_STATUS, UVD_POWER_STATUS__UVD_PG_EN_MASK);
  1406. if (state == AMD_PG_STATE_GATE) {
  1407. uvd_v7_0_stop(adev);
  1408. return 0;
  1409. } else {
  1410. return uvd_v7_0_start(adev);
  1411. }
  1412. }
  1413. #endif
  1414. static int uvd_v7_0_set_clockgating_state(void *handle,
  1415. enum amd_clockgating_state state)
  1416. {
  1417. /* needed for driver unload*/
  1418. return 0;
  1419. }
  1420. const struct amd_ip_funcs uvd_v7_0_ip_funcs = {
  1421. .name = "uvd_v7_0",
  1422. .early_init = uvd_v7_0_early_init,
  1423. .late_init = NULL,
  1424. .sw_init = uvd_v7_0_sw_init,
  1425. .sw_fini = uvd_v7_0_sw_fini,
  1426. .hw_init = uvd_v7_0_hw_init,
  1427. .hw_fini = uvd_v7_0_hw_fini,
  1428. .suspend = uvd_v7_0_suspend,
  1429. .resume = uvd_v7_0_resume,
  1430. .is_idle = NULL /* uvd_v7_0_is_idle */,
  1431. .wait_for_idle = NULL /* uvd_v7_0_wait_for_idle */,
  1432. .check_soft_reset = NULL /* uvd_v7_0_check_soft_reset */,
  1433. .pre_soft_reset = NULL /* uvd_v7_0_pre_soft_reset */,
  1434. .soft_reset = NULL /* uvd_v7_0_soft_reset */,
  1435. .post_soft_reset = NULL /* uvd_v7_0_post_soft_reset */,
  1436. .set_clockgating_state = uvd_v7_0_set_clockgating_state,
  1437. .set_powergating_state = NULL /* uvd_v7_0_set_powergating_state */,
  1438. };
  1439. static const struct amdgpu_ring_funcs uvd_v7_0_ring_vm_funcs = {
  1440. .type = AMDGPU_RING_TYPE_UVD,
  1441. .align_mask = 0xf,
  1442. .nop = PACKET0(0x81ff, 0),
  1443. .support_64bit_ptrs = false,
  1444. .vmhub = AMDGPU_MMHUB,
  1445. .get_rptr = uvd_v7_0_ring_get_rptr,
  1446. .get_wptr = uvd_v7_0_ring_get_wptr,
  1447. .set_wptr = uvd_v7_0_ring_set_wptr,
  1448. .emit_frame_size =
  1449. 2 + /* uvd_v7_0_ring_emit_hdp_flush */
  1450. 2 + /* uvd_v7_0_ring_emit_hdp_invalidate */
  1451. 34 + /* uvd_v7_0_ring_emit_vm_flush */
  1452. 14 + 14, /* uvd_v7_0_ring_emit_fence x2 vm fence */
  1453. .emit_ib_size = 8, /* uvd_v7_0_ring_emit_ib */
  1454. .emit_ib = uvd_v7_0_ring_emit_ib,
  1455. .emit_fence = uvd_v7_0_ring_emit_fence,
  1456. .emit_vm_flush = uvd_v7_0_ring_emit_vm_flush,
  1457. .emit_hdp_flush = uvd_v7_0_ring_emit_hdp_flush,
  1458. .emit_hdp_invalidate = uvd_v7_0_ring_emit_hdp_invalidate,
  1459. .test_ring = uvd_v7_0_ring_test_ring,
  1460. .test_ib = amdgpu_uvd_ring_test_ib,
  1461. .insert_nop = uvd_v7_0_ring_insert_nop,
  1462. .pad_ib = amdgpu_ring_generic_pad_ib,
  1463. .begin_use = amdgpu_uvd_ring_begin_use,
  1464. .end_use = amdgpu_uvd_ring_end_use,
  1465. };
  1466. static const struct amdgpu_ring_funcs uvd_v7_0_enc_ring_vm_funcs = {
  1467. .type = AMDGPU_RING_TYPE_UVD_ENC,
  1468. .align_mask = 0x3f,
  1469. .nop = HEVC_ENC_CMD_NO_OP,
  1470. .support_64bit_ptrs = false,
  1471. .vmhub = AMDGPU_MMHUB,
  1472. .get_rptr = uvd_v7_0_enc_ring_get_rptr,
  1473. .get_wptr = uvd_v7_0_enc_ring_get_wptr,
  1474. .set_wptr = uvd_v7_0_enc_ring_set_wptr,
  1475. .emit_frame_size =
  1476. 17 + /* uvd_v7_0_enc_ring_emit_vm_flush */
  1477. 5 + 5 + /* uvd_v7_0_enc_ring_emit_fence x2 vm fence */
  1478. 1, /* uvd_v7_0_enc_ring_insert_end */
  1479. .emit_ib_size = 5, /* uvd_v7_0_enc_ring_emit_ib */
  1480. .emit_ib = uvd_v7_0_enc_ring_emit_ib,
  1481. .emit_fence = uvd_v7_0_enc_ring_emit_fence,
  1482. .emit_vm_flush = uvd_v7_0_enc_ring_emit_vm_flush,
  1483. .test_ring = uvd_v7_0_enc_ring_test_ring,
  1484. .test_ib = uvd_v7_0_enc_ring_test_ib,
  1485. .insert_nop = amdgpu_ring_insert_nop,
  1486. .insert_end = uvd_v7_0_enc_ring_insert_end,
  1487. .pad_ib = amdgpu_ring_generic_pad_ib,
  1488. .begin_use = amdgpu_uvd_ring_begin_use,
  1489. .end_use = amdgpu_uvd_ring_end_use,
  1490. };
  1491. static void uvd_v7_0_set_ring_funcs(struct amdgpu_device *adev)
  1492. {
  1493. adev->uvd.ring.funcs = &uvd_v7_0_ring_vm_funcs;
  1494. DRM_INFO("UVD is enabled in VM mode\n");
  1495. }
  1496. static void uvd_v7_0_set_enc_ring_funcs(struct amdgpu_device *adev)
  1497. {
  1498. int i;
  1499. for (i = 0; i < adev->uvd.num_enc_rings; ++i)
  1500. adev->uvd.ring_enc[i].funcs = &uvd_v7_0_enc_ring_vm_funcs;
  1501. DRM_INFO("UVD ENC is enabled in VM mode\n");
  1502. }
  1503. static const struct amdgpu_irq_src_funcs uvd_v7_0_irq_funcs = {
  1504. .set = uvd_v7_0_set_interrupt_state,
  1505. .process = uvd_v7_0_process_interrupt,
  1506. };
  1507. static void uvd_v7_0_set_irq_funcs(struct amdgpu_device *adev)
  1508. {
  1509. adev->uvd.irq.num_types = adev->uvd.num_enc_rings + 1;
  1510. adev->uvd.irq.funcs = &uvd_v7_0_irq_funcs;
  1511. }
  1512. const struct amdgpu_ip_block_version uvd_v7_0_ip_block =
  1513. {
  1514. .type = AMD_IP_BLOCK_TYPE_UVD,
  1515. .major = 7,
  1516. .minor = 0,
  1517. .rev = 0,
  1518. .funcs = &uvd_v7_0_ip_funcs,
  1519. };