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