xref: /aosp_15_r20/external/libdrm/tests/amdgpu/cs_tests.c (revision 7688df22e49036ff52a766b7101da3a49edadb8c)
1*7688df22SAndroid Build Coastguard Worker /*
2*7688df22SAndroid Build Coastguard Worker  * Copyright 2014 Advanced Micro Devices, Inc.
3*7688df22SAndroid Build Coastguard Worker  *
4*7688df22SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*7688df22SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*7688df22SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*7688df22SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*7688df22SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*7688df22SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*7688df22SAndroid Build Coastguard Worker  *
11*7688df22SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice shall be included in
12*7688df22SAndroid Build Coastguard Worker  * all copies or substantial portions of the Software.
13*7688df22SAndroid Build Coastguard Worker  *
14*7688df22SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15*7688df22SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*7688df22SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17*7688df22SAndroid Build Coastguard Worker  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18*7688df22SAndroid Build Coastguard Worker  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19*7688df22SAndroid Build Coastguard Worker  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20*7688df22SAndroid Build Coastguard Worker  * OTHER DEALINGS IN THE SOFTWARE.
21*7688df22SAndroid Build Coastguard Worker  *
22*7688df22SAndroid Build Coastguard Worker */
23*7688df22SAndroid Build Coastguard Worker 
24*7688df22SAndroid Build Coastguard Worker #include <stdio.h>
25*7688df22SAndroid Build Coastguard Worker 
26*7688df22SAndroid Build Coastguard Worker #include "CUnit/Basic.h"
27*7688df22SAndroid Build Coastguard Worker 
28*7688df22SAndroid Build Coastguard Worker #include "util_math.h"
29*7688df22SAndroid Build Coastguard Worker 
30*7688df22SAndroid Build Coastguard Worker #include "amdgpu_test.h"
31*7688df22SAndroid Build Coastguard Worker #include "decode_messages.h"
32*7688df22SAndroid Build Coastguard Worker #include "amdgpu_drm.h"
33*7688df22SAndroid Build Coastguard Worker #include "amdgpu_internal.h"
34*7688df22SAndroid Build Coastguard Worker 
35*7688df22SAndroid Build Coastguard Worker #define IB_SIZE		4096
36*7688df22SAndroid Build Coastguard Worker #define MAX_RESOURCES	16
37*7688df22SAndroid Build Coastguard Worker 
38*7688df22SAndroid Build Coastguard Worker static amdgpu_device_handle device_handle;
39*7688df22SAndroid Build Coastguard Worker static uint32_t major_version;
40*7688df22SAndroid Build Coastguard Worker static uint32_t minor_version;
41*7688df22SAndroid Build Coastguard Worker static uint32_t family_id;
42*7688df22SAndroid Build Coastguard Worker static uint32_t chip_rev;
43*7688df22SAndroid Build Coastguard Worker static uint32_t chip_id;
44*7688df22SAndroid Build Coastguard Worker 
45*7688df22SAndroid Build Coastguard Worker static amdgpu_context_handle context_handle;
46*7688df22SAndroid Build Coastguard Worker static amdgpu_bo_handle ib_handle;
47*7688df22SAndroid Build Coastguard Worker static uint64_t ib_mc_address;
48*7688df22SAndroid Build Coastguard Worker static uint32_t *ib_cpu;
49*7688df22SAndroid Build Coastguard Worker static amdgpu_va_handle ib_va_handle;
50*7688df22SAndroid Build Coastguard Worker 
51*7688df22SAndroid Build Coastguard Worker static amdgpu_bo_handle resources[MAX_RESOURCES];
52*7688df22SAndroid Build Coastguard Worker static unsigned num_resources;
53*7688df22SAndroid Build Coastguard Worker 
54*7688df22SAndroid Build Coastguard Worker static void amdgpu_cs_uvd_create(void);
55*7688df22SAndroid Build Coastguard Worker static void amdgpu_cs_uvd_decode(void);
56*7688df22SAndroid Build Coastguard Worker static void amdgpu_cs_uvd_destroy(void);
57*7688df22SAndroid Build Coastguard Worker 
58*7688df22SAndroid Build Coastguard Worker CU_TestInfo cs_tests[] = {
59*7688df22SAndroid Build Coastguard Worker 	{ "UVD create",  amdgpu_cs_uvd_create },
60*7688df22SAndroid Build Coastguard Worker 	{ "UVD decode",  amdgpu_cs_uvd_decode },
61*7688df22SAndroid Build Coastguard Worker 	{ "UVD destroy",  amdgpu_cs_uvd_destroy },
62*7688df22SAndroid Build Coastguard Worker 	CU_TEST_INFO_NULL,
63*7688df22SAndroid Build Coastguard Worker };
64*7688df22SAndroid Build Coastguard Worker 
suite_cs_tests_enable(void)65*7688df22SAndroid Build Coastguard Worker CU_BOOL suite_cs_tests_enable(void)
66*7688df22SAndroid Build Coastguard Worker {
67*7688df22SAndroid Build Coastguard Worker 	if (amdgpu_device_initialize(drm_amdgpu[0], &major_version,
68*7688df22SAndroid Build Coastguard Worker 					     &minor_version, &device_handle))
69*7688df22SAndroid Build Coastguard Worker 		return CU_FALSE;
70*7688df22SAndroid Build Coastguard Worker 
71*7688df22SAndroid Build Coastguard Worker 	family_id = device_handle->info.family_id;
72*7688df22SAndroid Build Coastguard Worker     chip_id = device_handle->info.chip_external_rev;
73*7688df22SAndroid Build Coastguard Worker     chip_rev = device_handle->info.chip_rev;
74*7688df22SAndroid Build Coastguard Worker 
75*7688df22SAndroid Build Coastguard Worker 	if (amdgpu_device_deinitialize(device_handle))
76*7688df22SAndroid Build Coastguard Worker 		return CU_FALSE;
77*7688df22SAndroid Build Coastguard Worker 
78*7688df22SAndroid Build Coastguard Worker 
79*7688df22SAndroid Build Coastguard Worker 	if (family_id >= AMDGPU_FAMILY_RV || family_id == AMDGPU_FAMILY_SI ||
80*7688df22SAndroid Build Coastguard Worker 		asic_is_gfx_pipe_removed(family_id, chip_id, chip_rev)) {
81*7688df22SAndroid Build Coastguard Worker 		printf("\n\nThe ASIC NOT support UVD, suite disabled\n");
82*7688df22SAndroid Build Coastguard Worker 		return CU_FALSE;
83*7688df22SAndroid Build Coastguard Worker 	}
84*7688df22SAndroid Build Coastguard Worker 
85*7688df22SAndroid Build Coastguard Worker 	return CU_TRUE;
86*7688df22SAndroid Build Coastguard Worker }
87*7688df22SAndroid Build Coastguard Worker 
suite_cs_tests_init(void)88*7688df22SAndroid Build Coastguard Worker int suite_cs_tests_init(void)
89*7688df22SAndroid Build Coastguard Worker {
90*7688df22SAndroid Build Coastguard Worker 	amdgpu_bo_handle ib_result_handle;
91*7688df22SAndroid Build Coastguard Worker 	void *ib_result_cpu;
92*7688df22SAndroid Build Coastguard Worker 	uint64_t ib_result_mc_address;
93*7688df22SAndroid Build Coastguard Worker 	amdgpu_va_handle ib_result_va_handle;
94*7688df22SAndroid Build Coastguard Worker 	int r;
95*7688df22SAndroid Build Coastguard Worker 
96*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_device_initialize(drm_amdgpu[0], &major_version,
97*7688df22SAndroid Build Coastguard Worker 				     &minor_version, &device_handle);
98*7688df22SAndroid Build Coastguard Worker 	if (r) {
99*7688df22SAndroid Build Coastguard Worker 		if ((r == -EACCES) && (errno == EACCES))
100*7688df22SAndroid Build Coastguard Worker 			printf("\n\nError:%s. "
101*7688df22SAndroid Build Coastguard Worker 				"Hint:Try to run this test program as root.",
102*7688df22SAndroid Build Coastguard Worker 				strerror(errno));
103*7688df22SAndroid Build Coastguard Worker 
104*7688df22SAndroid Build Coastguard Worker 		return CUE_SINIT_FAILED;
105*7688df22SAndroid Build Coastguard Worker 	}
106*7688df22SAndroid Build Coastguard Worker 
107*7688df22SAndroid Build Coastguard Worker 	family_id = device_handle->info.family_id;
108*7688df22SAndroid Build Coastguard Worker 	/* VI asic POLARIS10/11 have specific external_rev_id */
109*7688df22SAndroid Build Coastguard Worker 	chip_rev = device_handle->info.chip_rev;
110*7688df22SAndroid Build Coastguard Worker 	chip_id = device_handle->info.chip_external_rev;
111*7688df22SAndroid Build Coastguard Worker 
112*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_cs_ctx_create(device_handle, &context_handle);
113*7688df22SAndroid Build Coastguard Worker 	if (r)
114*7688df22SAndroid Build Coastguard Worker 		return CUE_SINIT_FAILED;
115*7688df22SAndroid Build Coastguard Worker 
116*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_bo_alloc_and_map(device_handle, IB_SIZE, 4096,
117*7688df22SAndroid Build Coastguard Worker 				    AMDGPU_GEM_DOMAIN_GTT, 0,
118*7688df22SAndroid Build Coastguard Worker 				    &ib_result_handle, &ib_result_cpu,
119*7688df22SAndroid Build Coastguard Worker 				    &ib_result_mc_address,
120*7688df22SAndroid Build Coastguard Worker 				    &ib_result_va_handle);
121*7688df22SAndroid Build Coastguard Worker 	if (r)
122*7688df22SAndroid Build Coastguard Worker 		return CUE_SINIT_FAILED;
123*7688df22SAndroid Build Coastguard Worker 
124*7688df22SAndroid Build Coastguard Worker 	ib_handle = ib_result_handle;
125*7688df22SAndroid Build Coastguard Worker 	ib_mc_address = ib_result_mc_address;
126*7688df22SAndroid Build Coastguard Worker 	ib_cpu = ib_result_cpu;
127*7688df22SAndroid Build Coastguard Worker 	ib_va_handle = ib_result_va_handle;
128*7688df22SAndroid Build Coastguard Worker 
129*7688df22SAndroid Build Coastguard Worker 	return CUE_SUCCESS;
130*7688df22SAndroid Build Coastguard Worker }
131*7688df22SAndroid Build Coastguard Worker 
suite_cs_tests_clean(void)132*7688df22SAndroid Build Coastguard Worker int suite_cs_tests_clean(void)
133*7688df22SAndroid Build Coastguard Worker {
134*7688df22SAndroid Build Coastguard Worker 	int r;
135*7688df22SAndroid Build Coastguard Worker 
136*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_bo_unmap_and_free(ib_handle, ib_va_handle,
137*7688df22SAndroid Build Coastguard Worker 				     ib_mc_address, IB_SIZE);
138*7688df22SAndroid Build Coastguard Worker 	if (r)
139*7688df22SAndroid Build Coastguard Worker 		return CUE_SCLEAN_FAILED;
140*7688df22SAndroid Build Coastguard Worker 
141*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_cs_ctx_free(context_handle);
142*7688df22SAndroid Build Coastguard Worker 	if (r)
143*7688df22SAndroid Build Coastguard Worker 		return CUE_SCLEAN_FAILED;
144*7688df22SAndroid Build Coastguard Worker 
145*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_device_deinitialize(device_handle);
146*7688df22SAndroid Build Coastguard Worker 	if (r)
147*7688df22SAndroid Build Coastguard Worker 		return CUE_SCLEAN_FAILED;
148*7688df22SAndroid Build Coastguard Worker 
149*7688df22SAndroid Build Coastguard Worker 	return CUE_SUCCESS;
150*7688df22SAndroid Build Coastguard Worker }
151*7688df22SAndroid Build Coastguard Worker 
submit(unsigned ndw,unsigned ip)152*7688df22SAndroid Build Coastguard Worker static int submit(unsigned ndw, unsigned ip)
153*7688df22SAndroid Build Coastguard Worker {
154*7688df22SAndroid Build Coastguard Worker 	struct amdgpu_cs_request ibs_request = {0};
155*7688df22SAndroid Build Coastguard Worker 	struct amdgpu_cs_ib_info ib_info = {0};
156*7688df22SAndroid Build Coastguard Worker 	struct amdgpu_cs_fence fence_status = {0};
157*7688df22SAndroid Build Coastguard Worker 	uint32_t expired;
158*7688df22SAndroid Build Coastguard Worker 	int r;
159*7688df22SAndroid Build Coastguard Worker 
160*7688df22SAndroid Build Coastguard Worker 	ib_info.ib_mc_address = ib_mc_address;
161*7688df22SAndroid Build Coastguard Worker 	ib_info.size = ndw;
162*7688df22SAndroid Build Coastguard Worker 
163*7688df22SAndroid Build Coastguard Worker 	ibs_request.ip_type = ip;
164*7688df22SAndroid Build Coastguard Worker 
165*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_bo_list_create(device_handle, num_resources, resources,
166*7688df22SAndroid Build Coastguard Worker 				  NULL, &ibs_request.resources);
167*7688df22SAndroid Build Coastguard Worker 	if (r)
168*7688df22SAndroid Build Coastguard Worker 		return r;
169*7688df22SAndroid Build Coastguard Worker 
170*7688df22SAndroid Build Coastguard Worker 	ibs_request.number_of_ibs = 1;
171*7688df22SAndroid Build Coastguard Worker 	ibs_request.ibs = &ib_info;
172*7688df22SAndroid Build Coastguard Worker 	ibs_request.fence_info.handle = NULL;
173*7688df22SAndroid Build Coastguard Worker 
174*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_cs_submit(context_handle, 0, &ibs_request, 1);
175*7688df22SAndroid Build Coastguard Worker 	if (r)
176*7688df22SAndroid Build Coastguard Worker 		return r;
177*7688df22SAndroid Build Coastguard Worker 
178*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_bo_list_destroy(ibs_request.resources);
179*7688df22SAndroid Build Coastguard Worker 	if (r)
180*7688df22SAndroid Build Coastguard Worker 		return r;
181*7688df22SAndroid Build Coastguard Worker 
182*7688df22SAndroid Build Coastguard Worker 	fence_status.context = context_handle;
183*7688df22SAndroid Build Coastguard Worker 	fence_status.ip_type = ip;
184*7688df22SAndroid Build Coastguard Worker 	fence_status.fence = ibs_request.seq_no;
185*7688df22SAndroid Build Coastguard Worker 
186*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_cs_query_fence_status(&fence_status,
187*7688df22SAndroid Build Coastguard Worker 					 AMDGPU_TIMEOUT_INFINITE,
188*7688df22SAndroid Build Coastguard Worker 					 0, &expired);
189*7688df22SAndroid Build Coastguard Worker 	if (r)
190*7688df22SAndroid Build Coastguard Worker 		return r;
191*7688df22SAndroid Build Coastguard Worker 
192*7688df22SAndroid Build Coastguard Worker 	return 0;
193*7688df22SAndroid Build Coastguard Worker }
194*7688df22SAndroid Build Coastguard Worker 
uvd_cmd(uint64_t addr,unsigned cmd,int * idx)195*7688df22SAndroid Build Coastguard Worker static void uvd_cmd(uint64_t addr, unsigned cmd, int *idx)
196*7688df22SAndroid Build Coastguard Worker {
197*7688df22SAndroid Build Coastguard Worker 	ib_cpu[(*idx)++] = (family_id < AMDGPU_FAMILY_AI) ? 0x3BC4 : 0x81C4;
198*7688df22SAndroid Build Coastguard Worker 	ib_cpu[(*idx)++] = addr;
199*7688df22SAndroid Build Coastguard Worker 	ib_cpu[(*idx)++] = (family_id < AMDGPU_FAMILY_AI) ? 0x3BC5 : 0x81C5;
200*7688df22SAndroid Build Coastguard Worker 	ib_cpu[(*idx)++] = addr >> 32;
201*7688df22SAndroid Build Coastguard Worker 	ib_cpu[(*idx)++] = (family_id < AMDGPU_FAMILY_AI) ? 0x3BC3 : 0x81C3;
202*7688df22SAndroid Build Coastguard Worker 	ib_cpu[(*idx)++] = cmd << 1;
203*7688df22SAndroid Build Coastguard Worker }
204*7688df22SAndroid Build Coastguard Worker 
amdgpu_cs_uvd_create(void)205*7688df22SAndroid Build Coastguard Worker static void amdgpu_cs_uvd_create(void)
206*7688df22SAndroid Build Coastguard Worker {
207*7688df22SAndroid Build Coastguard Worker 	struct amdgpu_bo_alloc_request req = {0};
208*7688df22SAndroid Build Coastguard Worker 	amdgpu_bo_handle buf_handle;
209*7688df22SAndroid Build Coastguard Worker 	uint64_t va = 0;
210*7688df22SAndroid Build Coastguard Worker 	amdgpu_va_handle va_handle;
211*7688df22SAndroid Build Coastguard Worker 	void *msg;
212*7688df22SAndroid Build Coastguard Worker 	int i, r;
213*7688df22SAndroid Build Coastguard Worker 
214*7688df22SAndroid Build Coastguard Worker 	req.alloc_size = 4*1024;
215*7688df22SAndroid Build Coastguard Worker 	req.preferred_heap = AMDGPU_GEM_DOMAIN_GTT;
216*7688df22SAndroid Build Coastguard Worker 
217*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_bo_alloc(device_handle, &req, &buf_handle);
218*7688df22SAndroid Build Coastguard Worker 	CU_ASSERT_EQUAL(r, 0);
219*7688df22SAndroid Build Coastguard Worker 
220*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_va_range_alloc(device_handle,
221*7688df22SAndroid Build Coastguard Worker 				  amdgpu_gpu_va_range_general,
222*7688df22SAndroid Build Coastguard Worker 				  4096, 1, 0, &va,
223*7688df22SAndroid Build Coastguard Worker 				  &va_handle, 0);
224*7688df22SAndroid Build Coastguard Worker 	CU_ASSERT_EQUAL(r, 0);
225*7688df22SAndroid Build Coastguard Worker 
226*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_bo_va_op(buf_handle, 0, 4096, va, 0, AMDGPU_VA_OP_MAP);
227*7688df22SAndroid Build Coastguard Worker 	CU_ASSERT_EQUAL(r, 0);
228*7688df22SAndroid Build Coastguard Worker 
229*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_bo_cpu_map(buf_handle, &msg);
230*7688df22SAndroid Build Coastguard Worker 	CU_ASSERT_EQUAL(r, 0);
231*7688df22SAndroid Build Coastguard Worker 
232*7688df22SAndroid Build Coastguard Worker 	memcpy(msg, uvd_create_msg, sizeof(uvd_create_msg));
233*7688df22SAndroid Build Coastguard Worker 
234*7688df22SAndroid Build Coastguard Worker 	if (family_id >= AMDGPU_FAMILY_VI) {
235*7688df22SAndroid Build Coastguard Worker 		((uint8_t*)msg)[0x10] = 7;
236*7688df22SAndroid Build Coastguard Worker 		/* chip beyond polaris 10/11 */
237*7688df22SAndroid Build Coastguard Worker 		if ((family_id == AMDGPU_FAMILY_AI) ||
238*7688df22SAndroid Build Coastguard Worker 		    (chip_id == chip_rev+0x50 || chip_id == chip_rev+0x5A ||
239*7688df22SAndroid Build Coastguard Worker 		     chip_id == chip_rev+0x64)) {
240*7688df22SAndroid Build Coastguard Worker 			/* dpb size */
241*7688df22SAndroid Build Coastguard Worker 			((uint8_t*)msg)[0x28] = 0x00;
242*7688df22SAndroid Build Coastguard Worker 			((uint8_t*)msg)[0x29] = 0x94;
243*7688df22SAndroid Build Coastguard Worker 			((uint8_t*)msg)[0x2A] = 0x6B;
244*7688df22SAndroid Build Coastguard Worker 			((uint8_t*)msg)[0x2B] = 0x00;
245*7688df22SAndroid Build Coastguard Worker 		}
246*7688df22SAndroid Build Coastguard Worker 	}
247*7688df22SAndroid Build Coastguard Worker 
248*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_bo_cpu_unmap(buf_handle);
249*7688df22SAndroid Build Coastguard Worker 	CU_ASSERT_EQUAL(r, 0);
250*7688df22SAndroid Build Coastguard Worker 
251*7688df22SAndroid Build Coastguard Worker 	num_resources = 0;
252*7688df22SAndroid Build Coastguard Worker 	resources[num_resources++] = buf_handle;
253*7688df22SAndroid Build Coastguard Worker 	resources[num_resources++] = ib_handle;
254*7688df22SAndroid Build Coastguard Worker 
255*7688df22SAndroid Build Coastguard Worker 	i = 0;
256*7688df22SAndroid Build Coastguard Worker 	uvd_cmd(va, 0x0, &i);
257*7688df22SAndroid Build Coastguard Worker 	for (; i % 16; ++i)
258*7688df22SAndroid Build Coastguard Worker 		ib_cpu[i] = 0x80000000;
259*7688df22SAndroid Build Coastguard Worker 
260*7688df22SAndroid Build Coastguard Worker 	r = submit(i, AMDGPU_HW_IP_UVD);
261*7688df22SAndroid Build Coastguard Worker 	CU_ASSERT_EQUAL(r, 0);
262*7688df22SAndroid Build Coastguard Worker 
263*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_bo_va_op(buf_handle, 0, 4096, va, 0, AMDGPU_VA_OP_UNMAP);
264*7688df22SAndroid Build Coastguard Worker 	CU_ASSERT_EQUAL(r, 0);
265*7688df22SAndroid Build Coastguard Worker 
266*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_va_range_free(va_handle);
267*7688df22SAndroid Build Coastguard Worker 	CU_ASSERT_EQUAL(r, 0);
268*7688df22SAndroid Build Coastguard Worker 
269*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_bo_free(buf_handle);
270*7688df22SAndroid Build Coastguard Worker 	CU_ASSERT_EQUAL(r, 0);
271*7688df22SAndroid Build Coastguard Worker }
272*7688df22SAndroid Build Coastguard Worker 
amdgpu_cs_uvd_decode(void)273*7688df22SAndroid Build Coastguard Worker static void amdgpu_cs_uvd_decode(void)
274*7688df22SAndroid Build Coastguard Worker {
275*7688df22SAndroid Build Coastguard Worker 	const unsigned dpb_size = 15923584, dt_size = 737280;
276*7688df22SAndroid Build Coastguard Worker 	uint64_t msg_addr, fb_addr, bs_addr, dpb_addr, ctx_addr, dt_addr, it_addr;
277*7688df22SAndroid Build Coastguard Worker 	struct amdgpu_bo_alloc_request req = {0};
278*7688df22SAndroid Build Coastguard Worker 	amdgpu_bo_handle buf_handle;
279*7688df22SAndroid Build Coastguard Worker 	amdgpu_va_handle va_handle;
280*7688df22SAndroid Build Coastguard Worker 	uint64_t va = 0;
281*7688df22SAndroid Build Coastguard Worker 	uint64_t sum;
282*7688df22SAndroid Build Coastguard Worker 	uint8_t *ptr;
283*7688df22SAndroid Build Coastguard Worker 	int i, r;
284*7688df22SAndroid Build Coastguard Worker 
285*7688df22SAndroid Build Coastguard Worker 	req.alloc_size = 4*1024; /* msg */
286*7688df22SAndroid Build Coastguard Worker 	req.alloc_size += 4*1024; /* fb */
287*7688df22SAndroid Build Coastguard Worker 	if (family_id >= AMDGPU_FAMILY_VI)
288*7688df22SAndroid Build Coastguard Worker 		req.alloc_size += 4096; /*it_scaling_table*/
289*7688df22SAndroid Build Coastguard Worker 	req.alloc_size += ALIGN(sizeof(uvd_bitstream), 4*1024);
290*7688df22SAndroid Build Coastguard Worker 	req.alloc_size += ALIGN(dpb_size, 4*1024);
291*7688df22SAndroid Build Coastguard Worker 	req.alloc_size += ALIGN(dt_size, 4*1024);
292*7688df22SAndroid Build Coastguard Worker 
293*7688df22SAndroid Build Coastguard Worker 	req.preferred_heap = AMDGPU_GEM_DOMAIN_GTT;
294*7688df22SAndroid Build Coastguard Worker 
295*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_bo_alloc(device_handle, &req, &buf_handle);
296*7688df22SAndroid Build Coastguard Worker 	CU_ASSERT_EQUAL(r, 0);
297*7688df22SAndroid Build Coastguard Worker 
298*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_va_range_alloc(device_handle,
299*7688df22SAndroid Build Coastguard Worker 				  amdgpu_gpu_va_range_general,
300*7688df22SAndroid Build Coastguard Worker 				  req.alloc_size, 1, 0, &va,
301*7688df22SAndroid Build Coastguard Worker 				  &va_handle, 0);
302*7688df22SAndroid Build Coastguard Worker 	CU_ASSERT_EQUAL(r, 0);
303*7688df22SAndroid Build Coastguard Worker 
304*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_bo_va_op(buf_handle, 0, req.alloc_size, va, 0,
305*7688df22SAndroid Build Coastguard Worker 			    AMDGPU_VA_OP_MAP);
306*7688df22SAndroid Build Coastguard Worker 	CU_ASSERT_EQUAL(r, 0);
307*7688df22SAndroid Build Coastguard Worker 
308*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_bo_cpu_map(buf_handle, (void **)&ptr);
309*7688df22SAndroid Build Coastguard Worker 	CU_ASSERT_EQUAL(r, 0);
310*7688df22SAndroid Build Coastguard Worker 
311*7688df22SAndroid Build Coastguard Worker 	memcpy(ptr, uvd_decode_msg, sizeof(uvd_decode_msg));
312*7688df22SAndroid Build Coastguard Worker 	memcpy(ptr + sizeof(uvd_decode_msg), avc_decode_msg, sizeof(avc_decode_msg));
313*7688df22SAndroid Build Coastguard Worker 
314*7688df22SAndroid Build Coastguard Worker 	if (family_id >= AMDGPU_FAMILY_VI) {
315*7688df22SAndroid Build Coastguard Worker 		ptr[0x10] = 7;
316*7688df22SAndroid Build Coastguard Worker 		ptr[0x98] = 0x00;
317*7688df22SAndroid Build Coastguard Worker 		ptr[0x99] = 0x02;
318*7688df22SAndroid Build Coastguard Worker 		/* chip beyond polaris10/11 */
319*7688df22SAndroid Build Coastguard Worker 		if ((family_id == AMDGPU_FAMILY_AI) ||
320*7688df22SAndroid Build Coastguard Worker 		    (chip_id == chip_rev+0x50 || chip_id == chip_rev+0x5A ||
321*7688df22SAndroid Build Coastguard Worker 		     chip_id == chip_rev+0x64)) {
322*7688df22SAndroid Build Coastguard Worker 			/* dpb size */
323*7688df22SAndroid Build Coastguard Worker 			ptr[0x24] = 0x00;
324*7688df22SAndroid Build Coastguard Worker 			ptr[0x25] = 0x94;
325*7688df22SAndroid Build Coastguard Worker 			ptr[0x26] = 0x6B;
326*7688df22SAndroid Build Coastguard Worker 			ptr[0x27] = 0x00;
327*7688df22SAndroid Build Coastguard Worker 			/*ctx size */
328*7688df22SAndroid Build Coastguard Worker 			ptr[0x2C] = 0x00;
329*7688df22SAndroid Build Coastguard Worker 			ptr[0x2D] = 0xAF;
330*7688df22SAndroid Build Coastguard Worker 			ptr[0x2E] = 0x50;
331*7688df22SAndroid Build Coastguard Worker 			ptr[0x2F] = 0x00;
332*7688df22SAndroid Build Coastguard Worker 		}
333*7688df22SAndroid Build Coastguard Worker 	}
334*7688df22SAndroid Build Coastguard Worker 
335*7688df22SAndroid Build Coastguard Worker 	ptr += 4*1024;
336*7688df22SAndroid Build Coastguard Worker 	memset(ptr, 0, 4*1024);
337*7688df22SAndroid Build Coastguard Worker 	if (family_id >= AMDGPU_FAMILY_VI) {
338*7688df22SAndroid Build Coastguard Worker 		ptr += 4*1024;
339*7688df22SAndroid Build Coastguard Worker 		memcpy(ptr, uvd_it_scaling_table, sizeof(uvd_it_scaling_table));
340*7688df22SAndroid Build Coastguard Worker 	}
341*7688df22SAndroid Build Coastguard Worker 
342*7688df22SAndroid Build Coastguard Worker 	ptr += 4*1024;
343*7688df22SAndroid Build Coastguard Worker 	memcpy(ptr, uvd_bitstream, sizeof(uvd_bitstream));
344*7688df22SAndroid Build Coastguard Worker 
345*7688df22SAndroid Build Coastguard Worker 	ptr += ALIGN(sizeof(uvd_bitstream), 4*1024);
346*7688df22SAndroid Build Coastguard Worker 	memset(ptr, 0, dpb_size);
347*7688df22SAndroid Build Coastguard Worker 
348*7688df22SAndroid Build Coastguard Worker 	ptr += ALIGN(dpb_size, 4*1024);
349*7688df22SAndroid Build Coastguard Worker 	memset(ptr, 0, dt_size);
350*7688df22SAndroid Build Coastguard Worker 
351*7688df22SAndroid Build Coastguard Worker 	num_resources = 0;
352*7688df22SAndroid Build Coastguard Worker 	resources[num_resources++] = buf_handle;
353*7688df22SAndroid Build Coastguard Worker 	resources[num_resources++] = ib_handle;
354*7688df22SAndroid Build Coastguard Worker 
355*7688df22SAndroid Build Coastguard Worker 	msg_addr = va;
356*7688df22SAndroid Build Coastguard Worker 	fb_addr = msg_addr + 4*1024;
357*7688df22SAndroid Build Coastguard Worker 	if (family_id >= AMDGPU_FAMILY_VI) {
358*7688df22SAndroid Build Coastguard Worker 		it_addr = fb_addr + 4*1024;
359*7688df22SAndroid Build Coastguard Worker 		bs_addr = it_addr + 4*1024;
360*7688df22SAndroid Build Coastguard Worker 	} else
361*7688df22SAndroid Build Coastguard Worker 		bs_addr = fb_addr + 4*1024;
362*7688df22SAndroid Build Coastguard Worker 	dpb_addr = ALIGN(bs_addr + sizeof(uvd_bitstream), 4*1024);
363*7688df22SAndroid Build Coastguard Worker 
364*7688df22SAndroid Build Coastguard Worker 	ctx_addr = 0;
365*7688df22SAndroid Build Coastguard Worker 	if (family_id >= AMDGPU_FAMILY_VI) {
366*7688df22SAndroid Build Coastguard Worker 		if ((family_id == AMDGPU_FAMILY_AI) ||
367*7688df22SAndroid Build Coastguard Worker 		    (chip_id == chip_rev+0x50 || chip_id == chip_rev+0x5A ||
368*7688df22SAndroid Build Coastguard Worker 		     chip_id == chip_rev+0x64)) {
369*7688df22SAndroid Build Coastguard Worker 			ctx_addr = ALIGN(dpb_addr + 0x006B9400, 4*1024);
370*7688df22SAndroid Build Coastguard Worker 		}
371*7688df22SAndroid Build Coastguard Worker 	}
372*7688df22SAndroid Build Coastguard Worker 
373*7688df22SAndroid Build Coastguard Worker 	dt_addr = ALIGN(dpb_addr + dpb_size, 4*1024);
374*7688df22SAndroid Build Coastguard Worker 
375*7688df22SAndroid Build Coastguard Worker 	i = 0;
376*7688df22SAndroid Build Coastguard Worker 	uvd_cmd(msg_addr, 0x0, &i);
377*7688df22SAndroid Build Coastguard Worker 	uvd_cmd(dpb_addr, 0x1, &i);
378*7688df22SAndroid Build Coastguard Worker 	uvd_cmd(dt_addr, 0x2, &i);
379*7688df22SAndroid Build Coastguard Worker 	uvd_cmd(fb_addr, 0x3, &i);
380*7688df22SAndroid Build Coastguard Worker 	uvd_cmd(bs_addr, 0x100, &i);
381*7688df22SAndroid Build Coastguard Worker 
382*7688df22SAndroid Build Coastguard Worker 	if (family_id >= AMDGPU_FAMILY_VI) {
383*7688df22SAndroid Build Coastguard Worker 		uvd_cmd(it_addr, 0x204, &i);
384*7688df22SAndroid Build Coastguard Worker 		if ((family_id == AMDGPU_FAMILY_AI) ||
385*7688df22SAndroid Build Coastguard Worker 		    (chip_id == chip_rev+0x50 || chip_id == chip_rev+0x5A ||
386*7688df22SAndroid Build Coastguard Worker 		     chip_id == chip_rev+0x64))
387*7688df22SAndroid Build Coastguard Worker 			uvd_cmd(ctx_addr, 0x206, &i);
388*7688df22SAndroid Build Coastguard Worker 	}
389*7688df22SAndroid Build Coastguard Worker 
390*7688df22SAndroid Build Coastguard Worker 	ib_cpu[i++] = (family_id < AMDGPU_FAMILY_AI) ? 0x3BC6 : 0x81C6;
391*7688df22SAndroid Build Coastguard Worker 	ib_cpu[i++] = 0x1;
392*7688df22SAndroid Build Coastguard Worker 	for (; i % 16; ++i)
393*7688df22SAndroid Build Coastguard Worker 		ib_cpu[i] = 0x80000000;
394*7688df22SAndroid Build Coastguard Worker 
395*7688df22SAndroid Build Coastguard Worker 	r = submit(i, AMDGPU_HW_IP_UVD);
396*7688df22SAndroid Build Coastguard Worker 	CU_ASSERT_EQUAL(r, 0);
397*7688df22SAndroid Build Coastguard Worker 
398*7688df22SAndroid Build Coastguard Worker 	/* TODO: use a real CRC32 */
399*7688df22SAndroid Build Coastguard Worker 	for (i = 0, sum = 0; i < dt_size; ++i)
400*7688df22SAndroid Build Coastguard Worker 		sum += ptr[i];
401*7688df22SAndroid Build Coastguard Worker 	CU_ASSERT_EQUAL(sum, SUM_DECODE);
402*7688df22SAndroid Build Coastguard Worker 
403*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_bo_cpu_unmap(buf_handle);
404*7688df22SAndroid Build Coastguard Worker 	CU_ASSERT_EQUAL(r, 0);
405*7688df22SAndroid Build Coastguard Worker 
406*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_bo_va_op(buf_handle, 0, req.alloc_size, va, 0, AMDGPU_VA_OP_UNMAP);
407*7688df22SAndroid Build Coastguard Worker 	CU_ASSERT_EQUAL(r, 0);
408*7688df22SAndroid Build Coastguard Worker 
409*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_va_range_free(va_handle);
410*7688df22SAndroid Build Coastguard Worker 	CU_ASSERT_EQUAL(r, 0);
411*7688df22SAndroid Build Coastguard Worker 
412*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_bo_free(buf_handle);
413*7688df22SAndroid Build Coastguard Worker 	CU_ASSERT_EQUAL(r, 0);
414*7688df22SAndroid Build Coastguard Worker }
415*7688df22SAndroid Build Coastguard Worker 
amdgpu_cs_uvd_destroy(void)416*7688df22SAndroid Build Coastguard Worker static void amdgpu_cs_uvd_destroy(void)
417*7688df22SAndroid Build Coastguard Worker {
418*7688df22SAndroid Build Coastguard Worker 	struct amdgpu_bo_alloc_request req = {0};
419*7688df22SAndroid Build Coastguard Worker 	amdgpu_bo_handle buf_handle;
420*7688df22SAndroid Build Coastguard Worker 	amdgpu_va_handle va_handle;
421*7688df22SAndroid Build Coastguard Worker 	uint64_t va = 0;
422*7688df22SAndroid Build Coastguard Worker 	void *msg;
423*7688df22SAndroid Build Coastguard Worker 	int i, r;
424*7688df22SAndroid Build Coastguard Worker 
425*7688df22SAndroid Build Coastguard Worker 	req.alloc_size = 4*1024;
426*7688df22SAndroid Build Coastguard Worker 	req.preferred_heap = AMDGPU_GEM_DOMAIN_GTT;
427*7688df22SAndroid Build Coastguard Worker 
428*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_bo_alloc(device_handle, &req, &buf_handle);
429*7688df22SAndroid Build Coastguard Worker 	CU_ASSERT_EQUAL(r, 0);
430*7688df22SAndroid Build Coastguard Worker 
431*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_va_range_alloc(device_handle,
432*7688df22SAndroid Build Coastguard Worker 				  amdgpu_gpu_va_range_general,
433*7688df22SAndroid Build Coastguard Worker 				  req.alloc_size, 1, 0, &va,
434*7688df22SAndroid Build Coastguard Worker 				  &va_handle, 0);
435*7688df22SAndroid Build Coastguard Worker 	CU_ASSERT_EQUAL(r, 0);
436*7688df22SAndroid Build Coastguard Worker 
437*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_bo_va_op(buf_handle, 0, req.alloc_size, va, 0,
438*7688df22SAndroid Build Coastguard Worker 			    AMDGPU_VA_OP_MAP);
439*7688df22SAndroid Build Coastguard Worker 	CU_ASSERT_EQUAL(r, 0);
440*7688df22SAndroid Build Coastguard Worker 
441*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_bo_cpu_map(buf_handle, &msg);
442*7688df22SAndroid Build Coastguard Worker 	CU_ASSERT_EQUAL(r, 0);
443*7688df22SAndroid Build Coastguard Worker 
444*7688df22SAndroid Build Coastguard Worker 	memcpy(msg, uvd_destroy_msg, sizeof(uvd_destroy_msg));
445*7688df22SAndroid Build Coastguard Worker 	if (family_id >= AMDGPU_FAMILY_VI)
446*7688df22SAndroid Build Coastguard Worker 		((uint8_t*)msg)[0x10] = 7;
447*7688df22SAndroid Build Coastguard Worker 
448*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_bo_cpu_unmap(buf_handle);
449*7688df22SAndroid Build Coastguard Worker 	CU_ASSERT_EQUAL(r, 0);
450*7688df22SAndroid Build Coastguard Worker 
451*7688df22SAndroid Build Coastguard Worker 	num_resources = 0;
452*7688df22SAndroid Build Coastguard Worker 	resources[num_resources++] = buf_handle;
453*7688df22SAndroid Build Coastguard Worker 	resources[num_resources++] = ib_handle;
454*7688df22SAndroid Build Coastguard Worker 
455*7688df22SAndroid Build Coastguard Worker 	i = 0;
456*7688df22SAndroid Build Coastguard Worker 	uvd_cmd(va, 0x0, &i);
457*7688df22SAndroid Build Coastguard Worker 	for (; i % 16; ++i)
458*7688df22SAndroid Build Coastguard Worker 		ib_cpu[i] = 0x80000000;
459*7688df22SAndroid Build Coastguard Worker 
460*7688df22SAndroid Build Coastguard Worker 	r = submit(i, AMDGPU_HW_IP_UVD);
461*7688df22SAndroid Build Coastguard Worker 	CU_ASSERT_EQUAL(r, 0);
462*7688df22SAndroid Build Coastguard Worker 
463*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_bo_va_op(buf_handle, 0, req.alloc_size, va, 0, AMDGPU_VA_OP_UNMAP);
464*7688df22SAndroid Build Coastguard Worker 	CU_ASSERT_EQUAL(r, 0);
465*7688df22SAndroid Build Coastguard Worker 
466*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_va_range_free(va_handle);
467*7688df22SAndroid Build Coastguard Worker 	CU_ASSERT_EQUAL(r, 0);
468*7688df22SAndroid Build Coastguard Worker 
469*7688df22SAndroid Build Coastguard Worker 	r = amdgpu_bo_free(buf_handle);
470*7688df22SAndroid Build Coastguard Worker 	CU_ASSERT_EQUAL(r, 0);
471*7688df22SAndroid Build Coastguard Worker }
472