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