1*b45c3ff5Sriastradh /*	$NetBSD: amdgpu_jpeg_v1_0.c,v 1.3 2021/12/19 12:02:39 riastradh Exp $	*/
21571a7a1Sriastradh 
31571a7a1Sriastradh /*
41571a7a1Sriastradh  * Copyright 2019 Advanced Micro Devices, Inc.
51571a7a1Sriastradh  *
61571a7a1Sriastradh  * Permission is hereby granted, free of charge, to any person obtaining a
71571a7a1Sriastradh  * copy of this software and associated documentation files (the "Software"),
81571a7a1Sriastradh  * to deal in the Software without restriction, including without limitation
91571a7a1Sriastradh  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
101571a7a1Sriastradh  * and/or sell copies of the Software, and to permit persons to whom the
111571a7a1Sriastradh  * Software is furnished to do so, subject to the following conditions:
121571a7a1Sriastradh  *
131571a7a1Sriastradh  * The above copyright notice and this permission notice shall be included in
141571a7a1Sriastradh  * all copies or substantial portions of the Software.
151571a7a1Sriastradh  *
161571a7a1Sriastradh  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
171571a7a1Sriastradh  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
181571a7a1Sriastradh  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
191571a7a1Sriastradh  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
201571a7a1Sriastradh  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
211571a7a1Sriastradh  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
221571a7a1Sriastradh  * OTHER DEALINGS IN THE SOFTWARE.
231571a7a1Sriastradh  *
241571a7a1Sriastradh  */
251571a7a1Sriastradh 
261571a7a1Sriastradh #include <sys/cdefs.h>
27*b45c3ff5Sriastradh __KERNEL_RCSID(0, "$NetBSD: amdgpu_jpeg_v1_0.c,v 1.3 2021/12/19 12:02:39 riastradh Exp $");
281571a7a1Sriastradh 
291571a7a1Sriastradh #include "amdgpu.h"
301571a7a1Sriastradh #include "amdgpu_jpeg.h"
311571a7a1Sriastradh #include "soc15.h"
321571a7a1Sriastradh #include "soc15d.h"
331571a7a1Sriastradh #include "vcn_v1_0.h"
341571a7a1Sriastradh 
351571a7a1Sriastradh #include "vcn/vcn_1_0_offset.h"
361571a7a1Sriastradh #include "vcn/vcn_1_0_sh_mask.h"
371571a7a1Sriastradh 
381571a7a1Sriastradh static void jpeg_v1_0_set_dec_ring_funcs(struct amdgpu_device *adev);
391571a7a1Sriastradh static void jpeg_v1_0_set_irq_funcs(struct amdgpu_device *adev);
401571a7a1Sriastradh 
jpeg_v1_0_decode_ring_patch_wreg(struct amdgpu_ring * ring,uint32_t * ptr,uint32_t reg_offset,uint32_t val)411571a7a1Sriastradh static void jpeg_v1_0_decode_ring_patch_wreg(struct amdgpu_ring *ring, uint32_t *ptr, uint32_t reg_offset, uint32_t val)
421571a7a1Sriastradh {
431571a7a1Sriastradh 	struct amdgpu_device *adev = ring->adev;
441571a7a1Sriastradh 	ring->ring[(*ptr)++] = PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_EXTERNAL_REG_BASE), 0, 0, PACKETJ_TYPE0);
451571a7a1Sriastradh 	if (((reg_offset >= 0x1f800) && (reg_offset <= 0x21fff)) ||
461571a7a1Sriastradh 		((reg_offset >= 0x1e000) && (reg_offset <= 0x1e1ff))) {
471571a7a1Sriastradh 		ring->ring[(*ptr)++] = 0;
481571a7a1Sriastradh 		ring->ring[(*ptr)++] = PACKETJ((reg_offset >> 2), 0, 0, PACKETJ_TYPE0);
491571a7a1Sriastradh 	} else {
501571a7a1Sriastradh 		ring->ring[(*ptr)++] = reg_offset;
511571a7a1Sriastradh 		ring->ring[(*ptr)++] = PACKETJ(0, 0, 0, PACKETJ_TYPE0);
521571a7a1Sriastradh 	}
531571a7a1Sriastradh 	ring->ring[(*ptr)++] = val;
541571a7a1Sriastradh }
551571a7a1Sriastradh 
jpeg_v1_0_decode_ring_set_patch_ring(struct amdgpu_ring * ring,uint32_t ptr)561571a7a1Sriastradh static void jpeg_v1_0_decode_ring_set_patch_ring(struct amdgpu_ring *ring, uint32_t ptr)
571571a7a1Sriastradh {
581571a7a1Sriastradh 	struct amdgpu_device *adev = ring->adev;
591571a7a1Sriastradh 
601571a7a1Sriastradh 	uint32_t reg, reg_offset, val, mask, i;
611571a7a1Sriastradh 
621571a7a1Sriastradh 	// 1st: program mmUVD_LMI_JRBC_RB_MEM_RD_64BIT_BAR_LOW
631571a7a1Sriastradh 	reg = SOC15_REG_OFFSET(JPEG, 0, mmUVD_LMI_JRBC_RB_MEM_RD_64BIT_BAR_LOW);
641571a7a1Sriastradh 	reg_offset = (reg << 2);
651571a7a1Sriastradh 	val = lower_32_bits(ring->gpu_addr);
661571a7a1Sriastradh 	jpeg_v1_0_decode_ring_patch_wreg(ring, &ptr, reg_offset, val);
671571a7a1Sriastradh 
681571a7a1Sriastradh 	// 2nd: program mmUVD_LMI_JRBC_RB_MEM_RD_64BIT_BAR_HIGH
691571a7a1Sriastradh 	reg = SOC15_REG_OFFSET(JPEG, 0, mmUVD_LMI_JRBC_RB_MEM_RD_64BIT_BAR_HIGH);
701571a7a1Sriastradh 	reg_offset = (reg << 2);
711571a7a1Sriastradh 	val = upper_32_bits(ring->gpu_addr);
721571a7a1Sriastradh 	jpeg_v1_0_decode_ring_patch_wreg(ring, &ptr, reg_offset, val);
731571a7a1Sriastradh 
741571a7a1Sriastradh 	// 3rd to 5th: issue MEM_READ commands
751571a7a1Sriastradh 	for (i = 0; i <= 2; i++) {
761571a7a1Sriastradh 		ring->ring[ptr++] = PACKETJ(0, 0, 0, PACKETJ_TYPE2);
771571a7a1Sriastradh 		ring->ring[ptr++] = 0;
781571a7a1Sriastradh 	}
791571a7a1Sriastradh 
801571a7a1Sriastradh 	// 6th: program mmUVD_JRBC_RB_CNTL register to enable NO_FETCH and RPTR write ability
811571a7a1Sriastradh 	reg = SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_RB_CNTL);
821571a7a1Sriastradh 	reg_offset = (reg << 2);
831571a7a1Sriastradh 	val = 0x13;
841571a7a1Sriastradh 	jpeg_v1_0_decode_ring_patch_wreg(ring, &ptr, reg_offset, val);
851571a7a1Sriastradh 
861571a7a1Sriastradh 	// 7th: program mmUVD_JRBC_RB_REF_DATA
871571a7a1Sriastradh 	reg = SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_RB_REF_DATA);
881571a7a1Sriastradh 	reg_offset = (reg << 2);
891571a7a1Sriastradh 	val = 0x1;
901571a7a1Sriastradh 	jpeg_v1_0_decode_ring_patch_wreg(ring, &ptr, reg_offset, val);
911571a7a1Sriastradh 
921571a7a1Sriastradh 	// 8th: issue conditional register read mmUVD_JRBC_RB_CNTL
931571a7a1Sriastradh 	reg = SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_RB_CNTL);
941571a7a1Sriastradh 	reg_offset = (reg << 2);
951571a7a1Sriastradh 	val = 0x1;
961571a7a1Sriastradh 	mask = 0x1;
971571a7a1Sriastradh 
981571a7a1Sriastradh 	ring->ring[ptr++] = PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_RB_COND_RD_TIMER), 0, 0, PACKETJ_TYPE0);
991571a7a1Sriastradh 	ring->ring[ptr++] = 0x01400200;
1001571a7a1Sriastradh 	ring->ring[ptr++] = PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_RB_REF_DATA), 0, 0, PACKETJ_TYPE0);
1011571a7a1Sriastradh 	ring->ring[ptr++] = val;
1021571a7a1Sriastradh 	ring->ring[ptr++] = PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_EXTERNAL_REG_BASE), 0, 0, PACKETJ_TYPE0);
1031571a7a1Sriastradh 	if (((reg_offset >= 0x1f800) && (reg_offset <= 0x21fff)) ||
1041571a7a1Sriastradh 		((reg_offset >= 0x1e000) && (reg_offset <= 0x1e1ff))) {
1051571a7a1Sriastradh 		ring->ring[ptr++] = 0;
1061571a7a1Sriastradh 		ring->ring[ptr++] = PACKETJ((reg_offset >> 2), 0, 0, PACKETJ_TYPE3);
1071571a7a1Sriastradh 	} else {
1081571a7a1Sriastradh 		ring->ring[ptr++] = reg_offset;
1091571a7a1Sriastradh 		ring->ring[ptr++] = PACKETJ(0, 0, 0, PACKETJ_TYPE3);
1101571a7a1Sriastradh 	}
1111571a7a1Sriastradh 	ring->ring[ptr++] = mask;
1121571a7a1Sriastradh 
1131571a7a1Sriastradh 	//9th to 21st: insert no-op
1141571a7a1Sriastradh 	for (i = 0; i <= 12; i++) {
1151571a7a1Sriastradh 		ring->ring[ptr++] = PACKETJ(0, 0, 0, PACKETJ_TYPE6);
1161571a7a1Sriastradh 		ring->ring[ptr++] = 0;
1171571a7a1Sriastradh 	}
1181571a7a1Sriastradh 
1191571a7a1Sriastradh 	//22nd: reset mmUVD_JRBC_RB_RPTR
1201571a7a1Sriastradh 	reg = SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_RB_RPTR);
1211571a7a1Sriastradh 	reg_offset = (reg << 2);
1221571a7a1Sriastradh 	val = 0;
1231571a7a1Sriastradh 	jpeg_v1_0_decode_ring_patch_wreg(ring, &ptr, reg_offset, val);
1241571a7a1Sriastradh 
1251571a7a1Sriastradh 	//23rd: program mmUVD_JRBC_RB_CNTL to disable no_fetch
1261571a7a1Sriastradh 	reg = SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_RB_CNTL);
1271571a7a1Sriastradh 	reg_offset = (reg << 2);
1281571a7a1Sriastradh 	val = 0x12;
1291571a7a1Sriastradh 	jpeg_v1_0_decode_ring_patch_wreg(ring, &ptr, reg_offset, val);
1301571a7a1Sriastradh }
1311571a7a1Sriastradh 
1321571a7a1Sriastradh /**
1331571a7a1Sriastradh  * jpeg_v1_0_decode_ring_get_rptr - get read pointer
1341571a7a1Sriastradh  *
1351571a7a1Sriastradh  * @ring: amdgpu_ring pointer
1361571a7a1Sriastradh  *
1371571a7a1Sriastradh  * Returns the current hardware read pointer
1381571a7a1Sriastradh  */
jpeg_v1_0_decode_ring_get_rptr(struct amdgpu_ring * ring)1391571a7a1Sriastradh static uint64_t jpeg_v1_0_decode_ring_get_rptr(struct amdgpu_ring *ring)
1401571a7a1Sriastradh {
1411571a7a1Sriastradh 	struct amdgpu_device *adev = ring->adev;
1421571a7a1Sriastradh 
1431571a7a1Sriastradh 	return RREG32_SOC15(JPEG, 0, mmUVD_JRBC_RB_RPTR);
1441571a7a1Sriastradh }
1451571a7a1Sriastradh 
1461571a7a1Sriastradh /**
1471571a7a1Sriastradh  * jpeg_v1_0_decode_ring_get_wptr - get write pointer
1481571a7a1Sriastradh  *
1491571a7a1Sriastradh  * @ring: amdgpu_ring pointer
1501571a7a1Sriastradh  *
1511571a7a1Sriastradh  * Returns the current hardware write pointer
1521571a7a1Sriastradh  */
jpeg_v1_0_decode_ring_get_wptr(struct amdgpu_ring * ring)1531571a7a1Sriastradh static uint64_t jpeg_v1_0_decode_ring_get_wptr(struct amdgpu_ring *ring)
1541571a7a1Sriastradh {
1551571a7a1Sriastradh 	struct amdgpu_device *adev = ring->adev;
1561571a7a1Sriastradh 
1571571a7a1Sriastradh 	return RREG32_SOC15(JPEG, 0, mmUVD_JRBC_RB_WPTR);
1581571a7a1Sriastradh }
1591571a7a1Sriastradh 
1601571a7a1Sriastradh /**
1611571a7a1Sriastradh  * jpeg_v1_0_decode_ring_set_wptr - set write pointer
1621571a7a1Sriastradh  *
1631571a7a1Sriastradh  * @ring: amdgpu_ring pointer
1641571a7a1Sriastradh  *
1651571a7a1Sriastradh  * Commits the write pointer to the hardware
1661571a7a1Sriastradh  */
jpeg_v1_0_decode_ring_set_wptr(struct amdgpu_ring * ring)1671571a7a1Sriastradh static void jpeg_v1_0_decode_ring_set_wptr(struct amdgpu_ring *ring)
1681571a7a1Sriastradh {
1691571a7a1Sriastradh 	struct amdgpu_device *adev = ring->adev;
1701571a7a1Sriastradh 
1711571a7a1Sriastradh 	WREG32_SOC15(JPEG, 0, mmUVD_JRBC_RB_WPTR, lower_32_bits(ring->wptr));
1721571a7a1Sriastradh }
1731571a7a1Sriastradh 
1741571a7a1Sriastradh /**
1751571a7a1Sriastradh  * jpeg_v1_0_decode_ring_insert_start - insert a start command
1761571a7a1Sriastradh  *
1771571a7a1Sriastradh  * @ring: amdgpu_ring pointer
1781571a7a1Sriastradh  *
1791571a7a1Sriastradh  * Write a start command to the ring.
1801571a7a1Sriastradh  */
jpeg_v1_0_decode_ring_insert_start(struct amdgpu_ring * ring)1811571a7a1Sriastradh static void jpeg_v1_0_decode_ring_insert_start(struct amdgpu_ring *ring)
1821571a7a1Sriastradh {
1831571a7a1Sriastradh 	struct amdgpu_device *adev = ring->adev;
1841571a7a1Sriastradh 
1851571a7a1Sriastradh 	amdgpu_ring_write(ring,
1861571a7a1Sriastradh 		PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_EXTERNAL_REG_BASE), 0, 0, PACKETJ_TYPE0));
1871571a7a1Sriastradh 	amdgpu_ring_write(ring, 0x68e04);
1881571a7a1Sriastradh 
1891571a7a1Sriastradh 	amdgpu_ring_write(ring, PACKETJ(0, 0, 0, PACKETJ_TYPE0));
1901571a7a1Sriastradh 	amdgpu_ring_write(ring, 0x80010000);
1911571a7a1Sriastradh }
1921571a7a1Sriastradh 
1931571a7a1Sriastradh /**
1941571a7a1Sriastradh  * jpeg_v1_0_decode_ring_insert_end - insert a end command
1951571a7a1Sriastradh  *
1961571a7a1Sriastradh  * @ring: amdgpu_ring pointer
1971571a7a1Sriastradh  *
1981571a7a1Sriastradh  * Write a end command to the ring.
1991571a7a1Sriastradh  */
jpeg_v1_0_decode_ring_insert_end(struct amdgpu_ring * ring)2001571a7a1Sriastradh static void jpeg_v1_0_decode_ring_insert_end(struct amdgpu_ring *ring)
2011571a7a1Sriastradh {
2021571a7a1Sriastradh 	struct amdgpu_device *adev = ring->adev;
2031571a7a1Sriastradh 
2041571a7a1Sriastradh 	amdgpu_ring_write(ring,
2051571a7a1Sriastradh 		PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_EXTERNAL_REG_BASE), 0, 0, PACKETJ_TYPE0));
2061571a7a1Sriastradh 	amdgpu_ring_write(ring, 0x68e04);
2071571a7a1Sriastradh 
2081571a7a1Sriastradh 	amdgpu_ring_write(ring, PACKETJ(0, 0, 0, PACKETJ_TYPE0));
2091571a7a1Sriastradh 	amdgpu_ring_write(ring, 0x00010000);
2101571a7a1Sriastradh }
2111571a7a1Sriastradh 
2121571a7a1Sriastradh /**
2131571a7a1Sriastradh  * jpeg_v1_0_decode_ring_emit_fence - emit an fence & trap command
2141571a7a1Sriastradh  *
2151571a7a1Sriastradh  * @ring: amdgpu_ring pointer
2161571a7a1Sriastradh  * @fence: fence to emit
2171571a7a1Sriastradh  *
2181571a7a1Sriastradh  * Write a fence and a trap command to the ring.
2191571a7a1Sriastradh  */
jpeg_v1_0_decode_ring_emit_fence(struct amdgpu_ring * ring,u64 addr,u64 seq,unsigned flags)2201571a7a1Sriastradh static void jpeg_v1_0_decode_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq,
2211571a7a1Sriastradh 				     unsigned flags)
2221571a7a1Sriastradh {
2231571a7a1Sriastradh 	struct amdgpu_device *adev = ring->adev;
2241571a7a1Sriastradh 
2251571a7a1Sriastradh 	WARN_ON(flags & AMDGPU_FENCE_FLAG_64BIT);
2261571a7a1Sriastradh 
2271571a7a1Sriastradh 	amdgpu_ring_write(ring,
2281571a7a1Sriastradh 		PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JPEG_GPCOM_DATA0), 0, 0, PACKETJ_TYPE0));
2291571a7a1Sriastradh 	amdgpu_ring_write(ring, seq);
2301571a7a1Sriastradh 
2311571a7a1Sriastradh 	amdgpu_ring_write(ring,
2321571a7a1Sriastradh 		PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JPEG_GPCOM_DATA1), 0, 0, PACKETJ_TYPE0));
2331571a7a1Sriastradh 	amdgpu_ring_write(ring, seq);
2341571a7a1Sriastradh 
2351571a7a1Sriastradh 	amdgpu_ring_write(ring,
2361571a7a1Sriastradh 		PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW), 0, 0, PACKETJ_TYPE0));
2371571a7a1Sriastradh 	amdgpu_ring_write(ring, lower_32_bits(addr));
2381571a7a1Sriastradh 
2391571a7a1Sriastradh 	amdgpu_ring_write(ring,
2401571a7a1Sriastradh 		PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH), 0, 0, PACKETJ_TYPE0));
2411571a7a1Sriastradh 	amdgpu_ring_write(ring, upper_32_bits(addr));
2421571a7a1Sriastradh 
2431571a7a1Sriastradh 	amdgpu_ring_write(ring,
2441571a7a1Sriastradh 		PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JPEG_GPCOM_CMD), 0, 0, PACKETJ_TYPE0));
2451571a7a1Sriastradh 	amdgpu_ring_write(ring, 0x8);
2461571a7a1Sriastradh 
2471571a7a1Sriastradh 	amdgpu_ring_write(ring,
2481571a7a1Sriastradh 		PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JPEG_GPCOM_CMD), 0, PACKETJ_CONDITION_CHECK0, PACKETJ_TYPE4));
2491571a7a1Sriastradh 	amdgpu_ring_write(ring, 0);
2501571a7a1Sriastradh 
2511571a7a1Sriastradh 	amdgpu_ring_write(ring,
2521571a7a1Sriastradh 		PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_RB_COND_RD_TIMER), 0, 0, PACKETJ_TYPE0));
2531571a7a1Sriastradh 	amdgpu_ring_write(ring, 0x01400200);
2541571a7a1Sriastradh 
2551571a7a1Sriastradh 	amdgpu_ring_write(ring,
2561571a7a1Sriastradh 		PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_RB_REF_DATA), 0, 0, PACKETJ_TYPE0));
2571571a7a1Sriastradh 	amdgpu_ring_write(ring, seq);
2581571a7a1Sriastradh 
2591571a7a1Sriastradh 	amdgpu_ring_write(ring,
2601571a7a1Sriastradh 		PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_LMI_JRBC_RB_MEM_RD_64BIT_BAR_LOW), 0, 0, PACKETJ_TYPE0));
2611571a7a1Sriastradh 	amdgpu_ring_write(ring, lower_32_bits(addr));
2621571a7a1Sriastradh 
2631571a7a1Sriastradh 	amdgpu_ring_write(ring,
2641571a7a1Sriastradh 		PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_LMI_JRBC_RB_MEM_RD_64BIT_BAR_HIGH), 0, 0, PACKETJ_TYPE0));
2651571a7a1Sriastradh 	amdgpu_ring_write(ring, upper_32_bits(addr));
2661571a7a1Sriastradh 
2671571a7a1Sriastradh 	amdgpu_ring_write(ring,
2681571a7a1Sriastradh 		PACKETJ(0, 0, PACKETJ_CONDITION_CHECK3, PACKETJ_TYPE2));
2691571a7a1Sriastradh 	amdgpu_ring_write(ring, 0xffffffff);
2701571a7a1Sriastradh 
2711571a7a1Sriastradh 	amdgpu_ring_write(ring,
2721571a7a1Sriastradh 		PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_EXTERNAL_REG_BASE), 0, 0, PACKETJ_TYPE0));
2731571a7a1Sriastradh 	amdgpu_ring_write(ring, 0x3fbc);
2741571a7a1Sriastradh 
2751571a7a1Sriastradh 	amdgpu_ring_write(ring,
2761571a7a1Sriastradh 		PACKETJ(0, 0, 0, PACKETJ_TYPE0));
2771571a7a1Sriastradh 	amdgpu_ring_write(ring, 0x1);
2781571a7a1Sriastradh 
2791571a7a1Sriastradh 	/* emit trap */
2801571a7a1Sriastradh 	amdgpu_ring_write(ring, PACKETJ(0, 0, 0, PACKETJ_TYPE7));
2811571a7a1Sriastradh 	amdgpu_ring_write(ring, 0);
2821571a7a1Sriastradh }
2831571a7a1Sriastradh 
2841571a7a1Sriastradh /**
2851571a7a1Sriastradh  * jpeg_v1_0_decode_ring_emit_ib - execute indirect buffer
2861571a7a1Sriastradh  *
2871571a7a1Sriastradh  * @ring: amdgpu_ring pointer
2881571a7a1Sriastradh  * @ib: indirect buffer to execute
2891571a7a1Sriastradh  *
2901571a7a1Sriastradh  * Write ring commands to execute the indirect buffer.
2911571a7a1Sriastradh  */
jpeg_v1_0_decode_ring_emit_ib(struct amdgpu_ring * ring,struct amdgpu_job * job,struct amdgpu_ib * ib,uint32_t flags)2921571a7a1Sriastradh static void jpeg_v1_0_decode_ring_emit_ib(struct amdgpu_ring *ring,
2931571a7a1Sriastradh 					struct amdgpu_job *job,
2941571a7a1Sriastradh 					struct amdgpu_ib *ib,
2951571a7a1Sriastradh 					uint32_t flags)
2961571a7a1Sriastradh {
2971571a7a1Sriastradh 	struct amdgpu_device *adev = ring->adev;
2981571a7a1Sriastradh 	unsigned vmid = AMDGPU_JOB_GET_VMID(job);
2991571a7a1Sriastradh 
3001571a7a1Sriastradh 	amdgpu_ring_write(ring,
3011571a7a1Sriastradh 		PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_LMI_JRBC_IB_VMID), 0, 0, PACKETJ_TYPE0));
3021571a7a1Sriastradh 	amdgpu_ring_write(ring, (vmid | (vmid << 4)));
3031571a7a1Sriastradh 
3041571a7a1Sriastradh 	amdgpu_ring_write(ring,
3051571a7a1Sriastradh 		PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_LMI_JPEG_VMID), 0, 0, PACKETJ_TYPE0));
3061571a7a1Sriastradh 	amdgpu_ring_write(ring, (vmid | (vmid << 4)));
3071571a7a1Sriastradh 
3081571a7a1Sriastradh 	amdgpu_ring_write(ring,
3091571a7a1Sriastradh 		PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_LMI_JRBC_IB_64BIT_BAR_LOW), 0, 0, PACKETJ_TYPE0));
3101571a7a1Sriastradh 	amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr));
3111571a7a1Sriastradh 
3121571a7a1Sriastradh 	amdgpu_ring_write(ring,
3131571a7a1Sriastradh 		PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_LMI_JRBC_IB_64BIT_BAR_HIGH), 0, 0, PACKETJ_TYPE0));
3141571a7a1Sriastradh 	amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr));
3151571a7a1Sriastradh 
3161571a7a1Sriastradh 	amdgpu_ring_write(ring,
3171571a7a1Sriastradh 		PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_IB_SIZE), 0, 0, PACKETJ_TYPE0));
3181571a7a1Sriastradh 	amdgpu_ring_write(ring, ib->length_dw);
3191571a7a1Sriastradh 
3201571a7a1Sriastradh 	amdgpu_ring_write(ring,
3211571a7a1Sriastradh 		PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_LMI_JRBC_RB_MEM_RD_64BIT_BAR_LOW), 0, 0, PACKETJ_TYPE0));
3221571a7a1Sriastradh 	amdgpu_ring_write(ring, lower_32_bits(ring->gpu_addr));
3231571a7a1Sriastradh 
3241571a7a1Sriastradh 	amdgpu_ring_write(ring,
3251571a7a1Sriastradh 		PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_LMI_JRBC_RB_MEM_RD_64BIT_BAR_HIGH), 0, 0, PACKETJ_TYPE0));
3261571a7a1Sriastradh 	amdgpu_ring_write(ring, upper_32_bits(ring->gpu_addr));
3271571a7a1Sriastradh 
3281571a7a1Sriastradh 	amdgpu_ring_write(ring,
3291571a7a1Sriastradh 		PACKETJ(0, 0, PACKETJ_CONDITION_CHECK0, PACKETJ_TYPE2));
3301571a7a1Sriastradh 	amdgpu_ring_write(ring, 0);
3311571a7a1Sriastradh 
3321571a7a1Sriastradh 	amdgpu_ring_write(ring,
3331571a7a1Sriastradh 		PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_RB_COND_RD_TIMER), 0, 0, PACKETJ_TYPE0));
3341571a7a1Sriastradh 	amdgpu_ring_write(ring, 0x01400200);
3351571a7a1Sriastradh 
3361571a7a1Sriastradh 	amdgpu_ring_write(ring,
3371571a7a1Sriastradh 		PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_RB_REF_DATA), 0, 0, PACKETJ_TYPE0));
3381571a7a1Sriastradh 	amdgpu_ring_write(ring, 0x2);
3391571a7a1Sriastradh 
3401571a7a1Sriastradh 	amdgpu_ring_write(ring,
3411571a7a1Sriastradh 		PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_STATUS), 0, PACKETJ_CONDITION_CHECK3, PACKETJ_TYPE3));
3421571a7a1Sriastradh 	amdgpu_ring_write(ring, 0x2);
3431571a7a1Sriastradh }
3441571a7a1Sriastradh 
jpeg_v1_0_decode_ring_emit_reg_wait(struct amdgpu_ring * ring,uint32_t reg,uint32_t val,uint32_t mask)3451571a7a1Sriastradh static void jpeg_v1_0_decode_ring_emit_reg_wait(struct amdgpu_ring *ring,
3461571a7a1Sriastradh 					    uint32_t reg, uint32_t val,
3471571a7a1Sriastradh 					    uint32_t mask)
3481571a7a1Sriastradh {
3491571a7a1Sriastradh 	struct amdgpu_device *adev = ring->adev;
3501571a7a1Sriastradh 	uint32_t reg_offset = (reg << 2);
3511571a7a1Sriastradh 
3521571a7a1Sriastradh 	amdgpu_ring_write(ring,
3531571a7a1Sriastradh 		PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_RB_COND_RD_TIMER), 0, 0, PACKETJ_TYPE0));
3541571a7a1Sriastradh 	amdgpu_ring_write(ring, 0x01400200);
3551571a7a1Sriastradh 
3561571a7a1Sriastradh 	amdgpu_ring_write(ring,
3571571a7a1Sriastradh 		PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_RB_REF_DATA), 0, 0, PACKETJ_TYPE0));
3581571a7a1Sriastradh 	amdgpu_ring_write(ring, val);
3591571a7a1Sriastradh 
3601571a7a1Sriastradh 	amdgpu_ring_write(ring,
3611571a7a1Sriastradh 		PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_EXTERNAL_REG_BASE), 0, 0, PACKETJ_TYPE0));
3621571a7a1Sriastradh 	if (((reg_offset >= 0x1f800) && (reg_offset <= 0x21fff)) ||
3631571a7a1Sriastradh 		((reg_offset >= 0x1e000) && (reg_offset <= 0x1e1ff))) {
3641571a7a1Sriastradh 		amdgpu_ring_write(ring, 0);
3651571a7a1Sriastradh 		amdgpu_ring_write(ring,
3661571a7a1Sriastradh 			PACKETJ((reg_offset >> 2), 0, 0, PACKETJ_TYPE3));
3671571a7a1Sriastradh 	} else {
3681571a7a1Sriastradh 		amdgpu_ring_write(ring, reg_offset);
3691571a7a1Sriastradh 		amdgpu_ring_write(ring,
3701571a7a1Sriastradh 			PACKETJ(0, 0, 0, PACKETJ_TYPE3));
3711571a7a1Sriastradh 	}
3721571a7a1Sriastradh 	amdgpu_ring_write(ring, mask);
3731571a7a1Sriastradh }
3741571a7a1Sriastradh 
jpeg_v1_0_decode_ring_emit_vm_flush(struct amdgpu_ring * ring,unsigned vmid,uint64_t pd_addr)3751571a7a1Sriastradh static void jpeg_v1_0_decode_ring_emit_vm_flush(struct amdgpu_ring *ring,
3761571a7a1Sriastradh 		unsigned vmid, uint64_t pd_addr)
3771571a7a1Sriastradh {
3781571a7a1Sriastradh 	struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub];
3791571a7a1Sriastradh 	uint32_t data0, data1, mask;
3801571a7a1Sriastradh 
3811571a7a1Sriastradh 	pd_addr = amdgpu_gmc_emit_flush_gpu_tlb(ring, vmid, pd_addr);
3821571a7a1Sriastradh 
3831571a7a1Sriastradh 	/* wait for register write */
3841571a7a1Sriastradh 	data0 = hub->ctx0_ptb_addr_lo32 + vmid * 2;
3851571a7a1Sriastradh 	data1 = lower_32_bits(pd_addr);
3861571a7a1Sriastradh 	mask = 0xffffffff;
3871571a7a1Sriastradh 	jpeg_v1_0_decode_ring_emit_reg_wait(ring, data0, data1, mask);
3881571a7a1Sriastradh }
3891571a7a1Sriastradh 
jpeg_v1_0_decode_ring_emit_wreg(struct amdgpu_ring * ring,uint32_t reg,uint32_t val)3901571a7a1Sriastradh static void jpeg_v1_0_decode_ring_emit_wreg(struct amdgpu_ring *ring,
3911571a7a1Sriastradh 					uint32_t reg, uint32_t val)
3921571a7a1Sriastradh {
3931571a7a1Sriastradh 	struct amdgpu_device *adev = ring->adev;
3941571a7a1Sriastradh 	uint32_t reg_offset = (reg << 2);
3951571a7a1Sriastradh 
3961571a7a1Sriastradh 	amdgpu_ring_write(ring,
3971571a7a1Sriastradh 		PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_EXTERNAL_REG_BASE), 0, 0, PACKETJ_TYPE0));
3981571a7a1Sriastradh 	if (((reg_offset >= 0x1f800) && (reg_offset <= 0x21fff)) ||
3991571a7a1Sriastradh 			((reg_offset >= 0x1e000) && (reg_offset <= 0x1e1ff))) {
4001571a7a1Sriastradh 		amdgpu_ring_write(ring, 0);
4011571a7a1Sriastradh 		amdgpu_ring_write(ring,
4021571a7a1Sriastradh 			PACKETJ((reg_offset >> 2), 0, 0, PACKETJ_TYPE0));
4031571a7a1Sriastradh 	} else {
4041571a7a1Sriastradh 		amdgpu_ring_write(ring, reg_offset);
4051571a7a1Sriastradh 		amdgpu_ring_write(ring,
4061571a7a1Sriastradh 			PACKETJ(0, 0, 0, PACKETJ_TYPE0));
4071571a7a1Sriastradh 	}
4081571a7a1Sriastradh 	amdgpu_ring_write(ring, val);
4091571a7a1Sriastradh }
4101571a7a1Sriastradh 
jpeg_v1_0_decode_ring_nop(struct amdgpu_ring * ring,uint32_t count)4111571a7a1Sriastradh static void jpeg_v1_0_decode_ring_nop(struct amdgpu_ring *ring, uint32_t count)
4121571a7a1Sriastradh {
4131571a7a1Sriastradh 	int i;
4141571a7a1Sriastradh 
4151571a7a1Sriastradh 	WARN_ON(ring->wptr % 2 || count % 2);
4161571a7a1Sriastradh 
4171571a7a1Sriastradh 	for (i = 0; i < count / 2; i++) {
4181571a7a1Sriastradh 		amdgpu_ring_write(ring, PACKETJ(0, 0, 0, PACKETJ_TYPE6));
4191571a7a1Sriastradh 		amdgpu_ring_write(ring, 0);
4201571a7a1Sriastradh 	}
4211571a7a1Sriastradh }
4221571a7a1Sriastradh 
jpeg_v1_0_set_interrupt_state(struct amdgpu_device * adev,struct amdgpu_irq_src * source,unsigned type,enum amdgpu_interrupt_state state)4231571a7a1Sriastradh static int jpeg_v1_0_set_interrupt_state(struct amdgpu_device *adev,
4241571a7a1Sriastradh 					struct amdgpu_irq_src *source,
4251571a7a1Sriastradh 					unsigned type,
4261571a7a1Sriastradh 					enum amdgpu_interrupt_state state)
4271571a7a1Sriastradh {
4281571a7a1Sriastradh 	return 0;
4291571a7a1Sriastradh }
4301571a7a1Sriastradh 
jpeg_v1_0_process_interrupt(struct amdgpu_device * adev,struct amdgpu_irq_src * source,struct amdgpu_iv_entry * entry)4311571a7a1Sriastradh static int jpeg_v1_0_process_interrupt(struct amdgpu_device *adev,
4321571a7a1Sriastradh 				      struct amdgpu_irq_src *source,
4331571a7a1Sriastradh 				      struct amdgpu_iv_entry *entry)
4341571a7a1Sriastradh {
4351571a7a1Sriastradh 	DRM_DEBUG("IH: JPEG decode TRAP\n");
4361571a7a1Sriastradh 
4371571a7a1Sriastradh 	switch (entry->src_id) {
4381571a7a1Sriastradh 	case 126:
4391571a7a1Sriastradh 		amdgpu_fence_process(&adev->jpeg.inst->ring_dec);
4401571a7a1Sriastradh 		break;
4411571a7a1Sriastradh 	default:
4421571a7a1Sriastradh 		DRM_ERROR("Unhandled interrupt: %d %d\n",
4431571a7a1Sriastradh 			  entry->src_id, entry->src_data[0]);
4441571a7a1Sriastradh 		break;
4451571a7a1Sriastradh 	}
4461571a7a1Sriastradh 
4471571a7a1Sriastradh 	return 0;
4481571a7a1Sriastradh }
4491571a7a1Sriastradh 
4501571a7a1Sriastradh /**
4511571a7a1Sriastradh  * jpeg_v1_0_early_init - set function pointers
4521571a7a1Sriastradh  *
4531571a7a1Sriastradh  * @handle: amdgpu_device pointer
4541571a7a1Sriastradh  *
4551571a7a1Sriastradh  * Set ring and irq function pointers
4561571a7a1Sriastradh  */
jpeg_v1_0_early_init(void * handle)4571571a7a1Sriastradh int jpeg_v1_0_early_init(void *handle)
4581571a7a1Sriastradh {
4591571a7a1Sriastradh 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
4601571a7a1Sriastradh 
4611571a7a1Sriastradh 	adev->jpeg.num_jpeg_inst = 1;
4621571a7a1Sriastradh 
4631571a7a1Sriastradh 	jpeg_v1_0_set_dec_ring_funcs(adev);
4641571a7a1Sriastradh 	jpeg_v1_0_set_irq_funcs(adev);
4651571a7a1Sriastradh 
4661571a7a1Sriastradh 	return 0;
4671571a7a1Sriastradh }
4681571a7a1Sriastradh 
4691571a7a1Sriastradh /**
4701571a7a1Sriastradh  * jpeg_v1_0_sw_init - sw init for JPEG block
4711571a7a1Sriastradh  *
4721571a7a1Sriastradh  * @handle: amdgpu_device pointer
4731571a7a1Sriastradh  *
4741571a7a1Sriastradh  */
jpeg_v1_0_sw_init(void * handle)4751571a7a1Sriastradh int jpeg_v1_0_sw_init(void *handle)
4761571a7a1Sriastradh {
4771571a7a1Sriastradh 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
4781571a7a1Sriastradh 	struct amdgpu_ring *ring;
4791571a7a1Sriastradh 	int r;
4801571a7a1Sriastradh 
4811571a7a1Sriastradh 	/* JPEG TRAP */
4821571a7a1Sriastradh 	r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_VCN, 126, &adev->jpeg.inst->irq);
4831571a7a1Sriastradh 	if (r)
4841571a7a1Sriastradh 		return r;
4851571a7a1Sriastradh 
4861571a7a1Sriastradh 	ring = &adev->jpeg.inst->ring_dec;
487*b45c3ff5Sriastradh 	snprintf(ring->name, sizeof(ring->name), "jpeg_dec");
4881571a7a1Sriastradh 	r = amdgpu_ring_init(adev, ring, 512, &adev->jpeg.inst->irq, 0);
4891571a7a1Sriastradh 	if (r)
4901571a7a1Sriastradh 		return r;
4911571a7a1Sriastradh 
4921571a7a1Sriastradh 	adev->jpeg.internal.jpeg_pitch = adev->jpeg.inst->external.jpeg_pitch =
4931571a7a1Sriastradh 		SOC15_REG_OFFSET(JPEG, 0, mmUVD_JPEG_PITCH);
4941571a7a1Sriastradh 
4951571a7a1Sriastradh 	return 0;
4961571a7a1Sriastradh }
4971571a7a1Sriastradh 
4981571a7a1Sriastradh /**
4991571a7a1Sriastradh  * jpeg_v1_0_sw_fini - sw fini for JPEG block
5001571a7a1Sriastradh  *
5011571a7a1Sriastradh  * @handle: amdgpu_device pointer
5021571a7a1Sriastradh  *
5031571a7a1Sriastradh  * JPEG free up sw allocation
5041571a7a1Sriastradh  */
jpeg_v1_0_sw_fini(void * handle)5051571a7a1Sriastradh void jpeg_v1_0_sw_fini(void *handle)
5061571a7a1Sriastradh {
5071571a7a1Sriastradh 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
5081571a7a1Sriastradh 
5091571a7a1Sriastradh 	amdgpu_ring_fini(&adev->jpeg.inst[0].ring_dec);
5101571a7a1Sriastradh }
5111571a7a1Sriastradh 
5121571a7a1Sriastradh /**
5131571a7a1Sriastradh  * jpeg_v1_0_start - start JPEG block
5141571a7a1Sriastradh  *
5151571a7a1Sriastradh  * @adev: amdgpu_device pointer
5161571a7a1Sriastradh  *
5171571a7a1Sriastradh  * Setup and start the JPEG block
5181571a7a1Sriastradh  */
jpeg_v1_0_start(struct amdgpu_device * adev,int mode)5191571a7a1Sriastradh void jpeg_v1_0_start(struct amdgpu_device *adev, int mode)
5201571a7a1Sriastradh {
5211571a7a1Sriastradh 	struct amdgpu_ring *ring = &adev->jpeg.inst->ring_dec;
5221571a7a1Sriastradh 
5231571a7a1Sriastradh 	if (mode == 0) {
5241571a7a1Sriastradh 		WREG32_SOC15(JPEG, 0, mmUVD_LMI_JRBC_RB_VMID, 0);
5251571a7a1Sriastradh 		WREG32_SOC15(JPEG, 0, mmUVD_JRBC_RB_CNTL, UVD_JRBC_RB_CNTL__RB_NO_FETCH_MASK |
5261571a7a1Sriastradh 				UVD_JRBC_RB_CNTL__RB_RPTR_WR_EN_MASK);
5271571a7a1Sriastradh 		WREG32_SOC15(JPEG, 0, mmUVD_LMI_JRBC_RB_64BIT_BAR_LOW, lower_32_bits(ring->gpu_addr));
5281571a7a1Sriastradh 		WREG32_SOC15(JPEG, 0, mmUVD_LMI_JRBC_RB_64BIT_BAR_HIGH, upper_32_bits(ring->gpu_addr));
5291571a7a1Sriastradh 		WREG32_SOC15(JPEG, 0, mmUVD_JRBC_RB_RPTR, 0);
5301571a7a1Sriastradh 		WREG32_SOC15(JPEG, 0, mmUVD_JRBC_RB_WPTR, 0);
5311571a7a1Sriastradh 		WREG32_SOC15(JPEG, 0, mmUVD_JRBC_RB_CNTL, UVD_JRBC_RB_CNTL__RB_RPTR_WR_EN_MASK);
5321571a7a1Sriastradh 	}
5331571a7a1Sriastradh 
5341571a7a1Sriastradh 	/* initialize wptr */
5351571a7a1Sriastradh 	ring->wptr = RREG32_SOC15(JPEG, 0, mmUVD_JRBC_RB_WPTR);
5361571a7a1Sriastradh 
5371571a7a1Sriastradh 	/* copy patch commands to the jpeg ring */
5381571a7a1Sriastradh 	jpeg_v1_0_decode_ring_set_patch_ring(ring,
5391571a7a1Sriastradh 		(ring->wptr + ring->max_dw * amdgpu_sched_hw_submission));
5401571a7a1Sriastradh }
5411571a7a1Sriastradh 
5421571a7a1Sriastradh static const struct amdgpu_ring_funcs jpeg_v1_0_decode_ring_vm_funcs = {
5431571a7a1Sriastradh 	.type = AMDGPU_RING_TYPE_VCN_JPEG,
5441571a7a1Sriastradh 	.align_mask = 0xf,
5451571a7a1Sriastradh 	.nop = PACKET0(0x81ff, 0),
5461571a7a1Sriastradh 	.support_64bit_ptrs = false,
5471571a7a1Sriastradh 	.no_user_fence = true,
5481571a7a1Sriastradh 	.vmhub = AMDGPU_MMHUB_0,
5491571a7a1Sriastradh 	.extra_dw = 64,
5501571a7a1Sriastradh 	.get_rptr = jpeg_v1_0_decode_ring_get_rptr,
5511571a7a1Sriastradh 	.get_wptr = jpeg_v1_0_decode_ring_get_wptr,
5521571a7a1Sriastradh 	.set_wptr = jpeg_v1_0_decode_ring_set_wptr,
5531571a7a1Sriastradh 	.emit_frame_size =
5541571a7a1Sriastradh 		6 + 6 + /* hdp invalidate / flush */
5551571a7a1Sriastradh 		SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 +
5561571a7a1Sriastradh 		SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 8 +
5571571a7a1Sriastradh 		8 + /* jpeg_v1_0_decode_ring_emit_vm_flush */
5581571a7a1Sriastradh 		26 + 26 + /* jpeg_v1_0_decode_ring_emit_fence x2 vm fence */
5591571a7a1Sriastradh 		6,
5601571a7a1Sriastradh 	.emit_ib_size = 22, /* jpeg_v1_0_decode_ring_emit_ib */
5611571a7a1Sriastradh 	.emit_ib = jpeg_v1_0_decode_ring_emit_ib,
5621571a7a1Sriastradh 	.emit_fence = jpeg_v1_0_decode_ring_emit_fence,
5631571a7a1Sriastradh 	.emit_vm_flush = jpeg_v1_0_decode_ring_emit_vm_flush,
5641571a7a1Sriastradh 	.test_ring = amdgpu_jpeg_dec_ring_test_ring,
5651571a7a1Sriastradh 	.test_ib = amdgpu_jpeg_dec_ring_test_ib,
5661571a7a1Sriastradh 	.insert_nop = jpeg_v1_0_decode_ring_nop,
5671571a7a1Sriastradh 	.insert_start = jpeg_v1_0_decode_ring_insert_start,
5681571a7a1Sriastradh 	.insert_end = jpeg_v1_0_decode_ring_insert_end,
5691571a7a1Sriastradh 	.pad_ib = amdgpu_ring_generic_pad_ib,
5701571a7a1Sriastradh 	.begin_use = vcn_v1_0_ring_begin_use,
5711571a7a1Sriastradh 	.end_use = amdgpu_vcn_ring_end_use,
5721571a7a1Sriastradh 	.emit_wreg = jpeg_v1_0_decode_ring_emit_wreg,
5731571a7a1Sriastradh 	.emit_reg_wait = jpeg_v1_0_decode_ring_emit_reg_wait,
5741571a7a1Sriastradh 	.emit_reg_write_reg_wait = amdgpu_ring_emit_reg_write_reg_wait_helper,
5751571a7a1Sriastradh };
5761571a7a1Sriastradh 
jpeg_v1_0_set_dec_ring_funcs(struct amdgpu_device * adev)5771571a7a1Sriastradh static void jpeg_v1_0_set_dec_ring_funcs(struct amdgpu_device *adev)
5781571a7a1Sriastradh {
5791571a7a1Sriastradh 	adev->jpeg.inst->ring_dec.funcs = &jpeg_v1_0_decode_ring_vm_funcs;
5801571a7a1Sriastradh 	DRM_INFO("JPEG decode is enabled in VM mode\n");
5811571a7a1Sriastradh }
5821571a7a1Sriastradh 
5831571a7a1Sriastradh static const struct amdgpu_irq_src_funcs jpeg_v1_0_irq_funcs = {
5841571a7a1Sriastradh 	.set = jpeg_v1_0_set_interrupt_state,
5851571a7a1Sriastradh 	.process = jpeg_v1_0_process_interrupt,
5861571a7a1Sriastradh };
5871571a7a1Sriastradh 
jpeg_v1_0_set_irq_funcs(struct amdgpu_device * adev)5881571a7a1Sriastradh static void jpeg_v1_0_set_irq_funcs(struct amdgpu_device *adev)
5891571a7a1Sriastradh {
5901571a7a1Sriastradh 	adev->jpeg.inst->irq.funcs = &jpeg_v1_0_irq_funcs;
5911571a7a1Sriastradh }
592