xref: /aosp_15_r20/external/igt-gpu-tools/tests/amdgpu/amd_basic.c (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker  * Copyright 2014 Advanced Micro Devices, Inc.
3*d83cc019SAndroid Build Coastguard Worker  *
4*d83cc019SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*d83cc019SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*d83cc019SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*d83cc019SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*d83cc019SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*d83cc019SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*d83cc019SAndroid Build Coastguard Worker  *
11*d83cc019SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice shall be included in
12*d83cc019SAndroid Build Coastguard Worker  * all copies or substantial portions of the Software.
13*d83cc019SAndroid Build Coastguard Worker  *
14*d83cc019SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15*d83cc019SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*d83cc019SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17*d83cc019SAndroid Build Coastguard Worker  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18*d83cc019SAndroid Build Coastguard Worker  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19*d83cc019SAndroid Build Coastguard Worker  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20*d83cc019SAndroid Build Coastguard Worker  * OTHER DEALINGS IN THE SOFTWARE.
21*d83cc019SAndroid Build Coastguard Worker  *
22*d83cc019SAndroid Build Coastguard Worker  * Based on libdrm/tests/amdgpu/basic_tests.c
23*d83cc019SAndroid Build Coastguard Worker  */
24*d83cc019SAndroid Build Coastguard Worker 
25*d83cc019SAndroid Build Coastguard Worker #include "config.h"
26*d83cc019SAndroid Build Coastguard Worker 
27*d83cc019SAndroid Build Coastguard Worker #include <stdio.h>
28*d83cc019SAndroid Build Coastguard Worker #include <stdlib.h>
29*d83cc019SAndroid Build Coastguard Worker #include <unistd.h>
30*d83cc019SAndroid Build Coastguard Worker #ifdef HAVE_ALLOCA_H
31*d83cc019SAndroid Build Coastguard Worker # include <alloca.h>
32*d83cc019SAndroid Build Coastguard Worker #endif
33*d83cc019SAndroid Build Coastguard Worker 
34*d83cc019SAndroid Build Coastguard Worker #include "drmtest.h"
35*d83cc019SAndroid Build Coastguard Worker 
36*d83cc019SAndroid Build Coastguard Worker #include <amdgpu.h>
37*d83cc019SAndroid Build Coastguard Worker #include <amdgpu_drm.h>
38*d83cc019SAndroid Build Coastguard Worker 
39*d83cc019SAndroid Build Coastguard Worker static amdgpu_device_handle device;
40*d83cc019SAndroid Build Coastguard Worker 
41*d83cc019SAndroid Build Coastguard Worker static void amdgpu_command_submission_write_linear_helper(unsigned ip_type);
42*d83cc019SAndroid Build Coastguard Worker static void amdgpu_command_submission_const_fill_helper(unsigned ip_type);
43*d83cc019SAndroid Build Coastguard Worker static void amdgpu_command_submission_copy_linear_helper(unsigned ip_type);
44*d83cc019SAndroid Build Coastguard Worker 
45*d83cc019SAndroid Build Coastguard Worker #define BUFFER_SIZE (8 * 1024)
46*d83cc019SAndroid Build Coastguard Worker #define SDMA_PKT_HEADER_op_offset 0
47*d83cc019SAndroid Build Coastguard Worker #define SDMA_PKT_HEADER_op_mask   0x000000FF
48*d83cc019SAndroid Build Coastguard Worker #define SDMA_PKT_HEADER_op_shift  0
49*d83cc019SAndroid Build Coastguard Worker #define SDMA_PKT_HEADER_OP(x) (((x) & SDMA_PKT_HEADER_op_mask) << SDMA_PKT_HEADER_op_shift)
50*d83cc019SAndroid Build Coastguard Worker #define SDMA_OPCODE_CONSTANT_FILL  11
51*d83cc019SAndroid Build Coastguard Worker #       define SDMA_CONSTANT_FILL_EXTRA_SIZE(x)           ((x) << 14)
52*d83cc019SAndroid Build Coastguard Worker 	/* 0 = byte fill
53*d83cc019SAndroid Build Coastguard Worker 	 * 2 = DW fill
54*d83cc019SAndroid Build Coastguard Worker 	 */
55*d83cc019SAndroid Build Coastguard Worker #define SDMA_PACKET(op, sub_op, e)	((((e) & 0xFFFF) << 16) |	\
56*d83cc019SAndroid Build Coastguard Worker 					(((sub_op) & 0xFF) << 8) |	\
57*d83cc019SAndroid Build Coastguard Worker 					(((op) & 0xFF) << 0))
58*d83cc019SAndroid Build Coastguard Worker #define	SDMA_OPCODE_WRITE				  2
59*d83cc019SAndroid Build Coastguard Worker #       define SDMA_WRITE_SUB_OPCODE_LINEAR               0
60*d83cc019SAndroid Build Coastguard Worker #       define SDMA_WRTIE_SUB_OPCODE_TILED                1
61*d83cc019SAndroid Build Coastguard Worker 
62*d83cc019SAndroid Build Coastguard Worker #define	SDMA_OPCODE_COPY				  1
63*d83cc019SAndroid Build Coastguard Worker #       define SDMA_COPY_SUB_OPCODE_LINEAR                0
64*d83cc019SAndroid Build Coastguard Worker 
65*d83cc019SAndroid Build Coastguard Worker #define GFX_COMPUTE_NOP  0xffff1000
66*d83cc019SAndroid Build Coastguard Worker #define SDMA_NOP  0x0
67*d83cc019SAndroid Build Coastguard Worker 
68*d83cc019SAndroid Build Coastguard Worker /* PM4 */
69*d83cc019SAndroid Build Coastguard Worker #define	PACKET_TYPE0	0
70*d83cc019SAndroid Build Coastguard Worker #define	PACKET_TYPE1	1
71*d83cc019SAndroid Build Coastguard Worker #define	PACKET_TYPE2	2
72*d83cc019SAndroid Build Coastguard Worker #define	PACKET_TYPE3	3
73*d83cc019SAndroid Build Coastguard Worker 
74*d83cc019SAndroid Build Coastguard Worker #define CP_PACKET_GET_TYPE(h) (((h) >> 30) & 3)
75*d83cc019SAndroid Build Coastguard Worker #define CP_PACKET_GET_COUNT(h) (((h) >> 16) & 0x3FFF)
76*d83cc019SAndroid Build Coastguard Worker #define CP_PACKET0_GET_REG(h) ((h) & 0xFFFF)
77*d83cc019SAndroid Build Coastguard Worker #define CP_PACKET3_GET_OPCODE(h) (((h) >> 8) & 0xFF)
78*d83cc019SAndroid Build Coastguard Worker #define PACKET0(reg, n)	((PACKET_TYPE0 << 30) |				\
79*d83cc019SAndroid Build Coastguard Worker 			 ((reg) & 0xFFFF) |			\
80*d83cc019SAndroid Build Coastguard Worker 			 ((n) & 0x3FFF) << 16)
81*d83cc019SAndroid Build Coastguard Worker #define CP_PACKET2			0x80000000
82*d83cc019SAndroid Build Coastguard Worker #define		PACKET2_PAD_SHIFT		0
83*d83cc019SAndroid Build Coastguard Worker #define		PACKET2_PAD_MASK		(0x3fffffff << 0)
84*d83cc019SAndroid Build Coastguard Worker 
85*d83cc019SAndroid Build Coastguard Worker #define PACKET2(v)	(CP_PACKET2 | REG_SET(PACKET2_PAD, (v)))
86*d83cc019SAndroid Build Coastguard Worker 
87*d83cc019SAndroid Build Coastguard Worker #define PACKET3(op, n)	((PACKET_TYPE3 << 30) |				\
88*d83cc019SAndroid Build Coastguard Worker 			 (((op) & 0xFF) << 8) |				\
89*d83cc019SAndroid Build Coastguard Worker 			 ((n) & 0x3FFF) << 16)
90*d83cc019SAndroid Build Coastguard Worker 
91*d83cc019SAndroid Build Coastguard Worker /* Packet 3 types */
92*d83cc019SAndroid Build Coastguard Worker #define	PACKET3_NOP					0x10
93*d83cc019SAndroid Build Coastguard Worker 
94*d83cc019SAndroid Build Coastguard Worker #define	PACKET3_WRITE_DATA				0x37
95*d83cc019SAndroid Build Coastguard Worker #define		WRITE_DATA_DST_SEL(x)                   ((x) << 8)
96*d83cc019SAndroid Build Coastguard Worker 		/* 0 - register
97*d83cc019SAndroid Build Coastguard Worker 		 * 1 - memory (sync - via GRBM)
98*d83cc019SAndroid Build Coastguard Worker 		 * 2 - gl2
99*d83cc019SAndroid Build Coastguard Worker 		 * 3 - gds
100*d83cc019SAndroid Build Coastguard Worker 		 * 4 - reserved
101*d83cc019SAndroid Build Coastguard Worker 		 * 5 - memory (async - direct)
102*d83cc019SAndroid Build Coastguard Worker 		 */
103*d83cc019SAndroid Build Coastguard Worker #define		WR_ONE_ADDR                             (1 << 16)
104*d83cc019SAndroid Build Coastguard Worker #define		WR_CONFIRM                              (1 << 20)
105*d83cc019SAndroid Build Coastguard Worker #define		WRITE_DATA_CACHE_POLICY(x)              ((x) << 25)
106*d83cc019SAndroid Build Coastguard Worker 		/* 0 - LRU
107*d83cc019SAndroid Build Coastguard Worker 		 * 1 - Stream
108*d83cc019SAndroid Build Coastguard Worker 		 */
109*d83cc019SAndroid Build Coastguard Worker #define		WRITE_DATA_ENGINE_SEL(x)                ((x) << 30)
110*d83cc019SAndroid Build Coastguard Worker 		/* 0 - me
111*d83cc019SAndroid Build Coastguard Worker 		 * 1 - pfp
112*d83cc019SAndroid Build Coastguard Worker 		 * 2 - ce
113*d83cc019SAndroid Build Coastguard Worker 		 */
114*d83cc019SAndroid Build Coastguard Worker 
115*d83cc019SAndroid Build Coastguard Worker #define	PACKET3_DMA_DATA				0x50
116*d83cc019SAndroid Build Coastguard Worker /* 1. header
117*d83cc019SAndroid Build Coastguard Worker  * 2. CONTROL
118*d83cc019SAndroid Build Coastguard Worker  * 3. SRC_ADDR_LO or DATA [31:0]
119*d83cc019SAndroid Build Coastguard Worker  * 4. SRC_ADDR_HI [31:0]
120*d83cc019SAndroid Build Coastguard Worker  * 5. DST_ADDR_LO [31:0]
121*d83cc019SAndroid Build Coastguard Worker  * 6. DST_ADDR_HI [7:0]
122*d83cc019SAndroid Build Coastguard Worker  * 7. COMMAND [30:21] | BYTE_COUNT [20:0]
123*d83cc019SAndroid Build Coastguard Worker  */
124*d83cc019SAndroid Build Coastguard Worker /* CONTROL */
125*d83cc019SAndroid Build Coastguard Worker #              define PACKET3_DMA_DATA_ENGINE(x)     ((x) << 0)
126*d83cc019SAndroid Build Coastguard Worker 		/* 0 - ME
127*d83cc019SAndroid Build Coastguard Worker 		 * 1 - PFP
128*d83cc019SAndroid Build Coastguard Worker 		 */
129*d83cc019SAndroid Build Coastguard Worker #              define PACKET3_DMA_DATA_SRC_CACHE_POLICY(x) ((x) << 13)
130*d83cc019SAndroid Build Coastguard Worker 		/* 0 - LRU
131*d83cc019SAndroid Build Coastguard Worker 		 * 1 - Stream
132*d83cc019SAndroid Build Coastguard Worker 		 * 2 - Bypass
133*d83cc019SAndroid Build Coastguard Worker 		 */
134*d83cc019SAndroid Build Coastguard Worker #              define PACKET3_DMA_DATA_SRC_VOLATILE (1 << 15)
135*d83cc019SAndroid Build Coastguard Worker #              define PACKET3_DMA_DATA_DST_SEL(x)  ((x) << 20)
136*d83cc019SAndroid Build Coastguard Worker 		/* 0 - DST_ADDR using DAS
137*d83cc019SAndroid Build Coastguard Worker 		 * 1 - GDS
138*d83cc019SAndroid Build Coastguard Worker 		 * 3 - DST_ADDR using L2
139*d83cc019SAndroid Build Coastguard Worker 		 */
140*d83cc019SAndroid Build Coastguard Worker #              define PACKET3_DMA_DATA_DST_CACHE_POLICY(x) ((x) << 25)
141*d83cc019SAndroid Build Coastguard Worker 		/* 0 - LRU
142*d83cc019SAndroid Build Coastguard Worker 		 * 1 - Stream
143*d83cc019SAndroid Build Coastguard Worker 		 * 2 - Bypass
144*d83cc019SAndroid Build Coastguard Worker 		 */
145*d83cc019SAndroid Build Coastguard Worker #              define PACKET3_DMA_DATA_DST_VOLATILE (1 << 27)
146*d83cc019SAndroid Build Coastguard Worker #              define PACKET3_DMA_DATA_SRC_SEL(x)  ((x) << 29)
147*d83cc019SAndroid Build Coastguard Worker 		/* 0 - SRC_ADDR using SAS
148*d83cc019SAndroid Build Coastguard Worker 		 * 1 - GDS
149*d83cc019SAndroid Build Coastguard Worker 		 * 2 - DATA
150*d83cc019SAndroid Build Coastguard Worker 		 * 3 - SRC_ADDR using L2
151*d83cc019SAndroid Build Coastguard Worker 		 */
152*d83cc019SAndroid Build Coastguard Worker #              define PACKET3_DMA_DATA_CP_SYNC     (1 << 31)
153*d83cc019SAndroid Build Coastguard Worker /* COMMAND */
154*d83cc019SAndroid Build Coastguard Worker #              define PACKET3_DMA_DATA_DIS_WC      (1 << 21)
155*d83cc019SAndroid Build Coastguard Worker #              define PACKET3_DMA_DATA_CMD_SRC_SWAP(x) ((x) << 22)
156*d83cc019SAndroid Build Coastguard Worker 		/* 0 - none
157*d83cc019SAndroid Build Coastguard Worker 		 * 1 - 8 in 16
158*d83cc019SAndroid Build Coastguard Worker 		 * 2 - 8 in 32
159*d83cc019SAndroid Build Coastguard Worker 		 * 3 - 8 in 64
160*d83cc019SAndroid Build Coastguard Worker 		 */
161*d83cc019SAndroid Build Coastguard Worker #              define PACKET3_DMA_DATA_CMD_DST_SWAP(x) ((x) << 24)
162*d83cc019SAndroid Build Coastguard Worker 		/* 0 - none
163*d83cc019SAndroid Build Coastguard Worker 		 * 1 - 8 in 16
164*d83cc019SAndroid Build Coastguard Worker 		 * 2 - 8 in 32
165*d83cc019SAndroid Build Coastguard Worker 		 * 3 - 8 in 64
166*d83cc019SAndroid Build Coastguard Worker 		 */
167*d83cc019SAndroid Build Coastguard Worker #              define PACKET3_DMA_DATA_CMD_SAS     (1 << 26)
168*d83cc019SAndroid Build Coastguard Worker 		/* 0 - memory
169*d83cc019SAndroid Build Coastguard Worker 		 * 1 - register
170*d83cc019SAndroid Build Coastguard Worker 		 */
171*d83cc019SAndroid Build Coastguard Worker #              define PACKET3_DMA_DATA_CMD_DAS     (1 << 27)
172*d83cc019SAndroid Build Coastguard Worker 		/* 0 - memory
173*d83cc019SAndroid Build Coastguard Worker 		 * 1 - register
174*d83cc019SAndroid Build Coastguard Worker 		 */
175*d83cc019SAndroid Build Coastguard Worker #              define PACKET3_DMA_DATA_CMD_SAIC    (1 << 28)
176*d83cc019SAndroid Build Coastguard Worker #              define PACKET3_DMA_DATA_CMD_DAIC    (1 << 29)
177*d83cc019SAndroid Build Coastguard Worker #              define PACKET3_DMA_DATA_CMD_RAW_WAIT  (1 << 30)
178*d83cc019SAndroid Build Coastguard Worker 
amdgpu_query_info_test(void)179*d83cc019SAndroid Build Coastguard Worker static void amdgpu_query_info_test(void)
180*d83cc019SAndroid Build Coastguard Worker {
181*d83cc019SAndroid Build Coastguard Worker 	struct amdgpu_gpu_info gpu_info = {};
182*d83cc019SAndroid Build Coastguard Worker 	uint32_t version, feature;
183*d83cc019SAndroid Build Coastguard Worker 	int r;
184*d83cc019SAndroid Build Coastguard Worker 
185*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_query_gpu_info(device, &gpu_info);
186*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
187*d83cc019SAndroid Build Coastguard Worker 
188*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_query_firmware_version(device, AMDGPU_INFO_FW_VCE, 0,
189*d83cc019SAndroid Build Coastguard Worker 					  0, &version, &feature);
190*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
191*d83cc019SAndroid Build Coastguard Worker }
192*d83cc019SAndroid Build Coastguard Worker 
gpu_mem_alloc(amdgpu_device_handle device_handle,uint64_t size,uint64_t alignment,uint32_t type,uint64_t flags,uint64_t * vmc_addr,amdgpu_va_handle * va_handle)193*d83cc019SAndroid Build Coastguard Worker static amdgpu_bo_handle gpu_mem_alloc(amdgpu_device_handle device_handle,
194*d83cc019SAndroid Build Coastguard Worker 				      uint64_t size,
195*d83cc019SAndroid Build Coastguard Worker 				      uint64_t alignment,
196*d83cc019SAndroid Build Coastguard Worker 				      uint32_t type,
197*d83cc019SAndroid Build Coastguard Worker 				      uint64_t flags,
198*d83cc019SAndroid Build Coastguard Worker 				      uint64_t *vmc_addr,
199*d83cc019SAndroid Build Coastguard Worker 				      amdgpu_va_handle *va_handle)
200*d83cc019SAndroid Build Coastguard Worker {
201*d83cc019SAndroid Build Coastguard Worker 	struct amdgpu_bo_alloc_request req = {
202*d83cc019SAndroid Build Coastguard Worker 		.alloc_size = size,
203*d83cc019SAndroid Build Coastguard Worker 		.phys_alignment = alignment,
204*d83cc019SAndroid Build Coastguard Worker 		.preferred_heap = type,
205*d83cc019SAndroid Build Coastguard Worker 		.flags = flags,
206*d83cc019SAndroid Build Coastguard Worker 	};
207*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_handle buf_handle;
208*d83cc019SAndroid Build Coastguard Worker 	int r;
209*d83cc019SAndroid Build Coastguard Worker 
210*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_bo_alloc(device_handle, &req, &buf_handle);
211*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
212*d83cc019SAndroid Build Coastguard Worker 
213*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_va_range_alloc(device_handle,
214*d83cc019SAndroid Build Coastguard Worker 				  amdgpu_gpu_va_range_general,
215*d83cc019SAndroid Build Coastguard Worker 				  size, alignment, 0, vmc_addr,
216*d83cc019SAndroid Build Coastguard Worker 				  va_handle, 0);
217*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
218*d83cc019SAndroid Build Coastguard Worker 
219*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_bo_va_op(buf_handle, 0, size, *vmc_addr, 0, AMDGPU_VA_OP_MAP);
220*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
221*d83cc019SAndroid Build Coastguard Worker 
222*d83cc019SAndroid Build Coastguard Worker 	return buf_handle;
223*d83cc019SAndroid Build Coastguard Worker }
224*d83cc019SAndroid Build Coastguard Worker 
gpu_mem_free(amdgpu_bo_handle bo,amdgpu_va_handle va_handle,uint64_t vmc_addr,uint64_t size)225*d83cc019SAndroid Build Coastguard Worker static void gpu_mem_free(amdgpu_bo_handle bo,
226*d83cc019SAndroid Build Coastguard Worker 			 amdgpu_va_handle va_handle,
227*d83cc019SAndroid Build Coastguard Worker 			 uint64_t vmc_addr,
228*d83cc019SAndroid Build Coastguard Worker 			 uint64_t size)
229*d83cc019SAndroid Build Coastguard Worker {
230*d83cc019SAndroid Build Coastguard Worker 	int r;
231*d83cc019SAndroid Build Coastguard Worker 
232*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_bo_va_op(bo, 0, size, vmc_addr, 0, AMDGPU_VA_OP_UNMAP);
233*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
234*d83cc019SAndroid Build Coastguard Worker 
235*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_va_range_free(va_handle);
236*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
237*d83cc019SAndroid Build Coastguard Worker 
238*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_bo_free(bo);
239*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
240*d83cc019SAndroid Build Coastguard Worker }
241*d83cc019SAndroid Build Coastguard Worker 
242*d83cc019SAndroid Build Coastguard Worker static int
amdgpu_bo_alloc_and_map(amdgpu_device_handle dev,unsigned size,unsigned alignment,unsigned heap,uint64_t flags,amdgpu_bo_handle * bo,void ** cpu,uint64_t * mc_address,amdgpu_va_handle * va_handle)243*d83cc019SAndroid Build Coastguard Worker amdgpu_bo_alloc_and_map(amdgpu_device_handle dev, unsigned size,
244*d83cc019SAndroid Build Coastguard Worker 			unsigned alignment, unsigned heap, uint64_t flags,
245*d83cc019SAndroid Build Coastguard Worker 			amdgpu_bo_handle *bo, void **cpu, uint64_t *mc_address,
246*d83cc019SAndroid Build Coastguard Worker 			amdgpu_va_handle *va_handle)
247*d83cc019SAndroid Build Coastguard Worker {
248*d83cc019SAndroid Build Coastguard Worker 	struct amdgpu_bo_alloc_request request = {
249*d83cc019SAndroid Build Coastguard Worker 		.alloc_size = size,
250*d83cc019SAndroid Build Coastguard Worker 		.phys_alignment = alignment,
251*d83cc019SAndroid Build Coastguard Worker 		.preferred_heap = heap,
252*d83cc019SAndroid Build Coastguard Worker 		.flags = flags,
253*d83cc019SAndroid Build Coastguard Worker 	};
254*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_handle buf_handle;
255*d83cc019SAndroid Build Coastguard Worker 	amdgpu_va_handle handle;
256*d83cc019SAndroid Build Coastguard Worker 	uint64_t vmc_addr;
257*d83cc019SAndroid Build Coastguard Worker 	int r;
258*d83cc019SAndroid Build Coastguard Worker 
259*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_bo_alloc(dev, &request, &buf_handle);
260*d83cc019SAndroid Build Coastguard Worker 	if (r)
261*d83cc019SAndroid Build Coastguard Worker 		return r;
262*d83cc019SAndroid Build Coastguard Worker 
263*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_va_range_alloc(dev,
264*d83cc019SAndroid Build Coastguard Worker 				  amdgpu_gpu_va_range_general,
265*d83cc019SAndroid Build Coastguard Worker 				  size, alignment, 0, &vmc_addr,
266*d83cc019SAndroid Build Coastguard Worker 				  &handle, 0);
267*d83cc019SAndroid Build Coastguard Worker 	if (r)
268*d83cc019SAndroid Build Coastguard Worker 		goto error_va_alloc;
269*d83cc019SAndroid Build Coastguard Worker 
270*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_bo_va_op(buf_handle, 0, size, vmc_addr, 0, AMDGPU_VA_OP_MAP);
271*d83cc019SAndroid Build Coastguard Worker 	if (r)
272*d83cc019SAndroid Build Coastguard Worker 		goto error_va_map;
273*d83cc019SAndroid Build Coastguard Worker 
274*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_bo_cpu_map(buf_handle, cpu);
275*d83cc019SAndroid Build Coastguard Worker 	if (r)
276*d83cc019SAndroid Build Coastguard Worker 		goto error_cpu_map;
277*d83cc019SAndroid Build Coastguard Worker 
278*d83cc019SAndroid Build Coastguard Worker 	*bo = buf_handle;
279*d83cc019SAndroid Build Coastguard Worker 	*mc_address = vmc_addr;
280*d83cc019SAndroid Build Coastguard Worker 	*va_handle = handle;
281*d83cc019SAndroid Build Coastguard Worker 
282*d83cc019SAndroid Build Coastguard Worker 	return 0;
283*d83cc019SAndroid Build Coastguard Worker 
284*d83cc019SAndroid Build Coastguard Worker error_cpu_map:
285*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_cpu_unmap(buf_handle);
286*d83cc019SAndroid Build Coastguard Worker 
287*d83cc019SAndroid Build Coastguard Worker error_va_map:
288*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_va_op(buf_handle, 0, size, vmc_addr, 0, AMDGPU_VA_OP_UNMAP);
289*d83cc019SAndroid Build Coastguard Worker 
290*d83cc019SAndroid Build Coastguard Worker error_va_alloc:
291*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_free(buf_handle);
292*d83cc019SAndroid Build Coastguard Worker 	return r;
293*d83cc019SAndroid Build Coastguard Worker }
294*d83cc019SAndroid Build Coastguard Worker 
295*d83cc019SAndroid Build Coastguard Worker static void
amdgpu_bo_unmap_and_free(amdgpu_bo_handle bo,amdgpu_va_handle va_handle,uint64_t mc_addr,uint64_t size)296*d83cc019SAndroid Build Coastguard Worker amdgpu_bo_unmap_and_free(amdgpu_bo_handle bo, amdgpu_va_handle va_handle,
297*d83cc019SAndroid Build Coastguard Worker 			 uint64_t mc_addr, uint64_t size)
298*d83cc019SAndroid Build Coastguard Worker {
299*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_cpu_unmap(bo);
300*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_va_op(bo, 0, size, mc_addr, 0, AMDGPU_VA_OP_UNMAP);
301*d83cc019SAndroid Build Coastguard Worker 	amdgpu_va_range_free(va_handle);
302*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_free(bo);
303*d83cc019SAndroid Build Coastguard Worker }
304*d83cc019SAndroid Build Coastguard Worker 
305*d83cc019SAndroid Build Coastguard Worker static int
amdgpu_get_bo_list(amdgpu_device_handle dev,amdgpu_bo_handle bo1,amdgpu_bo_handle bo2,amdgpu_bo_list_handle * list)306*d83cc019SAndroid Build Coastguard Worker amdgpu_get_bo_list(amdgpu_device_handle dev, amdgpu_bo_handle bo1,
307*d83cc019SAndroid Build Coastguard Worker 		   amdgpu_bo_handle bo2, amdgpu_bo_list_handle *list)
308*d83cc019SAndroid Build Coastguard Worker {
309*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_handle resources[] = {bo1, bo2};
310*d83cc019SAndroid Build Coastguard Worker 
311*d83cc019SAndroid Build Coastguard Worker 	return amdgpu_bo_list_create(dev, bo2 ? 2 : 1, resources, NULL, list);
312*d83cc019SAndroid Build Coastguard Worker }
313*d83cc019SAndroid Build Coastguard Worker 
amdgpu_memory_alloc(void)314*d83cc019SAndroid Build Coastguard Worker static void amdgpu_memory_alloc(void)
315*d83cc019SAndroid Build Coastguard Worker {
316*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_handle bo;
317*d83cc019SAndroid Build Coastguard Worker 	amdgpu_va_handle va_handle;
318*d83cc019SAndroid Build Coastguard Worker 	uint64_t bo_mc;
319*d83cc019SAndroid Build Coastguard Worker 
320*d83cc019SAndroid Build Coastguard Worker 	/* Test visible VRAM */
321*d83cc019SAndroid Build Coastguard Worker 	bo = gpu_mem_alloc(device,
322*d83cc019SAndroid Build Coastguard Worker 			   4096, 4096,
323*d83cc019SAndroid Build Coastguard Worker 			   AMDGPU_GEM_DOMAIN_VRAM,
324*d83cc019SAndroid Build Coastguard Worker 			   AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED,
325*d83cc019SAndroid Build Coastguard Worker 			   &bo_mc, &va_handle);
326*d83cc019SAndroid Build Coastguard Worker 
327*d83cc019SAndroid Build Coastguard Worker 	gpu_mem_free(bo, va_handle, bo_mc, 4096);
328*d83cc019SAndroid Build Coastguard Worker 
329*d83cc019SAndroid Build Coastguard Worker 	/* Test invisible VRAM */
330*d83cc019SAndroid Build Coastguard Worker 	bo = gpu_mem_alloc(device,
331*d83cc019SAndroid Build Coastguard Worker 			   4096, 4096,
332*d83cc019SAndroid Build Coastguard Worker 			   AMDGPU_GEM_DOMAIN_VRAM,
333*d83cc019SAndroid Build Coastguard Worker 			   AMDGPU_GEM_CREATE_NO_CPU_ACCESS,
334*d83cc019SAndroid Build Coastguard Worker 			   &bo_mc, &va_handle);
335*d83cc019SAndroid Build Coastguard Worker 
336*d83cc019SAndroid Build Coastguard Worker 	gpu_mem_free(bo, va_handle, bo_mc, 4096);
337*d83cc019SAndroid Build Coastguard Worker 
338*d83cc019SAndroid Build Coastguard Worker 	/* Test GART Cacheable */
339*d83cc019SAndroid Build Coastguard Worker 	bo = gpu_mem_alloc(device,
340*d83cc019SAndroid Build Coastguard Worker 			   4096, 4096,
341*d83cc019SAndroid Build Coastguard Worker 			   AMDGPU_GEM_DOMAIN_GTT,
342*d83cc019SAndroid Build Coastguard Worker 			   0, &bo_mc, &va_handle);
343*d83cc019SAndroid Build Coastguard Worker 
344*d83cc019SAndroid Build Coastguard Worker 	gpu_mem_free(bo, va_handle, bo_mc, 4096);
345*d83cc019SAndroid Build Coastguard Worker 
346*d83cc019SAndroid Build Coastguard Worker 	/* Test GART USWC */
347*d83cc019SAndroid Build Coastguard Worker 	bo = gpu_mem_alloc(device,
348*d83cc019SAndroid Build Coastguard Worker 			   4096, 4096,
349*d83cc019SAndroid Build Coastguard Worker 			   AMDGPU_GEM_DOMAIN_GTT,
350*d83cc019SAndroid Build Coastguard Worker 			   AMDGPU_GEM_CREATE_CPU_GTT_USWC,
351*d83cc019SAndroid Build Coastguard Worker 			   &bo_mc, &va_handle);
352*d83cc019SAndroid Build Coastguard Worker 
353*d83cc019SAndroid Build Coastguard Worker 	gpu_mem_free(bo, va_handle, bo_mc, 4096);
354*d83cc019SAndroid Build Coastguard Worker }
355*d83cc019SAndroid Build Coastguard Worker 
amdgpu_command_submission_gfx_separate_ibs(void)356*d83cc019SAndroid Build Coastguard Worker static void amdgpu_command_submission_gfx_separate_ibs(void)
357*d83cc019SAndroid Build Coastguard Worker {
358*d83cc019SAndroid Build Coastguard Worker 	amdgpu_context_handle context_handle;
359*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_handle ib_result_handle, ib_result_ce_handle;
360*d83cc019SAndroid Build Coastguard Worker 	void *ib_result_cpu, *ib_result_ce_cpu;
361*d83cc019SAndroid Build Coastguard Worker 	uint64_t ib_result_mc_address, ib_result_ce_mc_address;
362*d83cc019SAndroid Build Coastguard Worker 	struct amdgpu_cs_request ibs_request = {0};
363*d83cc019SAndroid Build Coastguard Worker 	struct amdgpu_cs_ib_info ib_info[2];
364*d83cc019SAndroid Build Coastguard Worker 	struct amdgpu_cs_fence fence_status = {0};
365*d83cc019SAndroid Build Coastguard Worker 	uint32_t *ptr;
366*d83cc019SAndroid Build Coastguard Worker 	uint32_t expired;
367*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_list_handle bo_list;
368*d83cc019SAndroid Build Coastguard Worker 	amdgpu_va_handle va_handle, va_handle_ce;
369*d83cc019SAndroid Build Coastguard Worker 	int r;
370*d83cc019SAndroid Build Coastguard Worker 
371*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_ctx_create(device, &context_handle);
372*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
373*d83cc019SAndroid Build Coastguard Worker 
374*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_bo_alloc_and_map(device, 4096, 4096,
375*d83cc019SAndroid Build Coastguard Worker 				    AMDGPU_GEM_DOMAIN_GTT, 0,
376*d83cc019SAndroid Build Coastguard Worker 				    &ib_result_handle, &ib_result_cpu,
377*d83cc019SAndroid Build Coastguard Worker 				    &ib_result_mc_address, &va_handle);
378*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
379*d83cc019SAndroid Build Coastguard Worker 
380*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_bo_alloc_and_map(device, 4096, 4096,
381*d83cc019SAndroid Build Coastguard Worker 				    AMDGPU_GEM_DOMAIN_GTT, 0,
382*d83cc019SAndroid Build Coastguard Worker 				    &ib_result_ce_handle, &ib_result_ce_cpu,
383*d83cc019SAndroid Build Coastguard Worker 				    &ib_result_ce_mc_address, &va_handle_ce);
384*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
385*d83cc019SAndroid Build Coastguard Worker 
386*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_get_bo_list(device, ib_result_handle,
387*d83cc019SAndroid Build Coastguard Worker 			       ib_result_ce_handle, &bo_list);
388*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
389*d83cc019SAndroid Build Coastguard Worker 
390*d83cc019SAndroid Build Coastguard Worker 	memset(ib_info, 0, 2 * sizeof(struct amdgpu_cs_ib_info));
391*d83cc019SAndroid Build Coastguard Worker 
392*d83cc019SAndroid Build Coastguard Worker 	/* IT_SET_CE_DE_COUNTERS */
393*d83cc019SAndroid Build Coastguard Worker 	ptr = ib_result_ce_cpu;
394*d83cc019SAndroid Build Coastguard Worker 	ptr[0] = 0xc0008900;
395*d83cc019SAndroid Build Coastguard Worker 	ptr[1] = 0;
396*d83cc019SAndroid Build Coastguard Worker 	ptr[2] = 0xc0008400;
397*d83cc019SAndroid Build Coastguard Worker 	ptr[3] = 1;
398*d83cc019SAndroid Build Coastguard Worker 	ib_info[0].ib_mc_address = ib_result_ce_mc_address;
399*d83cc019SAndroid Build Coastguard Worker 	ib_info[0].size = 4;
400*d83cc019SAndroid Build Coastguard Worker 	ib_info[0].flags = AMDGPU_IB_FLAG_CE;
401*d83cc019SAndroid Build Coastguard Worker 
402*d83cc019SAndroid Build Coastguard Worker 	/* IT_WAIT_ON_CE_COUNTER */
403*d83cc019SAndroid Build Coastguard Worker 	ptr = ib_result_cpu;
404*d83cc019SAndroid Build Coastguard Worker 	ptr[0] = 0xc0008600;
405*d83cc019SAndroid Build Coastguard Worker 	ptr[1] = 0x00000001;
406*d83cc019SAndroid Build Coastguard Worker 	ib_info[1].ib_mc_address = ib_result_mc_address;
407*d83cc019SAndroid Build Coastguard Worker 	ib_info[1].size = 2;
408*d83cc019SAndroid Build Coastguard Worker 
409*d83cc019SAndroid Build Coastguard Worker 	ibs_request.ip_type = AMDGPU_HW_IP_GFX;
410*d83cc019SAndroid Build Coastguard Worker 	ibs_request.number_of_ibs = 2;
411*d83cc019SAndroid Build Coastguard Worker 	ibs_request.ibs = ib_info;
412*d83cc019SAndroid Build Coastguard Worker 	ibs_request.resources = bo_list;
413*d83cc019SAndroid Build Coastguard Worker 	ibs_request.fence_info.handle = NULL;
414*d83cc019SAndroid Build Coastguard Worker 
415*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_submit(context_handle, 0,&ibs_request, 1);
416*d83cc019SAndroid Build Coastguard Worker 
417*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
418*d83cc019SAndroid Build Coastguard Worker 
419*d83cc019SAndroid Build Coastguard Worker 	fence_status.context = context_handle;
420*d83cc019SAndroid Build Coastguard Worker 	fence_status.ip_type = AMDGPU_HW_IP_GFX;
421*d83cc019SAndroid Build Coastguard Worker 	fence_status.ip_instance = 0;
422*d83cc019SAndroid Build Coastguard Worker 	fence_status.fence = ibs_request.seq_no;
423*d83cc019SAndroid Build Coastguard Worker 
424*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_query_fence_status(&fence_status,
425*d83cc019SAndroid Build Coastguard Worker 					 AMDGPU_TIMEOUT_INFINITE,
426*d83cc019SAndroid Build Coastguard Worker 					 0, &expired);
427*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
428*d83cc019SAndroid Build Coastguard Worker 
429*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_unmap_and_free(ib_result_handle, va_handle,
430*d83cc019SAndroid Build Coastguard Worker 				 ib_result_mc_address, 4096);
431*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_unmap_and_free(ib_result_ce_handle, va_handle_ce,
432*d83cc019SAndroid Build Coastguard Worker 				 ib_result_ce_mc_address, 4096);
433*d83cc019SAndroid Build Coastguard Worker 
434*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_bo_list_destroy(bo_list);
435*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
436*d83cc019SAndroid Build Coastguard Worker 
437*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_ctx_free(context_handle);
438*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
439*d83cc019SAndroid Build Coastguard Worker }
440*d83cc019SAndroid Build Coastguard Worker 
amdgpu_command_submission_gfx_shared_ib(void)441*d83cc019SAndroid Build Coastguard Worker static void amdgpu_command_submission_gfx_shared_ib(void)
442*d83cc019SAndroid Build Coastguard Worker {
443*d83cc019SAndroid Build Coastguard Worker 	amdgpu_context_handle context_handle;
444*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_handle ib_result_handle;
445*d83cc019SAndroid Build Coastguard Worker 	void *ib_result_cpu;
446*d83cc019SAndroid Build Coastguard Worker 	uint64_t ib_result_mc_address;
447*d83cc019SAndroid Build Coastguard Worker 	struct amdgpu_cs_request ibs_request = {0};
448*d83cc019SAndroid Build Coastguard Worker 	struct amdgpu_cs_ib_info ib_info[2];
449*d83cc019SAndroid Build Coastguard Worker 	struct amdgpu_cs_fence fence_status = {0};
450*d83cc019SAndroid Build Coastguard Worker 	uint32_t *ptr;
451*d83cc019SAndroid Build Coastguard Worker 	uint32_t expired;
452*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_list_handle bo_list;
453*d83cc019SAndroid Build Coastguard Worker 	amdgpu_va_handle va_handle;
454*d83cc019SAndroid Build Coastguard Worker 	int r;
455*d83cc019SAndroid Build Coastguard Worker 
456*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_ctx_create(device, &context_handle);
457*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
458*d83cc019SAndroid Build Coastguard Worker 
459*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_bo_alloc_and_map(device, 4096, 4096,
460*d83cc019SAndroid Build Coastguard Worker 				    AMDGPU_GEM_DOMAIN_GTT, 0,
461*d83cc019SAndroid Build Coastguard Worker 				    &ib_result_handle, &ib_result_cpu,
462*d83cc019SAndroid Build Coastguard Worker 				    &ib_result_mc_address, &va_handle);
463*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
464*d83cc019SAndroid Build Coastguard Worker 
465*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_get_bo_list(device, ib_result_handle, NULL,
466*d83cc019SAndroid Build Coastguard Worker 			       &bo_list);
467*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
468*d83cc019SAndroid Build Coastguard Worker 
469*d83cc019SAndroid Build Coastguard Worker 	memset(ib_info, 0, 2 * sizeof(struct amdgpu_cs_ib_info));
470*d83cc019SAndroid Build Coastguard Worker 
471*d83cc019SAndroid Build Coastguard Worker 	/* IT_SET_CE_DE_COUNTERS */
472*d83cc019SAndroid Build Coastguard Worker 	ptr = ib_result_cpu;
473*d83cc019SAndroid Build Coastguard Worker 	ptr[0] = 0xc0008900;
474*d83cc019SAndroid Build Coastguard Worker 	ptr[1] = 0;
475*d83cc019SAndroid Build Coastguard Worker 	ptr[2] = 0xc0008400;
476*d83cc019SAndroid Build Coastguard Worker 	ptr[3] = 1;
477*d83cc019SAndroid Build Coastguard Worker 	ib_info[0].ib_mc_address = ib_result_mc_address;
478*d83cc019SAndroid Build Coastguard Worker 	ib_info[0].size = 4;
479*d83cc019SAndroid Build Coastguard Worker 	ib_info[0].flags = AMDGPU_IB_FLAG_CE;
480*d83cc019SAndroid Build Coastguard Worker 
481*d83cc019SAndroid Build Coastguard Worker 	ptr = (uint32_t *)ib_result_cpu + 4;
482*d83cc019SAndroid Build Coastguard Worker 	ptr[0] = 0xc0008600;
483*d83cc019SAndroid Build Coastguard Worker 	ptr[1] = 0x00000001;
484*d83cc019SAndroid Build Coastguard Worker 	ib_info[1].ib_mc_address = ib_result_mc_address + 16;
485*d83cc019SAndroid Build Coastguard Worker 	ib_info[1].size = 2;
486*d83cc019SAndroid Build Coastguard Worker 
487*d83cc019SAndroid Build Coastguard Worker 	ibs_request.ip_type = AMDGPU_HW_IP_GFX;
488*d83cc019SAndroid Build Coastguard Worker 	ibs_request.number_of_ibs = 2;
489*d83cc019SAndroid Build Coastguard Worker 	ibs_request.ibs = ib_info;
490*d83cc019SAndroid Build Coastguard Worker 	ibs_request.resources = bo_list;
491*d83cc019SAndroid Build Coastguard Worker 	ibs_request.fence_info.handle = NULL;
492*d83cc019SAndroid Build Coastguard Worker 
493*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_submit(context_handle, 0, &ibs_request, 1);
494*d83cc019SAndroid Build Coastguard Worker 
495*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
496*d83cc019SAndroid Build Coastguard Worker 
497*d83cc019SAndroid Build Coastguard Worker 	fence_status.context = context_handle;
498*d83cc019SAndroid Build Coastguard Worker 	fence_status.ip_type = AMDGPU_HW_IP_GFX;
499*d83cc019SAndroid Build Coastguard Worker 	fence_status.ip_instance = 0;
500*d83cc019SAndroid Build Coastguard Worker 	fence_status.fence = ibs_request.seq_no;
501*d83cc019SAndroid Build Coastguard Worker 
502*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_query_fence_status(&fence_status,
503*d83cc019SAndroid Build Coastguard Worker 					 AMDGPU_TIMEOUT_INFINITE,
504*d83cc019SAndroid Build Coastguard Worker 					 0, &expired);
505*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
506*d83cc019SAndroid Build Coastguard Worker 
507*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_unmap_and_free(ib_result_handle, va_handle,
508*d83cc019SAndroid Build Coastguard Worker 				 ib_result_mc_address, 4096);
509*d83cc019SAndroid Build Coastguard Worker 
510*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_bo_list_destroy(bo_list);
511*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
512*d83cc019SAndroid Build Coastguard Worker 
513*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_ctx_free(context_handle);
514*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
515*d83cc019SAndroid Build Coastguard Worker }
516*d83cc019SAndroid Build Coastguard Worker 
amdgpu_command_submission_gfx_cp_write_data(void)517*d83cc019SAndroid Build Coastguard Worker static void amdgpu_command_submission_gfx_cp_write_data(void)
518*d83cc019SAndroid Build Coastguard Worker {
519*d83cc019SAndroid Build Coastguard Worker 	amdgpu_command_submission_write_linear_helper(AMDGPU_HW_IP_GFX);
520*d83cc019SAndroid Build Coastguard Worker }
521*d83cc019SAndroid Build Coastguard Worker 
amdgpu_command_submission_gfx_cp_const_fill(void)522*d83cc019SAndroid Build Coastguard Worker static void amdgpu_command_submission_gfx_cp_const_fill(void)
523*d83cc019SAndroid Build Coastguard Worker {
524*d83cc019SAndroid Build Coastguard Worker 	amdgpu_command_submission_const_fill_helper(AMDGPU_HW_IP_GFX);
525*d83cc019SAndroid Build Coastguard Worker }
526*d83cc019SAndroid Build Coastguard Worker 
amdgpu_command_submission_gfx_cp_copy_data(void)527*d83cc019SAndroid Build Coastguard Worker static void amdgpu_command_submission_gfx_cp_copy_data(void)
528*d83cc019SAndroid Build Coastguard Worker {
529*d83cc019SAndroid Build Coastguard Worker 	amdgpu_command_submission_copy_linear_helper(AMDGPU_HW_IP_GFX);
530*d83cc019SAndroid Build Coastguard Worker }
531*d83cc019SAndroid Build Coastguard Worker 
amdgpu_command_submission_gfx(void)532*d83cc019SAndroid Build Coastguard Worker static void amdgpu_command_submission_gfx(void)
533*d83cc019SAndroid Build Coastguard Worker {
534*d83cc019SAndroid Build Coastguard Worker 	/* write data using the CP */
535*d83cc019SAndroid Build Coastguard Worker 	amdgpu_command_submission_gfx_cp_write_data();
536*d83cc019SAndroid Build Coastguard Worker 	/* const fill using the CP */
537*d83cc019SAndroid Build Coastguard Worker 	amdgpu_command_submission_gfx_cp_const_fill();
538*d83cc019SAndroid Build Coastguard Worker 	/* copy data using the CP */
539*d83cc019SAndroid Build Coastguard Worker 	amdgpu_command_submission_gfx_cp_copy_data();
540*d83cc019SAndroid Build Coastguard Worker 	/* separate IB buffers for multi-IB submission */
541*d83cc019SAndroid Build Coastguard Worker 	amdgpu_command_submission_gfx_separate_ibs();
542*d83cc019SAndroid Build Coastguard Worker 	/* shared IB buffer for multi-IB submission */
543*d83cc019SAndroid Build Coastguard Worker 	amdgpu_command_submission_gfx_shared_ib();
544*d83cc019SAndroid Build Coastguard Worker }
545*d83cc019SAndroid Build Coastguard Worker 
amdgpu_semaphore_test(void)546*d83cc019SAndroid Build Coastguard Worker static void amdgpu_semaphore_test(void)
547*d83cc019SAndroid Build Coastguard Worker {
548*d83cc019SAndroid Build Coastguard Worker 	amdgpu_context_handle context_handle[2];
549*d83cc019SAndroid Build Coastguard Worker 	amdgpu_semaphore_handle sem;
550*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_handle ib_result_handle[2];
551*d83cc019SAndroid Build Coastguard Worker 	void *ib_result_cpu[2];
552*d83cc019SAndroid Build Coastguard Worker 	uint64_t ib_result_mc_address[2];
553*d83cc019SAndroid Build Coastguard Worker 	struct amdgpu_cs_request ibs_request[2] = {};
554*d83cc019SAndroid Build Coastguard Worker 	struct amdgpu_cs_ib_info ib_info[2] = {};
555*d83cc019SAndroid Build Coastguard Worker 	struct amdgpu_cs_fence fence_status = {};
556*d83cc019SAndroid Build Coastguard Worker 	uint32_t *ptr;
557*d83cc019SAndroid Build Coastguard Worker 	uint32_t expired;
558*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_list_handle bo_list[2];
559*d83cc019SAndroid Build Coastguard Worker 	amdgpu_va_handle va_handle[2];
560*d83cc019SAndroid Build Coastguard Worker 	int r, i;
561*d83cc019SAndroid Build Coastguard Worker 
562*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_create_semaphore(&sem);
563*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
564*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < 2; i++) {
565*d83cc019SAndroid Build Coastguard Worker 		r = amdgpu_cs_ctx_create(device, &context_handle[i]);
566*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(r, 0);
567*d83cc019SAndroid Build Coastguard Worker 
568*d83cc019SAndroid Build Coastguard Worker 		r = amdgpu_bo_alloc_and_map(device, 4096, 4096,
569*d83cc019SAndroid Build Coastguard Worker 					    AMDGPU_GEM_DOMAIN_GTT, 0,
570*d83cc019SAndroid Build Coastguard Worker 					    &ib_result_handle[i], &ib_result_cpu[i],
571*d83cc019SAndroid Build Coastguard Worker 					    &ib_result_mc_address[i], &va_handle[i]);
572*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(r, 0);
573*d83cc019SAndroid Build Coastguard Worker 
574*d83cc019SAndroid Build Coastguard Worker 		r = amdgpu_get_bo_list(device, ib_result_handle[i],
575*d83cc019SAndroid Build Coastguard Worker 				       NULL, &bo_list[i]);
576*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(r, 0);
577*d83cc019SAndroid Build Coastguard Worker 	}
578*d83cc019SAndroid Build Coastguard Worker 
579*d83cc019SAndroid Build Coastguard Worker 	/* 1. same context different engine */
580*d83cc019SAndroid Build Coastguard Worker 	ptr = ib_result_cpu[0];
581*d83cc019SAndroid Build Coastguard Worker 	ptr[0] = SDMA_NOP;
582*d83cc019SAndroid Build Coastguard Worker 	ib_info[0].ib_mc_address = ib_result_mc_address[0];
583*d83cc019SAndroid Build Coastguard Worker 	ib_info[0].size = 1;
584*d83cc019SAndroid Build Coastguard Worker 
585*d83cc019SAndroid Build Coastguard Worker 	ibs_request[0].ip_type = AMDGPU_HW_IP_DMA;
586*d83cc019SAndroid Build Coastguard Worker 	ibs_request[0].number_of_ibs = 1;
587*d83cc019SAndroid Build Coastguard Worker 	ibs_request[0].ibs = &ib_info[0];
588*d83cc019SAndroid Build Coastguard Worker 	ibs_request[0].resources = bo_list[0];
589*d83cc019SAndroid Build Coastguard Worker 	ibs_request[0].fence_info.handle = NULL;
590*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_submit(context_handle[0], 0,&ibs_request[0], 1);
591*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
592*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_signal_semaphore(context_handle[0], AMDGPU_HW_IP_DMA, 0, 0, sem);
593*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
594*d83cc019SAndroid Build Coastguard Worker 
595*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_wait_semaphore(context_handle[0], AMDGPU_HW_IP_GFX, 0, 0, sem);
596*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
597*d83cc019SAndroid Build Coastguard Worker 	ptr = ib_result_cpu[1];
598*d83cc019SAndroid Build Coastguard Worker 	ptr[0] = GFX_COMPUTE_NOP;
599*d83cc019SAndroid Build Coastguard Worker 	ib_info[1].ib_mc_address = ib_result_mc_address[1];
600*d83cc019SAndroid Build Coastguard Worker 	ib_info[1].size = 1;
601*d83cc019SAndroid Build Coastguard Worker 
602*d83cc019SAndroid Build Coastguard Worker 	ibs_request[1].ip_type = AMDGPU_HW_IP_GFX;
603*d83cc019SAndroid Build Coastguard Worker 	ibs_request[1].number_of_ibs = 1;
604*d83cc019SAndroid Build Coastguard Worker 	ibs_request[1].ibs = &ib_info[1];
605*d83cc019SAndroid Build Coastguard Worker 	ibs_request[1].resources = bo_list[1];
606*d83cc019SAndroid Build Coastguard Worker 	ibs_request[1].fence_info.handle = NULL;
607*d83cc019SAndroid Build Coastguard Worker 
608*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_submit(context_handle[0], 0,&ibs_request[1], 1);
609*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
610*d83cc019SAndroid Build Coastguard Worker 
611*d83cc019SAndroid Build Coastguard Worker 	fence_status.context = context_handle[0];
612*d83cc019SAndroid Build Coastguard Worker 	fence_status.ip_type = AMDGPU_HW_IP_GFX;
613*d83cc019SAndroid Build Coastguard Worker 	fence_status.ip_instance = 0;
614*d83cc019SAndroid Build Coastguard Worker 	fence_status.fence = ibs_request[1].seq_no;
615*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_query_fence_status(&fence_status,
616*d83cc019SAndroid Build Coastguard Worker 					 500000000, 0, &expired);
617*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
618*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(expired, true);
619*d83cc019SAndroid Build Coastguard Worker 
620*d83cc019SAndroid Build Coastguard Worker 	/* 2. same engine different context */
621*d83cc019SAndroid Build Coastguard Worker 	ptr = ib_result_cpu[0];
622*d83cc019SAndroid Build Coastguard Worker 	ptr[0] = GFX_COMPUTE_NOP;
623*d83cc019SAndroid Build Coastguard Worker 	ib_info[0].ib_mc_address = ib_result_mc_address[0];
624*d83cc019SAndroid Build Coastguard Worker 	ib_info[0].size = 1;
625*d83cc019SAndroid Build Coastguard Worker 
626*d83cc019SAndroid Build Coastguard Worker 	ibs_request[0].ip_type = AMDGPU_HW_IP_GFX;
627*d83cc019SAndroid Build Coastguard Worker 	ibs_request[0].number_of_ibs = 1;
628*d83cc019SAndroid Build Coastguard Worker 	ibs_request[0].ibs = &ib_info[0];
629*d83cc019SAndroid Build Coastguard Worker 	ibs_request[0].resources = bo_list[0];
630*d83cc019SAndroid Build Coastguard Worker 	ibs_request[0].fence_info.handle = NULL;
631*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_submit(context_handle[0], 0,&ibs_request[0], 1);
632*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
633*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_signal_semaphore(context_handle[0], AMDGPU_HW_IP_GFX, 0, 0, sem);
634*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
635*d83cc019SAndroid Build Coastguard Worker 
636*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_wait_semaphore(context_handle[1], AMDGPU_HW_IP_GFX, 0, 0, sem);
637*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
638*d83cc019SAndroid Build Coastguard Worker 	ptr = ib_result_cpu[1];
639*d83cc019SAndroid Build Coastguard Worker 	ptr[0] = GFX_COMPUTE_NOP;
640*d83cc019SAndroid Build Coastguard Worker 	ib_info[1].ib_mc_address = ib_result_mc_address[1];
641*d83cc019SAndroid Build Coastguard Worker 	ib_info[1].size = 1;
642*d83cc019SAndroid Build Coastguard Worker 
643*d83cc019SAndroid Build Coastguard Worker 	ibs_request[1].ip_type = AMDGPU_HW_IP_GFX;
644*d83cc019SAndroid Build Coastguard Worker 	ibs_request[1].number_of_ibs = 1;
645*d83cc019SAndroid Build Coastguard Worker 	ibs_request[1].ibs = &ib_info[1];
646*d83cc019SAndroid Build Coastguard Worker 	ibs_request[1].resources = bo_list[1];
647*d83cc019SAndroid Build Coastguard Worker 	ibs_request[1].fence_info.handle = NULL;
648*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_submit(context_handle[1], 0,&ibs_request[1], 1);
649*d83cc019SAndroid Build Coastguard Worker 
650*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
651*d83cc019SAndroid Build Coastguard Worker 
652*d83cc019SAndroid Build Coastguard Worker 	fence_status.context = context_handle[1];
653*d83cc019SAndroid Build Coastguard Worker 	fence_status.ip_type = AMDGPU_HW_IP_GFX;
654*d83cc019SAndroid Build Coastguard Worker 	fence_status.ip_instance = 0;
655*d83cc019SAndroid Build Coastguard Worker 	fence_status.fence = ibs_request[1].seq_no;
656*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_query_fence_status(&fence_status,
657*d83cc019SAndroid Build Coastguard Worker 					 500000000, 0, &expired);
658*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
659*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(expired, true);
660*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < 2; i++) {
661*d83cc019SAndroid Build Coastguard Worker 		amdgpu_bo_unmap_and_free(ib_result_handle[i], va_handle[i],
662*d83cc019SAndroid Build Coastguard Worker 					 ib_result_mc_address[i], 4096);
663*d83cc019SAndroid Build Coastguard Worker 
664*d83cc019SAndroid Build Coastguard Worker 		r = amdgpu_bo_list_destroy(bo_list[i]);
665*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(r, 0);
666*d83cc019SAndroid Build Coastguard Worker 
667*d83cc019SAndroid Build Coastguard Worker 		r = amdgpu_cs_ctx_free(context_handle[i]);
668*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(r, 0);
669*d83cc019SAndroid Build Coastguard Worker 	}
670*d83cc019SAndroid Build Coastguard Worker 
671*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_destroy_semaphore(sem);
672*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
673*d83cc019SAndroid Build Coastguard Worker }
674*d83cc019SAndroid Build Coastguard Worker 
amdgpu_command_submission_compute_nop(void)675*d83cc019SAndroid Build Coastguard Worker static void amdgpu_command_submission_compute_nop(void)
676*d83cc019SAndroid Build Coastguard Worker {
677*d83cc019SAndroid Build Coastguard Worker 	amdgpu_context_handle context_handle;
678*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_handle ib_result_handle;
679*d83cc019SAndroid Build Coastguard Worker 	void *ib_result_cpu;
680*d83cc019SAndroid Build Coastguard Worker 	uint64_t ib_result_mc_address;
681*d83cc019SAndroid Build Coastguard Worker 	struct amdgpu_cs_request ibs_request;
682*d83cc019SAndroid Build Coastguard Worker 	struct amdgpu_cs_ib_info ib_info;
683*d83cc019SAndroid Build Coastguard Worker 	struct amdgpu_cs_fence fence_status;
684*d83cc019SAndroid Build Coastguard Worker 	uint32_t *ptr;
685*d83cc019SAndroid Build Coastguard Worker 	uint32_t expired;
686*d83cc019SAndroid Build Coastguard Worker 	int i, r, instance;
687*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_list_handle bo_list;
688*d83cc019SAndroid Build Coastguard Worker 	amdgpu_va_handle va_handle;
689*d83cc019SAndroid Build Coastguard Worker 
690*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_ctx_create(device, &context_handle);
691*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
692*d83cc019SAndroid Build Coastguard Worker 
693*d83cc019SAndroid Build Coastguard Worker 	for (instance = 0; instance < 8; instance++) {
694*d83cc019SAndroid Build Coastguard Worker 		r = amdgpu_bo_alloc_and_map(device, 4096, 4096,
695*d83cc019SAndroid Build Coastguard Worker 					    AMDGPU_GEM_DOMAIN_GTT, 0,
696*d83cc019SAndroid Build Coastguard Worker 					    &ib_result_handle, &ib_result_cpu,
697*d83cc019SAndroid Build Coastguard Worker 					    &ib_result_mc_address, &va_handle);
698*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(r, 0);
699*d83cc019SAndroid Build Coastguard Worker 
700*d83cc019SAndroid Build Coastguard Worker 		r = amdgpu_get_bo_list(device, ib_result_handle, NULL,
701*d83cc019SAndroid Build Coastguard Worker 				       &bo_list);
702*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(r, 0);
703*d83cc019SAndroid Build Coastguard Worker 
704*d83cc019SAndroid Build Coastguard Worker 		ptr = ib_result_cpu;
705*d83cc019SAndroid Build Coastguard Worker 		for (i = 0; i < 16; ++i)
706*d83cc019SAndroid Build Coastguard Worker 			ptr[i] = 0xffff1000;
707*d83cc019SAndroid Build Coastguard Worker 
708*d83cc019SAndroid Build Coastguard Worker 		memset(&ib_info, 0, sizeof(struct amdgpu_cs_ib_info));
709*d83cc019SAndroid Build Coastguard Worker 		ib_info.ib_mc_address = ib_result_mc_address;
710*d83cc019SAndroid Build Coastguard Worker 		ib_info.size = 16;
711*d83cc019SAndroid Build Coastguard Worker 
712*d83cc019SAndroid Build Coastguard Worker 		memset(&ibs_request, 0, sizeof(struct amdgpu_cs_request));
713*d83cc019SAndroid Build Coastguard Worker 		ibs_request.ip_type = AMDGPU_HW_IP_COMPUTE;
714*d83cc019SAndroid Build Coastguard Worker 		ibs_request.ring = instance;
715*d83cc019SAndroid Build Coastguard Worker 		ibs_request.number_of_ibs = 1;
716*d83cc019SAndroid Build Coastguard Worker 		ibs_request.ibs = &ib_info;
717*d83cc019SAndroid Build Coastguard Worker 		ibs_request.resources = bo_list;
718*d83cc019SAndroid Build Coastguard Worker 		ibs_request.fence_info.handle = NULL;
719*d83cc019SAndroid Build Coastguard Worker 
720*d83cc019SAndroid Build Coastguard Worker 		memset(&fence_status, 0, sizeof(struct amdgpu_cs_fence));
721*d83cc019SAndroid Build Coastguard Worker 		r = amdgpu_cs_submit(context_handle, 0,&ibs_request, 1);
722*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(r, 0);
723*d83cc019SAndroid Build Coastguard Worker 
724*d83cc019SAndroid Build Coastguard Worker 		fence_status.context = context_handle;
725*d83cc019SAndroid Build Coastguard Worker 		fence_status.ip_type = AMDGPU_HW_IP_COMPUTE;
726*d83cc019SAndroid Build Coastguard Worker 		fence_status.ip_instance = 0;
727*d83cc019SAndroid Build Coastguard Worker 		fence_status.ring = instance;
728*d83cc019SAndroid Build Coastguard Worker 		fence_status.fence = ibs_request.seq_no;
729*d83cc019SAndroid Build Coastguard Worker 
730*d83cc019SAndroid Build Coastguard Worker 		r = amdgpu_cs_query_fence_status(&fence_status,
731*d83cc019SAndroid Build Coastguard Worker 						 AMDGPU_TIMEOUT_INFINITE,
732*d83cc019SAndroid Build Coastguard Worker 						 0, &expired);
733*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(r, 0);
734*d83cc019SAndroid Build Coastguard Worker 
735*d83cc019SAndroid Build Coastguard Worker 		r = amdgpu_bo_list_destroy(bo_list);
736*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(r, 0);
737*d83cc019SAndroid Build Coastguard Worker 
738*d83cc019SAndroid Build Coastguard Worker 		amdgpu_bo_unmap_and_free(ib_result_handle, va_handle,
739*d83cc019SAndroid Build Coastguard Worker 					 ib_result_mc_address, 4096);
740*d83cc019SAndroid Build Coastguard Worker 	}
741*d83cc019SAndroid Build Coastguard Worker 
742*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_ctx_free(context_handle);
743*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
744*d83cc019SAndroid Build Coastguard Worker }
745*d83cc019SAndroid Build Coastguard Worker 
amdgpu_command_submission_compute_cp_write_data(void)746*d83cc019SAndroid Build Coastguard Worker static void amdgpu_command_submission_compute_cp_write_data(void)
747*d83cc019SAndroid Build Coastguard Worker {
748*d83cc019SAndroid Build Coastguard Worker 	amdgpu_command_submission_write_linear_helper(AMDGPU_HW_IP_COMPUTE);
749*d83cc019SAndroid Build Coastguard Worker }
750*d83cc019SAndroid Build Coastguard Worker 
amdgpu_command_submission_compute_cp_const_fill(void)751*d83cc019SAndroid Build Coastguard Worker static void amdgpu_command_submission_compute_cp_const_fill(void)
752*d83cc019SAndroid Build Coastguard Worker {
753*d83cc019SAndroid Build Coastguard Worker 	amdgpu_command_submission_const_fill_helper(AMDGPU_HW_IP_COMPUTE);
754*d83cc019SAndroid Build Coastguard Worker }
755*d83cc019SAndroid Build Coastguard Worker 
amdgpu_command_submission_compute_cp_copy_data(void)756*d83cc019SAndroid Build Coastguard Worker static void amdgpu_command_submission_compute_cp_copy_data(void)
757*d83cc019SAndroid Build Coastguard Worker {
758*d83cc019SAndroid Build Coastguard Worker 	amdgpu_command_submission_copy_linear_helper(AMDGPU_HW_IP_COMPUTE);
759*d83cc019SAndroid Build Coastguard Worker }
760*d83cc019SAndroid Build Coastguard Worker 
amdgpu_command_submission_compute(void)761*d83cc019SAndroid Build Coastguard Worker static void amdgpu_command_submission_compute(void)
762*d83cc019SAndroid Build Coastguard Worker {
763*d83cc019SAndroid Build Coastguard Worker 	/* write data using the CP */
764*d83cc019SAndroid Build Coastguard Worker 	amdgpu_command_submission_compute_cp_write_data();
765*d83cc019SAndroid Build Coastguard Worker 	/* const fill using the CP */
766*d83cc019SAndroid Build Coastguard Worker 	amdgpu_command_submission_compute_cp_const_fill();
767*d83cc019SAndroid Build Coastguard Worker 	/* copy data using the CP */
768*d83cc019SAndroid Build Coastguard Worker 	amdgpu_command_submission_compute_cp_copy_data();
769*d83cc019SAndroid Build Coastguard Worker 	/* nop test */
770*d83cc019SAndroid Build Coastguard Worker 	amdgpu_command_submission_compute_nop();
771*d83cc019SAndroid Build Coastguard Worker }
772*d83cc019SAndroid Build Coastguard Worker 
773*d83cc019SAndroid Build Coastguard Worker /*
774*d83cc019SAndroid Build Coastguard Worker  * caller need create/release:
775*d83cc019SAndroid Build Coastguard Worker  * pm4_src, resources, ib_info, and ibs_request
776*d83cc019SAndroid Build Coastguard Worker  * submit command stream described in ibs_request and wait for this IB accomplished
777*d83cc019SAndroid Build Coastguard Worker  */
amdgpu_test_exec_cs_helper(amdgpu_context_handle context_handle,unsigned ip_type,int instance,int pm4_dw,uint32_t * pm4_src,int res_cnt,amdgpu_bo_handle * resources,struct amdgpu_cs_ib_info * ib_info,struct amdgpu_cs_request * ibs_request)778*d83cc019SAndroid Build Coastguard Worker static void amdgpu_test_exec_cs_helper(amdgpu_context_handle context_handle,
779*d83cc019SAndroid Build Coastguard Worker 				       unsigned ip_type,
780*d83cc019SAndroid Build Coastguard Worker 				       int instance, int pm4_dw, uint32_t *pm4_src,
781*d83cc019SAndroid Build Coastguard Worker 				       int res_cnt, amdgpu_bo_handle *resources,
782*d83cc019SAndroid Build Coastguard Worker 				       struct amdgpu_cs_ib_info *ib_info,
783*d83cc019SAndroid Build Coastguard Worker 				       struct amdgpu_cs_request *ibs_request)
784*d83cc019SAndroid Build Coastguard Worker {
785*d83cc019SAndroid Build Coastguard Worker 	int r;
786*d83cc019SAndroid Build Coastguard Worker 	uint32_t expired;
787*d83cc019SAndroid Build Coastguard Worker 	uint32_t *ring_ptr;
788*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_handle ib_result_handle;
789*d83cc019SAndroid Build Coastguard Worker 	void *ib_result_cpu;
790*d83cc019SAndroid Build Coastguard Worker 	uint64_t ib_result_mc_address;
791*d83cc019SAndroid Build Coastguard Worker 	struct amdgpu_cs_fence fence_status = {0};
792*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_handle *all_res = alloca(sizeof(resources[0]) * (res_cnt + 1));
793*d83cc019SAndroid Build Coastguard Worker 	amdgpu_va_handle va_handle;
794*d83cc019SAndroid Build Coastguard Worker 
795*d83cc019SAndroid Build Coastguard Worker 	/* prepare CS */
796*d83cc019SAndroid Build Coastguard Worker 	igt_assert(pm4_dw <= 1024);
797*d83cc019SAndroid Build Coastguard Worker 
798*d83cc019SAndroid Build Coastguard Worker 	/* allocate IB */
799*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_bo_alloc_and_map(device, 4096, 4096,
800*d83cc019SAndroid Build Coastguard Worker 				    AMDGPU_GEM_DOMAIN_GTT, 0,
801*d83cc019SAndroid Build Coastguard Worker 				    &ib_result_handle, &ib_result_cpu,
802*d83cc019SAndroid Build Coastguard Worker 				    &ib_result_mc_address, &va_handle);
803*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
804*d83cc019SAndroid Build Coastguard Worker 
805*d83cc019SAndroid Build Coastguard Worker 	/* copy PM4 packet to ring from caller */
806*d83cc019SAndroid Build Coastguard Worker 	ring_ptr = ib_result_cpu;
807*d83cc019SAndroid Build Coastguard Worker 	memcpy(ring_ptr, pm4_src, pm4_dw * sizeof(*pm4_src));
808*d83cc019SAndroid Build Coastguard Worker 
809*d83cc019SAndroid Build Coastguard Worker 	ib_info->ib_mc_address = ib_result_mc_address;
810*d83cc019SAndroid Build Coastguard Worker 	ib_info->size = pm4_dw;
811*d83cc019SAndroid Build Coastguard Worker 
812*d83cc019SAndroid Build Coastguard Worker 	ibs_request->ip_type = ip_type;
813*d83cc019SAndroid Build Coastguard Worker 	ibs_request->ring = instance;
814*d83cc019SAndroid Build Coastguard Worker 	ibs_request->number_of_ibs = 1;
815*d83cc019SAndroid Build Coastguard Worker 	ibs_request->ibs = ib_info;
816*d83cc019SAndroid Build Coastguard Worker 	ibs_request->fence_info.handle = NULL;
817*d83cc019SAndroid Build Coastguard Worker 
818*d83cc019SAndroid Build Coastguard Worker 	memcpy(all_res, resources, sizeof(resources[0]) * res_cnt);
819*d83cc019SAndroid Build Coastguard Worker 	all_res[res_cnt] = ib_result_handle;
820*d83cc019SAndroid Build Coastguard Worker 
821*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_bo_list_create(device, res_cnt+1, all_res,
822*d83cc019SAndroid Build Coastguard Worker 				  NULL, &ibs_request->resources);
823*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
824*d83cc019SAndroid Build Coastguard Worker 
825*d83cc019SAndroid Build Coastguard Worker 	/* submit CS */
826*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_submit(context_handle, 0, ibs_request, 1);
827*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
828*d83cc019SAndroid Build Coastguard Worker 
829*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_bo_list_destroy(ibs_request->resources);
830*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
831*d83cc019SAndroid Build Coastguard Worker 
832*d83cc019SAndroid Build Coastguard Worker 	fence_status.ip_type = ip_type;
833*d83cc019SAndroid Build Coastguard Worker 	fence_status.ip_instance = 0;
834*d83cc019SAndroid Build Coastguard Worker 	fence_status.ring = ibs_request->ring;
835*d83cc019SAndroid Build Coastguard Worker 	fence_status.context = context_handle;
836*d83cc019SAndroid Build Coastguard Worker 	fence_status.fence = ibs_request->seq_no;
837*d83cc019SAndroid Build Coastguard Worker 
838*d83cc019SAndroid Build Coastguard Worker 	/* wait for IB accomplished */
839*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_query_fence_status(&fence_status,
840*d83cc019SAndroid Build Coastguard Worker 					 AMDGPU_TIMEOUT_INFINITE,
841*d83cc019SAndroid Build Coastguard Worker 					 0, &expired);
842*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
843*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(expired, true);
844*d83cc019SAndroid Build Coastguard Worker 
845*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_unmap_and_free(ib_result_handle, va_handle,
846*d83cc019SAndroid Build Coastguard Worker 				 ib_result_mc_address, 4096);
847*d83cc019SAndroid Build Coastguard Worker }
848*d83cc019SAndroid Build Coastguard Worker 
amdgpu_command_submission_write_linear_helper(unsigned ip_type)849*d83cc019SAndroid Build Coastguard Worker static void amdgpu_command_submission_write_linear_helper(unsigned ip_type)
850*d83cc019SAndroid Build Coastguard Worker {
851*d83cc019SAndroid Build Coastguard Worker 	const int sdma_write_length = 128;
852*d83cc019SAndroid Build Coastguard Worker 	const int pm4_dw = 256;
853*d83cc019SAndroid Build Coastguard Worker 	amdgpu_context_handle context_handle;
854*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_handle bo;
855*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_handle *resources;
856*d83cc019SAndroid Build Coastguard Worker 	uint32_t *pm4;
857*d83cc019SAndroid Build Coastguard Worker 	struct amdgpu_cs_ib_info *ib_info;
858*d83cc019SAndroid Build Coastguard Worker 	struct amdgpu_cs_request *ibs_request;
859*d83cc019SAndroid Build Coastguard Worker 	struct amdgpu_gpu_info gpu_info = {0};
860*d83cc019SAndroid Build Coastguard Worker 	uint64_t bo_mc;
861*d83cc019SAndroid Build Coastguard Worker 	volatile uint32_t *bo_cpu;
862*d83cc019SAndroid Build Coastguard Worker 	int i, j, r, loop;
863*d83cc019SAndroid Build Coastguard Worker 	uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC};
864*d83cc019SAndroid Build Coastguard Worker 	amdgpu_va_handle va_handle;
865*d83cc019SAndroid Build Coastguard Worker 
866*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_query_gpu_info(device, &gpu_info);
867*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
868*d83cc019SAndroid Build Coastguard Worker 
869*d83cc019SAndroid Build Coastguard Worker 	pm4 = calloc(pm4_dw, sizeof(*pm4));
870*d83cc019SAndroid Build Coastguard Worker 	igt_assert(pm4);
871*d83cc019SAndroid Build Coastguard Worker 
872*d83cc019SAndroid Build Coastguard Worker 	ib_info = calloc(1, sizeof(*ib_info));
873*d83cc019SAndroid Build Coastguard Worker 	igt_assert(ib_info);
874*d83cc019SAndroid Build Coastguard Worker 
875*d83cc019SAndroid Build Coastguard Worker 	ibs_request = calloc(1, sizeof(*ibs_request));
876*d83cc019SAndroid Build Coastguard Worker 	igt_assert(ibs_request);
877*d83cc019SAndroid Build Coastguard Worker 
878*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_ctx_create(device, &context_handle);
879*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
880*d83cc019SAndroid Build Coastguard Worker 
881*d83cc019SAndroid Build Coastguard Worker 	/* prepare resource */
882*d83cc019SAndroid Build Coastguard Worker 	resources = calloc(1, sizeof(amdgpu_bo_handle));
883*d83cc019SAndroid Build Coastguard Worker 	igt_assert(resources);
884*d83cc019SAndroid Build Coastguard Worker 
885*d83cc019SAndroid Build Coastguard Worker 	loop = 0;
886*d83cc019SAndroid Build Coastguard Worker 	while(loop < 2) {
887*d83cc019SAndroid Build Coastguard Worker 		/* allocate UC bo for sDMA use */
888*d83cc019SAndroid Build Coastguard Worker 		r = amdgpu_bo_alloc_and_map(device,
889*d83cc019SAndroid Build Coastguard Worker 					    sdma_write_length * sizeof(uint32_t),
890*d83cc019SAndroid Build Coastguard Worker 					    4096, AMDGPU_GEM_DOMAIN_GTT,
891*d83cc019SAndroid Build Coastguard Worker 					    gtt_flags[loop], &bo, (void**)&bo_cpu,
892*d83cc019SAndroid Build Coastguard Worker 					    &bo_mc, &va_handle);
893*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(r, 0);
894*d83cc019SAndroid Build Coastguard Worker 
895*d83cc019SAndroid Build Coastguard Worker 		/* clear bo */
896*d83cc019SAndroid Build Coastguard Worker 		memset((void*)bo_cpu, 0, sdma_write_length * sizeof(uint32_t));
897*d83cc019SAndroid Build Coastguard Worker 
898*d83cc019SAndroid Build Coastguard Worker 
899*d83cc019SAndroid Build Coastguard Worker 		resources[0] = bo;
900*d83cc019SAndroid Build Coastguard Worker 
901*d83cc019SAndroid Build Coastguard Worker 		/* fulfill PM4: test DMA write-linear */
902*d83cc019SAndroid Build Coastguard Worker 		i = j = 0;
903*d83cc019SAndroid Build Coastguard Worker 		if (ip_type == AMDGPU_HW_IP_DMA) {
904*d83cc019SAndroid Build Coastguard Worker 			pm4[i++] = SDMA_PACKET(SDMA_OPCODE_WRITE,
905*d83cc019SAndroid Build Coastguard Worker 					       SDMA_WRITE_SUB_OPCODE_LINEAR, 0);
906*d83cc019SAndroid Build Coastguard Worker 			pm4[i++] = 0xffffffff & bo_mc;
907*d83cc019SAndroid Build Coastguard Worker 			pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32;
908*d83cc019SAndroid Build Coastguard Worker 			if (gpu_info.family_id >= AMDGPU_FAMILY_AI)
909*d83cc019SAndroid Build Coastguard Worker 				pm4[i++] = sdma_write_length - 1;
910*d83cc019SAndroid Build Coastguard Worker 			else
911*d83cc019SAndroid Build Coastguard Worker 				pm4[i++] = sdma_write_length;
912*d83cc019SAndroid Build Coastguard Worker 			while(j++ < sdma_write_length)
913*d83cc019SAndroid Build Coastguard Worker 				pm4[i++] = 0xdeadbeaf;
914*d83cc019SAndroid Build Coastguard Worker 		} else if ((ip_type == AMDGPU_HW_IP_GFX) ||
915*d83cc019SAndroid Build Coastguard Worker 			   (ip_type == AMDGPU_HW_IP_COMPUTE)) {
916*d83cc019SAndroid Build Coastguard Worker 			pm4[i++] = PACKET3(PACKET3_WRITE_DATA, 2 + sdma_write_length);
917*d83cc019SAndroid Build Coastguard Worker 			pm4[i++] = WRITE_DATA_DST_SEL(5) | WR_CONFIRM;
918*d83cc019SAndroid Build Coastguard Worker 			pm4[i++] = 0xfffffffc & bo_mc;
919*d83cc019SAndroid Build Coastguard Worker 			pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32;
920*d83cc019SAndroid Build Coastguard Worker 			while(j++ < sdma_write_length)
921*d83cc019SAndroid Build Coastguard Worker 				pm4[i++] = 0xdeadbeaf;
922*d83cc019SAndroid Build Coastguard Worker 		}
923*d83cc019SAndroid Build Coastguard Worker 
924*d83cc019SAndroid Build Coastguard Worker 		amdgpu_test_exec_cs_helper(context_handle,
925*d83cc019SAndroid Build Coastguard Worker 					   ip_type, 0,
926*d83cc019SAndroid Build Coastguard Worker 					   i, pm4,
927*d83cc019SAndroid Build Coastguard Worker 					   1, resources,
928*d83cc019SAndroid Build Coastguard Worker 					   ib_info, ibs_request);
929*d83cc019SAndroid Build Coastguard Worker 
930*d83cc019SAndroid Build Coastguard Worker 		/* verify if SDMA test result meets with expected */
931*d83cc019SAndroid Build Coastguard Worker 		i = 0;
932*d83cc019SAndroid Build Coastguard Worker 		while(i < sdma_write_length) {
933*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eq(bo_cpu[i++], 0xdeadbeaf);
934*d83cc019SAndroid Build Coastguard Worker 		}
935*d83cc019SAndroid Build Coastguard Worker 
936*d83cc019SAndroid Build Coastguard Worker 		amdgpu_bo_unmap_and_free(bo, va_handle, bo_mc,
937*d83cc019SAndroid Build Coastguard Worker 					 sdma_write_length * sizeof(uint32_t));
938*d83cc019SAndroid Build Coastguard Worker 		loop++;
939*d83cc019SAndroid Build Coastguard Worker 	}
940*d83cc019SAndroid Build Coastguard Worker 	/* clean resources */
941*d83cc019SAndroid Build Coastguard Worker 	free(resources);
942*d83cc019SAndroid Build Coastguard Worker 	free(ibs_request);
943*d83cc019SAndroid Build Coastguard Worker 	free(ib_info);
944*d83cc019SAndroid Build Coastguard Worker 	free(pm4);
945*d83cc019SAndroid Build Coastguard Worker 
946*d83cc019SAndroid Build Coastguard Worker 	/* end of test */
947*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_ctx_free(context_handle);
948*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
949*d83cc019SAndroid Build Coastguard Worker }
950*d83cc019SAndroid Build Coastguard Worker 
amdgpu_command_submission_sdma_write_linear(void)951*d83cc019SAndroid Build Coastguard Worker static void amdgpu_command_submission_sdma_write_linear(void)
952*d83cc019SAndroid Build Coastguard Worker {
953*d83cc019SAndroid Build Coastguard Worker 	amdgpu_command_submission_write_linear_helper(AMDGPU_HW_IP_DMA);
954*d83cc019SAndroid Build Coastguard Worker }
955*d83cc019SAndroid Build Coastguard Worker 
amdgpu_command_submission_const_fill_helper(unsigned ip_type)956*d83cc019SAndroid Build Coastguard Worker static void amdgpu_command_submission_const_fill_helper(unsigned ip_type)
957*d83cc019SAndroid Build Coastguard Worker {
958*d83cc019SAndroid Build Coastguard Worker 	const int sdma_write_length = 1024 * 1024;
959*d83cc019SAndroid Build Coastguard Worker 	const int pm4_dw = 256;
960*d83cc019SAndroid Build Coastguard Worker 	amdgpu_context_handle context_handle;
961*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_handle bo;
962*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_handle *resources;
963*d83cc019SAndroid Build Coastguard Worker 	uint32_t *pm4;
964*d83cc019SAndroid Build Coastguard Worker 	struct amdgpu_cs_ib_info *ib_info;
965*d83cc019SAndroid Build Coastguard Worker 	struct amdgpu_cs_request *ibs_request;
966*d83cc019SAndroid Build Coastguard Worker 	struct amdgpu_gpu_info gpu_info = {0};
967*d83cc019SAndroid Build Coastguard Worker 	uint64_t bo_mc;
968*d83cc019SAndroid Build Coastguard Worker 	volatile uint32_t *bo_cpu;
969*d83cc019SAndroid Build Coastguard Worker 	int i, j, r, loop;
970*d83cc019SAndroid Build Coastguard Worker 	uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC};
971*d83cc019SAndroid Build Coastguard Worker 	amdgpu_va_handle va_handle;
972*d83cc019SAndroid Build Coastguard Worker 
973*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_query_gpu_info(device, &gpu_info);
974*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
975*d83cc019SAndroid Build Coastguard Worker 
976*d83cc019SAndroid Build Coastguard Worker 	pm4 = calloc(pm4_dw, sizeof(*pm4));
977*d83cc019SAndroid Build Coastguard Worker 	igt_assert(pm4);
978*d83cc019SAndroid Build Coastguard Worker 
979*d83cc019SAndroid Build Coastguard Worker 	ib_info = calloc(1, sizeof(*ib_info));
980*d83cc019SAndroid Build Coastguard Worker 	igt_assert(ib_info);
981*d83cc019SAndroid Build Coastguard Worker 
982*d83cc019SAndroid Build Coastguard Worker 	ibs_request = calloc(1, sizeof(*ibs_request));
983*d83cc019SAndroid Build Coastguard Worker 	igt_assert(ibs_request);
984*d83cc019SAndroid Build Coastguard Worker 
985*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_ctx_create(device, &context_handle);
986*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
987*d83cc019SAndroid Build Coastguard Worker 
988*d83cc019SAndroid Build Coastguard Worker 	/* prepare resource */
989*d83cc019SAndroid Build Coastguard Worker 	resources = calloc(1, sizeof(amdgpu_bo_handle));
990*d83cc019SAndroid Build Coastguard Worker 	igt_assert(resources);
991*d83cc019SAndroid Build Coastguard Worker 
992*d83cc019SAndroid Build Coastguard Worker 	loop = 0;
993*d83cc019SAndroid Build Coastguard Worker 	while(loop < 2) {
994*d83cc019SAndroid Build Coastguard Worker 		/* allocate UC bo for sDMA use */
995*d83cc019SAndroid Build Coastguard Worker 		r = amdgpu_bo_alloc_and_map(device,
996*d83cc019SAndroid Build Coastguard Worker 					    sdma_write_length, 4096,
997*d83cc019SAndroid Build Coastguard Worker 					    AMDGPU_GEM_DOMAIN_GTT,
998*d83cc019SAndroid Build Coastguard Worker 					    gtt_flags[loop], &bo, (void**)&bo_cpu,
999*d83cc019SAndroid Build Coastguard Worker 					    &bo_mc, &va_handle);
1000*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(r, 0);
1001*d83cc019SAndroid Build Coastguard Worker 
1002*d83cc019SAndroid Build Coastguard Worker 		/* clear bo */
1003*d83cc019SAndroid Build Coastguard Worker 		memset((void*)bo_cpu, 0, sdma_write_length);
1004*d83cc019SAndroid Build Coastguard Worker 
1005*d83cc019SAndroid Build Coastguard Worker 		resources[0] = bo;
1006*d83cc019SAndroid Build Coastguard Worker 
1007*d83cc019SAndroid Build Coastguard Worker 		/* fulfill PM4: test DMA const fill */
1008*d83cc019SAndroid Build Coastguard Worker 		i = j = 0;
1009*d83cc019SAndroid Build Coastguard Worker 		if (ip_type == AMDGPU_HW_IP_DMA) {
1010*d83cc019SAndroid Build Coastguard Worker 			pm4[i++] = SDMA_PACKET(SDMA_OPCODE_CONSTANT_FILL, 0,
1011*d83cc019SAndroid Build Coastguard Worker 					       SDMA_CONSTANT_FILL_EXTRA_SIZE(2));
1012*d83cc019SAndroid Build Coastguard Worker 			pm4[i++] = 0xffffffff & bo_mc;
1013*d83cc019SAndroid Build Coastguard Worker 			pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32;
1014*d83cc019SAndroid Build Coastguard Worker 			pm4[i++] = 0xdeadbeaf;
1015*d83cc019SAndroid Build Coastguard Worker 			if (gpu_info.family_id >= AMDGPU_FAMILY_AI)
1016*d83cc019SAndroid Build Coastguard Worker 				pm4[i++] = sdma_write_length - 1;
1017*d83cc019SAndroid Build Coastguard Worker 			else
1018*d83cc019SAndroid Build Coastguard Worker 				pm4[i++] = sdma_write_length;
1019*d83cc019SAndroid Build Coastguard Worker 		} else if ((ip_type == AMDGPU_HW_IP_GFX) ||
1020*d83cc019SAndroid Build Coastguard Worker 			   (ip_type == AMDGPU_HW_IP_COMPUTE)) {
1021*d83cc019SAndroid Build Coastguard Worker 			pm4[i++] = PACKET3(PACKET3_DMA_DATA, 5);
1022*d83cc019SAndroid Build Coastguard Worker 			pm4[i++] = PACKET3_DMA_DATA_ENGINE(0) |
1023*d83cc019SAndroid Build Coastguard Worker 				PACKET3_DMA_DATA_DST_SEL(0) |
1024*d83cc019SAndroid Build Coastguard Worker 				PACKET3_DMA_DATA_SRC_SEL(2) |
1025*d83cc019SAndroid Build Coastguard Worker 				PACKET3_DMA_DATA_CP_SYNC;
1026*d83cc019SAndroid Build Coastguard Worker 			pm4[i++] = 0xdeadbeaf;
1027*d83cc019SAndroid Build Coastguard Worker 			pm4[i++] = 0;
1028*d83cc019SAndroid Build Coastguard Worker 			pm4[i++] = 0xfffffffc & bo_mc;
1029*d83cc019SAndroid Build Coastguard Worker 			pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32;
1030*d83cc019SAndroid Build Coastguard Worker 			pm4[i++] = sdma_write_length;
1031*d83cc019SAndroid Build Coastguard Worker 		}
1032*d83cc019SAndroid Build Coastguard Worker 
1033*d83cc019SAndroid Build Coastguard Worker 		amdgpu_test_exec_cs_helper(context_handle,
1034*d83cc019SAndroid Build Coastguard Worker 					   ip_type, 0,
1035*d83cc019SAndroid Build Coastguard Worker 					   i, pm4,
1036*d83cc019SAndroid Build Coastguard Worker 					   1, resources,
1037*d83cc019SAndroid Build Coastguard Worker 					   ib_info, ibs_request);
1038*d83cc019SAndroid Build Coastguard Worker 
1039*d83cc019SAndroid Build Coastguard Worker 		/* verify if SDMA test result meets with expected */
1040*d83cc019SAndroid Build Coastguard Worker 		i = 0;
1041*d83cc019SAndroid Build Coastguard Worker 		while(i < (sdma_write_length / 4)) {
1042*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eq(bo_cpu[i++], 0xdeadbeaf);
1043*d83cc019SAndroid Build Coastguard Worker 		}
1044*d83cc019SAndroid Build Coastguard Worker 
1045*d83cc019SAndroid Build Coastguard Worker 		amdgpu_bo_unmap_and_free(bo, va_handle, bo_mc,
1046*d83cc019SAndroid Build Coastguard Worker 					 sdma_write_length);
1047*d83cc019SAndroid Build Coastguard Worker 		loop++;
1048*d83cc019SAndroid Build Coastguard Worker 	}
1049*d83cc019SAndroid Build Coastguard Worker 	/* clean resources */
1050*d83cc019SAndroid Build Coastguard Worker 	free(resources);
1051*d83cc019SAndroid Build Coastguard Worker 	free(ibs_request);
1052*d83cc019SAndroid Build Coastguard Worker 	free(ib_info);
1053*d83cc019SAndroid Build Coastguard Worker 	free(pm4);
1054*d83cc019SAndroid Build Coastguard Worker 
1055*d83cc019SAndroid Build Coastguard Worker 	/* end of test */
1056*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_ctx_free(context_handle);
1057*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
1058*d83cc019SAndroid Build Coastguard Worker }
1059*d83cc019SAndroid Build Coastguard Worker 
amdgpu_command_submission_sdma_const_fill(void)1060*d83cc019SAndroid Build Coastguard Worker static void amdgpu_command_submission_sdma_const_fill(void)
1061*d83cc019SAndroid Build Coastguard Worker {
1062*d83cc019SAndroid Build Coastguard Worker 	amdgpu_command_submission_const_fill_helper(AMDGPU_HW_IP_DMA);
1063*d83cc019SAndroid Build Coastguard Worker }
1064*d83cc019SAndroid Build Coastguard Worker 
amdgpu_command_submission_copy_linear_helper(unsigned ip_type)1065*d83cc019SAndroid Build Coastguard Worker static void amdgpu_command_submission_copy_linear_helper(unsigned ip_type)
1066*d83cc019SAndroid Build Coastguard Worker {
1067*d83cc019SAndroid Build Coastguard Worker 	const int sdma_write_length = 1024;
1068*d83cc019SAndroid Build Coastguard Worker 	const int pm4_dw = 256;
1069*d83cc019SAndroid Build Coastguard Worker 	amdgpu_context_handle context_handle;
1070*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_handle bo1, bo2;
1071*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_handle *resources;
1072*d83cc019SAndroid Build Coastguard Worker 	uint32_t *pm4;
1073*d83cc019SAndroid Build Coastguard Worker 	struct amdgpu_cs_ib_info *ib_info;
1074*d83cc019SAndroid Build Coastguard Worker 	struct amdgpu_cs_request *ibs_request;
1075*d83cc019SAndroid Build Coastguard Worker 	struct amdgpu_gpu_info gpu_info = {0};
1076*d83cc019SAndroid Build Coastguard Worker 	uint64_t bo1_mc, bo2_mc;
1077*d83cc019SAndroid Build Coastguard Worker 	volatile unsigned char *bo1_cpu, *bo2_cpu;
1078*d83cc019SAndroid Build Coastguard Worker 	int i, j, r, loop1, loop2;
1079*d83cc019SAndroid Build Coastguard Worker 	uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC};
1080*d83cc019SAndroid Build Coastguard Worker 	amdgpu_va_handle bo1_va_handle, bo2_va_handle;
1081*d83cc019SAndroid Build Coastguard Worker 
1082*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_query_gpu_info(device, &gpu_info);
1083*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
1084*d83cc019SAndroid Build Coastguard Worker 
1085*d83cc019SAndroid Build Coastguard Worker 	pm4 = calloc(pm4_dw, sizeof(*pm4));
1086*d83cc019SAndroid Build Coastguard Worker 	igt_assert(pm4);
1087*d83cc019SAndroid Build Coastguard Worker 
1088*d83cc019SAndroid Build Coastguard Worker 	ib_info = calloc(1, sizeof(*ib_info));
1089*d83cc019SAndroid Build Coastguard Worker 	igt_assert(ib_info);
1090*d83cc019SAndroid Build Coastguard Worker 
1091*d83cc019SAndroid Build Coastguard Worker 	ibs_request = calloc(1, sizeof(*ibs_request));
1092*d83cc019SAndroid Build Coastguard Worker 	igt_assert(ibs_request);
1093*d83cc019SAndroid Build Coastguard Worker 
1094*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_ctx_create(device, &context_handle);
1095*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
1096*d83cc019SAndroid Build Coastguard Worker 
1097*d83cc019SAndroid Build Coastguard Worker 	/* prepare resource */
1098*d83cc019SAndroid Build Coastguard Worker 	resources = calloc(2, sizeof(amdgpu_bo_handle));
1099*d83cc019SAndroid Build Coastguard Worker 	igt_assert(resources);
1100*d83cc019SAndroid Build Coastguard Worker 
1101*d83cc019SAndroid Build Coastguard Worker 	loop1 = loop2 = 0;
1102*d83cc019SAndroid Build Coastguard Worker 	/* run 9 circle to test all mapping combination */
1103*d83cc019SAndroid Build Coastguard Worker 	while(loop1 < 2) {
1104*d83cc019SAndroid Build Coastguard Worker 		while(loop2 < 2) {
1105*d83cc019SAndroid Build Coastguard Worker 			/* allocate UC bo1for sDMA use */
1106*d83cc019SAndroid Build Coastguard Worker 			r = amdgpu_bo_alloc_and_map(device,
1107*d83cc019SAndroid Build Coastguard Worker 						    sdma_write_length, 4096,
1108*d83cc019SAndroid Build Coastguard Worker 						    AMDGPU_GEM_DOMAIN_GTT,
1109*d83cc019SAndroid Build Coastguard Worker 						    gtt_flags[loop1], &bo1,
1110*d83cc019SAndroid Build Coastguard Worker 						    (void**)&bo1_cpu, &bo1_mc,
1111*d83cc019SAndroid Build Coastguard Worker 						    &bo1_va_handle);
1112*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eq(r, 0);
1113*d83cc019SAndroid Build Coastguard Worker 
1114*d83cc019SAndroid Build Coastguard Worker 			/* set bo1 */
1115*d83cc019SAndroid Build Coastguard Worker 			memset((void*)bo1_cpu, 0xaa, sdma_write_length);
1116*d83cc019SAndroid Build Coastguard Worker 
1117*d83cc019SAndroid Build Coastguard Worker 			/* allocate UC bo2 for sDMA use */
1118*d83cc019SAndroid Build Coastguard Worker 			r = amdgpu_bo_alloc_and_map(device,
1119*d83cc019SAndroid Build Coastguard Worker 						    sdma_write_length, 4096,
1120*d83cc019SAndroid Build Coastguard Worker 						    AMDGPU_GEM_DOMAIN_GTT,
1121*d83cc019SAndroid Build Coastguard Worker 						    gtt_flags[loop2], &bo2,
1122*d83cc019SAndroid Build Coastguard Worker 						    (void**)&bo2_cpu, &bo2_mc,
1123*d83cc019SAndroid Build Coastguard Worker 						    &bo2_va_handle);
1124*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eq(r, 0);
1125*d83cc019SAndroid Build Coastguard Worker 
1126*d83cc019SAndroid Build Coastguard Worker 			/* clear bo2 */
1127*d83cc019SAndroid Build Coastguard Worker 			memset((void*)bo2_cpu, 0, sdma_write_length);
1128*d83cc019SAndroid Build Coastguard Worker 
1129*d83cc019SAndroid Build Coastguard Worker 			resources[0] = bo1;
1130*d83cc019SAndroid Build Coastguard Worker 			resources[1] = bo2;
1131*d83cc019SAndroid Build Coastguard Worker 
1132*d83cc019SAndroid Build Coastguard Worker 			/* fulfill PM4: test DMA copy linear */
1133*d83cc019SAndroid Build Coastguard Worker 			i = j = 0;
1134*d83cc019SAndroid Build Coastguard Worker 			if (ip_type == AMDGPU_HW_IP_DMA) {
1135*d83cc019SAndroid Build Coastguard Worker 				pm4[i++] = SDMA_PACKET(SDMA_OPCODE_COPY, SDMA_COPY_SUB_OPCODE_LINEAR, 0);
1136*d83cc019SAndroid Build Coastguard Worker 				if (gpu_info.family_id >= AMDGPU_FAMILY_AI)
1137*d83cc019SAndroid Build Coastguard Worker 					pm4[i++] = sdma_write_length - 1;
1138*d83cc019SAndroid Build Coastguard Worker 				else
1139*d83cc019SAndroid Build Coastguard Worker 					pm4[i++] = sdma_write_length;
1140*d83cc019SAndroid Build Coastguard Worker 				pm4[i++] = 0;
1141*d83cc019SAndroid Build Coastguard Worker 				pm4[i++] = 0xffffffff & bo1_mc;
1142*d83cc019SAndroid Build Coastguard Worker 				pm4[i++] = (0xffffffff00000000 & bo1_mc) >> 32;
1143*d83cc019SAndroid Build Coastguard Worker 				pm4[i++] = 0xffffffff & bo2_mc;
1144*d83cc019SAndroid Build Coastguard Worker 				pm4[i++] = (0xffffffff00000000 & bo2_mc) >> 32;
1145*d83cc019SAndroid Build Coastguard Worker 			} else if ((ip_type == AMDGPU_HW_IP_GFX) ||
1146*d83cc019SAndroid Build Coastguard Worker 				   (ip_type == AMDGPU_HW_IP_COMPUTE)) {
1147*d83cc019SAndroid Build Coastguard Worker 				pm4[i++] = PACKET3(PACKET3_DMA_DATA, 5);
1148*d83cc019SAndroid Build Coastguard Worker 				pm4[i++] = PACKET3_DMA_DATA_ENGINE(0) |
1149*d83cc019SAndroid Build Coastguard Worker 					PACKET3_DMA_DATA_DST_SEL(0) |
1150*d83cc019SAndroid Build Coastguard Worker 					PACKET3_DMA_DATA_SRC_SEL(0) |
1151*d83cc019SAndroid Build Coastguard Worker 					PACKET3_DMA_DATA_CP_SYNC;
1152*d83cc019SAndroid Build Coastguard Worker 				pm4[i++] = 0xfffffffc & bo1_mc;
1153*d83cc019SAndroid Build Coastguard Worker 				pm4[i++] = (0xffffffff00000000 & bo1_mc) >> 32;
1154*d83cc019SAndroid Build Coastguard Worker 				pm4[i++] = 0xfffffffc & bo2_mc;
1155*d83cc019SAndroid Build Coastguard Worker 				pm4[i++] = (0xffffffff00000000 & bo2_mc) >> 32;
1156*d83cc019SAndroid Build Coastguard Worker 				pm4[i++] = sdma_write_length;
1157*d83cc019SAndroid Build Coastguard Worker 			}
1158*d83cc019SAndroid Build Coastguard Worker 
1159*d83cc019SAndroid Build Coastguard Worker 			amdgpu_test_exec_cs_helper(context_handle,
1160*d83cc019SAndroid Build Coastguard Worker 						   ip_type, 0,
1161*d83cc019SAndroid Build Coastguard Worker 						   i, pm4,
1162*d83cc019SAndroid Build Coastguard Worker 						   2, resources,
1163*d83cc019SAndroid Build Coastguard Worker 						   ib_info, ibs_request);
1164*d83cc019SAndroid Build Coastguard Worker 
1165*d83cc019SAndroid Build Coastguard Worker 			/* verify if SDMA test result meets with expected */
1166*d83cc019SAndroid Build Coastguard Worker 			i = 0;
1167*d83cc019SAndroid Build Coastguard Worker 			while(i < sdma_write_length) {
1168*d83cc019SAndroid Build Coastguard Worker 				igt_assert_eq(bo2_cpu[i++], 0xaa);
1169*d83cc019SAndroid Build Coastguard Worker 			}
1170*d83cc019SAndroid Build Coastguard Worker 
1171*d83cc019SAndroid Build Coastguard Worker 			amdgpu_bo_unmap_and_free(bo1, bo1_va_handle, bo1_mc,
1172*d83cc019SAndroid Build Coastguard Worker 						 sdma_write_length);
1173*d83cc019SAndroid Build Coastguard Worker 			amdgpu_bo_unmap_and_free(bo2, bo2_va_handle, bo2_mc,
1174*d83cc019SAndroid Build Coastguard Worker 						 sdma_write_length);
1175*d83cc019SAndroid Build Coastguard Worker 			loop2++;
1176*d83cc019SAndroid Build Coastguard Worker 		}
1177*d83cc019SAndroid Build Coastguard Worker 		loop1++;
1178*d83cc019SAndroid Build Coastguard Worker 	}
1179*d83cc019SAndroid Build Coastguard Worker 	/* clean resources */
1180*d83cc019SAndroid Build Coastguard Worker 	free(resources);
1181*d83cc019SAndroid Build Coastguard Worker 	free(ibs_request);
1182*d83cc019SAndroid Build Coastguard Worker 	free(ib_info);
1183*d83cc019SAndroid Build Coastguard Worker 	free(pm4);
1184*d83cc019SAndroid Build Coastguard Worker 
1185*d83cc019SAndroid Build Coastguard Worker 	/* end of test */
1186*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_ctx_free(context_handle);
1187*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
1188*d83cc019SAndroid Build Coastguard Worker }
1189*d83cc019SAndroid Build Coastguard Worker 
amdgpu_command_submission_sdma_copy_linear(void)1190*d83cc019SAndroid Build Coastguard Worker static void amdgpu_command_submission_sdma_copy_linear(void)
1191*d83cc019SAndroid Build Coastguard Worker {
1192*d83cc019SAndroid Build Coastguard Worker 	amdgpu_command_submission_copy_linear_helper(AMDGPU_HW_IP_DMA);
1193*d83cc019SAndroid Build Coastguard Worker }
1194*d83cc019SAndroid Build Coastguard Worker 
amdgpu_command_submission_sdma(void)1195*d83cc019SAndroid Build Coastguard Worker static void amdgpu_command_submission_sdma(void)
1196*d83cc019SAndroid Build Coastguard Worker {
1197*d83cc019SAndroid Build Coastguard Worker 	amdgpu_command_submission_sdma_write_linear();
1198*d83cc019SAndroid Build Coastguard Worker 	amdgpu_command_submission_sdma_const_fill();
1199*d83cc019SAndroid Build Coastguard Worker 	amdgpu_command_submission_sdma_copy_linear();
1200*d83cc019SAndroid Build Coastguard Worker }
1201*d83cc019SAndroid Build Coastguard Worker 
amdgpu_command_submission_multi_fence_wait_all(bool wait_all)1202*d83cc019SAndroid Build Coastguard Worker static void amdgpu_command_submission_multi_fence_wait_all(bool wait_all)
1203*d83cc019SAndroid Build Coastguard Worker {
1204*d83cc019SAndroid Build Coastguard Worker 	amdgpu_context_handle context_handle;
1205*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_handle ib_result_handle, ib_result_ce_handle;
1206*d83cc019SAndroid Build Coastguard Worker 	void *ib_result_cpu, *ib_result_ce_cpu;
1207*d83cc019SAndroid Build Coastguard Worker 	uint64_t ib_result_mc_address, ib_result_ce_mc_address;
1208*d83cc019SAndroid Build Coastguard Worker 	struct amdgpu_cs_request ibs_request[2] = {};
1209*d83cc019SAndroid Build Coastguard Worker 	struct amdgpu_cs_ib_info ib_info[2];
1210*d83cc019SAndroid Build Coastguard Worker 	struct amdgpu_cs_fence fence_status[2] = {};
1211*d83cc019SAndroid Build Coastguard Worker 	uint32_t *ptr;
1212*d83cc019SAndroid Build Coastguard Worker 	uint32_t expired;
1213*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_list_handle bo_list;
1214*d83cc019SAndroid Build Coastguard Worker 	amdgpu_va_handle va_handle, va_handle_ce;
1215*d83cc019SAndroid Build Coastguard Worker 	int r;
1216*d83cc019SAndroid Build Coastguard Worker 	int i, ib_cs_num = 2;
1217*d83cc019SAndroid Build Coastguard Worker 
1218*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_ctx_create(device, &context_handle);
1219*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
1220*d83cc019SAndroid Build Coastguard Worker 
1221*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_bo_alloc_and_map(device, 4096, 4096,
1222*d83cc019SAndroid Build Coastguard Worker 				    AMDGPU_GEM_DOMAIN_GTT, 0,
1223*d83cc019SAndroid Build Coastguard Worker 				    &ib_result_handle, &ib_result_cpu,
1224*d83cc019SAndroid Build Coastguard Worker 				    &ib_result_mc_address, &va_handle);
1225*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
1226*d83cc019SAndroid Build Coastguard Worker 
1227*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_bo_alloc_and_map(device, 4096, 4096,
1228*d83cc019SAndroid Build Coastguard Worker 				    AMDGPU_GEM_DOMAIN_GTT, 0,
1229*d83cc019SAndroid Build Coastguard Worker 				    &ib_result_ce_handle, &ib_result_ce_cpu,
1230*d83cc019SAndroid Build Coastguard Worker 				    &ib_result_ce_mc_address, &va_handle_ce);
1231*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
1232*d83cc019SAndroid Build Coastguard Worker 
1233*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_get_bo_list(device, ib_result_handle,
1234*d83cc019SAndroid Build Coastguard Worker 			       ib_result_ce_handle, &bo_list);
1235*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
1236*d83cc019SAndroid Build Coastguard Worker 
1237*d83cc019SAndroid Build Coastguard Worker 	memset(ib_info, 0, 2 * sizeof(struct amdgpu_cs_ib_info));
1238*d83cc019SAndroid Build Coastguard Worker 
1239*d83cc019SAndroid Build Coastguard Worker 	/* IT_SET_CE_DE_COUNTERS */
1240*d83cc019SAndroid Build Coastguard Worker 	ptr = ib_result_ce_cpu;
1241*d83cc019SAndroid Build Coastguard Worker 	ptr[0] = 0xc0008900;
1242*d83cc019SAndroid Build Coastguard Worker 	ptr[1] = 0;
1243*d83cc019SAndroid Build Coastguard Worker 	ptr[2] = 0xc0008400;
1244*d83cc019SAndroid Build Coastguard Worker 	ptr[3] = 1;
1245*d83cc019SAndroid Build Coastguard Worker 	ib_info[0].ib_mc_address = ib_result_ce_mc_address;
1246*d83cc019SAndroid Build Coastguard Worker 	ib_info[0].size = 4;
1247*d83cc019SAndroid Build Coastguard Worker 	ib_info[0].flags = AMDGPU_IB_FLAG_CE;
1248*d83cc019SAndroid Build Coastguard Worker 
1249*d83cc019SAndroid Build Coastguard Worker 	/* IT_WAIT_ON_CE_COUNTER */
1250*d83cc019SAndroid Build Coastguard Worker 	ptr = ib_result_cpu;
1251*d83cc019SAndroid Build Coastguard Worker 	ptr[0] = 0xc0008600;
1252*d83cc019SAndroid Build Coastguard Worker 	ptr[1] = 0x00000001;
1253*d83cc019SAndroid Build Coastguard Worker 	ib_info[1].ib_mc_address = ib_result_mc_address;
1254*d83cc019SAndroid Build Coastguard Worker 	ib_info[1].size = 2;
1255*d83cc019SAndroid Build Coastguard Worker 
1256*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < ib_cs_num; i++) {
1257*d83cc019SAndroid Build Coastguard Worker 		ibs_request[i].ip_type = AMDGPU_HW_IP_GFX;
1258*d83cc019SAndroid Build Coastguard Worker 		ibs_request[i].number_of_ibs = 2;
1259*d83cc019SAndroid Build Coastguard Worker 		ibs_request[i].ibs = ib_info;
1260*d83cc019SAndroid Build Coastguard Worker 		ibs_request[i].resources = bo_list;
1261*d83cc019SAndroid Build Coastguard Worker 		ibs_request[i].fence_info.handle = NULL;
1262*d83cc019SAndroid Build Coastguard Worker 	}
1263*d83cc019SAndroid Build Coastguard Worker 
1264*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_submit(context_handle, 0,ibs_request, ib_cs_num);
1265*d83cc019SAndroid Build Coastguard Worker 
1266*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
1267*d83cc019SAndroid Build Coastguard Worker 
1268*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < ib_cs_num; i++) {
1269*d83cc019SAndroid Build Coastguard Worker 		fence_status[i].context = context_handle;
1270*d83cc019SAndroid Build Coastguard Worker 		fence_status[i].ip_type = AMDGPU_HW_IP_GFX;
1271*d83cc019SAndroid Build Coastguard Worker 		fence_status[i].fence = ibs_request[i].seq_no;
1272*d83cc019SAndroid Build Coastguard Worker 	}
1273*d83cc019SAndroid Build Coastguard Worker 
1274*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_wait_fences(fence_status, ib_cs_num, wait_all,
1275*d83cc019SAndroid Build Coastguard Worker 				  AMDGPU_TIMEOUT_INFINITE,
1276*d83cc019SAndroid Build Coastguard Worker 				  &expired, NULL);
1277*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
1278*d83cc019SAndroid Build Coastguard Worker 
1279*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_unmap_and_free(ib_result_handle, va_handle,
1280*d83cc019SAndroid Build Coastguard Worker 				 ib_result_mc_address, 4096);
1281*d83cc019SAndroid Build Coastguard Worker 
1282*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_unmap_and_free(ib_result_ce_handle, va_handle_ce,
1283*d83cc019SAndroid Build Coastguard Worker 				 ib_result_ce_mc_address, 4096);
1284*d83cc019SAndroid Build Coastguard Worker 
1285*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_bo_list_destroy(bo_list);
1286*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
1287*d83cc019SAndroid Build Coastguard Worker 
1288*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_ctx_free(context_handle);
1289*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
1290*d83cc019SAndroid Build Coastguard Worker }
1291*d83cc019SAndroid Build Coastguard Worker 
amdgpu_command_submission_multi_fence(void)1292*d83cc019SAndroid Build Coastguard Worker static void amdgpu_command_submission_multi_fence(void)
1293*d83cc019SAndroid Build Coastguard Worker {
1294*d83cc019SAndroid Build Coastguard Worker 	amdgpu_command_submission_multi_fence_wait_all(true);
1295*d83cc019SAndroid Build Coastguard Worker 	amdgpu_command_submission_multi_fence_wait_all(false);
1296*d83cc019SAndroid Build Coastguard Worker }
1297*d83cc019SAndroid Build Coastguard Worker 
amdgpu_userptr_test(void)1298*d83cc019SAndroid Build Coastguard Worker static void amdgpu_userptr_test(void)
1299*d83cc019SAndroid Build Coastguard Worker {
1300*d83cc019SAndroid Build Coastguard Worker 	int i, r, j;
1301*d83cc019SAndroid Build Coastguard Worker 	uint32_t *pm4 = NULL;
1302*d83cc019SAndroid Build Coastguard Worker 	uint64_t bo_mc;
1303*d83cc019SAndroid Build Coastguard Worker 	void *ptr = NULL;
1304*d83cc019SAndroid Build Coastguard Worker 	int pm4_dw = 256;
1305*d83cc019SAndroid Build Coastguard Worker 	int sdma_write_length = 4;
1306*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_handle handle;
1307*d83cc019SAndroid Build Coastguard Worker 	amdgpu_context_handle context_handle;
1308*d83cc019SAndroid Build Coastguard Worker 	struct amdgpu_cs_ib_info *ib_info;
1309*d83cc019SAndroid Build Coastguard Worker 	struct amdgpu_cs_request *ibs_request;
1310*d83cc019SAndroid Build Coastguard Worker 	amdgpu_bo_handle buf_handle;
1311*d83cc019SAndroid Build Coastguard Worker 	amdgpu_va_handle va_handle;
1312*d83cc019SAndroid Build Coastguard Worker 
1313*d83cc019SAndroid Build Coastguard Worker 	pm4 = calloc(pm4_dw, sizeof(*pm4));
1314*d83cc019SAndroid Build Coastguard Worker 	igt_assert(pm4);
1315*d83cc019SAndroid Build Coastguard Worker 
1316*d83cc019SAndroid Build Coastguard Worker 	ib_info = calloc(1, sizeof(*ib_info));
1317*d83cc019SAndroid Build Coastguard Worker 	igt_assert(ib_info);
1318*d83cc019SAndroid Build Coastguard Worker 
1319*d83cc019SAndroid Build Coastguard Worker 	ibs_request = calloc(1, sizeof(*ibs_request));
1320*d83cc019SAndroid Build Coastguard Worker 	igt_assert(ibs_request);
1321*d83cc019SAndroid Build Coastguard Worker 
1322*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_ctx_create(device, &context_handle);
1323*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
1324*d83cc019SAndroid Build Coastguard Worker 
1325*d83cc019SAndroid Build Coastguard Worker 	posix_memalign(&ptr, sysconf(_SC_PAGE_SIZE), BUFFER_SIZE);
1326*d83cc019SAndroid Build Coastguard Worker 	igt_assert(ptr);
1327*d83cc019SAndroid Build Coastguard Worker 	memset(ptr, 0, BUFFER_SIZE);
1328*d83cc019SAndroid Build Coastguard Worker 
1329*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_create_bo_from_user_mem(device,
1330*d83cc019SAndroid Build Coastguard Worker 					   ptr, BUFFER_SIZE, &buf_handle);
1331*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
1332*d83cc019SAndroid Build Coastguard Worker 
1333*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_va_range_alloc(device,
1334*d83cc019SAndroid Build Coastguard Worker 				  amdgpu_gpu_va_range_general,
1335*d83cc019SAndroid Build Coastguard Worker 				  BUFFER_SIZE, 1, 0, &bo_mc,
1336*d83cc019SAndroid Build Coastguard Worker 				  &va_handle, 0);
1337*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
1338*d83cc019SAndroid Build Coastguard Worker 
1339*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_bo_va_op(buf_handle, 0, BUFFER_SIZE, bo_mc, 0, AMDGPU_VA_OP_MAP);
1340*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
1341*d83cc019SAndroid Build Coastguard Worker 
1342*d83cc019SAndroid Build Coastguard Worker 	handle = buf_handle;
1343*d83cc019SAndroid Build Coastguard Worker 
1344*d83cc019SAndroid Build Coastguard Worker 	j = i = 0;
1345*d83cc019SAndroid Build Coastguard Worker 	pm4[i++] = SDMA_PACKET(SDMA_OPCODE_WRITE,
1346*d83cc019SAndroid Build Coastguard Worker 			       SDMA_WRITE_SUB_OPCODE_LINEAR, 0);
1347*d83cc019SAndroid Build Coastguard Worker 	pm4[i++] = 0xffffffff & bo_mc;
1348*d83cc019SAndroid Build Coastguard Worker 	pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32;
1349*d83cc019SAndroid Build Coastguard Worker 	pm4[i++] = sdma_write_length;
1350*d83cc019SAndroid Build Coastguard Worker 
1351*d83cc019SAndroid Build Coastguard Worker 	while (j++ < sdma_write_length)
1352*d83cc019SAndroid Build Coastguard Worker 		pm4[i++] = 0xdeadbeaf;
1353*d83cc019SAndroid Build Coastguard Worker 
1354*d83cc019SAndroid Build Coastguard Worker 	amdgpu_test_exec_cs_helper(context_handle,
1355*d83cc019SAndroid Build Coastguard Worker 				   AMDGPU_HW_IP_DMA, 0,
1356*d83cc019SAndroid Build Coastguard Worker 				   i, pm4,
1357*d83cc019SAndroid Build Coastguard Worker 				   1, &handle,
1358*d83cc019SAndroid Build Coastguard Worker 				   ib_info, ibs_request);
1359*d83cc019SAndroid Build Coastguard Worker 	i = 0;
1360*d83cc019SAndroid Build Coastguard Worker 	while (i < sdma_write_length) {
1361*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(((int*)ptr)[i++], 0xdeadbeaf);
1362*d83cc019SAndroid Build Coastguard Worker 	}
1363*d83cc019SAndroid Build Coastguard Worker 	free(ibs_request);
1364*d83cc019SAndroid Build Coastguard Worker 	free(ib_info);
1365*d83cc019SAndroid Build Coastguard Worker 	free(pm4);
1366*d83cc019SAndroid Build Coastguard Worker 
1367*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_bo_va_op(buf_handle, 0, BUFFER_SIZE, bo_mc, 0, AMDGPU_VA_OP_UNMAP);
1368*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
1369*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_va_range_free(va_handle);
1370*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
1371*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_bo_free(buf_handle);
1372*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
1373*d83cc019SAndroid Build Coastguard Worker 	free(ptr);
1374*d83cc019SAndroid Build Coastguard Worker 
1375*d83cc019SAndroid Build Coastguard Worker 	r = amdgpu_cs_ctx_free(context_handle);
1376*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(r, 0);
1377*d83cc019SAndroid Build Coastguard Worker }
1378*d83cc019SAndroid Build Coastguard Worker 
1379*d83cc019SAndroid Build Coastguard Worker igt_main
1380*d83cc019SAndroid Build Coastguard Worker {
1381*d83cc019SAndroid Build Coastguard Worker 	int fd = -1;
1382*d83cc019SAndroid Build Coastguard Worker 
1383*d83cc019SAndroid Build Coastguard Worker 	igt_fixture {
1384*d83cc019SAndroid Build Coastguard Worker 		uint32_t major, minor;
1385*d83cc019SAndroid Build Coastguard Worker 		int err;
1386*d83cc019SAndroid Build Coastguard Worker 
1387*d83cc019SAndroid Build Coastguard Worker 		fd = drm_open_driver(DRIVER_AMDGPU);
1388*d83cc019SAndroid Build Coastguard Worker 
1389*d83cc019SAndroid Build Coastguard Worker 		err = amdgpu_device_initialize(fd, &major, &minor, &device);
1390*d83cc019SAndroid Build Coastguard Worker 		igt_require(err == 0);
1391*d83cc019SAndroid Build Coastguard Worker 
1392*d83cc019SAndroid Build Coastguard Worker 		igt_info("Initialized amdgpu, driver version %d.%d\n",
1393*d83cc019SAndroid Build Coastguard Worker 			 major, minor);
1394*d83cc019SAndroid Build Coastguard Worker 	}
1395*d83cc019SAndroid Build Coastguard Worker 
1396*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("query-info")
1397*d83cc019SAndroid Build Coastguard Worker 		amdgpu_query_info_test();
1398*d83cc019SAndroid Build Coastguard Worker 
1399*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("memory-alloc")
1400*d83cc019SAndroid Build Coastguard Worker 		amdgpu_memory_alloc();
1401*d83cc019SAndroid Build Coastguard Worker 
1402*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("userptr")
1403*d83cc019SAndroid Build Coastguard Worker 		amdgpu_userptr_test();
1404*d83cc019SAndroid Build Coastguard Worker 
1405*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("cs-gfx")
1406*d83cc019SAndroid Build Coastguard Worker 		amdgpu_command_submission_gfx();
1407*d83cc019SAndroid Build Coastguard Worker 
1408*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("cs-compute")
1409*d83cc019SAndroid Build Coastguard Worker 		amdgpu_command_submission_compute();
1410*d83cc019SAndroid Build Coastguard Worker 
1411*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("cs-multi-fence")
1412*d83cc019SAndroid Build Coastguard Worker 		amdgpu_command_submission_multi_fence();
1413*d83cc019SAndroid Build Coastguard Worker 
1414*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("cs-sdma")
1415*d83cc019SAndroid Build Coastguard Worker 		amdgpu_command_submission_sdma();
1416*d83cc019SAndroid Build Coastguard Worker 
1417*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("semaphore")
1418*d83cc019SAndroid Build Coastguard Worker 		amdgpu_semaphore_test();
1419*d83cc019SAndroid Build Coastguard Worker 
1420*d83cc019SAndroid Build Coastguard Worker 	igt_fixture {
1421*d83cc019SAndroid Build Coastguard Worker 		amdgpu_device_deinitialize(device);
1422*d83cc019SAndroid Build Coastguard Worker 		close(fd);
1423*d83cc019SAndroid Build Coastguard Worker 	}
1424*d83cc019SAndroid Build Coastguard Worker }
1425