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