1*7688df22SAndroid Build Coastguard Worker /*
2*7688df22SAndroid Build Coastguard Worker * Copyright 2014 Advanced Micro Devices, Inc.
3*7688df22SAndroid Build Coastguard Worker *
4*7688df22SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
5*7688df22SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
6*7688df22SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
7*7688df22SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*7688df22SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
9*7688df22SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
10*7688df22SAndroid Build Coastguard Worker *
11*7688df22SAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included in
12*7688df22SAndroid Build Coastguard Worker * all copies or substantial portions of the Software.
13*7688df22SAndroid Build Coastguard Worker *
14*7688df22SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15*7688df22SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*7688df22SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17*7688df22SAndroid Build Coastguard Worker * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18*7688df22SAndroid Build Coastguard Worker * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19*7688df22SAndroid Build Coastguard Worker * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20*7688df22SAndroid Build Coastguard Worker * OTHER DEALINGS IN THE SOFTWARE.
21*7688df22SAndroid Build Coastguard Worker *
22*7688df22SAndroid Build Coastguard Worker */
23*7688df22SAndroid Build Coastguard Worker
24*7688df22SAndroid Build Coastguard Worker #include <stdio.h>
25*7688df22SAndroid Build Coastguard Worker #include <stdlib.h>
26*7688df22SAndroid Build Coastguard Worker #include <unistd.h>
27*7688df22SAndroid Build Coastguard Worker #include <sys/types.h>
28*7688df22SAndroid Build Coastguard Worker #ifdef MAJOR_IN_SYSMACROS
29*7688df22SAndroid Build Coastguard Worker #include <sys/sysmacros.h>
30*7688df22SAndroid Build Coastguard Worker #endif
31*7688df22SAndroid Build Coastguard Worker #include <sys/stat.h>
32*7688df22SAndroid Build Coastguard Worker #include <fcntl.h>
33*7688df22SAndroid Build Coastguard Worker #if HAVE_ALLOCA_H
34*7688df22SAndroid Build Coastguard Worker # include <alloca.h>
35*7688df22SAndroid Build Coastguard Worker #endif
36*7688df22SAndroid Build Coastguard Worker #include <sys/wait.h>
37*7688df22SAndroid Build Coastguard Worker
38*7688df22SAndroid Build Coastguard Worker #include "CUnit/Basic.h"
39*7688df22SAndroid Build Coastguard Worker
40*7688df22SAndroid Build Coastguard Worker #include "amdgpu_test.h"
41*7688df22SAndroid Build Coastguard Worker #include "amdgpu_drm.h"
42*7688df22SAndroid Build Coastguard Worker #include "amdgpu_internal.h"
43*7688df22SAndroid Build Coastguard Worker #include "util_math.h"
44*7688df22SAndroid Build Coastguard Worker
45*7688df22SAndroid Build Coastguard Worker static amdgpu_device_handle device_handle;
46*7688df22SAndroid Build Coastguard Worker static uint32_t major_version;
47*7688df22SAndroid Build Coastguard Worker static uint32_t minor_version;
48*7688df22SAndroid Build Coastguard Worker static uint32_t family_id;
49*7688df22SAndroid Build Coastguard Worker static uint32_t chip_id;
50*7688df22SAndroid Build Coastguard Worker static uint32_t chip_rev;
51*7688df22SAndroid Build Coastguard Worker
52*7688df22SAndroid Build Coastguard Worker static void amdgpu_query_info_test(void);
53*7688df22SAndroid Build Coastguard Worker static void amdgpu_command_submission_gfx(void);
54*7688df22SAndroid Build Coastguard Worker static void amdgpu_command_submission_compute(void);
55*7688df22SAndroid Build Coastguard Worker static void amdgpu_command_submission_multi_fence(void);
56*7688df22SAndroid Build Coastguard Worker static void amdgpu_command_submission_sdma(void);
57*7688df22SAndroid Build Coastguard Worker static void amdgpu_userptr_test(void);
58*7688df22SAndroid Build Coastguard Worker static void amdgpu_semaphore_test(void);
59*7688df22SAndroid Build Coastguard Worker static void amdgpu_sync_dependency_test(void);
60*7688df22SAndroid Build Coastguard Worker static void amdgpu_bo_eviction_test(void);
61*7688df22SAndroid Build Coastguard Worker static void amdgpu_compute_dispatch_test(void);
62*7688df22SAndroid Build Coastguard Worker static void amdgpu_gfx_dispatch_test(void);
63*7688df22SAndroid Build Coastguard Worker static void amdgpu_draw_test(void);
64*7688df22SAndroid Build Coastguard Worker static void amdgpu_gpu_reset_test(void);
65*7688df22SAndroid Build Coastguard Worker static void amdgpu_stable_pstate_test(void);
66*7688df22SAndroid Build Coastguard Worker
67*7688df22SAndroid Build Coastguard Worker static void amdgpu_command_submission_write_linear_helper(unsigned ip_type);
68*7688df22SAndroid Build Coastguard Worker static void amdgpu_command_submission_const_fill_helper(unsigned ip_type);
69*7688df22SAndroid Build Coastguard Worker static void amdgpu_command_submission_copy_linear_helper(unsigned ip_type);
70*7688df22SAndroid Build Coastguard Worker static void amdgpu_test_exec_cs_helper(amdgpu_context_handle context_handle,
71*7688df22SAndroid Build Coastguard Worker unsigned ip_type,
72*7688df22SAndroid Build Coastguard Worker int instance, int pm4_dw, uint32_t *pm4_src,
73*7688df22SAndroid Build Coastguard Worker int res_cnt, amdgpu_bo_handle *resources,
74*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_ib_info *ib_info,
75*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_request *ibs_request);
76*7688df22SAndroid Build Coastguard Worker
77*7688df22SAndroid Build Coastguard Worker CU_TestInfo basic_tests[] = {
78*7688df22SAndroid Build Coastguard Worker { "Query Info Test", amdgpu_query_info_test },
79*7688df22SAndroid Build Coastguard Worker { "Userptr Test", amdgpu_userptr_test },
80*7688df22SAndroid Build Coastguard Worker { "bo eviction Test", amdgpu_bo_eviction_test },
81*7688df22SAndroid Build Coastguard Worker { "Command submission Test (GFX)", amdgpu_command_submission_gfx },
82*7688df22SAndroid Build Coastguard Worker { "Command submission Test (Compute)", amdgpu_command_submission_compute },
83*7688df22SAndroid Build Coastguard Worker { "Command submission Test (Multi-Fence)", amdgpu_command_submission_multi_fence },
84*7688df22SAndroid Build Coastguard Worker { "Command submission Test (SDMA)", amdgpu_command_submission_sdma },
85*7688df22SAndroid Build Coastguard Worker { "SW semaphore Test", amdgpu_semaphore_test },
86*7688df22SAndroid Build Coastguard Worker { "Sync dependency Test", amdgpu_sync_dependency_test },
87*7688df22SAndroid Build Coastguard Worker { "Dispatch Test (Compute)", amdgpu_compute_dispatch_test },
88*7688df22SAndroid Build Coastguard Worker { "Dispatch Test (GFX)", amdgpu_gfx_dispatch_test },
89*7688df22SAndroid Build Coastguard Worker { "Draw Test", amdgpu_draw_test },
90*7688df22SAndroid Build Coastguard Worker { "GPU reset Test", amdgpu_gpu_reset_test },
91*7688df22SAndroid Build Coastguard Worker { "Stable pstate Test", amdgpu_stable_pstate_test },
92*7688df22SAndroid Build Coastguard Worker CU_TEST_INFO_NULL,
93*7688df22SAndroid Build Coastguard Worker };
94*7688df22SAndroid Build Coastguard Worker #define BUFFER_SIZE (MAX2(8 * 1024, getpagesize()))
95*7688df22SAndroid Build Coastguard Worker #define SDMA_PKT_HEADER_op_offset 0
96*7688df22SAndroid Build Coastguard Worker #define SDMA_PKT_HEADER_op_mask 0x000000FF
97*7688df22SAndroid Build Coastguard Worker #define SDMA_PKT_HEADER_op_shift 0
98*7688df22SAndroid Build Coastguard Worker #define SDMA_PKT_HEADER_OP(x) (((x) & SDMA_PKT_HEADER_op_mask) << SDMA_PKT_HEADER_op_shift)
99*7688df22SAndroid Build Coastguard Worker #define SDMA_OPCODE_CONSTANT_FILL 11
100*7688df22SAndroid Build Coastguard Worker # define SDMA_CONSTANT_FILL_EXTRA_SIZE(x) ((x) << 14)
101*7688df22SAndroid Build Coastguard Worker /* 0 = byte fill
102*7688df22SAndroid Build Coastguard Worker * 2 = DW fill
103*7688df22SAndroid Build Coastguard Worker */
104*7688df22SAndroid Build Coastguard Worker #define SDMA_PACKET(op, sub_op, e) ((((e) & 0xFFFF) << 16) | \
105*7688df22SAndroid Build Coastguard Worker (((sub_op) & 0xFF) << 8) | \
106*7688df22SAndroid Build Coastguard Worker (((op) & 0xFF) << 0))
107*7688df22SAndroid Build Coastguard Worker #define SDMA_OPCODE_WRITE 2
108*7688df22SAndroid Build Coastguard Worker # define SDMA_WRITE_SUB_OPCODE_LINEAR 0
109*7688df22SAndroid Build Coastguard Worker # define SDMA_WRTIE_SUB_OPCODE_TILED 1
110*7688df22SAndroid Build Coastguard Worker
111*7688df22SAndroid Build Coastguard Worker #define SDMA_OPCODE_COPY 1
112*7688df22SAndroid Build Coastguard Worker # define SDMA_COPY_SUB_OPCODE_LINEAR 0
113*7688df22SAndroid Build Coastguard Worker
114*7688df22SAndroid Build Coastguard Worker #define SDMA_OPCODE_ATOMIC 10
115*7688df22SAndroid Build Coastguard Worker # define SDMA_ATOMIC_LOOP(x) ((x) << 0)
116*7688df22SAndroid Build Coastguard Worker /* 0 - single_pass_atomic.
117*7688df22SAndroid Build Coastguard Worker * 1 - loop_until_compare_satisfied.
118*7688df22SAndroid Build Coastguard Worker */
119*7688df22SAndroid Build Coastguard Worker # define SDMA_ATOMIC_TMZ(x) ((x) << 2)
120*7688df22SAndroid Build Coastguard Worker /* 0 - non-TMZ.
121*7688df22SAndroid Build Coastguard Worker * 1 - TMZ.
122*7688df22SAndroid Build Coastguard Worker */
123*7688df22SAndroid Build Coastguard Worker # define SDMA_ATOMIC_OPCODE(x) ((x) << 9)
124*7688df22SAndroid Build Coastguard Worker /* TC_OP_ATOMIC_CMPSWAP_RTN_32 0x00000008
125*7688df22SAndroid Build Coastguard Worker * same as Packet 3
126*7688df22SAndroid Build Coastguard Worker */
127*7688df22SAndroid Build Coastguard Worker
128*7688df22SAndroid Build Coastguard Worker #define GFX_COMPUTE_NOP 0xffff1000
129*7688df22SAndroid Build Coastguard Worker #define SDMA_NOP 0x0
130*7688df22SAndroid Build Coastguard Worker
131*7688df22SAndroid Build Coastguard Worker /* PM4 */
132*7688df22SAndroid Build Coastguard Worker #define PACKET_TYPE0 0
133*7688df22SAndroid Build Coastguard Worker #define PACKET_TYPE1 1
134*7688df22SAndroid Build Coastguard Worker #define PACKET_TYPE2 2
135*7688df22SAndroid Build Coastguard Worker #define PACKET_TYPE3 3
136*7688df22SAndroid Build Coastguard Worker
137*7688df22SAndroid Build Coastguard Worker #define CP_PACKET_GET_TYPE(h) (((h) >> 30) & 3)
138*7688df22SAndroid Build Coastguard Worker #define CP_PACKET_GET_COUNT(h) (((h) >> 16) & 0x3FFF)
139*7688df22SAndroid Build Coastguard Worker #define CP_PACKET0_GET_REG(h) ((h) & 0xFFFF)
140*7688df22SAndroid Build Coastguard Worker #define CP_PACKET3_GET_OPCODE(h) (((h) >> 8) & 0xFF)
141*7688df22SAndroid Build Coastguard Worker #define PACKET0(reg, n) ((PACKET_TYPE0 << 30) | \
142*7688df22SAndroid Build Coastguard Worker ((reg) & 0xFFFF) | \
143*7688df22SAndroid Build Coastguard Worker ((n) & 0x3FFF) << 16)
144*7688df22SAndroid Build Coastguard Worker #define CP_PACKET2 0x80000000
145*7688df22SAndroid Build Coastguard Worker #define PACKET2_PAD_SHIFT 0
146*7688df22SAndroid Build Coastguard Worker #define PACKET2_PAD_MASK (0x3fffffff << 0)
147*7688df22SAndroid Build Coastguard Worker
148*7688df22SAndroid Build Coastguard Worker #define PACKET2(v) (CP_PACKET2 | REG_SET(PACKET2_PAD, (v)))
149*7688df22SAndroid Build Coastguard Worker
150*7688df22SAndroid Build Coastguard Worker #define PACKET3(op, n) ((PACKET_TYPE3 << 30) | \
151*7688df22SAndroid Build Coastguard Worker (((op) & 0xFF) << 8) | \
152*7688df22SAndroid Build Coastguard Worker ((n) & 0x3FFF) << 16)
153*7688df22SAndroid Build Coastguard Worker #define PACKET3_COMPUTE(op, n) PACKET3(op, n) | (1 << 1)
154*7688df22SAndroid Build Coastguard Worker
155*7688df22SAndroid Build Coastguard Worker /* Packet 3 types */
156*7688df22SAndroid Build Coastguard Worker #define PACKET3_NOP 0x10
157*7688df22SAndroid Build Coastguard Worker
158*7688df22SAndroid Build Coastguard Worker #define PACKET3_WRITE_DATA 0x37
159*7688df22SAndroid Build Coastguard Worker #define WRITE_DATA_DST_SEL(x) ((x) << 8)
160*7688df22SAndroid Build Coastguard Worker /* 0 - register
161*7688df22SAndroid Build Coastguard Worker * 1 - memory (sync - via GRBM)
162*7688df22SAndroid Build Coastguard Worker * 2 - gl2
163*7688df22SAndroid Build Coastguard Worker * 3 - gds
164*7688df22SAndroid Build Coastguard Worker * 4 - reserved
165*7688df22SAndroid Build Coastguard Worker * 5 - memory (async - direct)
166*7688df22SAndroid Build Coastguard Worker */
167*7688df22SAndroid Build Coastguard Worker #define WR_ONE_ADDR (1 << 16)
168*7688df22SAndroid Build Coastguard Worker #define WR_CONFIRM (1 << 20)
169*7688df22SAndroid Build Coastguard Worker #define WRITE_DATA_CACHE_POLICY(x) ((x) << 25)
170*7688df22SAndroid Build Coastguard Worker /* 0 - LRU
171*7688df22SAndroid Build Coastguard Worker * 1 - Stream
172*7688df22SAndroid Build Coastguard Worker */
173*7688df22SAndroid Build Coastguard Worker #define WRITE_DATA_ENGINE_SEL(x) ((x) << 30)
174*7688df22SAndroid Build Coastguard Worker /* 0 - me
175*7688df22SAndroid Build Coastguard Worker * 1 - pfp
176*7688df22SAndroid Build Coastguard Worker * 2 - ce
177*7688df22SAndroid Build Coastguard Worker */
178*7688df22SAndroid Build Coastguard Worker
179*7688df22SAndroid Build Coastguard Worker #define PACKET3_ATOMIC_MEM 0x1E
180*7688df22SAndroid Build Coastguard Worker #define TC_OP_ATOMIC_CMPSWAP_RTN_32 0x00000008
181*7688df22SAndroid Build Coastguard Worker #define ATOMIC_MEM_COMMAND(x) ((x) << 8)
182*7688df22SAndroid Build Coastguard Worker /* 0 - single_pass_atomic.
183*7688df22SAndroid Build Coastguard Worker * 1 - loop_until_compare_satisfied.
184*7688df22SAndroid Build Coastguard Worker */
185*7688df22SAndroid Build Coastguard Worker #define ATOMIC_MEM_CACHEPOLICAY(x) ((x) << 25)
186*7688df22SAndroid Build Coastguard Worker /* 0 - lru.
187*7688df22SAndroid Build Coastguard Worker * 1 - stream.
188*7688df22SAndroid Build Coastguard Worker */
189*7688df22SAndroid Build Coastguard Worker #define ATOMIC_MEM_ENGINESEL(x) ((x) << 30)
190*7688df22SAndroid Build Coastguard Worker /* 0 - micro_engine.
191*7688df22SAndroid Build Coastguard Worker */
192*7688df22SAndroid Build Coastguard Worker
193*7688df22SAndroid Build Coastguard Worker #define PACKET3_DMA_DATA 0x50
194*7688df22SAndroid Build Coastguard Worker /* 1. header
195*7688df22SAndroid Build Coastguard Worker * 2. CONTROL
196*7688df22SAndroid Build Coastguard Worker * 3. SRC_ADDR_LO or DATA [31:0]
197*7688df22SAndroid Build Coastguard Worker * 4. SRC_ADDR_HI [31:0]
198*7688df22SAndroid Build Coastguard Worker * 5. DST_ADDR_LO [31:0]
199*7688df22SAndroid Build Coastguard Worker * 6. DST_ADDR_HI [7:0]
200*7688df22SAndroid Build Coastguard Worker * 7. COMMAND [30:21] | BYTE_COUNT [20:0]
201*7688df22SAndroid Build Coastguard Worker */
202*7688df22SAndroid Build Coastguard Worker /* CONTROL */
203*7688df22SAndroid Build Coastguard Worker # define PACKET3_DMA_DATA_ENGINE(x) ((x) << 0)
204*7688df22SAndroid Build Coastguard Worker /* 0 - ME
205*7688df22SAndroid Build Coastguard Worker * 1 - PFP
206*7688df22SAndroid Build Coastguard Worker */
207*7688df22SAndroid Build Coastguard Worker # define PACKET3_DMA_DATA_SRC_CACHE_POLICY(x) ((x) << 13)
208*7688df22SAndroid Build Coastguard Worker /* 0 - LRU
209*7688df22SAndroid Build Coastguard Worker * 1 - Stream
210*7688df22SAndroid Build Coastguard Worker * 2 - Bypass
211*7688df22SAndroid Build Coastguard Worker */
212*7688df22SAndroid Build Coastguard Worker # define PACKET3_DMA_DATA_SRC_VOLATILE (1 << 15)
213*7688df22SAndroid Build Coastguard Worker # define PACKET3_DMA_DATA_DST_SEL(x) ((x) << 20)
214*7688df22SAndroid Build Coastguard Worker /* 0 - DST_ADDR using DAS
215*7688df22SAndroid Build Coastguard Worker * 1 - GDS
216*7688df22SAndroid Build Coastguard Worker * 3 - DST_ADDR using L2
217*7688df22SAndroid Build Coastguard Worker */
218*7688df22SAndroid Build Coastguard Worker # define PACKET3_DMA_DATA_DST_CACHE_POLICY(x) ((x) << 25)
219*7688df22SAndroid Build Coastguard Worker /* 0 - LRU
220*7688df22SAndroid Build Coastguard Worker * 1 - Stream
221*7688df22SAndroid Build Coastguard Worker * 2 - Bypass
222*7688df22SAndroid Build Coastguard Worker */
223*7688df22SAndroid Build Coastguard Worker # define PACKET3_DMA_DATA_DST_VOLATILE (1 << 27)
224*7688df22SAndroid Build Coastguard Worker # define PACKET3_DMA_DATA_SRC_SEL(x) ((x) << 29)
225*7688df22SAndroid Build Coastguard Worker /* 0 - SRC_ADDR using SAS
226*7688df22SAndroid Build Coastguard Worker * 1 - GDS
227*7688df22SAndroid Build Coastguard Worker * 2 - DATA
228*7688df22SAndroid Build Coastguard Worker * 3 - SRC_ADDR using L2
229*7688df22SAndroid Build Coastguard Worker */
230*7688df22SAndroid Build Coastguard Worker # define PACKET3_DMA_DATA_CP_SYNC (1 << 31)
231*7688df22SAndroid Build Coastguard Worker /* COMMAND */
232*7688df22SAndroid Build Coastguard Worker # define PACKET3_DMA_DATA_DIS_WC (1 << 21)
233*7688df22SAndroid Build Coastguard Worker # define PACKET3_DMA_DATA_CMD_SRC_SWAP(x) ((x) << 22)
234*7688df22SAndroid Build Coastguard Worker /* 0 - none
235*7688df22SAndroid Build Coastguard Worker * 1 - 8 in 16
236*7688df22SAndroid Build Coastguard Worker * 2 - 8 in 32
237*7688df22SAndroid Build Coastguard Worker * 3 - 8 in 64
238*7688df22SAndroid Build Coastguard Worker */
239*7688df22SAndroid Build Coastguard Worker # define PACKET3_DMA_DATA_CMD_DST_SWAP(x) ((x) << 24)
240*7688df22SAndroid Build Coastguard Worker /* 0 - none
241*7688df22SAndroid Build Coastguard Worker * 1 - 8 in 16
242*7688df22SAndroid Build Coastguard Worker * 2 - 8 in 32
243*7688df22SAndroid Build Coastguard Worker * 3 - 8 in 64
244*7688df22SAndroid Build Coastguard Worker */
245*7688df22SAndroid Build Coastguard Worker # define PACKET3_DMA_DATA_CMD_SAS (1 << 26)
246*7688df22SAndroid Build Coastguard Worker /* 0 - memory
247*7688df22SAndroid Build Coastguard Worker * 1 - register
248*7688df22SAndroid Build Coastguard Worker */
249*7688df22SAndroid Build Coastguard Worker # define PACKET3_DMA_DATA_CMD_DAS (1 << 27)
250*7688df22SAndroid Build Coastguard Worker /* 0 - memory
251*7688df22SAndroid Build Coastguard Worker * 1 - register
252*7688df22SAndroid Build Coastguard Worker */
253*7688df22SAndroid Build Coastguard Worker # define PACKET3_DMA_DATA_CMD_SAIC (1 << 28)
254*7688df22SAndroid Build Coastguard Worker # define PACKET3_DMA_DATA_CMD_DAIC (1 << 29)
255*7688df22SAndroid Build Coastguard Worker # define PACKET3_DMA_DATA_CMD_RAW_WAIT (1 << 30)
256*7688df22SAndroid Build Coastguard Worker
257*7688df22SAndroid Build Coastguard Worker #define SDMA_PACKET_SI(op, b, t, s, cnt) ((((op) & 0xF) << 28) | \
258*7688df22SAndroid Build Coastguard Worker (((b) & 0x1) << 26) | \
259*7688df22SAndroid Build Coastguard Worker (((t) & 0x1) << 23) | \
260*7688df22SAndroid Build Coastguard Worker (((s) & 0x1) << 22) | \
261*7688df22SAndroid Build Coastguard Worker (((cnt) & 0xFFFFF) << 0))
262*7688df22SAndroid Build Coastguard Worker #define SDMA_OPCODE_COPY_SI 3
263*7688df22SAndroid Build Coastguard Worker #define SDMA_OPCODE_CONSTANT_FILL_SI 13
264*7688df22SAndroid Build Coastguard Worker #define SDMA_NOP_SI 0xf
265*7688df22SAndroid Build Coastguard Worker #define GFX_COMPUTE_NOP_SI 0x80000000
266*7688df22SAndroid Build Coastguard Worker #define PACKET3_DMA_DATA_SI 0x41
267*7688df22SAndroid Build Coastguard Worker # define PACKET3_DMA_DATA_SI_ENGINE(x) ((x) << 27)
268*7688df22SAndroid Build Coastguard Worker /* 0 - ME
269*7688df22SAndroid Build Coastguard Worker * 1 - PFP
270*7688df22SAndroid Build Coastguard Worker */
271*7688df22SAndroid Build Coastguard Worker # define PACKET3_DMA_DATA_SI_DST_SEL(x) ((x) << 20)
272*7688df22SAndroid Build Coastguard Worker /* 0 - DST_ADDR using DAS
273*7688df22SAndroid Build Coastguard Worker * 1 - GDS
274*7688df22SAndroid Build Coastguard Worker * 3 - DST_ADDR using L2
275*7688df22SAndroid Build Coastguard Worker */
276*7688df22SAndroid Build Coastguard Worker # define PACKET3_DMA_DATA_SI_SRC_SEL(x) ((x) << 29)
277*7688df22SAndroid Build Coastguard Worker /* 0 - SRC_ADDR using SAS
278*7688df22SAndroid Build Coastguard Worker * 1 - GDS
279*7688df22SAndroid Build Coastguard Worker * 2 - DATA
280*7688df22SAndroid Build Coastguard Worker * 3 - SRC_ADDR using L2
281*7688df22SAndroid Build Coastguard Worker */
282*7688df22SAndroid Build Coastguard Worker # define PACKET3_DMA_DATA_SI_CP_SYNC (1 << 31)
283*7688df22SAndroid Build Coastguard Worker
284*7688df22SAndroid Build Coastguard Worker
285*7688df22SAndroid Build Coastguard Worker #define PKT3_CONTEXT_CONTROL 0x28
286*7688df22SAndroid Build Coastguard Worker #define CONTEXT_CONTROL_LOAD_ENABLE(x) (((unsigned)(x) & 0x1) << 31)
287*7688df22SAndroid Build Coastguard Worker #define CONTEXT_CONTROL_LOAD_CE_RAM(x) (((unsigned)(x) & 0x1) << 28)
288*7688df22SAndroid Build Coastguard Worker #define CONTEXT_CONTROL_SHADOW_ENABLE(x) (((unsigned)(x) & 0x1) << 31)
289*7688df22SAndroid Build Coastguard Worker
290*7688df22SAndroid Build Coastguard Worker #define PKT3_CLEAR_STATE 0x12
291*7688df22SAndroid Build Coastguard Worker
292*7688df22SAndroid Build Coastguard Worker #define PKT3_SET_SH_REG 0x76
293*7688df22SAndroid Build Coastguard Worker #define PACKET3_SET_SH_REG_START 0x00002c00
294*7688df22SAndroid Build Coastguard Worker
295*7688df22SAndroid Build Coastguard Worker #define PKT3_SET_SH_REG_INDEX 0x9B
296*7688df22SAndroid Build Coastguard Worker
297*7688df22SAndroid Build Coastguard Worker #define PACKET3_DISPATCH_DIRECT 0x15
298*7688df22SAndroid Build Coastguard Worker #define PACKET3_EVENT_WRITE 0x46
299*7688df22SAndroid Build Coastguard Worker #define PACKET3_ACQUIRE_MEM 0x58
300*7688df22SAndroid Build Coastguard Worker #define PACKET3_SET_CONTEXT_REG 0x69
301*7688df22SAndroid Build Coastguard Worker #define PACKET3_SET_UCONFIG_REG 0x79
302*7688df22SAndroid Build Coastguard Worker #define PACKET3_DRAW_INDEX_AUTO 0x2D
303*7688df22SAndroid Build Coastguard Worker /* gfx 8 */
304*7688df22SAndroid Build Coastguard Worker #define mmCOMPUTE_PGM_LO 0x2e0c
305*7688df22SAndroid Build Coastguard Worker #define mmCOMPUTE_PGM_RSRC1 0x2e12
306*7688df22SAndroid Build Coastguard Worker #define mmCOMPUTE_TMPRING_SIZE 0x2e18
307*7688df22SAndroid Build Coastguard Worker #define mmCOMPUTE_USER_DATA_0 0x2e40
308*7688df22SAndroid Build Coastguard Worker #define mmCOMPUTE_USER_DATA_1 0x2e41
309*7688df22SAndroid Build Coastguard Worker #define mmCOMPUTE_RESOURCE_LIMITS 0x2e15
310*7688df22SAndroid Build Coastguard Worker #define mmCOMPUTE_NUM_THREAD_X 0x2e07
311*7688df22SAndroid Build Coastguard Worker
312*7688df22SAndroid Build Coastguard Worker
313*7688df22SAndroid Build Coastguard Worker
314*7688df22SAndroid Build Coastguard Worker #define SWAP_32(num) (((num & 0xff000000) >> 24) | \
315*7688df22SAndroid Build Coastguard Worker ((num & 0x0000ff00) << 8) | \
316*7688df22SAndroid Build Coastguard Worker ((num & 0x00ff0000) >> 8) | \
317*7688df22SAndroid Build Coastguard Worker ((num & 0x000000ff) << 24))
318*7688df22SAndroid Build Coastguard Worker
319*7688df22SAndroid Build Coastguard Worker
320*7688df22SAndroid Build Coastguard Worker /* Shader code
321*7688df22SAndroid Build Coastguard Worker * void main()
322*7688df22SAndroid Build Coastguard Worker {
323*7688df22SAndroid Build Coastguard Worker
324*7688df22SAndroid Build Coastguard Worker float x = some_input;
325*7688df22SAndroid Build Coastguard Worker for (unsigned i = 0; i < 1000000; i++)
326*7688df22SAndroid Build Coastguard Worker x = sin(x);
327*7688df22SAndroid Build Coastguard Worker
328*7688df22SAndroid Build Coastguard Worker u[0] = 42u;
329*7688df22SAndroid Build Coastguard Worker }
330*7688df22SAndroid Build Coastguard Worker */
331*7688df22SAndroid Build Coastguard Worker
332*7688df22SAndroid Build Coastguard Worker static uint32_t shader_bin[] = {
333*7688df22SAndroid Build Coastguard Worker SWAP_32(0x800082be), SWAP_32(0x02ff08bf), SWAP_32(0x7f969800), SWAP_32(0x040085bf),
334*7688df22SAndroid Build Coastguard Worker SWAP_32(0x02810281), SWAP_32(0x02ff08bf), SWAP_32(0x7f969800), SWAP_32(0xfcff84bf),
335*7688df22SAndroid Build Coastguard Worker SWAP_32(0xff0083be), SWAP_32(0x00f00000), SWAP_32(0xc10082be), SWAP_32(0xaa02007e),
336*7688df22SAndroid Build Coastguard Worker SWAP_32(0x000070e0), SWAP_32(0x00000080), SWAP_32(0x000081bf)
337*7688df22SAndroid Build Coastguard Worker };
338*7688df22SAndroid Build Coastguard Worker
339*7688df22SAndroid Build Coastguard Worker #define CODE_OFFSET 512
340*7688df22SAndroid Build Coastguard Worker #define DATA_OFFSET 1024
341*7688df22SAndroid Build Coastguard Worker
342*7688df22SAndroid Build Coastguard Worker enum cs_type {
343*7688df22SAndroid Build Coastguard Worker CS_BUFFERCLEAR,
344*7688df22SAndroid Build Coastguard Worker CS_BUFFERCOPY,
345*7688df22SAndroid Build Coastguard Worker CS_HANG,
346*7688df22SAndroid Build Coastguard Worker CS_HANG_SLOW
347*7688df22SAndroid Build Coastguard Worker };
348*7688df22SAndroid Build Coastguard Worker
349*7688df22SAndroid Build Coastguard Worker static const uint32_t bufferclear_cs_shader_gfx9[] = {
350*7688df22SAndroid Build Coastguard Worker 0x260000ff, 0x000003ff, 0xd1fd0000, 0x04010c08,
351*7688df22SAndroid Build Coastguard Worker 0x7e020280, 0x7e040204, 0x7e060205, 0x7e080206,
352*7688df22SAndroid Build Coastguard Worker 0x7e0a0207, 0xe01c2000, 0x80000200, 0xbf8c0000,
353*7688df22SAndroid Build Coastguard Worker 0xbf810000
354*7688df22SAndroid Build Coastguard Worker };
355*7688df22SAndroid Build Coastguard Worker
356*7688df22SAndroid Build Coastguard Worker static const uint32_t bufferclear_cs_shader_gfx10[] = {
357*7688df22SAndroid Build Coastguard Worker 0xD7460004, 0x04010C08, 0x7E000204, 0x7E020205,
358*7688df22SAndroid Build Coastguard Worker 0x7E040206, 0x7E060207, 0xE01C2000, 0x80000004,
359*7688df22SAndroid Build Coastguard Worker 0xBF810000
360*7688df22SAndroid Build Coastguard Worker };
361*7688df22SAndroid Build Coastguard Worker
362*7688df22SAndroid Build Coastguard Worker static const uint32_t bufferclear_cs_shader_registers_gfx9[][2] = {
363*7688df22SAndroid Build Coastguard Worker {0x2e12, 0x000C0041}, //{ mmCOMPUTE_PGM_RSRC1, 0x000C0041 },
364*7688df22SAndroid Build Coastguard Worker {0x2e13, 0x00000090}, //{ mmCOMPUTE_PGM_RSRC2, 0x00000090 },
365*7688df22SAndroid Build Coastguard Worker {0x2e07, 0x00000040}, //{ mmCOMPUTE_NUM_THREAD_X, 0x00000040 },
366*7688df22SAndroid Build Coastguard Worker {0x2e08, 0x00000001}, //{ mmCOMPUTE_NUM_THREAD_Y, 0x00000001 },
367*7688df22SAndroid Build Coastguard Worker {0x2e09, 0x00000001}, //{ mmCOMPUTE_NUM_THREAD_Z, 0x00000001 }
368*7688df22SAndroid Build Coastguard Worker };
369*7688df22SAndroid Build Coastguard Worker
370*7688df22SAndroid Build Coastguard Worker static const uint32_t bufferclear_cs_shader_registers_num_gfx9 = 5;
371*7688df22SAndroid Build Coastguard Worker
372*7688df22SAndroid Build Coastguard Worker static const uint32_t buffercopy_cs_shader_gfx9[] = {
373*7688df22SAndroid Build Coastguard Worker 0x260000ff, 0x000003ff, 0xd1fd0000, 0x04010c08,
374*7688df22SAndroid Build Coastguard Worker 0x7e020280, 0xe00c2000, 0x80000200, 0xbf8c0f70,
375*7688df22SAndroid Build Coastguard Worker 0xe01c2000, 0x80010200, 0xbf810000
376*7688df22SAndroid Build Coastguard Worker };
377*7688df22SAndroid Build Coastguard Worker
378*7688df22SAndroid Build Coastguard Worker static const uint32_t buffercopy_cs_shader_gfx10[] = {
379*7688df22SAndroid Build Coastguard Worker 0xD7460001, 0x04010C08, 0xE00C2000, 0x80000201,
380*7688df22SAndroid Build Coastguard Worker 0xBF8C3F70, 0xE01C2000, 0x80010201, 0xBF810000
381*7688df22SAndroid Build Coastguard Worker };
382*7688df22SAndroid Build Coastguard Worker
383*7688df22SAndroid Build Coastguard Worker static const uint32_t preamblecache_gfx9[] = {
384*7688df22SAndroid Build Coastguard Worker 0xc0026900, 0x81, 0x80000000, 0x40004000, 0xc0026900, 0x8c, 0xaa99aaaa, 0x0,
385*7688df22SAndroid Build Coastguard Worker 0xc0026900, 0x90, 0x80000000, 0x40004000, 0xc0026900, 0x94, 0x80000000, 0x40004000,
386*7688df22SAndroid Build Coastguard Worker 0xc0026900, 0xb4, 0x0, 0x3f800000, 0xc0016900, 0x103, 0x0,
387*7688df22SAndroid Build Coastguard Worker 0xc0016900, 0x208, 0x0, 0xc0016900, 0x290, 0x0,
388*7688df22SAndroid Build Coastguard Worker 0xc0016900, 0x2a1, 0x0, 0xc0026900, 0x2ad, 0x0, 0x0,
389*7688df22SAndroid Build Coastguard Worker 0xc0016900, 0x2d5, 0x10000, 0xc0016900, 0x2dc, 0x0,
390*7688df22SAndroid Build Coastguard Worker 0xc0066900, 0x2de, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0026900, 0x2e5, 0x0, 0x0,
391*7688df22SAndroid Build Coastguard Worker 0xc0056900, 0x2f9, 0x5, 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000,
392*7688df22SAndroid Build Coastguard Worker 0xc0036900, 0x311, 0x3, 0, 0x100000, 0xc0026900, 0x316, 0x1e, 0x20,
393*7688df22SAndroid Build Coastguard Worker 0xc0016900, 0x349, 0x0, 0xc0016900, 0x358, 0x0, 0xc0016900, 0x367, 0x0,
394*7688df22SAndroid Build Coastguard Worker 0xc0016900, 0x376, 0x0, 0xc0016900, 0x385, 0x0, 0xc0016900, 0x19, 0x0,
395*7688df22SAndroid Build Coastguard Worker 0xc0056900, 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0,
396*7688df22SAndroid Build Coastguard Worker 0xc0076900, 0x1e1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
397*7688df22SAndroid Build Coastguard Worker 0xc0026900, 0x204, 0x90000, 0x4, 0xc0046900, 0x20c, 0x0, 0x0, 0x0, 0x0,
398*7688df22SAndroid Build Coastguard Worker 0xc0016900, 0x2b2, 0x0, 0xc0026900, 0x30e, 0xffffffff, 0xffffffff,
399*7688df22SAndroid Build Coastguard Worker 0xc0016900, 0x314, 0x0, 0xc0016900, 0x2a6, 0, 0xc0016900, 0x210, 0,
400*7688df22SAndroid Build Coastguard Worker 0xc0002f00, 0x1, 0xc0016900, 0x1, 0x1,
401*7688df22SAndroid Build Coastguard Worker 0xc0016900, 0x18, 0x2, 0xc0016900, 0x206, 0x300, 0xc0017900, 0x20000243, 0x0,
402*7688df22SAndroid Build Coastguard Worker 0xc0017900, 0x248, 0xffffffff, 0xc0017900, 0x249, 0x0, 0xc0017900, 0x24a, 0x0,
403*7688df22SAndroid Build Coastguard Worker 0xc0017900, 0x24b, 0x0
404*7688df22SAndroid Build Coastguard Worker };
405*7688df22SAndroid Build Coastguard Worker
406*7688df22SAndroid Build Coastguard Worker static const uint32_t preamblecache_gfx10[] = {
407*7688df22SAndroid Build Coastguard Worker 0xc0026900, 0x81, 0x80000000, 0x40004000, 0xc0026900, 0x8c, 0xaa99aaaa, 0x0,
408*7688df22SAndroid Build Coastguard Worker 0xc0026900, 0x90, 0x80000000, 0x40004000, 0xc0026900, 0x94, 0x80000000, 0x40004000,
409*7688df22SAndroid Build Coastguard Worker 0xc0026900, 0xb4, 0x0, 0x3f800000, 0xc0016900, 0x103, 0x0,
410*7688df22SAndroid Build Coastguard Worker 0xc0016900, 0x208, 0x0, 0xc0016900, 0x290, 0x0,
411*7688df22SAndroid Build Coastguard Worker 0xc0016900, 0x2a1, 0x0, 0xc0026900, 0x2ad, 0x0, 0x0,
412*7688df22SAndroid Build Coastguard Worker 0xc0016900, 0x2d5, 0x10000, 0xc0016900, 0x2dc, 0x0,
413*7688df22SAndroid Build Coastguard Worker 0xc0066900, 0x2de, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0026900, 0x2e5, 0x0, 0x0,
414*7688df22SAndroid Build Coastguard Worker 0xc0056900, 0x2f9, 0x5, 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000,
415*7688df22SAndroid Build Coastguard Worker 0xc0046900, 0x310, 0, 0x3, 0, 0x100000, 0xc0026900, 0x316, 0xe, 0x20,
416*7688df22SAndroid Build Coastguard Worker 0xc0016900, 0x349, 0x0, 0xc0016900, 0x358, 0x0, 0xc0016900, 0x367, 0x0,
417*7688df22SAndroid Build Coastguard Worker 0xc0016900, 0x376, 0x0, 0xc0016900, 0x385, 0x0, 0xc0016900, 0x6, 0x0,
418*7688df22SAndroid Build Coastguard Worker 0xc0056900, 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0,
419*7688df22SAndroid Build Coastguard Worker 0xc0076900, 0x1e1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
420*7688df22SAndroid Build Coastguard Worker 0xc0026900, 0x204, 0x90000, 0x4, 0xc0046900, 0x20c, 0x0, 0x0, 0x0, 0x0,
421*7688df22SAndroid Build Coastguard Worker 0xc0016900, 0x2b2, 0x0, 0xc0026900, 0x30e, 0xffffffff, 0xffffffff,
422*7688df22SAndroid Build Coastguard Worker 0xc0016900, 0x314, 0x0, 0xc0016900, 0x10a, 0, 0xc0016900, 0x2a6, 0, 0xc0016900, 0x210, 0,
423*7688df22SAndroid Build Coastguard Worker 0xc0016900, 0x2db, 0, 0xc0016900, 0x1d4, 0, 0xc0002f00, 0x1, 0xc0016900, 0x1, 0x1, 0xc0016900, 0xe, 0x2,
424*7688df22SAndroid Build Coastguard Worker 0xc0016900, 0x206, 0x300, 0xc0016900, 0x212, 0x200, 0xc0017900, 0x7b, 0x20, 0xc0017a00, 0x20000243, 0x0,
425*7688df22SAndroid Build Coastguard Worker 0xc0017900, 0x249, 0, 0xc0017900, 0x24a, 0, 0xc0017900, 0x24b, 0, 0xc0017900, 0x259, 0xffffffff,
426*7688df22SAndroid Build Coastguard Worker 0xc0017900, 0x25f, 0, 0xc0017900, 0x260, 0, 0xc0017900, 0x262, 0,
427*7688df22SAndroid Build Coastguard Worker 0xc0017600, 0x45, 0x0, 0xc0017600, 0x6, 0x0,
428*7688df22SAndroid Build Coastguard Worker 0xc0067600, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
429*7688df22SAndroid Build Coastguard Worker 0xc0067600, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
430*7688df22SAndroid Build Coastguard Worker };
431*7688df22SAndroid Build Coastguard Worker
432*7688df22SAndroid Build Coastguard Worker enum ps_type {
433*7688df22SAndroid Build Coastguard Worker PS_CONST,
434*7688df22SAndroid Build Coastguard Worker PS_TEX,
435*7688df22SAndroid Build Coastguard Worker PS_HANG,
436*7688df22SAndroid Build Coastguard Worker PS_HANG_SLOW
437*7688df22SAndroid Build Coastguard Worker };
438*7688df22SAndroid Build Coastguard Worker
439*7688df22SAndroid Build Coastguard Worker static const uint32_t ps_const_shader_gfx9[] = {
440*7688df22SAndroid Build Coastguard Worker 0x7E000200, 0x7E020201, 0x7E040202, 0x7E060203,
441*7688df22SAndroid Build Coastguard Worker 0xD2960000, 0x00020300, 0xD2960001, 0x00020702,
442*7688df22SAndroid Build Coastguard Worker 0xC4001C0F, 0x00000100, 0xBF810000
443*7688df22SAndroid Build Coastguard Worker };
444*7688df22SAndroid Build Coastguard Worker
445*7688df22SAndroid Build Coastguard Worker static const uint32_t ps_const_shader_patchinfo_code_size_gfx9 = 6;
446*7688df22SAndroid Build Coastguard Worker
447*7688df22SAndroid Build Coastguard Worker static const uint32_t ps_const_shader_patchinfo_code_gfx9[][10][6] = {
448*7688df22SAndroid Build Coastguard Worker {{ 0xBF800000, 0xBF800000, 0xBF800000, 0xBF800000, 0xC4001890, 0x00000000 },
449*7688df22SAndroid Build Coastguard Worker { 0xBF800000, 0xBF800000, 0xBF800000, 0xBF800000, 0xC4001801, 0x00000000 },
450*7688df22SAndroid Build Coastguard Worker { 0xBF800000, 0xBF800000, 0xBF800000, 0xBF800000, 0xC4001803, 0x00000100 },
451*7688df22SAndroid Build Coastguard Worker { 0xBF800000, 0xBF800000, 0xBF800000, 0xBF800000, 0xC4001803, 0x00000300 },
452*7688df22SAndroid Build Coastguard Worker { 0xD2960000, 0x00020300, 0xD2960001, 0x00020702, 0xC4001C0F, 0x00000100 },
453*7688df22SAndroid Build Coastguard Worker { 0xD2950000, 0x00020300, 0xD2950001, 0x00020702, 0xC4001C0F, 0x00000100 },
454*7688df22SAndroid Build Coastguard Worker { 0xD2940000, 0x00020300, 0xD2940001, 0x00020702, 0xC4001C0F, 0x00000100 },
455*7688df22SAndroid Build Coastguard Worker { 0xD2970000, 0x00020300, 0xD2970001, 0x00020702, 0xC4001C0F, 0x00000100 },
456*7688df22SAndroid Build Coastguard Worker { 0xD2980000, 0x00020300, 0xD2980001, 0x00020702, 0xC4001C0F, 0x00000100 },
457*7688df22SAndroid Build Coastguard Worker { 0xBF800000, 0xBF800000, 0xBF800000, 0xBF800000, 0xC400180F, 0x03020100 }
458*7688df22SAndroid Build Coastguard Worker }
459*7688df22SAndroid Build Coastguard Worker };
460*7688df22SAndroid Build Coastguard Worker
461*7688df22SAndroid Build Coastguard Worker static const uint32_t ps_const_shader_patchinfo_offset_gfx9[] = {
462*7688df22SAndroid Build Coastguard Worker 0x00000004
463*7688df22SAndroid Build Coastguard Worker };
464*7688df22SAndroid Build Coastguard Worker
465*7688df22SAndroid Build Coastguard Worker static const uint32_t ps_num_sh_registers_gfx9 = 2;
466*7688df22SAndroid Build Coastguard Worker
467*7688df22SAndroid Build Coastguard Worker static const uint32_t ps_const_sh_registers_gfx9[][2] = {
468*7688df22SAndroid Build Coastguard Worker {0x2C0A, 0x000C0040},//{ mmSPI_SHADER_PGM_RSRC1_PS, 0x000C0040 },
469*7688df22SAndroid Build Coastguard Worker {0x2C0B, 0x00000008}, //{ mmSPI_SHADER_PGM_RSRC2_PS, 0x00000008 }
470*7688df22SAndroid Build Coastguard Worker };
471*7688df22SAndroid Build Coastguard Worker
472*7688df22SAndroid Build Coastguard Worker static const uint32_t ps_num_context_registers_gfx9 = 7;
473*7688df22SAndroid Build Coastguard Worker
474*7688df22SAndroid Build Coastguard Worker static const uint32_t ps_const_context_reg_gfx9[][2] = {
475*7688df22SAndroid Build Coastguard Worker {0xA1B4, 0x00000002}, //{ mmSPI_PS_INPUT_ADDR, 0x00000002 },
476*7688df22SAndroid Build Coastguard Worker {0xA1B6, 0x00000000}, //{ mmSPI_PS_IN_CONTROL, 0x00000000 },
477*7688df22SAndroid Build Coastguard Worker {0xA08F, 0x0000000F}, //{ mmCB_SHADER_MASK, 0x0000000F },
478*7688df22SAndroid Build Coastguard Worker {0xA203, 0x00000010}, //{ mmDB_SHADER_CONTROL, 0x00000010 },
479*7688df22SAndroid Build Coastguard Worker {0xA1C4, 0x00000000}, //{ mmSPI_SHADER_Z_FORMAT, 0x00000000 },
480*7688df22SAndroid Build Coastguard Worker {0xA1B8, 0x00000000}, //{ mmSPI_BARYC_CNTL, 0x00000000 /* Always 0 for now */},
481*7688df22SAndroid Build Coastguard Worker {0xA1C5, 0x00000004}, //{ mmSPI_SHADER_COL_FORMAT, 0x00000004 }
482*7688df22SAndroid Build Coastguard Worker };
483*7688df22SAndroid Build Coastguard Worker
484*7688df22SAndroid Build Coastguard Worker static const uint32_t ps_const_shader_gfx10[] = {
485*7688df22SAndroid Build Coastguard Worker 0x7E000200, 0x7E020201, 0x7E040202, 0x7E060203,
486*7688df22SAndroid Build Coastguard Worker 0x5E000300, 0x5E020702, 0xBF800000, 0xBF800000,
487*7688df22SAndroid Build Coastguard Worker 0xF8001C0F, 0x00000100, 0xBF810000
488*7688df22SAndroid Build Coastguard Worker };
489*7688df22SAndroid Build Coastguard Worker
490*7688df22SAndroid Build Coastguard Worker static const uint32_t ps_const_shader_patchinfo_code_size_gfx10 = 6;
491*7688df22SAndroid Build Coastguard Worker
492*7688df22SAndroid Build Coastguard Worker static const uint32_t ps_const_shader_patchinfo_code_gfx10[][10][6] = {
493*7688df22SAndroid Build Coastguard Worker {{ 0xBF800000, 0xBF800000, 0xBF800000, 0xBF800000, 0xF8001890, 0x00000000 },
494*7688df22SAndroid Build Coastguard Worker { 0xBF800000, 0xBF800000, 0xBF800000, 0xBF800000, 0xF8001801, 0x00000000 },
495*7688df22SAndroid Build Coastguard Worker { 0xBF800000, 0xBF800000, 0xBF800000, 0xBF800000, 0xF8001803, 0x00000100 },
496*7688df22SAndroid Build Coastguard Worker { 0xBF800000, 0xBF800000, 0xBF800000, 0xBF800000, 0xF8001803, 0x00000300 },
497*7688df22SAndroid Build Coastguard Worker { 0x5E000300, 0x5E020702, 0xBF800000, 0xBF800000, 0xF8001C0F, 0x00000100 },
498*7688df22SAndroid Build Coastguard Worker { 0xD7690000, 0x00020300, 0xD7690001, 0x00020702, 0xF8001C0F, 0x00000100 },
499*7688df22SAndroid Build Coastguard Worker { 0xD7680000, 0x00020300, 0xD7680001, 0x00020702, 0xF8001C0F, 0x00000100 },
500*7688df22SAndroid Build Coastguard Worker { 0xD76A0000, 0x00020300, 0xD76A0001, 0x00020702, 0xF8001C0F, 0x00000100 },
501*7688df22SAndroid Build Coastguard Worker { 0xD76B0000, 0x00020300, 0xD76B0001, 0x00020702, 0xF8001C0F, 0x00000100 },
502*7688df22SAndroid Build Coastguard Worker { 0xBF800000, 0xBF800000, 0xBF800000, 0xBF800000, 0xF800180F, 0x03020100 }
503*7688df22SAndroid Build Coastguard Worker }
504*7688df22SAndroid Build Coastguard Worker };
505*7688df22SAndroid Build Coastguard Worker
506*7688df22SAndroid Build Coastguard Worker static const uint32_t ps_const_shader_patchinfo_offset_gfx10[] = {
507*7688df22SAndroid Build Coastguard Worker 0x00000004
508*7688df22SAndroid Build Coastguard Worker };
509*7688df22SAndroid Build Coastguard Worker
510*7688df22SAndroid Build Coastguard Worker static const uint32_t ps_num_sh_registers_gfx10 = 2;
511*7688df22SAndroid Build Coastguard Worker
512*7688df22SAndroid Build Coastguard Worker static const uint32_t ps_const_sh_registers_gfx10[][2] = {
513*7688df22SAndroid Build Coastguard Worker {0x2C0A, 0x000C0000},//{ mmSPI_SHADER_PGM_RSRC1_PS, 0x000C0000 },
514*7688df22SAndroid Build Coastguard Worker {0x2C0B, 0x00000008}, //{ mmSPI_SHADER_PGM_RSRC2_PS, 0x00000008 }
515*7688df22SAndroid Build Coastguard Worker };
516*7688df22SAndroid Build Coastguard Worker
517*7688df22SAndroid Build Coastguard Worker static const uint32_t ps_tex_shader_gfx9[] = {
518*7688df22SAndroid Build Coastguard Worker 0xBEFC000C, 0xBE8E017E, 0xBEFE077E, 0xD4180000,
519*7688df22SAndroid Build Coastguard Worker 0xD4190001, 0xD41C0100, 0xD41D0101, 0xF0800F00,
520*7688df22SAndroid Build Coastguard Worker 0x00400206, 0xBEFE010E, 0xBF8C0F70, 0xD2960000,
521*7688df22SAndroid Build Coastguard Worker 0x00020702, 0xD2960001, 0x00020B04, 0xC4001C0F,
522*7688df22SAndroid Build Coastguard Worker 0x00000100, 0xBF810000
523*7688df22SAndroid Build Coastguard Worker };
524*7688df22SAndroid Build Coastguard Worker
525*7688df22SAndroid Build Coastguard Worker static const uint32_t ps_tex_shader_patchinfo_offset_gfx9[] = {
526*7688df22SAndroid Build Coastguard Worker 0x0000000B
527*7688df22SAndroid Build Coastguard Worker };
528*7688df22SAndroid Build Coastguard Worker
529*7688df22SAndroid Build Coastguard Worker static const uint32_t ps_tex_shader_patchinfo_code_size_gfx9 = 6;
530*7688df22SAndroid Build Coastguard Worker
531*7688df22SAndroid Build Coastguard Worker static const uint32_t ps_tex_shader_patchinfo_code_gfx9[][10][6] = {
532*7688df22SAndroid Build Coastguard Worker {{ 0xBF800000, 0xBF800000, 0xBF800000, 0xBF800000, 0xC4001890, 0x00000000 },
533*7688df22SAndroid Build Coastguard Worker { 0xBF800000, 0xBF800000, 0xBF800000, 0xBF800000, 0xC4001801, 0x00000002 },
534*7688df22SAndroid Build Coastguard Worker { 0xBF800000, 0xBF800000, 0xBF800000, 0xBF800000, 0xC4001803, 0x00000302 },
535*7688df22SAndroid Build Coastguard Worker { 0xBF800000, 0xBF800000, 0xBF800000, 0xBF800000, 0xC4001803, 0x00000502 },
536*7688df22SAndroid Build Coastguard Worker { 0xD2960000, 0x00020702, 0xD2960001, 0x00020B04, 0xC4001C0F, 0x00000100 },
537*7688df22SAndroid Build Coastguard Worker { 0xD2950000, 0x00020702, 0xD2950001, 0x00020B04, 0xC4001C0F, 0x00000100 },
538*7688df22SAndroid Build Coastguard Worker { 0xD2940000, 0x00020702, 0xD2940001, 0x00020B04, 0xC4001C0F, 0x00000100 },
539*7688df22SAndroid Build Coastguard Worker { 0xD2970000, 0x00020702, 0xD2970001, 0x00020B04, 0xC4001C0F, 0x00000100 },
540*7688df22SAndroid Build Coastguard Worker { 0xD2980000, 0x00020702, 0xD2980001, 0x00020B04, 0xC4001C0F, 0x00000100 },
541*7688df22SAndroid Build Coastguard Worker { 0xBF800000, 0xBF800000, 0xBF800000, 0xBF800000, 0xC400180F, 0x05040302 }
542*7688df22SAndroid Build Coastguard Worker }
543*7688df22SAndroid Build Coastguard Worker };
544*7688df22SAndroid Build Coastguard Worker
545*7688df22SAndroid Build Coastguard Worker static const uint32_t ps_tex_sh_registers_gfx9[][2] = {
546*7688df22SAndroid Build Coastguard Worker {0x2C0A, 0x000C0081},//{ mmSPI_SHADER_PGM_RSRC1_PS, 0x000C0081 },
547*7688df22SAndroid Build Coastguard Worker {0x2C0B, 0x00000018}, //{ mmSPI_SHADER_PGM_RSRC2_PS, 0x00000018 }
548*7688df22SAndroid Build Coastguard Worker };
549*7688df22SAndroid Build Coastguard Worker
550*7688df22SAndroid Build Coastguard Worker static const uint32_t ps_tex_context_reg_gfx9[][2] = {
551*7688df22SAndroid Build Coastguard Worker {0xA1B4, 0x00000002}, //{ mmSPI_PS_INPUT_ADDR, 0x00000002 },
552*7688df22SAndroid Build Coastguard Worker {0xA1B6, 0x00000001}, //{ mmSPI_PS_IN_CONTROL, 0x00000001 },
553*7688df22SAndroid Build Coastguard Worker {0xA08F, 0x0000000F}, //{ mmCB_SHADER_MASK, 0x0000000F },
554*7688df22SAndroid Build Coastguard Worker {0xA203, 0x00000010}, //{ mmDB_SHADER_CONTROL, 0x00000010 },
555*7688df22SAndroid Build Coastguard Worker {0xA1C4, 0x00000000}, //{ mmSPI_SHADER_Z_FORMAT, 0x00000000 },
556*7688df22SAndroid Build Coastguard Worker {0xA1B8, 0x00000000}, //{ mmSPI_BARYC_CNTL, 0x00000000 /* Always 0 for now */},
557*7688df22SAndroid Build Coastguard Worker {0xA1C5, 0x00000004}, //{ mmSPI_SHADER_COL_FORMAT, 0x00000004 }
558*7688df22SAndroid Build Coastguard Worker };
559*7688df22SAndroid Build Coastguard Worker
560*7688df22SAndroid Build Coastguard Worker static const uint32_t ps_tex_shader_gfx10[] = {
561*7688df22SAndroid Build Coastguard Worker 0xBEFC030C, 0xBE8E047E, 0xBEFE0A7E, 0xC8080000,
562*7688df22SAndroid Build Coastguard Worker 0xC80C0100, 0xC8090001, 0xC80D0101, 0xF0800F0A,
563*7688df22SAndroid Build Coastguard Worker 0x00400402, 0x00000003, 0xBEFE040E, 0xBF8C0F70,
564*7688df22SAndroid Build Coastguard Worker 0x5E000B04, 0x5E020F06, 0xBF800000, 0xBF800000,
565*7688df22SAndroid Build Coastguard Worker 0xF8001C0F, 0x00000100, 0xBF810000
566*7688df22SAndroid Build Coastguard Worker };
567*7688df22SAndroid Build Coastguard Worker
568*7688df22SAndroid Build Coastguard Worker static const uint32_t ps_tex_shader_patchinfo_offset_gfx10[] = {
569*7688df22SAndroid Build Coastguard Worker 0x0000000C
570*7688df22SAndroid Build Coastguard Worker };
571*7688df22SAndroid Build Coastguard Worker
572*7688df22SAndroid Build Coastguard Worker static const uint32_t ps_tex_shader_patchinfo_code_size_gfx10 = 6;
573*7688df22SAndroid Build Coastguard Worker
574*7688df22SAndroid Build Coastguard Worker static const uint32_t ps_tex_shader_patchinfo_code_gfx10[][10][6] = {
575*7688df22SAndroid Build Coastguard Worker {{ 0xBF800000, 0xBF800000, 0xBF800000, 0xBF800000, 0xF8001890, 0x00000000 },
576*7688df22SAndroid Build Coastguard Worker { 0xBF800000, 0xBF800000, 0xBF800000, 0xBF800000, 0xF8001801, 0x00000004 },
577*7688df22SAndroid Build Coastguard Worker { 0xBF800000, 0xBF800000, 0xBF800000, 0xBF800000, 0xF8001803, 0x00000504 },
578*7688df22SAndroid Build Coastguard Worker { 0xBF800000, 0xBF800000, 0xBF800000, 0xBF800000, 0xF8001803, 0x00000704 },
579*7688df22SAndroid Build Coastguard Worker { 0x5E000B04, 0x5E020F06, 0xBF800000, 0xBF800000, 0xF8001C0F, 0x00000100 },
580*7688df22SAndroid Build Coastguard Worker { 0xD7690000, 0x00020B04, 0xD7690001, 0x00020F06, 0xF8001C0F, 0x00000100 },
581*7688df22SAndroid Build Coastguard Worker { 0xD7680000, 0x00020B04, 0xD7680001, 0x00020F06, 0xF8001C0F, 0x00000100 },
582*7688df22SAndroid Build Coastguard Worker { 0xD76A0000, 0x00020B04, 0xD76A0001, 0x00020F06, 0xF8001C0F, 0x00000100 },
583*7688df22SAndroid Build Coastguard Worker { 0xD76B0000, 0x00020B04, 0xD76B0001, 0x00020F06, 0xF8001C0F, 0x00000100 },
584*7688df22SAndroid Build Coastguard Worker { 0xBF800000, 0xBF800000, 0xBF800000, 0xBF800000, 0xF800180F, 0x07060504 }
585*7688df22SAndroid Build Coastguard Worker }
586*7688df22SAndroid Build Coastguard Worker };
587*7688df22SAndroid Build Coastguard Worker
588*7688df22SAndroid Build Coastguard Worker static const uint32_t vs_RectPosTexFast_shader_gfx9[] = {
589*7688df22SAndroid Build Coastguard Worker 0x7E000B00, 0x020000F3, 0xD042000A, 0x00010100,
590*7688df22SAndroid Build Coastguard Worker 0x7E020202, 0x7E040200, 0x020000F3, 0x7E060206,
591*7688df22SAndroid Build Coastguard Worker 0x7E080204, 0xD1000001, 0x002A0302, 0x7C840080,
592*7688df22SAndroid Build Coastguard Worker 0x7E000200, 0x7E040203, 0x7E0A0201, 0xD1000003,
593*7688df22SAndroid Build Coastguard Worker 0x002A0704, 0x7E0C0207, 0x7E0E0205, 0x00000101,
594*7688df22SAndroid Build Coastguard Worker 0x00020505, 0x7E040208, 0x7E0A02F2, 0x00060903,
595*7688df22SAndroid Build Coastguard Worker 0x00080D07, 0x7E0C0209, 0xC40008CF, 0x05020100,
596*7688df22SAndroid Build Coastguard Worker 0xC400020F, 0x05060403, 0xBF810000
597*7688df22SAndroid Build Coastguard Worker };
598*7688df22SAndroid Build Coastguard Worker
599*7688df22SAndroid Build Coastguard Worker static const uint32_t vs_RectPosTexFast_shader_gfx10[] = {
600*7688df22SAndroid Build Coastguard Worker 0x7E000B00, 0x060000F3, 0x7E020202, 0x7E040206,
601*7688df22SAndroid Build Coastguard Worker 0x7C040080, 0x060000F3, 0xD5010001, 0x01AA0200,
602*7688df22SAndroid Build Coastguard Worker 0x7E060203, 0xD5010002, 0x01AA0404, 0x7E080207,
603*7688df22SAndroid Build Coastguard Worker 0x7C040080, 0xD5010000, 0x01A80101, 0xD5010001,
604*7688df22SAndroid Build Coastguard Worker 0x01AA0601, 0x7E060208, 0x7E0A02F2, 0xD5010002,
605*7688df22SAndroid Build Coastguard Worker 0x01A80902, 0xD5010004, 0x01AA0805, 0x7E0C0209,
606*7688df22SAndroid Build Coastguard Worker 0xF80008CF, 0x05030100, 0xF800020F, 0x05060402,
607*7688df22SAndroid Build Coastguard Worker 0xBF810000
608*7688df22SAndroid Build Coastguard Worker };
609*7688df22SAndroid Build Coastguard Worker
610*7688df22SAndroid Build Coastguard Worker static const uint32_t cached_cmd_gfx9[] = {
611*7688df22SAndroid Build Coastguard Worker 0xc0016900, 0x0, 0x0, 0xc0026900, 0x3, 0x2a, 0x0,
612*7688df22SAndroid Build Coastguard Worker 0xc0046900, 0xa, 0x0, 0x0, 0x0, 0x200020,
613*7688df22SAndroid Build Coastguard Worker 0xc0016900, 0x83, 0xffff, 0xc0026900, 0x8e, 0xf, 0xf,
614*7688df22SAndroid Build Coastguard Worker 0xc0056900, 0x105, 0x0, 0x0, 0x0, 0x0, 0x12,
615*7688df22SAndroid Build Coastguard Worker 0xc0026900, 0x10b, 0x0, 0x0, 0xc0016900, 0x1e0, 0x0,
616*7688df22SAndroid Build Coastguard Worker 0xc0036900, 0x200, 0x0, 0x10000, 0xcc0011,
617*7688df22SAndroid Build Coastguard Worker 0xc0026900, 0x292, 0x20, 0x60201b8,
618*7688df22SAndroid Build Coastguard Worker 0xc0026900, 0x2b0, 0x0, 0x0, 0xc0016900, 0x2f8, 0x0
619*7688df22SAndroid Build Coastguard Worker };
620*7688df22SAndroid Build Coastguard Worker
621*7688df22SAndroid Build Coastguard Worker static const uint32_t cached_cmd_gfx10[] = {
622*7688df22SAndroid Build Coastguard Worker 0xc0016900, 0x0, 0x0, 0xc0026900, 0x3, 0x2a, 0x0,
623*7688df22SAndroid Build Coastguard Worker 0xc0046900, 0xa, 0x0, 0x0, 0x0, 0x200020,
624*7688df22SAndroid Build Coastguard Worker 0xc0016900, 0x83, 0xffff, 0xc0026900, 0x8e, 0xf, 0xf,
625*7688df22SAndroid Build Coastguard Worker 0xc0056900, 0x105, 0x0, 0x0, 0x0, 0x0, 0x18,
626*7688df22SAndroid Build Coastguard Worker 0xc0026900, 0x10b, 0x0, 0x0, 0xc0016900, 0x1e0, 0x0,
627*7688df22SAndroid Build Coastguard Worker 0xc0036900, 0x200, 0x0, 0x10000, 0xcc0011,
628*7688df22SAndroid Build Coastguard Worker 0xc0026900, 0x292, 0x20, 0x6020000,
629*7688df22SAndroid Build Coastguard Worker 0xc0026900, 0x2b0, 0x0, 0x0, 0xc0016900, 0x2f8, 0x0
630*7688df22SAndroid Build Coastguard Worker };
631*7688df22SAndroid Build Coastguard Worker
632*7688df22SAndroid Build Coastguard Worker unsigned int memcpy_ps_hang[] = {
633*7688df22SAndroid Build Coastguard Worker 0xFFFFFFFF, 0xBEFE0A7E, 0xBEFC0304, 0xC0C20100,
634*7688df22SAndroid Build Coastguard Worker 0xC0800300, 0xC8080000, 0xC80C0100, 0xC8090001,
635*7688df22SAndroid Build Coastguard Worker 0xC80D0101, 0xBF8C007F, 0xF0800F00, 0x00010002,
636*7688df22SAndroid Build Coastguard Worker 0xBEFE040C, 0xBF8C0F70, 0xBF800000, 0xBF800000,
637*7688df22SAndroid Build Coastguard Worker 0xF800180F, 0x03020100, 0xBF810000
638*7688df22SAndroid Build Coastguard Worker };
639*7688df22SAndroid Build Coastguard Worker
640*7688df22SAndroid Build Coastguard Worker struct amdgpu_test_shader {
641*7688df22SAndroid Build Coastguard Worker uint32_t *shader;
642*7688df22SAndroid Build Coastguard Worker uint32_t header_length;
643*7688df22SAndroid Build Coastguard Worker uint32_t body_length;
644*7688df22SAndroid Build Coastguard Worker uint32_t foot_length;
645*7688df22SAndroid Build Coastguard Worker };
646*7688df22SAndroid Build Coastguard Worker
647*7688df22SAndroid Build Coastguard Worker unsigned int memcpy_cs_hang_slow_ai_codes[] = {
648*7688df22SAndroid Build Coastguard Worker 0xd1fd0000, 0x04010c08, 0xe00c2000, 0x80000100,
649*7688df22SAndroid Build Coastguard Worker 0xbf8c0f70, 0xe01c2000, 0x80010100, 0xbf810000
650*7688df22SAndroid Build Coastguard Worker };
651*7688df22SAndroid Build Coastguard Worker
652*7688df22SAndroid Build Coastguard Worker struct amdgpu_test_shader memcpy_cs_hang_slow_ai = {
653*7688df22SAndroid Build Coastguard Worker memcpy_cs_hang_slow_ai_codes,
654*7688df22SAndroid Build Coastguard Worker 4,
655*7688df22SAndroid Build Coastguard Worker 3,
656*7688df22SAndroid Build Coastguard Worker 1
657*7688df22SAndroid Build Coastguard Worker };
658*7688df22SAndroid Build Coastguard Worker
659*7688df22SAndroid Build Coastguard Worker unsigned int memcpy_cs_hang_slow_rv_codes[] = {
660*7688df22SAndroid Build Coastguard Worker 0x8e00860c, 0x32000000, 0xe00c2000, 0x80010100,
661*7688df22SAndroid Build Coastguard Worker 0xbf8c0f70, 0xe01c2000, 0x80020100, 0xbf810000
662*7688df22SAndroid Build Coastguard Worker };
663*7688df22SAndroid Build Coastguard Worker
664*7688df22SAndroid Build Coastguard Worker struct amdgpu_test_shader memcpy_cs_hang_slow_rv = {
665*7688df22SAndroid Build Coastguard Worker memcpy_cs_hang_slow_rv_codes,
666*7688df22SAndroid Build Coastguard Worker 4,
667*7688df22SAndroid Build Coastguard Worker 3,
668*7688df22SAndroid Build Coastguard Worker 1
669*7688df22SAndroid Build Coastguard Worker };
670*7688df22SAndroid Build Coastguard Worker
671*7688df22SAndroid Build Coastguard Worker unsigned int memcpy_cs_hang_slow_nv_codes[] = {
672*7688df22SAndroid Build Coastguard Worker 0xd7460000, 0x04010c08, 0xe00c2000, 0x80000100,
673*7688df22SAndroid Build Coastguard Worker 0xbf8c0f70, 0xe01ca000, 0x80010100, 0xbf810000
674*7688df22SAndroid Build Coastguard Worker };
675*7688df22SAndroid Build Coastguard Worker
676*7688df22SAndroid Build Coastguard Worker struct amdgpu_test_shader memcpy_cs_hang_slow_nv = {
677*7688df22SAndroid Build Coastguard Worker memcpy_cs_hang_slow_nv_codes,
678*7688df22SAndroid Build Coastguard Worker 4,
679*7688df22SAndroid Build Coastguard Worker 3,
680*7688df22SAndroid Build Coastguard Worker 1
681*7688df22SAndroid Build Coastguard Worker };
682*7688df22SAndroid Build Coastguard Worker
683*7688df22SAndroid Build Coastguard Worker unsigned int memcpy_ps_hang_slow_ai_codes[] = {
684*7688df22SAndroid Build Coastguard Worker 0xbefc000c, 0xbe8e017e, 0xbefe077e, 0xd4080000,
685*7688df22SAndroid Build Coastguard Worker 0xd4090001, 0xd40c0100, 0xd40d0101, 0xf0800f00,
686*7688df22SAndroid Build Coastguard Worker 0x00400002, 0xbefe010e, 0xbf8c0f70, 0xbf800000,
687*7688df22SAndroid Build Coastguard Worker 0xbf800000, 0xbf800000, 0xbf800000, 0xc400180f,
688*7688df22SAndroid Build Coastguard Worker 0x03020100, 0xbf810000
689*7688df22SAndroid Build Coastguard Worker };
690*7688df22SAndroid Build Coastguard Worker
691*7688df22SAndroid Build Coastguard Worker struct amdgpu_test_shader memcpy_ps_hang_slow_ai = {
692*7688df22SAndroid Build Coastguard Worker memcpy_ps_hang_slow_ai_codes,
693*7688df22SAndroid Build Coastguard Worker 7,
694*7688df22SAndroid Build Coastguard Worker 2,
695*7688df22SAndroid Build Coastguard Worker 9
696*7688df22SAndroid Build Coastguard Worker };
697*7688df22SAndroid Build Coastguard Worker
amdgpu_bo_alloc_and_map_raw(amdgpu_device_handle dev,unsigned size,unsigned alignment,unsigned heap,uint64_t alloc_flags,uint64_t mapping_flags,amdgpu_bo_handle * bo,void ** cpu,uint64_t * mc_address,amdgpu_va_handle * va_handle)698*7688df22SAndroid Build Coastguard Worker int amdgpu_bo_alloc_and_map_raw(amdgpu_device_handle dev, unsigned size,
699*7688df22SAndroid Build Coastguard Worker unsigned alignment, unsigned heap, uint64_t alloc_flags,
700*7688df22SAndroid Build Coastguard Worker uint64_t mapping_flags, amdgpu_bo_handle *bo, void **cpu,
701*7688df22SAndroid Build Coastguard Worker uint64_t *mc_address,
702*7688df22SAndroid Build Coastguard Worker amdgpu_va_handle *va_handle)
703*7688df22SAndroid Build Coastguard Worker {
704*7688df22SAndroid Build Coastguard Worker struct amdgpu_bo_alloc_request request = {};
705*7688df22SAndroid Build Coastguard Worker amdgpu_bo_handle buf_handle;
706*7688df22SAndroid Build Coastguard Worker amdgpu_va_handle handle;
707*7688df22SAndroid Build Coastguard Worker uint64_t vmc_addr;
708*7688df22SAndroid Build Coastguard Worker int r;
709*7688df22SAndroid Build Coastguard Worker
710*7688df22SAndroid Build Coastguard Worker request.alloc_size = size;
711*7688df22SAndroid Build Coastguard Worker request.phys_alignment = alignment;
712*7688df22SAndroid Build Coastguard Worker request.preferred_heap = heap;
713*7688df22SAndroid Build Coastguard Worker request.flags = alloc_flags;
714*7688df22SAndroid Build Coastguard Worker
715*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_alloc(dev, &request, &buf_handle);
716*7688df22SAndroid Build Coastguard Worker if (r)
717*7688df22SAndroid Build Coastguard Worker return r;
718*7688df22SAndroid Build Coastguard Worker
719*7688df22SAndroid Build Coastguard Worker r = amdgpu_va_range_alloc(dev,
720*7688df22SAndroid Build Coastguard Worker amdgpu_gpu_va_range_general,
721*7688df22SAndroid Build Coastguard Worker size, alignment, 0, &vmc_addr,
722*7688df22SAndroid Build Coastguard Worker &handle, 0);
723*7688df22SAndroid Build Coastguard Worker if (r)
724*7688df22SAndroid Build Coastguard Worker goto error_va_alloc;
725*7688df22SAndroid Build Coastguard Worker
726*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_va_op_raw(dev, buf_handle, 0, ALIGN(size, getpagesize()), vmc_addr,
727*7688df22SAndroid Build Coastguard Worker AMDGPU_VM_PAGE_READABLE |
728*7688df22SAndroid Build Coastguard Worker AMDGPU_VM_PAGE_WRITEABLE |
729*7688df22SAndroid Build Coastguard Worker AMDGPU_VM_PAGE_EXECUTABLE |
730*7688df22SAndroid Build Coastguard Worker mapping_flags,
731*7688df22SAndroid Build Coastguard Worker AMDGPU_VA_OP_MAP);
732*7688df22SAndroid Build Coastguard Worker if (r)
733*7688df22SAndroid Build Coastguard Worker goto error_va_map;
734*7688df22SAndroid Build Coastguard Worker
735*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_cpu_map(buf_handle, cpu);
736*7688df22SAndroid Build Coastguard Worker if (r)
737*7688df22SAndroid Build Coastguard Worker goto error_cpu_map;
738*7688df22SAndroid Build Coastguard Worker
739*7688df22SAndroid Build Coastguard Worker *bo = buf_handle;
740*7688df22SAndroid Build Coastguard Worker *mc_address = vmc_addr;
741*7688df22SAndroid Build Coastguard Worker *va_handle = handle;
742*7688df22SAndroid Build Coastguard Worker
743*7688df22SAndroid Build Coastguard Worker return 0;
744*7688df22SAndroid Build Coastguard Worker
745*7688df22SAndroid Build Coastguard Worker error_cpu_map:
746*7688df22SAndroid Build Coastguard Worker amdgpu_bo_cpu_unmap(buf_handle);
747*7688df22SAndroid Build Coastguard Worker
748*7688df22SAndroid Build Coastguard Worker error_va_map:
749*7688df22SAndroid Build Coastguard Worker amdgpu_bo_va_op(buf_handle, 0, size, vmc_addr, 0, AMDGPU_VA_OP_UNMAP);
750*7688df22SAndroid Build Coastguard Worker
751*7688df22SAndroid Build Coastguard Worker error_va_alloc:
752*7688df22SAndroid Build Coastguard Worker amdgpu_bo_free(buf_handle);
753*7688df22SAndroid Build Coastguard Worker return r;
754*7688df22SAndroid Build Coastguard Worker }
755*7688df22SAndroid Build Coastguard Worker
756*7688df22SAndroid Build Coastguard Worker
757*7688df22SAndroid Build Coastguard Worker
suite_basic_tests_enable(void)758*7688df22SAndroid Build Coastguard Worker CU_BOOL suite_basic_tests_enable(void)
759*7688df22SAndroid Build Coastguard Worker {
760*7688df22SAndroid Build Coastguard Worker
761*7688df22SAndroid Build Coastguard Worker if (amdgpu_device_initialize(drm_amdgpu[0], &major_version,
762*7688df22SAndroid Build Coastguard Worker &minor_version, &device_handle))
763*7688df22SAndroid Build Coastguard Worker return CU_FALSE;
764*7688df22SAndroid Build Coastguard Worker
765*7688df22SAndroid Build Coastguard Worker
766*7688df22SAndroid Build Coastguard Worker family_id = device_handle->info.family_id;
767*7688df22SAndroid Build Coastguard Worker chip_id = device_handle->info.chip_external_rev;
768*7688df22SAndroid Build Coastguard Worker chip_rev = device_handle->info.chip_rev;
769*7688df22SAndroid Build Coastguard Worker
770*7688df22SAndroid Build Coastguard Worker if (amdgpu_device_deinitialize(device_handle))
771*7688df22SAndroid Build Coastguard Worker return CU_FALSE;
772*7688df22SAndroid Build Coastguard Worker
773*7688df22SAndroid Build Coastguard Worker /* disable gfx engine basic test cases for some asics have no CPG */
774*7688df22SAndroid Build Coastguard Worker if (asic_is_gfx_pipe_removed(family_id, chip_id, chip_rev)) {
775*7688df22SAndroid Build Coastguard Worker if (amdgpu_set_test_active("Basic Tests",
776*7688df22SAndroid Build Coastguard Worker "Command submission Test (GFX)",
777*7688df22SAndroid Build Coastguard Worker CU_FALSE))
778*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "test deactivation failed - %s\n",
779*7688df22SAndroid Build Coastguard Worker CU_get_error_msg());
780*7688df22SAndroid Build Coastguard Worker
781*7688df22SAndroid Build Coastguard Worker if (amdgpu_set_test_active("Basic Tests",
782*7688df22SAndroid Build Coastguard Worker "Command submission Test (Multi-Fence)",
783*7688df22SAndroid Build Coastguard Worker CU_FALSE))
784*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "test deactivation failed - %s\n",
785*7688df22SAndroid Build Coastguard Worker CU_get_error_msg());
786*7688df22SAndroid Build Coastguard Worker
787*7688df22SAndroid Build Coastguard Worker if (amdgpu_set_test_active("Basic Tests",
788*7688df22SAndroid Build Coastguard Worker "Sync dependency Test",
789*7688df22SAndroid Build Coastguard Worker CU_FALSE))
790*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "test deactivation failed - %s\n",
791*7688df22SAndroid Build Coastguard Worker CU_get_error_msg());
792*7688df22SAndroid Build Coastguard Worker }
793*7688df22SAndroid Build Coastguard Worker
794*7688df22SAndroid Build Coastguard Worker return CU_TRUE;
795*7688df22SAndroid Build Coastguard Worker }
796*7688df22SAndroid Build Coastguard Worker
suite_basic_tests_init(void)797*7688df22SAndroid Build Coastguard Worker int suite_basic_tests_init(void)
798*7688df22SAndroid Build Coastguard Worker {
799*7688df22SAndroid Build Coastguard Worker struct amdgpu_gpu_info gpu_info = {0};
800*7688df22SAndroid Build Coastguard Worker int r;
801*7688df22SAndroid Build Coastguard Worker
802*7688df22SAndroid Build Coastguard Worker r = amdgpu_device_initialize(drm_amdgpu[0], &major_version,
803*7688df22SAndroid Build Coastguard Worker &minor_version, &device_handle);
804*7688df22SAndroid Build Coastguard Worker
805*7688df22SAndroid Build Coastguard Worker if (r) {
806*7688df22SAndroid Build Coastguard Worker if ((r == -EACCES) && (errno == EACCES))
807*7688df22SAndroid Build Coastguard Worker printf("\n\nError:%s. "
808*7688df22SAndroid Build Coastguard Worker "Hint:Try to run this test program as root.",
809*7688df22SAndroid Build Coastguard Worker strerror(errno));
810*7688df22SAndroid Build Coastguard Worker return CUE_SINIT_FAILED;
811*7688df22SAndroid Build Coastguard Worker }
812*7688df22SAndroid Build Coastguard Worker
813*7688df22SAndroid Build Coastguard Worker r = amdgpu_query_gpu_info(device_handle, &gpu_info);
814*7688df22SAndroid Build Coastguard Worker if (r)
815*7688df22SAndroid Build Coastguard Worker return CUE_SINIT_FAILED;
816*7688df22SAndroid Build Coastguard Worker
817*7688df22SAndroid Build Coastguard Worker family_id = gpu_info.family_id;
818*7688df22SAndroid Build Coastguard Worker
819*7688df22SAndroid Build Coastguard Worker return CUE_SUCCESS;
820*7688df22SAndroid Build Coastguard Worker }
821*7688df22SAndroid Build Coastguard Worker
suite_basic_tests_clean(void)822*7688df22SAndroid Build Coastguard Worker int suite_basic_tests_clean(void)
823*7688df22SAndroid Build Coastguard Worker {
824*7688df22SAndroid Build Coastguard Worker int r = amdgpu_device_deinitialize(device_handle);
825*7688df22SAndroid Build Coastguard Worker
826*7688df22SAndroid Build Coastguard Worker if (r == 0)
827*7688df22SAndroid Build Coastguard Worker return CUE_SUCCESS;
828*7688df22SAndroid Build Coastguard Worker else
829*7688df22SAndroid Build Coastguard Worker return CUE_SCLEAN_FAILED;
830*7688df22SAndroid Build Coastguard Worker }
831*7688df22SAndroid Build Coastguard Worker
amdgpu_query_info_test(void)832*7688df22SAndroid Build Coastguard Worker static void amdgpu_query_info_test(void)
833*7688df22SAndroid Build Coastguard Worker {
834*7688df22SAndroid Build Coastguard Worker struct amdgpu_gpu_info gpu_info = {0};
835*7688df22SAndroid Build Coastguard Worker uint32_t version, feature;
836*7688df22SAndroid Build Coastguard Worker int r;
837*7688df22SAndroid Build Coastguard Worker
838*7688df22SAndroid Build Coastguard Worker r = amdgpu_query_gpu_info(device_handle, &gpu_info);
839*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
840*7688df22SAndroid Build Coastguard Worker
841*7688df22SAndroid Build Coastguard Worker r = amdgpu_query_firmware_version(device_handle, AMDGPU_INFO_FW_VCE, 0,
842*7688df22SAndroid Build Coastguard Worker 0, &version, &feature);
843*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
844*7688df22SAndroid Build Coastguard Worker }
845*7688df22SAndroid Build Coastguard Worker
amdgpu_command_submission_gfx_separate_ibs(void)846*7688df22SAndroid Build Coastguard Worker static void amdgpu_command_submission_gfx_separate_ibs(void)
847*7688df22SAndroid Build Coastguard Worker {
848*7688df22SAndroid Build Coastguard Worker amdgpu_context_handle context_handle;
849*7688df22SAndroid Build Coastguard Worker amdgpu_bo_handle ib_result_handle, ib_result_ce_handle;
850*7688df22SAndroid Build Coastguard Worker void *ib_result_cpu, *ib_result_ce_cpu;
851*7688df22SAndroid Build Coastguard Worker uint64_t ib_result_mc_address, ib_result_ce_mc_address;
852*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_request ibs_request = {0};
853*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_ib_info ib_info[2];
854*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_fence fence_status = {0};
855*7688df22SAndroid Build Coastguard Worker uint32_t *ptr;
856*7688df22SAndroid Build Coastguard Worker uint32_t expired;
857*7688df22SAndroid Build Coastguard Worker amdgpu_bo_list_handle bo_list;
858*7688df22SAndroid Build Coastguard Worker amdgpu_va_handle va_handle, va_handle_ce;
859*7688df22SAndroid Build Coastguard Worker int r, i = 0;
860*7688df22SAndroid Build Coastguard Worker struct drm_amdgpu_info_hw_ip info;
861*7688df22SAndroid Build Coastguard Worker
862*7688df22SAndroid Build Coastguard Worker r = amdgpu_query_hw_ip_info(device_handle, AMDGPU_HW_IP_GFX, 0, &info);
863*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
864*7688df22SAndroid Build Coastguard Worker
865*7688df22SAndroid Build Coastguard Worker if (info.hw_ip_version_major >= 11)
866*7688df22SAndroid Build Coastguard Worker return;
867*7688df22SAndroid Build Coastguard Worker
868*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_ctx_create(device_handle, &context_handle);
869*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
870*7688df22SAndroid Build Coastguard Worker
871*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096,
872*7688df22SAndroid Build Coastguard Worker AMDGPU_GEM_DOMAIN_GTT, 0,
873*7688df22SAndroid Build Coastguard Worker &ib_result_handle, &ib_result_cpu,
874*7688df22SAndroid Build Coastguard Worker &ib_result_mc_address, &va_handle);
875*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
876*7688df22SAndroid Build Coastguard Worker
877*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096,
878*7688df22SAndroid Build Coastguard Worker AMDGPU_GEM_DOMAIN_GTT, 0,
879*7688df22SAndroid Build Coastguard Worker &ib_result_ce_handle, &ib_result_ce_cpu,
880*7688df22SAndroid Build Coastguard Worker &ib_result_ce_mc_address, &va_handle_ce);
881*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
882*7688df22SAndroid Build Coastguard Worker
883*7688df22SAndroid Build Coastguard Worker r = amdgpu_get_bo_list(device_handle, ib_result_handle,
884*7688df22SAndroid Build Coastguard Worker ib_result_ce_handle, &bo_list);
885*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
886*7688df22SAndroid Build Coastguard Worker
887*7688df22SAndroid Build Coastguard Worker memset(ib_info, 0, 2 * sizeof(struct amdgpu_cs_ib_info));
888*7688df22SAndroid Build Coastguard Worker
889*7688df22SAndroid Build Coastguard Worker /* IT_SET_CE_DE_COUNTERS */
890*7688df22SAndroid Build Coastguard Worker ptr = ib_result_ce_cpu;
891*7688df22SAndroid Build Coastguard Worker if (family_id != AMDGPU_FAMILY_SI) {
892*7688df22SAndroid Build Coastguard Worker ptr[i++] = 0xc0008900;
893*7688df22SAndroid Build Coastguard Worker ptr[i++] = 0;
894*7688df22SAndroid Build Coastguard Worker }
895*7688df22SAndroid Build Coastguard Worker ptr[i++] = 0xc0008400;
896*7688df22SAndroid Build Coastguard Worker ptr[i++] = 1;
897*7688df22SAndroid Build Coastguard Worker ib_info[0].ib_mc_address = ib_result_ce_mc_address;
898*7688df22SAndroid Build Coastguard Worker ib_info[0].size = i;
899*7688df22SAndroid Build Coastguard Worker ib_info[0].flags = AMDGPU_IB_FLAG_CE;
900*7688df22SAndroid Build Coastguard Worker
901*7688df22SAndroid Build Coastguard Worker /* IT_WAIT_ON_CE_COUNTER */
902*7688df22SAndroid Build Coastguard Worker ptr = ib_result_cpu;
903*7688df22SAndroid Build Coastguard Worker ptr[0] = 0xc0008600;
904*7688df22SAndroid Build Coastguard Worker ptr[1] = 0x00000001;
905*7688df22SAndroid Build Coastguard Worker ib_info[1].ib_mc_address = ib_result_mc_address;
906*7688df22SAndroid Build Coastguard Worker ib_info[1].size = 2;
907*7688df22SAndroid Build Coastguard Worker
908*7688df22SAndroid Build Coastguard Worker ibs_request.ip_type = AMDGPU_HW_IP_GFX;
909*7688df22SAndroid Build Coastguard Worker ibs_request.number_of_ibs = 2;
910*7688df22SAndroid Build Coastguard Worker ibs_request.ibs = ib_info;
911*7688df22SAndroid Build Coastguard Worker ibs_request.resources = bo_list;
912*7688df22SAndroid Build Coastguard Worker ibs_request.fence_info.handle = NULL;
913*7688df22SAndroid Build Coastguard Worker
914*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_submit(context_handle, 0,&ibs_request, 1);
915*7688df22SAndroid Build Coastguard Worker
916*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
917*7688df22SAndroid Build Coastguard Worker
918*7688df22SAndroid Build Coastguard Worker fence_status.context = context_handle;
919*7688df22SAndroid Build Coastguard Worker fence_status.ip_type = AMDGPU_HW_IP_GFX;
920*7688df22SAndroid Build Coastguard Worker fence_status.ip_instance = 0;
921*7688df22SAndroid Build Coastguard Worker fence_status.fence = ibs_request.seq_no;
922*7688df22SAndroid Build Coastguard Worker
923*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_query_fence_status(&fence_status,
924*7688df22SAndroid Build Coastguard Worker AMDGPU_TIMEOUT_INFINITE,
925*7688df22SAndroid Build Coastguard Worker 0, &expired);
926*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
927*7688df22SAndroid Build Coastguard Worker
928*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle,
929*7688df22SAndroid Build Coastguard Worker ib_result_mc_address, 4096);
930*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
931*7688df22SAndroid Build Coastguard Worker
932*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_unmap_and_free(ib_result_ce_handle, va_handle_ce,
933*7688df22SAndroid Build Coastguard Worker ib_result_ce_mc_address, 4096);
934*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
935*7688df22SAndroid Build Coastguard Worker
936*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_list_destroy(bo_list);
937*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
938*7688df22SAndroid Build Coastguard Worker
939*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_ctx_free(context_handle);
940*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
941*7688df22SAndroid Build Coastguard Worker
942*7688df22SAndroid Build Coastguard Worker }
943*7688df22SAndroid Build Coastguard Worker
amdgpu_command_submission_gfx_shared_ib(void)944*7688df22SAndroid Build Coastguard Worker static void amdgpu_command_submission_gfx_shared_ib(void)
945*7688df22SAndroid Build Coastguard Worker {
946*7688df22SAndroid Build Coastguard Worker amdgpu_context_handle context_handle;
947*7688df22SAndroid Build Coastguard Worker amdgpu_bo_handle ib_result_handle;
948*7688df22SAndroid Build Coastguard Worker void *ib_result_cpu;
949*7688df22SAndroid Build Coastguard Worker uint64_t ib_result_mc_address;
950*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_request ibs_request = {0};
951*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_ib_info ib_info[2];
952*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_fence fence_status = {0};
953*7688df22SAndroid Build Coastguard Worker uint32_t *ptr;
954*7688df22SAndroid Build Coastguard Worker uint32_t expired;
955*7688df22SAndroid Build Coastguard Worker amdgpu_bo_list_handle bo_list;
956*7688df22SAndroid Build Coastguard Worker amdgpu_va_handle va_handle;
957*7688df22SAndroid Build Coastguard Worker int r, i = 0;
958*7688df22SAndroid Build Coastguard Worker struct drm_amdgpu_info_hw_ip info;
959*7688df22SAndroid Build Coastguard Worker
960*7688df22SAndroid Build Coastguard Worker r = amdgpu_query_hw_ip_info(device_handle, AMDGPU_HW_IP_GFX, 0, &info);
961*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
962*7688df22SAndroid Build Coastguard Worker
963*7688df22SAndroid Build Coastguard Worker if (info.hw_ip_version_major >= 11)
964*7688df22SAndroid Build Coastguard Worker return;
965*7688df22SAndroid Build Coastguard Worker
966*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_ctx_create(device_handle, &context_handle);
967*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
968*7688df22SAndroid Build Coastguard Worker
969*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096,
970*7688df22SAndroid Build Coastguard Worker AMDGPU_GEM_DOMAIN_GTT, 0,
971*7688df22SAndroid Build Coastguard Worker &ib_result_handle, &ib_result_cpu,
972*7688df22SAndroid Build Coastguard Worker &ib_result_mc_address, &va_handle);
973*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
974*7688df22SAndroid Build Coastguard Worker
975*7688df22SAndroid Build Coastguard Worker r = amdgpu_get_bo_list(device_handle, ib_result_handle, NULL,
976*7688df22SAndroid Build Coastguard Worker &bo_list);
977*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
978*7688df22SAndroid Build Coastguard Worker
979*7688df22SAndroid Build Coastguard Worker memset(ib_info, 0, 2 * sizeof(struct amdgpu_cs_ib_info));
980*7688df22SAndroid Build Coastguard Worker
981*7688df22SAndroid Build Coastguard Worker /* IT_SET_CE_DE_COUNTERS */
982*7688df22SAndroid Build Coastguard Worker ptr = ib_result_cpu;
983*7688df22SAndroid Build Coastguard Worker if (family_id != AMDGPU_FAMILY_SI) {
984*7688df22SAndroid Build Coastguard Worker ptr[i++] = 0xc0008900;
985*7688df22SAndroid Build Coastguard Worker ptr[i++] = 0;
986*7688df22SAndroid Build Coastguard Worker }
987*7688df22SAndroid Build Coastguard Worker ptr[i++] = 0xc0008400;
988*7688df22SAndroid Build Coastguard Worker ptr[i++] = 1;
989*7688df22SAndroid Build Coastguard Worker ib_info[0].ib_mc_address = ib_result_mc_address;
990*7688df22SAndroid Build Coastguard Worker ib_info[0].size = i;
991*7688df22SAndroid Build Coastguard Worker ib_info[0].flags = AMDGPU_IB_FLAG_CE;
992*7688df22SAndroid Build Coastguard Worker
993*7688df22SAndroid Build Coastguard Worker ptr = (uint32_t *)ib_result_cpu + 4;
994*7688df22SAndroid Build Coastguard Worker ptr[0] = 0xc0008600;
995*7688df22SAndroid Build Coastguard Worker ptr[1] = 0x00000001;
996*7688df22SAndroid Build Coastguard Worker ib_info[1].ib_mc_address = ib_result_mc_address + 16;
997*7688df22SAndroid Build Coastguard Worker ib_info[1].size = 2;
998*7688df22SAndroid Build Coastguard Worker
999*7688df22SAndroid Build Coastguard Worker ibs_request.ip_type = AMDGPU_HW_IP_GFX;
1000*7688df22SAndroid Build Coastguard Worker ibs_request.number_of_ibs = 2;
1001*7688df22SAndroid Build Coastguard Worker ibs_request.ibs = ib_info;
1002*7688df22SAndroid Build Coastguard Worker ibs_request.resources = bo_list;
1003*7688df22SAndroid Build Coastguard Worker ibs_request.fence_info.handle = NULL;
1004*7688df22SAndroid Build Coastguard Worker
1005*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_submit(context_handle, 0, &ibs_request, 1);
1006*7688df22SAndroid Build Coastguard Worker
1007*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1008*7688df22SAndroid Build Coastguard Worker
1009*7688df22SAndroid Build Coastguard Worker fence_status.context = context_handle;
1010*7688df22SAndroid Build Coastguard Worker fence_status.ip_type = AMDGPU_HW_IP_GFX;
1011*7688df22SAndroid Build Coastguard Worker fence_status.ip_instance = 0;
1012*7688df22SAndroid Build Coastguard Worker fence_status.fence = ibs_request.seq_no;
1013*7688df22SAndroid Build Coastguard Worker
1014*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_query_fence_status(&fence_status,
1015*7688df22SAndroid Build Coastguard Worker AMDGPU_TIMEOUT_INFINITE,
1016*7688df22SAndroid Build Coastguard Worker 0, &expired);
1017*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1018*7688df22SAndroid Build Coastguard Worker
1019*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle,
1020*7688df22SAndroid Build Coastguard Worker ib_result_mc_address, 4096);
1021*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1022*7688df22SAndroid Build Coastguard Worker
1023*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_list_destroy(bo_list);
1024*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1025*7688df22SAndroid Build Coastguard Worker
1026*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_ctx_free(context_handle);
1027*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1028*7688df22SAndroid Build Coastguard Worker }
1029*7688df22SAndroid Build Coastguard Worker
amdgpu_command_submission_gfx_cp_write_data(void)1030*7688df22SAndroid Build Coastguard Worker static void amdgpu_command_submission_gfx_cp_write_data(void)
1031*7688df22SAndroid Build Coastguard Worker {
1032*7688df22SAndroid Build Coastguard Worker amdgpu_command_submission_write_linear_helper(AMDGPU_HW_IP_GFX);
1033*7688df22SAndroid Build Coastguard Worker }
1034*7688df22SAndroid Build Coastguard Worker
amdgpu_command_submission_gfx_cp_const_fill(void)1035*7688df22SAndroid Build Coastguard Worker static void amdgpu_command_submission_gfx_cp_const_fill(void)
1036*7688df22SAndroid Build Coastguard Worker {
1037*7688df22SAndroid Build Coastguard Worker amdgpu_command_submission_const_fill_helper(AMDGPU_HW_IP_GFX);
1038*7688df22SAndroid Build Coastguard Worker }
1039*7688df22SAndroid Build Coastguard Worker
amdgpu_command_submission_gfx_cp_copy_data(void)1040*7688df22SAndroid Build Coastguard Worker static void amdgpu_command_submission_gfx_cp_copy_data(void)
1041*7688df22SAndroid Build Coastguard Worker {
1042*7688df22SAndroid Build Coastguard Worker amdgpu_command_submission_copy_linear_helper(AMDGPU_HW_IP_GFX);
1043*7688df22SAndroid Build Coastguard Worker }
1044*7688df22SAndroid Build Coastguard Worker
amdgpu_bo_eviction_test(void)1045*7688df22SAndroid Build Coastguard Worker static void amdgpu_bo_eviction_test(void)
1046*7688df22SAndroid Build Coastguard Worker {
1047*7688df22SAndroid Build Coastguard Worker const int sdma_write_length = 1024;
1048*7688df22SAndroid Build Coastguard Worker const int pm4_dw = 256;
1049*7688df22SAndroid Build Coastguard Worker amdgpu_context_handle context_handle;
1050*7688df22SAndroid Build Coastguard Worker amdgpu_bo_handle bo1, bo2, vram_max[2], gtt_max[2];
1051*7688df22SAndroid Build Coastguard Worker amdgpu_bo_handle *resources;
1052*7688df22SAndroid Build Coastguard Worker uint32_t *pm4;
1053*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_ib_info *ib_info;
1054*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_request *ibs_request;
1055*7688df22SAndroid Build Coastguard Worker uint64_t bo1_mc, bo2_mc;
1056*7688df22SAndroid Build Coastguard Worker volatile unsigned char *bo1_cpu, *bo2_cpu;
1057*7688df22SAndroid Build Coastguard Worker int i, j, r, loop1, loop2;
1058*7688df22SAndroid Build Coastguard Worker uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC};
1059*7688df22SAndroid Build Coastguard Worker amdgpu_va_handle bo1_va_handle, bo2_va_handle;
1060*7688df22SAndroid Build Coastguard Worker struct amdgpu_heap_info vram_info, gtt_info;
1061*7688df22SAndroid Build Coastguard Worker
1062*7688df22SAndroid Build Coastguard Worker pm4 = calloc(pm4_dw, sizeof(*pm4));
1063*7688df22SAndroid Build Coastguard Worker CU_ASSERT_NOT_EQUAL(pm4, NULL);
1064*7688df22SAndroid Build Coastguard Worker
1065*7688df22SAndroid Build Coastguard Worker ib_info = calloc(1, sizeof(*ib_info));
1066*7688df22SAndroid Build Coastguard Worker CU_ASSERT_NOT_EQUAL(ib_info, NULL);
1067*7688df22SAndroid Build Coastguard Worker
1068*7688df22SAndroid Build Coastguard Worker ibs_request = calloc(1, sizeof(*ibs_request));
1069*7688df22SAndroid Build Coastguard Worker CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
1070*7688df22SAndroid Build Coastguard Worker
1071*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_ctx_create(device_handle, &context_handle);
1072*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1073*7688df22SAndroid Build Coastguard Worker
1074*7688df22SAndroid Build Coastguard Worker /* prepare resource */
1075*7688df22SAndroid Build Coastguard Worker resources = calloc(4, sizeof(amdgpu_bo_handle));
1076*7688df22SAndroid Build Coastguard Worker CU_ASSERT_NOT_EQUAL(resources, NULL);
1077*7688df22SAndroid Build Coastguard Worker
1078*7688df22SAndroid Build Coastguard Worker r = amdgpu_query_heap_info(device_handle, AMDGPU_GEM_DOMAIN_VRAM,
1079*7688df22SAndroid Build Coastguard Worker 0, &vram_info);
1080*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1081*7688df22SAndroid Build Coastguard Worker
1082*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_alloc_wrap(device_handle, vram_info.max_allocation, 4096,
1083*7688df22SAndroid Build Coastguard Worker AMDGPU_GEM_DOMAIN_VRAM, 0, &vram_max[0]);
1084*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1085*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_alloc_wrap(device_handle, vram_info.max_allocation, 4096,
1086*7688df22SAndroid Build Coastguard Worker AMDGPU_GEM_DOMAIN_VRAM, 0, &vram_max[1]);
1087*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1088*7688df22SAndroid Build Coastguard Worker
1089*7688df22SAndroid Build Coastguard Worker r = amdgpu_query_heap_info(device_handle, AMDGPU_GEM_DOMAIN_GTT,
1090*7688df22SAndroid Build Coastguard Worker 0, >t_info);
1091*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1092*7688df22SAndroid Build Coastguard Worker
1093*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_alloc_wrap(device_handle, gtt_info.max_allocation, 4096,
1094*7688df22SAndroid Build Coastguard Worker AMDGPU_GEM_DOMAIN_GTT, 0, >t_max[0]);
1095*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1096*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_alloc_wrap(device_handle, gtt_info.max_allocation, 4096,
1097*7688df22SAndroid Build Coastguard Worker AMDGPU_GEM_DOMAIN_GTT, 0, >t_max[1]);
1098*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1099*7688df22SAndroid Build Coastguard Worker
1100*7688df22SAndroid Build Coastguard Worker
1101*7688df22SAndroid Build Coastguard Worker
1102*7688df22SAndroid Build Coastguard Worker loop1 = loop2 = 0;
1103*7688df22SAndroid Build Coastguard Worker /* run 9 circle to test all mapping combination */
1104*7688df22SAndroid Build Coastguard Worker while(loop1 < 2) {
1105*7688df22SAndroid Build Coastguard Worker while(loop2 < 2) {
1106*7688df22SAndroid Build Coastguard Worker /* allocate UC bo1for sDMA use */
1107*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_alloc_and_map(device_handle,
1108*7688df22SAndroid Build Coastguard Worker sdma_write_length, 4096,
1109*7688df22SAndroid Build Coastguard Worker AMDGPU_GEM_DOMAIN_GTT,
1110*7688df22SAndroid Build Coastguard Worker gtt_flags[loop1], &bo1,
1111*7688df22SAndroid Build Coastguard Worker (void**)&bo1_cpu, &bo1_mc,
1112*7688df22SAndroid Build Coastguard Worker &bo1_va_handle);
1113*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1114*7688df22SAndroid Build Coastguard Worker
1115*7688df22SAndroid Build Coastguard Worker /* set bo1 */
1116*7688df22SAndroid Build Coastguard Worker memset((void*)bo1_cpu, 0xaa, sdma_write_length);
1117*7688df22SAndroid Build Coastguard Worker
1118*7688df22SAndroid Build Coastguard Worker /* allocate UC bo2 for sDMA use */
1119*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_alloc_and_map(device_handle,
1120*7688df22SAndroid Build Coastguard Worker sdma_write_length, 4096,
1121*7688df22SAndroid Build Coastguard Worker AMDGPU_GEM_DOMAIN_GTT,
1122*7688df22SAndroid Build Coastguard Worker gtt_flags[loop2], &bo2,
1123*7688df22SAndroid Build Coastguard Worker (void**)&bo2_cpu, &bo2_mc,
1124*7688df22SAndroid Build Coastguard Worker &bo2_va_handle);
1125*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1126*7688df22SAndroid Build Coastguard Worker
1127*7688df22SAndroid Build Coastguard Worker /* clear bo2 */
1128*7688df22SAndroid Build Coastguard Worker memset((void*)bo2_cpu, 0, sdma_write_length);
1129*7688df22SAndroid Build Coastguard Worker
1130*7688df22SAndroid Build Coastguard Worker resources[0] = bo1;
1131*7688df22SAndroid Build Coastguard Worker resources[1] = bo2;
1132*7688df22SAndroid Build Coastguard Worker resources[2] = vram_max[loop2];
1133*7688df22SAndroid Build Coastguard Worker resources[3] = gtt_max[loop2];
1134*7688df22SAndroid Build Coastguard Worker
1135*7688df22SAndroid Build Coastguard Worker /* fulfill PM4: test DMA copy linear */
1136*7688df22SAndroid Build Coastguard Worker i = j = 0;
1137*7688df22SAndroid Build Coastguard Worker if (family_id == AMDGPU_FAMILY_SI) {
1138*7688df22SAndroid Build Coastguard Worker pm4[i++] = SDMA_PACKET_SI(SDMA_OPCODE_COPY_SI, 0, 0, 0,
1139*7688df22SAndroid Build Coastguard Worker sdma_write_length);
1140*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0xffffffff & bo2_mc;
1141*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0xffffffff & bo1_mc;
1142*7688df22SAndroid Build Coastguard Worker pm4[i++] = (0xffffffff00000000 & bo2_mc) >> 32;
1143*7688df22SAndroid Build Coastguard Worker pm4[i++] = (0xffffffff00000000 & bo1_mc) >> 32;
1144*7688df22SAndroid Build Coastguard Worker } else {
1145*7688df22SAndroid Build Coastguard Worker pm4[i++] = SDMA_PACKET(SDMA_OPCODE_COPY, SDMA_COPY_SUB_OPCODE_LINEAR, 0);
1146*7688df22SAndroid Build Coastguard Worker if (family_id >= AMDGPU_FAMILY_AI)
1147*7688df22SAndroid Build Coastguard Worker pm4[i++] = sdma_write_length - 1;
1148*7688df22SAndroid Build Coastguard Worker else
1149*7688df22SAndroid Build Coastguard Worker pm4[i++] = sdma_write_length;
1150*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0;
1151*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0xffffffff & bo1_mc;
1152*7688df22SAndroid Build Coastguard Worker pm4[i++] = (0xffffffff00000000 & bo1_mc) >> 32;
1153*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0xffffffff & bo2_mc;
1154*7688df22SAndroid Build Coastguard Worker pm4[i++] = (0xffffffff00000000 & bo2_mc) >> 32;
1155*7688df22SAndroid Build Coastguard Worker }
1156*7688df22SAndroid Build Coastguard Worker
1157*7688df22SAndroid Build Coastguard Worker amdgpu_test_exec_cs_helper(context_handle,
1158*7688df22SAndroid Build Coastguard Worker AMDGPU_HW_IP_DMA, 0,
1159*7688df22SAndroid Build Coastguard Worker i, pm4,
1160*7688df22SAndroid Build Coastguard Worker 4, resources,
1161*7688df22SAndroid Build Coastguard Worker ib_info, ibs_request);
1162*7688df22SAndroid Build Coastguard Worker
1163*7688df22SAndroid Build Coastguard Worker /* verify if SDMA test result meets with expected */
1164*7688df22SAndroid Build Coastguard Worker i = 0;
1165*7688df22SAndroid Build Coastguard Worker while(i < sdma_write_length) {
1166*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(bo2_cpu[i++], 0xaa);
1167*7688df22SAndroid Build Coastguard Worker }
1168*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_unmap_and_free(bo1, bo1_va_handle, bo1_mc,
1169*7688df22SAndroid Build Coastguard Worker sdma_write_length);
1170*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1171*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_unmap_and_free(bo2, bo2_va_handle, bo2_mc,
1172*7688df22SAndroid Build Coastguard Worker sdma_write_length);
1173*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1174*7688df22SAndroid Build Coastguard Worker loop2++;
1175*7688df22SAndroid Build Coastguard Worker }
1176*7688df22SAndroid Build Coastguard Worker loop2 = 0;
1177*7688df22SAndroid Build Coastguard Worker loop1++;
1178*7688df22SAndroid Build Coastguard Worker }
1179*7688df22SAndroid Build Coastguard Worker amdgpu_bo_free(vram_max[0]);
1180*7688df22SAndroid Build Coastguard Worker amdgpu_bo_free(vram_max[1]);
1181*7688df22SAndroid Build Coastguard Worker amdgpu_bo_free(gtt_max[0]);
1182*7688df22SAndroid Build Coastguard Worker amdgpu_bo_free(gtt_max[1]);
1183*7688df22SAndroid Build Coastguard Worker /* clean resources */
1184*7688df22SAndroid Build Coastguard Worker free(resources);
1185*7688df22SAndroid Build Coastguard Worker free(ibs_request);
1186*7688df22SAndroid Build Coastguard Worker free(ib_info);
1187*7688df22SAndroid Build Coastguard Worker free(pm4);
1188*7688df22SAndroid Build Coastguard Worker
1189*7688df22SAndroid Build Coastguard Worker /* end of test */
1190*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_ctx_free(context_handle);
1191*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1192*7688df22SAndroid Build Coastguard Worker }
1193*7688df22SAndroid Build Coastguard Worker
1194*7688df22SAndroid Build Coastguard Worker
amdgpu_command_submission_gfx(void)1195*7688df22SAndroid Build Coastguard Worker static void amdgpu_command_submission_gfx(void)
1196*7688df22SAndroid Build Coastguard Worker {
1197*7688df22SAndroid Build Coastguard Worker /* write data using the CP */
1198*7688df22SAndroid Build Coastguard Worker amdgpu_command_submission_gfx_cp_write_data();
1199*7688df22SAndroid Build Coastguard Worker /* const fill using the CP */
1200*7688df22SAndroid Build Coastguard Worker amdgpu_command_submission_gfx_cp_const_fill();
1201*7688df22SAndroid Build Coastguard Worker /* copy data using the CP */
1202*7688df22SAndroid Build Coastguard Worker amdgpu_command_submission_gfx_cp_copy_data();
1203*7688df22SAndroid Build Coastguard Worker /* separate IB buffers for multi-IB submission */
1204*7688df22SAndroid Build Coastguard Worker amdgpu_command_submission_gfx_separate_ibs();
1205*7688df22SAndroid Build Coastguard Worker /* shared IB buffer for multi-IB submission */
1206*7688df22SAndroid Build Coastguard Worker amdgpu_command_submission_gfx_shared_ib();
1207*7688df22SAndroid Build Coastguard Worker }
1208*7688df22SAndroid Build Coastguard Worker
amdgpu_semaphore_test(void)1209*7688df22SAndroid Build Coastguard Worker static void amdgpu_semaphore_test(void)
1210*7688df22SAndroid Build Coastguard Worker {
1211*7688df22SAndroid Build Coastguard Worker amdgpu_context_handle context_handle[2];
1212*7688df22SAndroid Build Coastguard Worker amdgpu_semaphore_handle sem;
1213*7688df22SAndroid Build Coastguard Worker amdgpu_bo_handle ib_result_handle[2];
1214*7688df22SAndroid Build Coastguard Worker void *ib_result_cpu[2];
1215*7688df22SAndroid Build Coastguard Worker uint64_t ib_result_mc_address[2];
1216*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_request ibs_request[2] = {0};
1217*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_ib_info ib_info[2] = {0};
1218*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_fence fence_status = {0};
1219*7688df22SAndroid Build Coastguard Worker uint32_t *ptr;
1220*7688df22SAndroid Build Coastguard Worker uint32_t expired;
1221*7688df22SAndroid Build Coastguard Worker uint32_t sdma_nop, gfx_nop;
1222*7688df22SAndroid Build Coastguard Worker amdgpu_bo_list_handle bo_list[2];
1223*7688df22SAndroid Build Coastguard Worker amdgpu_va_handle va_handle[2];
1224*7688df22SAndroid Build Coastguard Worker int r, i;
1225*7688df22SAndroid Build Coastguard Worker struct amdgpu_gpu_info gpu_info = {0};
1226*7688df22SAndroid Build Coastguard Worker unsigned gc_ip_type;
1227*7688df22SAndroid Build Coastguard Worker
1228*7688df22SAndroid Build Coastguard Worker r = amdgpu_query_gpu_info(device_handle, &gpu_info);
1229*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1230*7688df22SAndroid Build Coastguard Worker
1231*7688df22SAndroid Build Coastguard Worker gc_ip_type = (asic_is_gfx_pipe_removed(family_id, chip_id, chip_rev)) ?
1232*7688df22SAndroid Build Coastguard Worker AMDGPU_HW_IP_COMPUTE : AMDGPU_HW_IP_GFX;
1233*7688df22SAndroid Build Coastguard Worker
1234*7688df22SAndroid Build Coastguard Worker if (family_id == AMDGPU_FAMILY_SI) {
1235*7688df22SAndroid Build Coastguard Worker sdma_nop = SDMA_PACKET_SI(SDMA_NOP_SI, 0, 0, 0, 0);
1236*7688df22SAndroid Build Coastguard Worker gfx_nop = GFX_COMPUTE_NOP_SI;
1237*7688df22SAndroid Build Coastguard Worker } else {
1238*7688df22SAndroid Build Coastguard Worker sdma_nop = SDMA_PKT_HEADER_OP(SDMA_NOP);
1239*7688df22SAndroid Build Coastguard Worker gfx_nop = GFX_COMPUTE_NOP;
1240*7688df22SAndroid Build Coastguard Worker }
1241*7688df22SAndroid Build Coastguard Worker
1242*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_create_semaphore(&sem);
1243*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1244*7688df22SAndroid Build Coastguard Worker for (i = 0; i < 2; i++) {
1245*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_ctx_create(device_handle, &context_handle[i]);
1246*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1247*7688df22SAndroid Build Coastguard Worker
1248*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096,
1249*7688df22SAndroid Build Coastguard Worker AMDGPU_GEM_DOMAIN_GTT, 0,
1250*7688df22SAndroid Build Coastguard Worker &ib_result_handle[i], &ib_result_cpu[i],
1251*7688df22SAndroid Build Coastguard Worker &ib_result_mc_address[i], &va_handle[i]);
1252*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1253*7688df22SAndroid Build Coastguard Worker
1254*7688df22SAndroid Build Coastguard Worker r = amdgpu_get_bo_list(device_handle, ib_result_handle[i],
1255*7688df22SAndroid Build Coastguard Worker NULL, &bo_list[i]);
1256*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1257*7688df22SAndroid Build Coastguard Worker }
1258*7688df22SAndroid Build Coastguard Worker
1259*7688df22SAndroid Build Coastguard Worker /* 1. same context different engine */
1260*7688df22SAndroid Build Coastguard Worker ptr = ib_result_cpu[0];
1261*7688df22SAndroid Build Coastguard Worker ptr[0] = sdma_nop;
1262*7688df22SAndroid Build Coastguard Worker ib_info[0].ib_mc_address = ib_result_mc_address[0];
1263*7688df22SAndroid Build Coastguard Worker ib_info[0].size = 1;
1264*7688df22SAndroid Build Coastguard Worker
1265*7688df22SAndroid Build Coastguard Worker ibs_request[0].ip_type = AMDGPU_HW_IP_DMA;
1266*7688df22SAndroid Build Coastguard Worker ibs_request[0].number_of_ibs = 1;
1267*7688df22SAndroid Build Coastguard Worker ibs_request[0].ibs = &ib_info[0];
1268*7688df22SAndroid Build Coastguard Worker ibs_request[0].resources = bo_list[0];
1269*7688df22SAndroid Build Coastguard Worker ibs_request[0].fence_info.handle = NULL;
1270*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_submit(context_handle[0], 0,&ibs_request[0], 1);
1271*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1272*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_signal_semaphore(context_handle[0], AMDGPU_HW_IP_DMA, 0, 0, sem);
1273*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1274*7688df22SAndroid Build Coastguard Worker
1275*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_wait_semaphore(context_handle[0], gc_ip_type, 0, 0, sem);
1276*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1277*7688df22SAndroid Build Coastguard Worker ptr = ib_result_cpu[1];
1278*7688df22SAndroid Build Coastguard Worker ptr[0] = gfx_nop;
1279*7688df22SAndroid Build Coastguard Worker ib_info[1].ib_mc_address = ib_result_mc_address[1];
1280*7688df22SAndroid Build Coastguard Worker ib_info[1].size = 1;
1281*7688df22SAndroid Build Coastguard Worker
1282*7688df22SAndroid Build Coastguard Worker ibs_request[1].ip_type = gc_ip_type;
1283*7688df22SAndroid Build Coastguard Worker ibs_request[1].number_of_ibs = 1;
1284*7688df22SAndroid Build Coastguard Worker ibs_request[1].ibs = &ib_info[1];
1285*7688df22SAndroid Build Coastguard Worker ibs_request[1].resources = bo_list[1];
1286*7688df22SAndroid Build Coastguard Worker ibs_request[1].fence_info.handle = NULL;
1287*7688df22SAndroid Build Coastguard Worker
1288*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_submit(context_handle[0], 0,&ibs_request[1], 1);
1289*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1290*7688df22SAndroid Build Coastguard Worker
1291*7688df22SAndroid Build Coastguard Worker fence_status.context = context_handle[0];
1292*7688df22SAndroid Build Coastguard Worker fence_status.ip_type = gc_ip_type;
1293*7688df22SAndroid Build Coastguard Worker fence_status.ip_instance = 0;
1294*7688df22SAndroid Build Coastguard Worker fence_status.fence = ibs_request[1].seq_no;
1295*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_query_fence_status(&fence_status,
1296*7688df22SAndroid Build Coastguard Worker AMDGPU_TIMEOUT_INFINITE, 0, &expired);
1297*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1298*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(expired, true);
1299*7688df22SAndroid Build Coastguard Worker
1300*7688df22SAndroid Build Coastguard Worker /* 2. same engine different context */
1301*7688df22SAndroid Build Coastguard Worker ptr = ib_result_cpu[0];
1302*7688df22SAndroid Build Coastguard Worker ptr[0] = gfx_nop;
1303*7688df22SAndroid Build Coastguard Worker ib_info[0].ib_mc_address = ib_result_mc_address[0];
1304*7688df22SAndroid Build Coastguard Worker ib_info[0].size = 1;
1305*7688df22SAndroid Build Coastguard Worker
1306*7688df22SAndroid Build Coastguard Worker ibs_request[0].ip_type = gc_ip_type;
1307*7688df22SAndroid Build Coastguard Worker ibs_request[0].number_of_ibs = 1;
1308*7688df22SAndroid Build Coastguard Worker ibs_request[0].ibs = &ib_info[0];
1309*7688df22SAndroid Build Coastguard Worker ibs_request[0].resources = bo_list[0];
1310*7688df22SAndroid Build Coastguard Worker ibs_request[0].fence_info.handle = NULL;
1311*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_submit(context_handle[0], 0,&ibs_request[0], 1);
1312*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1313*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_signal_semaphore(context_handle[0], gc_ip_type, 0, 0, sem);
1314*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1315*7688df22SAndroid Build Coastguard Worker
1316*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_wait_semaphore(context_handle[1], gc_ip_type, 0, 0, sem);
1317*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1318*7688df22SAndroid Build Coastguard Worker ptr = ib_result_cpu[1];
1319*7688df22SAndroid Build Coastguard Worker ptr[0] = gfx_nop;
1320*7688df22SAndroid Build Coastguard Worker ib_info[1].ib_mc_address = ib_result_mc_address[1];
1321*7688df22SAndroid Build Coastguard Worker ib_info[1].size = 1;
1322*7688df22SAndroid Build Coastguard Worker
1323*7688df22SAndroid Build Coastguard Worker ibs_request[1].ip_type = gc_ip_type;
1324*7688df22SAndroid Build Coastguard Worker ibs_request[1].number_of_ibs = 1;
1325*7688df22SAndroid Build Coastguard Worker ibs_request[1].ibs = &ib_info[1];
1326*7688df22SAndroid Build Coastguard Worker ibs_request[1].resources = bo_list[1];
1327*7688df22SAndroid Build Coastguard Worker ibs_request[1].fence_info.handle = NULL;
1328*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_submit(context_handle[1], 0,&ibs_request[1], 1);
1329*7688df22SAndroid Build Coastguard Worker
1330*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1331*7688df22SAndroid Build Coastguard Worker
1332*7688df22SAndroid Build Coastguard Worker fence_status.context = context_handle[1];
1333*7688df22SAndroid Build Coastguard Worker fence_status.ip_type = gc_ip_type;
1334*7688df22SAndroid Build Coastguard Worker fence_status.ip_instance = 0;
1335*7688df22SAndroid Build Coastguard Worker fence_status.fence = ibs_request[1].seq_no;
1336*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_query_fence_status(&fence_status,
1337*7688df22SAndroid Build Coastguard Worker AMDGPU_TIMEOUT_INFINITE, 0, &expired);
1338*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1339*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(expired, true);
1340*7688df22SAndroid Build Coastguard Worker
1341*7688df22SAndroid Build Coastguard Worker for (i = 0; i < 2; i++) {
1342*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_unmap_and_free(ib_result_handle[i], va_handle[i],
1343*7688df22SAndroid Build Coastguard Worker ib_result_mc_address[i], 4096);
1344*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1345*7688df22SAndroid Build Coastguard Worker
1346*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_list_destroy(bo_list[i]);
1347*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1348*7688df22SAndroid Build Coastguard Worker
1349*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_ctx_free(context_handle[i]);
1350*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1351*7688df22SAndroid Build Coastguard Worker }
1352*7688df22SAndroid Build Coastguard Worker
1353*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_destroy_semaphore(sem);
1354*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1355*7688df22SAndroid Build Coastguard Worker }
1356*7688df22SAndroid Build Coastguard Worker
amdgpu_command_submission_compute_nop(void)1357*7688df22SAndroid Build Coastguard Worker static void amdgpu_command_submission_compute_nop(void)
1358*7688df22SAndroid Build Coastguard Worker {
1359*7688df22SAndroid Build Coastguard Worker amdgpu_context_handle context_handle;
1360*7688df22SAndroid Build Coastguard Worker amdgpu_bo_handle ib_result_handle;
1361*7688df22SAndroid Build Coastguard Worker void *ib_result_cpu;
1362*7688df22SAndroid Build Coastguard Worker uint64_t ib_result_mc_address;
1363*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_request ibs_request;
1364*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_ib_info ib_info;
1365*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_fence fence_status;
1366*7688df22SAndroid Build Coastguard Worker uint32_t *ptr;
1367*7688df22SAndroid Build Coastguard Worker uint32_t expired;
1368*7688df22SAndroid Build Coastguard Worker int r, instance;
1369*7688df22SAndroid Build Coastguard Worker amdgpu_bo_list_handle bo_list;
1370*7688df22SAndroid Build Coastguard Worker amdgpu_va_handle va_handle;
1371*7688df22SAndroid Build Coastguard Worker struct drm_amdgpu_info_hw_ip info;
1372*7688df22SAndroid Build Coastguard Worker
1373*7688df22SAndroid Build Coastguard Worker r = amdgpu_query_hw_ip_info(device_handle, AMDGPU_HW_IP_COMPUTE, 0, &info);
1374*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1375*7688df22SAndroid Build Coastguard Worker
1376*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_ctx_create(device_handle, &context_handle);
1377*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1378*7688df22SAndroid Build Coastguard Worker
1379*7688df22SAndroid Build Coastguard Worker for (instance = 0; (1 << instance) & info.available_rings; instance++) {
1380*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096,
1381*7688df22SAndroid Build Coastguard Worker AMDGPU_GEM_DOMAIN_GTT, 0,
1382*7688df22SAndroid Build Coastguard Worker &ib_result_handle, &ib_result_cpu,
1383*7688df22SAndroid Build Coastguard Worker &ib_result_mc_address, &va_handle);
1384*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1385*7688df22SAndroid Build Coastguard Worker
1386*7688df22SAndroid Build Coastguard Worker r = amdgpu_get_bo_list(device_handle, ib_result_handle, NULL,
1387*7688df22SAndroid Build Coastguard Worker &bo_list);
1388*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1389*7688df22SAndroid Build Coastguard Worker
1390*7688df22SAndroid Build Coastguard Worker ptr = ib_result_cpu;
1391*7688df22SAndroid Build Coastguard Worker memset(ptr, 0, 16);
1392*7688df22SAndroid Build Coastguard Worker ptr[0]=PACKET3(PACKET3_NOP, 14);
1393*7688df22SAndroid Build Coastguard Worker
1394*7688df22SAndroid Build Coastguard Worker memset(&ib_info, 0, sizeof(struct amdgpu_cs_ib_info));
1395*7688df22SAndroid Build Coastguard Worker ib_info.ib_mc_address = ib_result_mc_address;
1396*7688df22SAndroid Build Coastguard Worker ib_info.size = 16;
1397*7688df22SAndroid Build Coastguard Worker
1398*7688df22SAndroid Build Coastguard Worker memset(&ibs_request, 0, sizeof(struct amdgpu_cs_request));
1399*7688df22SAndroid Build Coastguard Worker ibs_request.ip_type = AMDGPU_HW_IP_COMPUTE;
1400*7688df22SAndroid Build Coastguard Worker ibs_request.ring = instance;
1401*7688df22SAndroid Build Coastguard Worker ibs_request.number_of_ibs = 1;
1402*7688df22SAndroid Build Coastguard Worker ibs_request.ibs = &ib_info;
1403*7688df22SAndroid Build Coastguard Worker ibs_request.resources = bo_list;
1404*7688df22SAndroid Build Coastguard Worker ibs_request.fence_info.handle = NULL;
1405*7688df22SAndroid Build Coastguard Worker
1406*7688df22SAndroid Build Coastguard Worker memset(&fence_status, 0, sizeof(struct amdgpu_cs_fence));
1407*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_submit(context_handle, 0,&ibs_request, 1);
1408*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1409*7688df22SAndroid Build Coastguard Worker
1410*7688df22SAndroid Build Coastguard Worker fence_status.context = context_handle;
1411*7688df22SAndroid Build Coastguard Worker fence_status.ip_type = AMDGPU_HW_IP_COMPUTE;
1412*7688df22SAndroid Build Coastguard Worker fence_status.ip_instance = 0;
1413*7688df22SAndroid Build Coastguard Worker fence_status.ring = instance;
1414*7688df22SAndroid Build Coastguard Worker fence_status.fence = ibs_request.seq_no;
1415*7688df22SAndroid Build Coastguard Worker
1416*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_query_fence_status(&fence_status,
1417*7688df22SAndroid Build Coastguard Worker AMDGPU_TIMEOUT_INFINITE,
1418*7688df22SAndroid Build Coastguard Worker 0, &expired);
1419*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1420*7688df22SAndroid Build Coastguard Worker
1421*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_list_destroy(bo_list);
1422*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1423*7688df22SAndroid Build Coastguard Worker
1424*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle,
1425*7688df22SAndroid Build Coastguard Worker ib_result_mc_address, 4096);
1426*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1427*7688df22SAndroid Build Coastguard Worker }
1428*7688df22SAndroid Build Coastguard Worker
1429*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_ctx_free(context_handle);
1430*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1431*7688df22SAndroid Build Coastguard Worker }
1432*7688df22SAndroid Build Coastguard Worker
amdgpu_command_submission_compute_cp_write_data(void)1433*7688df22SAndroid Build Coastguard Worker static void amdgpu_command_submission_compute_cp_write_data(void)
1434*7688df22SAndroid Build Coastguard Worker {
1435*7688df22SAndroid Build Coastguard Worker amdgpu_command_submission_write_linear_helper(AMDGPU_HW_IP_COMPUTE);
1436*7688df22SAndroid Build Coastguard Worker }
1437*7688df22SAndroid Build Coastguard Worker
amdgpu_command_submission_compute_cp_const_fill(void)1438*7688df22SAndroid Build Coastguard Worker static void amdgpu_command_submission_compute_cp_const_fill(void)
1439*7688df22SAndroid Build Coastguard Worker {
1440*7688df22SAndroid Build Coastguard Worker amdgpu_command_submission_const_fill_helper(AMDGPU_HW_IP_COMPUTE);
1441*7688df22SAndroid Build Coastguard Worker }
1442*7688df22SAndroid Build Coastguard Worker
amdgpu_command_submission_compute_cp_copy_data(void)1443*7688df22SAndroid Build Coastguard Worker static void amdgpu_command_submission_compute_cp_copy_data(void)
1444*7688df22SAndroid Build Coastguard Worker {
1445*7688df22SAndroid Build Coastguard Worker amdgpu_command_submission_copy_linear_helper(AMDGPU_HW_IP_COMPUTE);
1446*7688df22SAndroid Build Coastguard Worker }
1447*7688df22SAndroid Build Coastguard Worker
amdgpu_command_submission_compute(void)1448*7688df22SAndroid Build Coastguard Worker static void amdgpu_command_submission_compute(void)
1449*7688df22SAndroid Build Coastguard Worker {
1450*7688df22SAndroid Build Coastguard Worker /* write data using the CP */
1451*7688df22SAndroid Build Coastguard Worker amdgpu_command_submission_compute_cp_write_data();
1452*7688df22SAndroid Build Coastguard Worker /* const fill using the CP */
1453*7688df22SAndroid Build Coastguard Worker amdgpu_command_submission_compute_cp_const_fill();
1454*7688df22SAndroid Build Coastguard Worker /* copy data using the CP */
1455*7688df22SAndroid Build Coastguard Worker amdgpu_command_submission_compute_cp_copy_data();
1456*7688df22SAndroid Build Coastguard Worker /* nop test */
1457*7688df22SAndroid Build Coastguard Worker amdgpu_command_submission_compute_nop();
1458*7688df22SAndroid Build Coastguard Worker }
1459*7688df22SAndroid Build Coastguard Worker
1460*7688df22SAndroid Build Coastguard Worker /*
1461*7688df22SAndroid Build Coastguard Worker * caller need create/release:
1462*7688df22SAndroid Build Coastguard Worker * pm4_src, resources, ib_info, and ibs_request
1463*7688df22SAndroid Build Coastguard Worker * submit command stream described in ibs_request and wait for this IB accomplished
1464*7688df22SAndroid Build Coastguard Worker */
1465*7688df22SAndroid Build Coastguard Worker void
amdgpu_test_exec_cs_helper_raw(amdgpu_device_handle device_handle,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,bool secure)1466*7688df22SAndroid Build Coastguard Worker amdgpu_test_exec_cs_helper_raw(amdgpu_device_handle device_handle,
1467*7688df22SAndroid Build Coastguard Worker amdgpu_context_handle context_handle,
1468*7688df22SAndroid Build Coastguard Worker unsigned ip_type, int instance, int pm4_dw,
1469*7688df22SAndroid Build Coastguard Worker uint32_t *pm4_src, int res_cnt,
1470*7688df22SAndroid Build Coastguard Worker amdgpu_bo_handle *resources,
1471*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_ib_info *ib_info,
1472*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_request *ibs_request,
1473*7688df22SAndroid Build Coastguard Worker bool secure)
1474*7688df22SAndroid Build Coastguard Worker {
1475*7688df22SAndroid Build Coastguard Worker int r;
1476*7688df22SAndroid Build Coastguard Worker uint32_t expired;
1477*7688df22SAndroid Build Coastguard Worker uint32_t *ring_ptr;
1478*7688df22SAndroid Build Coastguard Worker amdgpu_bo_handle ib_result_handle;
1479*7688df22SAndroid Build Coastguard Worker void *ib_result_cpu;
1480*7688df22SAndroid Build Coastguard Worker uint64_t ib_result_mc_address;
1481*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_fence fence_status = {0};
1482*7688df22SAndroid Build Coastguard Worker amdgpu_bo_handle *all_res = alloca(sizeof(resources[0]) * (res_cnt + 1));
1483*7688df22SAndroid Build Coastguard Worker amdgpu_va_handle va_handle;
1484*7688df22SAndroid Build Coastguard Worker
1485*7688df22SAndroid Build Coastguard Worker /* prepare CS */
1486*7688df22SAndroid Build Coastguard Worker CU_ASSERT_NOT_EQUAL(pm4_src, NULL);
1487*7688df22SAndroid Build Coastguard Worker CU_ASSERT_NOT_EQUAL(resources, NULL);
1488*7688df22SAndroid Build Coastguard Worker CU_ASSERT_NOT_EQUAL(ib_info, NULL);
1489*7688df22SAndroid Build Coastguard Worker CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
1490*7688df22SAndroid Build Coastguard Worker CU_ASSERT_TRUE(pm4_dw <= 1024);
1491*7688df22SAndroid Build Coastguard Worker
1492*7688df22SAndroid Build Coastguard Worker /* allocate IB */
1493*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096,
1494*7688df22SAndroid Build Coastguard Worker AMDGPU_GEM_DOMAIN_GTT, 0,
1495*7688df22SAndroid Build Coastguard Worker &ib_result_handle, &ib_result_cpu,
1496*7688df22SAndroid Build Coastguard Worker &ib_result_mc_address, &va_handle);
1497*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1498*7688df22SAndroid Build Coastguard Worker
1499*7688df22SAndroid Build Coastguard Worker /* copy PM4 packet to ring from caller */
1500*7688df22SAndroid Build Coastguard Worker ring_ptr = ib_result_cpu;
1501*7688df22SAndroid Build Coastguard Worker memcpy(ring_ptr, pm4_src, pm4_dw * sizeof(*pm4_src));
1502*7688df22SAndroid Build Coastguard Worker
1503*7688df22SAndroid Build Coastguard Worker ib_info->ib_mc_address = ib_result_mc_address;
1504*7688df22SAndroid Build Coastguard Worker ib_info->size = pm4_dw;
1505*7688df22SAndroid Build Coastguard Worker if (secure)
1506*7688df22SAndroid Build Coastguard Worker ib_info->flags |= AMDGPU_IB_FLAGS_SECURE;
1507*7688df22SAndroid Build Coastguard Worker
1508*7688df22SAndroid Build Coastguard Worker ibs_request->ip_type = ip_type;
1509*7688df22SAndroid Build Coastguard Worker ibs_request->ring = instance;
1510*7688df22SAndroid Build Coastguard Worker ibs_request->number_of_ibs = 1;
1511*7688df22SAndroid Build Coastguard Worker ibs_request->ibs = ib_info;
1512*7688df22SAndroid Build Coastguard Worker ibs_request->fence_info.handle = NULL;
1513*7688df22SAndroid Build Coastguard Worker
1514*7688df22SAndroid Build Coastguard Worker memcpy(all_res, resources, sizeof(resources[0]) * res_cnt);
1515*7688df22SAndroid Build Coastguard Worker all_res[res_cnt] = ib_result_handle;
1516*7688df22SAndroid Build Coastguard Worker
1517*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_list_create(device_handle, res_cnt+1, all_res,
1518*7688df22SAndroid Build Coastguard Worker NULL, &ibs_request->resources);
1519*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1520*7688df22SAndroid Build Coastguard Worker
1521*7688df22SAndroid Build Coastguard Worker CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
1522*7688df22SAndroid Build Coastguard Worker
1523*7688df22SAndroid Build Coastguard Worker /* submit CS */
1524*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_submit(context_handle, 0, ibs_request, 1);
1525*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1526*7688df22SAndroid Build Coastguard Worker
1527*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_list_destroy(ibs_request->resources);
1528*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1529*7688df22SAndroid Build Coastguard Worker
1530*7688df22SAndroid Build Coastguard Worker fence_status.ip_type = ip_type;
1531*7688df22SAndroid Build Coastguard Worker fence_status.ip_instance = 0;
1532*7688df22SAndroid Build Coastguard Worker fence_status.ring = ibs_request->ring;
1533*7688df22SAndroid Build Coastguard Worker fence_status.context = context_handle;
1534*7688df22SAndroid Build Coastguard Worker fence_status.fence = ibs_request->seq_no;
1535*7688df22SAndroid Build Coastguard Worker
1536*7688df22SAndroid Build Coastguard Worker /* wait for IB accomplished */
1537*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_query_fence_status(&fence_status,
1538*7688df22SAndroid Build Coastguard Worker AMDGPU_TIMEOUT_INFINITE,
1539*7688df22SAndroid Build Coastguard Worker 0, &expired);
1540*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1541*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(expired, true);
1542*7688df22SAndroid Build Coastguard Worker
1543*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle,
1544*7688df22SAndroid Build Coastguard Worker ib_result_mc_address, 4096);
1545*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1546*7688df22SAndroid Build Coastguard Worker }
1547*7688df22SAndroid Build Coastguard Worker
1548*7688df22SAndroid Build Coastguard Worker static void
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)1549*7688df22SAndroid Build Coastguard Worker amdgpu_test_exec_cs_helper(amdgpu_context_handle context_handle,
1550*7688df22SAndroid Build Coastguard Worker unsigned ip_type, int instance, int pm4_dw,
1551*7688df22SAndroid Build Coastguard Worker uint32_t *pm4_src, int res_cnt,
1552*7688df22SAndroid Build Coastguard Worker amdgpu_bo_handle *resources,
1553*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_ib_info *ib_info,
1554*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_request *ibs_request)
1555*7688df22SAndroid Build Coastguard Worker {
1556*7688df22SAndroid Build Coastguard Worker amdgpu_test_exec_cs_helper_raw(device_handle, context_handle,
1557*7688df22SAndroid Build Coastguard Worker ip_type, instance, pm4_dw, pm4_src,
1558*7688df22SAndroid Build Coastguard Worker res_cnt, resources, ib_info,
1559*7688df22SAndroid Build Coastguard Worker ibs_request, false);
1560*7688df22SAndroid Build Coastguard Worker }
1561*7688df22SAndroid Build Coastguard Worker
1562*7688df22SAndroid Build Coastguard Worker void
amdgpu_command_submission_write_linear_helper_with_secure(amdgpu_device_handle device,unsigned ip_type,bool secure)1563*7688df22SAndroid Build Coastguard Worker amdgpu_command_submission_write_linear_helper_with_secure(amdgpu_device_handle
1564*7688df22SAndroid Build Coastguard Worker device, unsigned
1565*7688df22SAndroid Build Coastguard Worker ip_type, bool secure)
1566*7688df22SAndroid Build Coastguard Worker {
1567*7688df22SAndroid Build Coastguard Worker const int sdma_write_length = 128;
1568*7688df22SAndroid Build Coastguard Worker const int pm4_dw = 256;
1569*7688df22SAndroid Build Coastguard Worker amdgpu_context_handle context_handle;
1570*7688df22SAndroid Build Coastguard Worker amdgpu_bo_handle bo;
1571*7688df22SAndroid Build Coastguard Worker amdgpu_bo_handle *resources;
1572*7688df22SAndroid Build Coastguard Worker uint32_t *pm4;
1573*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_ib_info *ib_info;
1574*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_request *ibs_request;
1575*7688df22SAndroid Build Coastguard Worker uint64_t bo_mc;
1576*7688df22SAndroid Build Coastguard Worker volatile uint32_t *bo_cpu;
1577*7688df22SAndroid Build Coastguard Worker uint32_t bo_cpu_origin;
1578*7688df22SAndroid Build Coastguard Worker int i, j, r, loop, ring_id;
1579*7688df22SAndroid Build Coastguard Worker uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC};
1580*7688df22SAndroid Build Coastguard Worker amdgpu_va_handle va_handle;
1581*7688df22SAndroid Build Coastguard Worker struct drm_amdgpu_info_hw_ip hw_ip_info;
1582*7688df22SAndroid Build Coastguard Worker
1583*7688df22SAndroid Build Coastguard Worker pm4 = calloc(pm4_dw, sizeof(*pm4));
1584*7688df22SAndroid Build Coastguard Worker CU_ASSERT_NOT_EQUAL(pm4, NULL);
1585*7688df22SAndroid Build Coastguard Worker
1586*7688df22SAndroid Build Coastguard Worker ib_info = calloc(1, sizeof(*ib_info));
1587*7688df22SAndroid Build Coastguard Worker CU_ASSERT_NOT_EQUAL(ib_info, NULL);
1588*7688df22SAndroid Build Coastguard Worker
1589*7688df22SAndroid Build Coastguard Worker ibs_request = calloc(1, sizeof(*ibs_request));
1590*7688df22SAndroid Build Coastguard Worker CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
1591*7688df22SAndroid Build Coastguard Worker
1592*7688df22SAndroid Build Coastguard Worker r = amdgpu_query_hw_ip_info(device, ip_type, 0, &hw_ip_info);
1593*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1594*7688df22SAndroid Build Coastguard Worker
1595*7688df22SAndroid Build Coastguard Worker for (i = 0; secure && (i < 2); i++)
1596*7688df22SAndroid Build Coastguard Worker gtt_flags[i] |= AMDGPU_GEM_CREATE_ENCRYPTED;
1597*7688df22SAndroid Build Coastguard Worker
1598*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_ctx_create(device, &context_handle);
1599*7688df22SAndroid Build Coastguard Worker
1600*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1601*7688df22SAndroid Build Coastguard Worker
1602*7688df22SAndroid Build Coastguard Worker /* prepare resource */
1603*7688df22SAndroid Build Coastguard Worker resources = calloc(1, sizeof(amdgpu_bo_handle));
1604*7688df22SAndroid Build Coastguard Worker CU_ASSERT_NOT_EQUAL(resources, NULL);
1605*7688df22SAndroid Build Coastguard Worker
1606*7688df22SAndroid Build Coastguard Worker for (ring_id = 0; (1 << ring_id) & hw_ip_info.available_rings; ring_id++) {
1607*7688df22SAndroid Build Coastguard Worker loop = 0;
1608*7688df22SAndroid Build Coastguard Worker while(loop < 2) {
1609*7688df22SAndroid Build Coastguard Worker /* allocate UC bo for sDMA use */
1610*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_alloc_and_map(device,
1611*7688df22SAndroid Build Coastguard Worker sdma_write_length * sizeof(uint32_t),
1612*7688df22SAndroid Build Coastguard Worker 4096, AMDGPU_GEM_DOMAIN_GTT,
1613*7688df22SAndroid Build Coastguard Worker gtt_flags[loop], &bo, (void**)&bo_cpu,
1614*7688df22SAndroid Build Coastguard Worker &bo_mc, &va_handle);
1615*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1616*7688df22SAndroid Build Coastguard Worker
1617*7688df22SAndroid Build Coastguard Worker /* clear bo */
1618*7688df22SAndroid Build Coastguard Worker memset((void*)bo_cpu, 0, sdma_write_length * sizeof(uint32_t));
1619*7688df22SAndroid Build Coastguard Worker
1620*7688df22SAndroid Build Coastguard Worker resources[0] = bo;
1621*7688df22SAndroid Build Coastguard Worker
1622*7688df22SAndroid Build Coastguard Worker /* fulfill PM4: test DMA write-linear */
1623*7688df22SAndroid Build Coastguard Worker i = j = 0;
1624*7688df22SAndroid Build Coastguard Worker if (ip_type == AMDGPU_HW_IP_DMA) {
1625*7688df22SAndroid Build Coastguard Worker if (family_id == AMDGPU_FAMILY_SI)
1626*7688df22SAndroid Build Coastguard Worker pm4[i++] = SDMA_PACKET_SI(SDMA_OPCODE_WRITE, 0, 0, 0,
1627*7688df22SAndroid Build Coastguard Worker sdma_write_length);
1628*7688df22SAndroid Build Coastguard Worker else
1629*7688df22SAndroid Build Coastguard Worker pm4[i++] = SDMA_PACKET(SDMA_OPCODE_WRITE,
1630*7688df22SAndroid Build Coastguard Worker SDMA_WRITE_SUB_OPCODE_LINEAR,
1631*7688df22SAndroid Build Coastguard Worker secure ? SDMA_ATOMIC_TMZ(1) : 0);
1632*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0xfffffffc & bo_mc;
1633*7688df22SAndroid Build Coastguard Worker pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32;
1634*7688df22SAndroid Build Coastguard Worker if (family_id >= AMDGPU_FAMILY_AI)
1635*7688df22SAndroid Build Coastguard Worker pm4[i++] = sdma_write_length - 1;
1636*7688df22SAndroid Build Coastguard Worker else if (family_id != AMDGPU_FAMILY_SI)
1637*7688df22SAndroid Build Coastguard Worker pm4[i++] = sdma_write_length;
1638*7688df22SAndroid Build Coastguard Worker while(j++ < sdma_write_length)
1639*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0xdeadbeaf;
1640*7688df22SAndroid Build Coastguard Worker } else if ((ip_type == AMDGPU_HW_IP_GFX) ||
1641*7688df22SAndroid Build Coastguard Worker (ip_type == AMDGPU_HW_IP_COMPUTE)) {
1642*7688df22SAndroid Build Coastguard Worker pm4[i++] = PACKET3(PACKET3_WRITE_DATA, 2 + sdma_write_length);
1643*7688df22SAndroid Build Coastguard Worker pm4[i++] = WRITE_DATA_DST_SEL(5) | WR_CONFIRM;
1644*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0xfffffffc & bo_mc;
1645*7688df22SAndroid Build Coastguard Worker pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32;
1646*7688df22SAndroid Build Coastguard Worker while(j++ < sdma_write_length)
1647*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0xdeadbeaf;
1648*7688df22SAndroid Build Coastguard Worker }
1649*7688df22SAndroid Build Coastguard Worker
1650*7688df22SAndroid Build Coastguard Worker amdgpu_test_exec_cs_helper_raw(device, context_handle,
1651*7688df22SAndroid Build Coastguard Worker ip_type, ring_id, i, pm4,
1652*7688df22SAndroid Build Coastguard Worker 1, resources, ib_info,
1653*7688df22SAndroid Build Coastguard Worker ibs_request, secure);
1654*7688df22SAndroid Build Coastguard Worker
1655*7688df22SAndroid Build Coastguard Worker /* verify if SDMA test result meets with expected */
1656*7688df22SAndroid Build Coastguard Worker i = 0;
1657*7688df22SAndroid Build Coastguard Worker if (!secure) {
1658*7688df22SAndroid Build Coastguard Worker while(i < sdma_write_length) {
1659*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(bo_cpu[i++], 0xdeadbeaf);
1660*7688df22SAndroid Build Coastguard Worker }
1661*7688df22SAndroid Build Coastguard Worker } else if (ip_type == AMDGPU_HW_IP_GFX) {
1662*7688df22SAndroid Build Coastguard Worker memset((void*)pm4, 0, pm4_dw * sizeof(uint32_t));
1663*7688df22SAndroid Build Coastguard Worker pm4[i++] = PACKET3(PACKET3_ATOMIC_MEM, 7);
1664*7688df22SAndroid Build Coastguard Worker /* atomic opcode for 32b w/ RTN and ATOMIC_SWAPCMP_RTN
1665*7688df22SAndroid Build Coastguard Worker * command, 1-loop_until_compare_satisfied.
1666*7688df22SAndroid Build Coastguard Worker * single_pass_atomic, 0-lru
1667*7688df22SAndroid Build Coastguard Worker * engine_sel, 0-micro_engine
1668*7688df22SAndroid Build Coastguard Worker */
1669*7688df22SAndroid Build Coastguard Worker pm4[i++] = (TC_OP_ATOMIC_CMPSWAP_RTN_32 |
1670*7688df22SAndroid Build Coastguard Worker ATOMIC_MEM_COMMAND(1) |
1671*7688df22SAndroid Build Coastguard Worker ATOMIC_MEM_CACHEPOLICAY(0) |
1672*7688df22SAndroid Build Coastguard Worker ATOMIC_MEM_ENGINESEL(0));
1673*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0xfffffffc & bo_mc;
1674*7688df22SAndroid Build Coastguard Worker pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32;
1675*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0x12345678;
1676*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0x0;
1677*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0xdeadbeaf;
1678*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0x0;
1679*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0x100;
1680*7688df22SAndroid Build Coastguard Worker amdgpu_test_exec_cs_helper_raw(device, context_handle,
1681*7688df22SAndroid Build Coastguard Worker ip_type, ring_id, i, pm4,
1682*7688df22SAndroid Build Coastguard Worker 1, resources, ib_info,
1683*7688df22SAndroid Build Coastguard Worker ibs_request, true);
1684*7688df22SAndroid Build Coastguard Worker } else if (ip_type == AMDGPU_HW_IP_DMA) {
1685*7688df22SAndroid Build Coastguard Worker /* restore the bo_cpu to compare */
1686*7688df22SAndroid Build Coastguard Worker bo_cpu_origin = bo_cpu[0];
1687*7688df22SAndroid Build Coastguard Worker memset((void*)pm4, 0, pm4_dw * sizeof(uint32_t));
1688*7688df22SAndroid Build Coastguard Worker /* atomic opcode for 32b w/ RTN and ATOMIC_SWAPCMP_RTN
1689*7688df22SAndroid Build Coastguard Worker * loop, 1-loop_until_compare_satisfied.
1690*7688df22SAndroid Build Coastguard Worker * single_pass_atomic, 0-lru
1691*7688df22SAndroid Build Coastguard Worker */
1692*7688df22SAndroid Build Coastguard Worker pm4[i++] = SDMA_PACKET(SDMA_OPCODE_ATOMIC,
1693*7688df22SAndroid Build Coastguard Worker 0,
1694*7688df22SAndroid Build Coastguard Worker SDMA_ATOMIC_LOOP(1) |
1695*7688df22SAndroid Build Coastguard Worker SDMA_ATOMIC_TMZ(1) |
1696*7688df22SAndroid Build Coastguard Worker SDMA_ATOMIC_OPCODE(TC_OP_ATOMIC_CMPSWAP_RTN_32));
1697*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0xfffffffc & bo_mc;
1698*7688df22SAndroid Build Coastguard Worker pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32;
1699*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0x12345678;
1700*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0x0;
1701*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0xdeadbeaf;
1702*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0x0;
1703*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0x100;
1704*7688df22SAndroid Build Coastguard Worker amdgpu_test_exec_cs_helper_raw(device, context_handle,
1705*7688df22SAndroid Build Coastguard Worker ip_type, ring_id, i, pm4,
1706*7688df22SAndroid Build Coastguard Worker 1, resources, ib_info,
1707*7688df22SAndroid Build Coastguard Worker ibs_request, true);
1708*7688df22SAndroid Build Coastguard Worker /* DMA's atomic behavir is unlike GFX
1709*7688df22SAndroid Build Coastguard Worker * If the comparing data is not equal to destination data,
1710*7688df22SAndroid Build Coastguard Worker * For GFX, loop again till gfx timeout(system hang).
1711*7688df22SAndroid Build Coastguard Worker * For DMA, loop again till timer expired and then send interrupt.
1712*7688df22SAndroid Build Coastguard Worker * So testcase can't use interrupt mechanism.
1713*7688df22SAndroid Build Coastguard Worker * We take another way to verify. When the comparing data is not
1714*7688df22SAndroid Build Coastguard Worker * equal to destination data, overwrite the source data to the destination
1715*7688df22SAndroid Build Coastguard Worker * buffer. Otherwise, original destination data unchanged.
1716*7688df22SAndroid Build Coastguard Worker * So if the bo_cpu data is overwritten, the result is passed.
1717*7688df22SAndroid Build Coastguard Worker */
1718*7688df22SAndroid Build Coastguard Worker CU_ASSERT_NOT_EQUAL(bo_cpu[0], bo_cpu_origin);
1719*7688df22SAndroid Build Coastguard Worker
1720*7688df22SAndroid Build Coastguard Worker /* compare again for the case of dest_data != cmp_data */
1721*7688df22SAndroid Build Coastguard Worker i = 0;
1722*7688df22SAndroid Build Coastguard Worker /* restore again, here dest_data should be */
1723*7688df22SAndroid Build Coastguard Worker bo_cpu_origin = bo_cpu[0];
1724*7688df22SAndroid Build Coastguard Worker memset((void*)pm4, 0, pm4_dw * sizeof(uint32_t));
1725*7688df22SAndroid Build Coastguard Worker pm4[i++] = SDMA_PACKET(SDMA_OPCODE_ATOMIC,
1726*7688df22SAndroid Build Coastguard Worker 0,
1727*7688df22SAndroid Build Coastguard Worker SDMA_ATOMIC_LOOP(1) |
1728*7688df22SAndroid Build Coastguard Worker SDMA_ATOMIC_TMZ(1) |
1729*7688df22SAndroid Build Coastguard Worker SDMA_ATOMIC_OPCODE(TC_OP_ATOMIC_CMPSWAP_RTN_32));
1730*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0xfffffffc & bo_mc;
1731*7688df22SAndroid Build Coastguard Worker pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32;
1732*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0x87654321;
1733*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0x0;
1734*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0xdeadbeaf;
1735*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0x0;
1736*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0x100;
1737*7688df22SAndroid Build Coastguard Worker amdgpu_test_exec_cs_helper_raw(device, context_handle,
1738*7688df22SAndroid Build Coastguard Worker ip_type, ring_id, i, pm4,
1739*7688df22SAndroid Build Coastguard Worker 1, resources, ib_info,
1740*7688df22SAndroid Build Coastguard Worker ibs_request, true);
1741*7688df22SAndroid Build Coastguard Worker /* here bo_cpu[0] should be unchanged, still is 0x12345678, otherwise failed*/
1742*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(bo_cpu[0], bo_cpu_origin);
1743*7688df22SAndroid Build Coastguard Worker }
1744*7688df22SAndroid Build Coastguard Worker
1745*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_unmap_and_free(bo, va_handle, bo_mc,
1746*7688df22SAndroid Build Coastguard Worker sdma_write_length * sizeof(uint32_t));
1747*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1748*7688df22SAndroid Build Coastguard Worker loop++;
1749*7688df22SAndroid Build Coastguard Worker }
1750*7688df22SAndroid Build Coastguard Worker }
1751*7688df22SAndroid Build Coastguard Worker /* clean resources */
1752*7688df22SAndroid Build Coastguard Worker free(resources);
1753*7688df22SAndroid Build Coastguard Worker free(ibs_request);
1754*7688df22SAndroid Build Coastguard Worker free(ib_info);
1755*7688df22SAndroid Build Coastguard Worker free(pm4);
1756*7688df22SAndroid Build Coastguard Worker
1757*7688df22SAndroid Build Coastguard Worker /* end of test */
1758*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_ctx_free(context_handle);
1759*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1760*7688df22SAndroid Build Coastguard Worker }
1761*7688df22SAndroid Build Coastguard Worker
amdgpu_command_submission_write_linear_helper(unsigned ip_type)1762*7688df22SAndroid Build Coastguard Worker static void amdgpu_command_submission_write_linear_helper(unsigned ip_type)
1763*7688df22SAndroid Build Coastguard Worker {
1764*7688df22SAndroid Build Coastguard Worker amdgpu_command_submission_write_linear_helper_with_secure(device_handle,
1765*7688df22SAndroid Build Coastguard Worker ip_type,
1766*7688df22SAndroid Build Coastguard Worker false);
1767*7688df22SAndroid Build Coastguard Worker }
1768*7688df22SAndroid Build Coastguard Worker
amdgpu_command_submission_sdma_write_linear(void)1769*7688df22SAndroid Build Coastguard Worker static void amdgpu_command_submission_sdma_write_linear(void)
1770*7688df22SAndroid Build Coastguard Worker {
1771*7688df22SAndroid Build Coastguard Worker amdgpu_command_submission_write_linear_helper(AMDGPU_HW_IP_DMA);
1772*7688df22SAndroid Build Coastguard Worker }
1773*7688df22SAndroid Build Coastguard Worker
amdgpu_command_submission_const_fill_helper(unsigned ip_type)1774*7688df22SAndroid Build Coastguard Worker static void amdgpu_command_submission_const_fill_helper(unsigned ip_type)
1775*7688df22SAndroid Build Coastguard Worker {
1776*7688df22SAndroid Build Coastguard Worker const int sdma_write_length = 1024 * 1024;
1777*7688df22SAndroid Build Coastguard Worker const int pm4_dw = 256;
1778*7688df22SAndroid Build Coastguard Worker amdgpu_context_handle context_handle;
1779*7688df22SAndroid Build Coastguard Worker amdgpu_bo_handle bo;
1780*7688df22SAndroid Build Coastguard Worker amdgpu_bo_handle *resources;
1781*7688df22SAndroid Build Coastguard Worker uint32_t *pm4;
1782*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_ib_info *ib_info;
1783*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_request *ibs_request;
1784*7688df22SAndroid Build Coastguard Worker uint64_t bo_mc;
1785*7688df22SAndroid Build Coastguard Worker volatile uint32_t *bo_cpu;
1786*7688df22SAndroid Build Coastguard Worker int i, j, r, loop, ring_id;
1787*7688df22SAndroid Build Coastguard Worker uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC};
1788*7688df22SAndroid Build Coastguard Worker amdgpu_va_handle va_handle;
1789*7688df22SAndroid Build Coastguard Worker struct drm_amdgpu_info_hw_ip hw_ip_info;
1790*7688df22SAndroid Build Coastguard Worker
1791*7688df22SAndroid Build Coastguard Worker pm4 = calloc(pm4_dw, sizeof(*pm4));
1792*7688df22SAndroid Build Coastguard Worker CU_ASSERT_NOT_EQUAL(pm4, NULL);
1793*7688df22SAndroid Build Coastguard Worker
1794*7688df22SAndroid Build Coastguard Worker ib_info = calloc(1, sizeof(*ib_info));
1795*7688df22SAndroid Build Coastguard Worker CU_ASSERT_NOT_EQUAL(ib_info, NULL);
1796*7688df22SAndroid Build Coastguard Worker
1797*7688df22SAndroid Build Coastguard Worker ibs_request = calloc(1, sizeof(*ibs_request));
1798*7688df22SAndroid Build Coastguard Worker CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
1799*7688df22SAndroid Build Coastguard Worker
1800*7688df22SAndroid Build Coastguard Worker r = amdgpu_query_hw_ip_info(device_handle, ip_type, 0, &hw_ip_info);
1801*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1802*7688df22SAndroid Build Coastguard Worker
1803*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_ctx_create(device_handle, &context_handle);
1804*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1805*7688df22SAndroid Build Coastguard Worker
1806*7688df22SAndroid Build Coastguard Worker /* prepare resource */
1807*7688df22SAndroid Build Coastguard Worker resources = calloc(1, sizeof(amdgpu_bo_handle));
1808*7688df22SAndroid Build Coastguard Worker CU_ASSERT_NOT_EQUAL(resources, NULL);
1809*7688df22SAndroid Build Coastguard Worker
1810*7688df22SAndroid Build Coastguard Worker for (ring_id = 0; (1 << ring_id) & hw_ip_info.available_rings; ring_id++) {
1811*7688df22SAndroid Build Coastguard Worker loop = 0;
1812*7688df22SAndroid Build Coastguard Worker while(loop < 2) {
1813*7688df22SAndroid Build Coastguard Worker /* allocate UC bo for sDMA use */
1814*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_alloc_and_map(device_handle,
1815*7688df22SAndroid Build Coastguard Worker sdma_write_length, 4096,
1816*7688df22SAndroid Build Coastguard Worker AMDGPU_GEM_DOMAIN_GTT,
1817*7688df22SAndroid Build Coastguard Worker gtt_flags[loop], &bo, (void**)&bo_cpu,
1818*7688df22SAndroid Build Coastguard Worker &bo_mc, &va_handle);
1819*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1820*7688df22SAndroid Build Coastguard Worker
1821*7688df22SAndroid Build Coastguard Worker /* clear bo */
1822*7688df22SAndroid Build Coastguard Worker memset((void*)bo_cpu, 0, sdma_write_length);
1823*7688df22SAndroid Build Coastguard Worker
1824*7688df22SAndroid Build Coastguard Worker resources[0] = bo;
1825*7688df22SAndroid Build Coastguard Worker
1826*7688df22SAndroid Build Coastguard Worker /* fulfill PM4: test DMA const fill */
1827*7688df22SAndroid Build Coastguard Worker i = j = 0;
1828*7688df22SAndroid Build Coastguard Worker if (ip_type == AMDGPU_HW_IP_DMA) {
1829*7688df22SAndroid Build Coastguard Worker if (family_id == AMDGPU_FAMILY_SI) {
1830*7688df22SAndroid Build Coastguard Worker pm4[i++] = SDMA_PACKET_SI(SDMA_OPCODE_CONSTANT_FILL_SI,
1831*7688df22SAndroid Build Coastguard Worker 0, 0, 0,
1832*7688df22SAndroid Build Coastguard Worker sdma_write_length / 4);
1833*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0xfffffffc & bo_mc;
1834*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0xdeadbeaf;
1835*7688df22SAndroid Build Coastguard Worker pm4[i++] = (0xffffffff00000000 & bo_mc) >> 16;
1836*7688df22SAndroid Build Coastguard Worker } else {
1837*7688df22SAndroid Build Coastguard Worker pm4[i++] = SDMA_PACKET(SDMA_OPCODE_CONSTANT_FILL, 0,
1838*7688df22SAndroid Build Coastguard Worker SDMA_CONSTANT_FILL_EXTRA_SIZE(2));
1839*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0xffffffff & bo_mc;
1840*7688df22SAndroid Build Coastguard Worker pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32;
1841*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0xdeadbeaf;
1842*7688df22SAndroid Build Coastguard Worker if (family_id >= AMDGPU_FAMILY_AI)
1843*7688df22SAndroid Build Coastguard Worker pm4[i++] = sdma_write_length - 1;
1844*7688df22SAndroid Build Coastguard Worker else
1845*7688df22SAndroid Build Coastguard Worker pm4[i++] = sdma_write_length;
1846*7688df22SAndroid Build Coastguard Worker }
1847*7688df22SAndroid Build Coastguard Worker } else if ((ip_type == AMDGPU_HW_IP_GFX) ||
1848*7688df22SAndroid Build Coastguard Worker (ip_type == AMDGPU_HW_IP_COMPUTE)) {
1849*7688df22SAndroid Build Coastguard Worker if (family_id == AMDGPU_FAMILY_SI) {
1850*7688df22SAndroid Build Coastguard Worker pm4[i++] = PACKET3(PACKET3_DMA_DATA_SI, 4);
1851*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0xdeadbeaf;
1852*7688df22SAndroid Build Coastguard Worker pm4[i++] = PACKET3_DMA_DATA_SI_ENGINE(0) |
1853*7688df22SAndroid Build Coastguard Worker PACKET3_DMA_DATA_SI_DST_SEL(0) |
1854*7688df22SAndroid Build Coastguard Worker PACKET3_DMA_DATA_SI_SRC_SEL(2) |
1855*7688df22SAndroid Build Coastguard Worker PACKET3_DMA_DATA_SI_CP_SYNC;
1856*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0xffffffff & bo_mc;
1857*7688df22SAndroid Build Coastguard Worker pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32;
1858*7688df22SAndroid Build Coastguard Worker pm4[i++] = sdma_write_length;
1859*7688df22SAndroid Build Coastguard Worker } else {
1860*7688df22SAndroid Build Coastguard Worker pm4[i++] = PACKET3(PACKET3_DMA_DATA, 5);
1861*7688df22SAndroid Build Coastguard Worker pm4[i++] = PACKET3_DMA_DATA_ENGINE(0) |
1862*7688df22SAndroid Build Coastguard Worker PACKET3_DMA_DATA_DST_SEL(0) |
1863*7688df22SAndroid Build Coastguard Worker PACKET3_DMA_DATA_SRC_SEL(2) |
1864*7688df22SAndroid Build Coastguard Worker PACKET3_DMA_DATA_CP_SYNC;
1865*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0xdeadbeaf;
1866*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0;
1867*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0xfffffffc & bo_mc;
1868*7688df22SAndroid Build Coastguard Worker pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32;
1869*7688df22SAndroid Build Coastguard Worker pm4[i++] = sdma_write_length;
1870*7688df22SAndroid Build Coastguard Worker }
1871*7688df22SAndroid Build Coastguard Worker }
1872*7688df22SAndroid Build Coastguard Worker
1873*7688df22SAndroid Build Coastguard Worker amdgpu_test_exec_cs_helper(context_handle,
1874*7688df22SAndroid Build Coastguard Worker ip_type, ring_id,
1875*7688df22SAndroid Build Coastguard Worker i, pm4,
1876*7688df22SAndroid Build Coastguard Worker 1, resources,
1877*7688df22SAndroid Build Coastguard Worker ib_info, ibs_request);
1878*7688df22SAndroid Build Coastguard Worker
1879*7688df22SAndroid Build Coastguard Worker /* verify if SDMA test result meets with expected */
1880*7688df22SAndroid Build Coastguard Worker i = 0;
1881*7688df22SAndroid Build Coastguard Worker while(i < (sdma_write_length / 4)) {
1882*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(bo_cpu[i++], 0xdeadbeaf);
1883*7688df22SAndroid Build Coastguard Worker }
1884*7688df22SAndroid Build Coastguard Worker
1885*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_unmap_and_free(bo, va_handle, bo_mc,
1886*7688df22SAndroid Build Coastguard Worker sdma_write_length);
1887*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1888*7688df22SAndroid Build Coastguard Worker loop++;
1889*7688df22SAndroid Build Coastguard Worker }
1890*7688df22SAndroid Build Coastguard Worker }
1891*7688df22SAndroid Build Coastguard Worker /* clean resources */
1892*7688df22SAndroid Build Coastguard Worker free(resources);
1893*7688df22SAndroid Build Coastguard Worker free(ibs_request);
1894*7688df22SAndroid Build Coastguard Worker free(ib_info);
1895*7688df22SAndroid Build Coastguard Worker free(pm4);
1896*7688df22SAndroid Build Coastguard Worker
1897*7688df22SAndroid Build Coastguard Worker /* end of test */
1898*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_ctx_free(context_handle);
1899*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1900*7688df22SAndroid Build Coastguard Worker }
1901*7688df22SAndroid Build Coastguard Worker
amdgpu_command_submission_sdma_const_fill(void)1902*7688df22SAndroid Build Coastguard Worker static void amdgpu_command_submission_sdma_const_fill(void)
1903*7688df22SAndroid Build Coastguard Worker {
1904*7688df22SAndroid Build Coastguard Worker amdgpu_command_submission_const_fill_helper(AMDGPU_HW_IP_DMA);
1905*7688df22SAndroid Build Coastguard Worker }
1906*7688df22SAndroid Build Coastguard Worker
amdgpu_command_submission_copy_linear_helper(unsigned ip_type)1907*7688df22SAndroid Build Coastguard Worker static void amdgpu_command_submission_copy_linear_helper(unsigned ip_type)
1908*7688df22SAndroid Build Coastguard Worker {
1909*7688df22SAndroid Build Coastguard Worker const int sdma_write_length = 1024;
1910*7688df22SAndroid Build Coastguard Worker const int pm4_dw = 256;
1911*7688df22SAndroid Build Coastguard Worker amdgpu_context_handle context_handle;
1912*7688df22SAndroid Build Coastguard Worker amdgpu_bo_handle bo1, bo2;
1913*7688df22SAndroid Build Coastguard Worker amdgpu_bo_handle *resources;
1914*7688df22SAndroid Build Coastguard Worker uint32_t *pm4;
1915*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_ib_info *ib_info;
1916*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_request *ibs_request;
1917*7688df22SAndroid Build Coastguard Worker uint64_t bo1_mc, bo2_mc;
1918*7688df22SAndroid Build Coastguard Worker volatile unsigned char *bo1_cpu, *bo2_cpu;
1919*7688df22SAndroid Build Coastguard Worker int i, j, r, loop1, loop2, ring_id;
1920*7688df22SAndroid Build Coastguard Worker uint64_t gtt_flags[2] = {0, AMDGPU_GEM_CREATE_CPU_GTT_USWC};
1921*7688df22SAndroid Build Coastguard Worker amdgpu_va_handle bo1_va_handle, bo2_va_handle;
1922*7688df22SAndroid Build Coastguard Worker struct drm_amdgpu_info_hw_ip hw_ip_info;
1923*7688df22SAndroid Build Coastguard Worker
1924*7688df22SAndroid Build Coastguard Worker pm4 = calloc(pm4_dw, sizeof(*pm4));
1925*7688df22SAndroid Build Coastguard Worker CU_ASSERT_NOT_EQUAL(pm4, NULL);
1926*7688df22SAndroid Build Coastguard Worker
1927*7688df22SAndroid Build Coastguard Worker ib_info = calloc(1, sizeof(*ib_info));
1928*7688df22SAndroid Build Coastguard Worker CU_ASSERT_NOT_EQUAL(ib_info, NULL);
1929*7688df22SAndroid Build Coastguard Worker
1930*7688df22SAndroid Build Coastguard Worker ibs_request = calloc(1, sizeof(*ibs_request));
1931*7688df22SAndroid Build Coastguard Worker CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
1932*7688df22SAndroid Build Coastguard Worker
1933*7688df22SAndroid Build Coastguard Worker r = amdgpu_query_hw_ip_info(device_handle, ip_type, 0, &hw_ip_info);
1934*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1935*7688df22SAndroid Build Coastguard Worker
1936*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_ctx_create(device_handle, &context_handle);
1937*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1938*7688df22SAndroid Build Coastguard Worker
1939*7688df22SAndroid Build Coastguard Worker /* prepare resource */
1940*7688df22SAndroid Build Coastguard Worker resources = calloc(2, sizeof(amdgpu_bo_handle));
1941*7688df22SAndroid Build Coastguard Worker CU_ASSERT_NOT_EQUAL(resources, NULL);
1942*7688df22SAndroid Build Coastguard Worker
1943*7688df22SAndroid Build Coastguard Worker for (ring_id = 0; (1 << ring_id) & hw_ip_info.available_rings; ring_id++) {
1944*7688df22SAndroid Build Coastguard Worker loop1 = loop2 = 0;
1945*7688df22SAndroid Build Coastguard Worker /* run 9 circle to test all mapping combination */
1946*7688df22SAndroid Build Coastguard Worker while(loop1 < 2) {
1947*7688df22SAndroid Build Coastguard Worker while(loop2 < 2) {
1948*7688df22SAndroid Build Coastguard Worker /* allocate UC bo1for sDMA use */
1949*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_alloc_and_map(device_handle,
1950*7688df22SAndroid Build Coastguard Worker sdma_write_length, 4096,
1951*7688df22SAndroid Build Coastguard Worker AMDGPU_GEM_DOMAIN_GTT,
1952*7688df22SAndroid Build Coastguard Worker gtt_flags[loop1], &bo1,
1953*7688df22SAndroid Build Coastguard Worker (void**)&bo1_cpu, &bo1_mc,
1954*7688df22SAndroid Build Coastguard Worker &bo1_va_handle);
1955*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1956*7688df22SAndroid Build Coastguard Worker
1957*7688df22SAndroid Build Coastguard Worker /* set bo1 */
1958*7688df22SAndroid Build Coastguard Worker memset((void*)bo1_cpu, 0xaa, sdma_write_length);
1959*7688df22SAndroid Build Coastguard Worker
1960*7688df22SAndroid Build Coastguard Worker /* allocate UC bo2 for sDMA use */
1961*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_alloc_and_map(device_handle,
1962*7688df22SAndroid Build Coastguard Worker sdma_write_length, 4096,
1963*7688df22SAndroid Build Coastguard Worker AMDGPU_GEM_DOMAIN_GTT,
1964*7688df22SAndroid Build Coastguard Worker gtt_flags[loop2], &bo2,
1965*7688df22SAndroid Build Coastguard Worker (void**)&bo2_cpu, &bo2_mc,
1966*7688df22SAndroid Build Coastguard Worker &bo2_va_handle);
1967*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
1968*7688df22SAndroid Build Coastguard Worker
1969*7688df22SAndroid Build Coastguard Worker /* clear bo2 */
1970*7688df22SAndroid Build Coastguard Worker memset((void*)bo2_cpu, 0, sdma_write_length);
1971*7688df22SAndroid Build Coastguard Worker
1972*7688df22SAndroid Build Coastguard Worker resources[0] = bo1;
1973*7688df22SAndroid Build Coastguard Worker resources[1] = bo2;
1974*7688df22SAndroid Build Coastguard Worker
1975*7688df22SAndroid Build Coastguard Worker /* fulfill PM4: test DMA copy linear */
1976*7688df22SAndroid Build Coastguard Worker i = j = 0;
1977*7688df22SAndroid Build Coastguard Worker if (ip_type == AMDGPU_HW_IP_DMA) {
1978*7688df22SAndroid Build Coastguard Worker if (family_id == AMDGPU_FAMILY_SI) {
1979*7688df22SAndroid Build Coastguard Worker pm4[i++] = SDMA_PACKET_SI(SDMA_OPCODE_COPY_SI,
1980*7688df22SAndroid Build Coastguard Worker 0, 0, 0,
1981*7688df22SAndroid Build Coastguard Worker sdma_write_length);
1982*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0xffffffff & bo2_mc;
1983*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0xffffffff & bo1_mc;
1984*7688df22SAndroid Build Coastguard Worker pm4[i++] = (0xffffffff00000000 & bo2_mc) >> 32;
1985*7688df22SAndroid Build Coastguard Worker pm4[i++] = (0xffffffff00000000 & bo1_mc) >> 32;
1986*7688df22SAndroid Build Coastguard Worker } else {
1987*7688df22SAndroid Build Coastguard Worker pm4[i++] = SDMA_PACKET(SDMA_OPCODE_COPY,
1988*7688df22SAndroid Build Coastguard Worker SDMA_COPY_SUB_OPCODE_LINEAR,
1989*7688df22SAndroid Build Coastguard Worker 0);
1990*7688df22SAndroid Build Coastguard Worker if (family_id >= AMDGPU_FAMILY_AI)
1991*7688df22SAndroid Build Coastguard Worker pm4[i++] = sdma_write_length - 1;
1992*7688df22SAndroid Build Coastguard Worker else
1993*7688df22SAndroid Build Coastguard Worker pm4[i++] = sdma_write_length;
1994*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0;
1995*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0xffffffff & bo1_mc;
1996*7688df22SAndroid Build Coastguard Worker pm4[i++] = (0xffffffff00000000 & bo1_mc) >> 32;
1997*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0xffffffff & bo2_mc;
1998*7688df22SAndroid Build Coastguard Worker pm4[i++] = (0xffffffff00000000 & bo2_mc) >> 32;
1999*7688df22SAndroid Build Coastguard Worker }
2000*7688df22SAndroid Build Coastguard Worker } else if ((ip_type == AMDGPU_HW_IP_GFX) ||
2001*7688df22SAndroid Build Coastguard Worker (ip_type == AMDGPU_HW_IP_COMPUTE)) {
2002*7688df22SAndroid Build Coastguard Worker if (family_id == AMDGPU_FAMILY_SI) {
2003*7688df22SAndroid Build Coastguard Worker pm4[i++] = PACKET3(PACKET3_DMA_DATA_SI, 4);
2004*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0xfffffffc & bo1_mc;
2005*7688df22SAndroid Build Coastguard Worker pm4[i++] = PACKET3_DMA_DATA_SI_ENGINE(0) |
2006*7688df22SAndroid Build Coastguard Worker PACKET3_DMA_DATA_SI_DST_SEL(0) |
2007*7688df22SAndroid Build Coastguard Worker PACKET3_DMA_DATA_SI_SRC_SEL(0) |
2008*7688df22SAndroid Build Coastguard Worker PACKET3_DMA_DATA_SI_CP_SYNC |
2009*7688df22SAndroid Build Coastguard Worker (0xffff00000000 & bo1_mc) >> 32;
2010*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0xfffffffc & bo2_mc;
2011*7688df22SAndroid Build Coastguard Worker pm4[i++] = (0xffffffff00000000 & bo2_mc) >> 32;
2012*7688df22SAndroid Build Coastguard Worker pm4[i++] = sdma_write_length;
2013*7688df22SAndroid Build Coastguard Worker } else {
2014*7688df22SAndroid Build Coastguard Worker pm4[i++] = PACKET3(PACKET3_DMA_DATA, 5);
2015*7688df22SAndroid Build Coastguard Worker pm4[i++] = PACKET3_DMA_DATA_ENGINE(0) |
2016*7688df22SAndroid Build Coastguard Worker PACKET3_DMA_DATA_DST_SEL(0) |
2017*7688df22SAndroid Build Coastguard Worker PACKET3_DMA_DATA_SRC_SEL(0) |
2018*7688df22SAndroid Build Coastguard Worker PACKET3_DMA_DATA_CP_SYNC;
2019*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0xfffffffc & bo1_mc;
2020*7688df22SAndroid Build Coastguard Worker pm4[i++] = (0xffffffff00000000 & bo1_mc) >> 32;
2021*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0xfffffffc & bo2_mc;
2022*7688df22SAndroid Build Coastguard Worker pm4[i++] = (0xffffffff00000000 & bo2_mc) >> 32;
2023*7688df22SAndroid Build Coastguard Worker pm4[i++] = sdma_write_length;
2024*7688df22SAndroid Build Coastguard Worker }
2025*7688df22SAndroid Build Coastguard Worker }
2026*7688df22SAndroid Build Coastguard Worker
2027*7688df22SAndroid Build Coastguard Worker amdgpu_test_exec_cs_helper(context_handle,
2028*7688df22SAndroid Build Coastguard Worker ip_type, ring_id,
2029*7688df22SAndroid Build Coastguard Worker i, pm4,
2030*7688df22SAndroid Build Coastguard Worker 2, resources,
2031*7688df22SAndroid Build Coastguard Worker ib_info, ibs_request);
2032*7688df22SAndroid Build Coastguard Worker
2033*7688df22SAndroid Build Coastguard Worker /* verify if SDMA test result meets with expected */
2034*7688df22SAndroid Build Coastguard Worker i = 0;
2035*7688df22SAndroid Build Coastguard Worker while(i < sdma_write_length) {
2036*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(bo2_cpu[i++], 0xaa);
2037*7688df22SAndroid Build Coastguard Worker }
2038*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_unmap_and_free(bo1, bo1_va_handle, bo1_mc,
2039*7688df22SAndroid Build Coastguard Worker sdma_write_length);
2040*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2041*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_unmap_and_free(bo2, bo2_va_handle, bo2_mc,
2042*7688df22SAndroid Build Coastguard Worker sdma_write_length);
2043*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2044*7688df22SAndroid Build Coastguard Worker loop2++;
2045*7688df22SAndroid Build Coastguard Worker }
2046*7688df22SAndroid Build Coastguard Worker loop1++;
2047*7688df22SAndroid Build Coastguard Worker }
2048*7688df22SAndroid Build Coastguard Worker }
2049*7688df22SAndroid Build Coastguard Worker /* clean resources */
2050*7688df22SAndroid Build Coastguard Worker free(resources);
2051*7688df22SAndroid Build Coastguard Worker free(ibs_request);
2052*7688df22SAndroid Build Coastguard Worker free(ib_info);
2053*7688df22SAndroid Build Coastguard Worker free(pm4);
2054*7688df22SAndroid Build Coastguard Worker
2055*7688df22SAndroid Build Coastguard Worker /* end of test */
2056*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_ctx_free(context_handle);
2057*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2058*7688df22SAndroid Build Coastguard Worker }
2059*7688df22SAndroid Build Coastguard Worker
amdgpu_command_submission_sdma_copy_linear(void)2060*7688df22SAndroid Build Coastguard Worker static void amdgpu_command_submission_sdma_copy_linear(void)
2061*7688df22SAndroid Build Coastguard Worker {
2062*7688df22SAndroid Build Coastguard Worker amdgpu_command_submission_copy_linear_helper(AMDGPU_HW_IP_DMA);
2063*7688df22SAndroid Build Coastguard Worker }
2064*7688df22SAndroid Build Coastguard Worker
amdgpu_command_submission_sdma(void)2065*7688df22SAndroid Build Coastguard Worker static void amdgpu_command_submission_sdma(void)
2066*7688df22SAndroid Build Coastguard Worker {
2067*7688df22SAndroid Build Coastguard Worker amdgpu_command_submission_sdma_write_linear();
2068*7688df22SAndroid Build Coastguard Worker amdgpu_command_submission_sdma_const_fill();
2069*7688df22SAndroid Build Coastguard Worker amdgpu_command_submission_sdma_copy_linear();
2070*7688df22SAndroid Build Coastguard Worker }
2071*7688df22SAndroid Build Coastguard Worker
amdgpu_command_submission_multi_fence_wait_all(bool wait_all)2072*7688df22SAndroid Build Coastguard Worker static void amdgpu_command_submission_multi_fence_wait_all(bool wait_all)
2073*7688df22SAndroid Build Coastguard Worker {
2074*7688df22SAndroid Build Coastguard Worker amdgpu_context_handle context_handle;
2075*7688df22SAndroid Build Coastguard Worker amdgpu_bo_handle ib_result_handle, ib_result_ce_handle;
2076*7688df22SAndroid Build Coastguard Worker void *ib_result_cpu, *ib_result_ce_cpu;
2077*7688df22SAndroid Build Coastguard Worker uint64_t ib_result_mc_address, ib_result_ce_mc_address;
2078*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_request ibs_request[2] = {0};
2079*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_ib_info ib_info[2];
2080*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_fence fence_status[2] = {0};
2081*7688df22SAndroid Build Coastguard Worker uint32_t *ptr;
2082*7688df22SAndroid Build Coastguard Worker uint32_t expired;
2083*7688df22SAndroid Build Coastguard Worker amdgpu_bo_list_handle bo_list;
2084*7688df22SAndroid Build Coastguard Worker amdgpu_va_handle va_handle, va_handle_ce;
2085*7688df22SAndroid Build Coastguard Worker int r;
2086*7688df22SAndroid Build Coastguard Worker int i = 0, ib_cs_num = 2;
2087*7688df22SAndroid Build Coastguard Worker struct drm_amdgpu_info_hw_ip info;
2088*7688df22SAndroid Build Coastguard Worker
2089*7688df22SAndroid Build Coastguard Worker r = amdgpu_query_hw_ip_info(device_handle, AMDGPU_HW_IP_GFX, 0, &info);
2090*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2091*7688df22SAndroid Build Coastguard Worker
2092*7688df22SAndroid Build Coastguard Worker if (info.hw_ip_version_major >= 11)
2093*7688df22SAndroid Build Coastguard Worker return;
2094*7688df22SAndroid Build Coastguard Worker
2095*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_ctx_create(device_handle, &context_handle);
2096*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2097*7688df22SAndroid Build Coastguard Worker
2098*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096,
2099*7688df22SAndroid Build Coastguard Worker AMDGPU_GEM_DOMAIN_GTT, 0,
2100*7688df22SAndroid Build Coastguard Worker &ib_result_handle, &ib_result_cpu,
2101*7688df22SAndroid Build Coastguard Worker &ib_result_mc_address, &va_handle);
2102*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2103*7688df22SAndroid Build Coastguard Worker
2104*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096,
2105*7688df22SAndroid Build Coastguard Worker AMDGPU_GEM_DOMAIN_GTT, 0,
2106*7688df22SAndroid Build Coastguard Worker &ib_result_ce_handle, &ib_result_ce_cpu,
2107*7688df22SAndroid Build Coastguard Worker &ib_result_ce_mc_address, &va_handle_ce);
2108*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2109*7688df22SAndroid Build Coastguard Worker
2110*7688df22SAndroid Build Coastguard Worker r = amdgpu_get_bo_list(device_handle, ib_result_handle,
2111*7688df22SAndroid Build Coastguard Worker ib_result_ce_handle, &bo_list);
2112*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2113*7688df22SAndroid Build Coastguard Worker
2114*7688df22SAndroid Build Coastguard Worker memset(ib_info, 0, 2 * sizeof(struct amdgpu_cs_ib_info));
2115*7688df22SAndroid Build Coastguard Worker
2116*7688df22SAndroid Build Coastguard Worker /* IT_SET_CE_DE_COUNTERS */
2117*7688df22SAndroid Build Coastguard Worker ptr = ib_result_ce_cpu;
2118*7688df22SAndroid Build Coastguard Worker if (family_id != AMDGPU_FAMILY_SI) {
2119*7688df22SAndroid Build Coastguard Worker ptr[i++] = 0xc0008900;
2120*7688df22SAndroid Build Coastguard Worker ptr[i++] = 0;
2121*7688df22SAndroid Build Coastguard Worker }
2122*7688df22SAndroid Build Coastguard Worker ptr[i++] = 0xc0008400;
2123*7688df22SAndroid Build Coastguard Worker ptr[i++] = 1;
2124*7688df22SAndroid Build Coastguard Worker ib_info[0].ib_mc_address = ib_result_ce_mc_address;
2125*7688df22SAndroid Build Coastguard Worker ib_info[0].size = i;
2126*7688df22SAndroid Build Coastguard Worker ib_info[0].flags = AMDGPU_IB_FLAG_CE;
2127*7688df22SAndroid Build Coastguard Worker
2128*7688df22SAndroid Build Coastguard Worker /* IT_WAIT_ON_CE_COUNTER */
2129*7688df22SAndroid Build Coastguard Worker ptr = ib_result_cpu;
2130*7688df22SAndroid Build Coastguard Worker ptr[0] = 0xc0008600;
2131*7688df22SAndroid Build Coastguard Worker ptr[1] = 0x00000001;
2132*7688df22SAndroid Build Coastguard Worker ib_info[1].ib_mc_address = ib_result_mc_address;
2133*7688df22SAndroid Build Coastguard Worker ib_info[1].size = 2;
2134*7688df22SAndroid Build Coastguard Worker
2135*7688df22SAndroid Build Coastguard Worker for (i = 0; i < ib_cs_num; i++) {
2136*7688df22SAndroid Build Coastguard Worker ibs_request[i].ip_type = AMDGPU_HW_IP_GFX;
2137*7688df22SAndroid Build Coastguard Worker ibs_request[i].number_of_ibs = 2;
2138*7688df22SAndroid Build Coastguard Worker ibs_request[i].ibs = ib_info;
2139*7688df22SAndroid Build Coastguard Worker ibs_request[i].resources = bo_list;
2140*7688df22SAndroid Build Coastguard Worker ibs_request[i].fence_info.handle = NULL;
2141*7688df22SAndroid Build Coastguard Worker }
2142*7688df22SAndroid Build Coastguard Worker
2143*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_submit(context_handle, 0,ibs_request, ib_cs_num);
2144*7688df22SAndroid Build Coastguard Worker
2145*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2146*7688df22SAndroid Build Coastguard Worker
2147*7688df22SAndroid Build Coastguard Worker for (i = 0; i < ib_cs_num; i++) {
2148*7688df22SAndroid Build Coastguard Worker fence_status[i].context = context_handle;
2149*7688df22SAndroid Build Coastguard Worker fence_status[i].ip_type = AMDGPU_HW_IP_GFX;
2150*7688df22SAndroid Build Coastguard Worker fence_status[i].fence = ibs_request[i].seq_no;
2151*7688df22SAndroid Build Coastguard Worker }
2152*7688df22SAndroid Build Coastguard Worker
2153*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_wait_fences(fence_status, ib_cs_num, wait_all,
2154*7688df22SAndroid Build Coastguard Worker AMDGPU_TIMEOUT_INFINITE,
2155*7688df22SAndroid Build Coastguard Worker &expired, NULL);
2156*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2157*7688df22SAndroid Build Coastguard Worker
2158*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle,
2159*7688df22SAndroid Build Coastguard Worker ib_result_mc_address, 4096);
2160*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2161*7688df22SAndroid Build Coastguard Worker
2162*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_unmap_and_free(ib_result_ce_handle, va_handle_ce,
2163*7688df22SAndroid Build Coastguard Worker ib_result_ce_mc_address, 4096);
2164*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2165*7688df22SAndroid Build Coastguard Worker
2166*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_list_destroy(bo_list);
2167*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2168*7688df22SAndroid Build Coastguard Worker
2169*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_ctx_free(context_handle);
2170*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2171*7688df22SAndroid Build Coastguard Worker }
2172*7688df22SAndroid Build Coastguard Worker
amdgpu_command_submission_multi_fence(void)2173*7688df22SAndroid Build Coastguard Worker static void amdgpu_command_submission_multi_fence(void)
2174*7688df22SAndroid Build Coastguard Worker {
2175*7688df22SAndroid Build Coastguard Worker amdgpu_command_submission_multi_fence_wait_all(true);
2176*7688df22SAndroid Build Coastguard Worker amdgpu_command_submission_multi_fence_wait_all(false);
2177*7688df22SAndroid Build Coastguard Worker }
2178*7688df22SAndroid Build Coastguard Worker
amdgpu_userptr_test(void)2179*7688df22SAndroid Build Coastguard Worker static void amdgpu_userptr_test(void)
2180*7688df22SAndroid Build Coastguard Worker {
2181*7688df22SAndroid Build Coastguard Worker int i, r, j;
2182*7688df22SAndroid Build Coastguard Worker uint32_t *pm4 = NULL;
2183*7688df22SAndroid Build Coastguard Worker uint64_t bo_mc;
2184*7688df22SAndroid Build Coastguard Worker void *ptr = NULL;
2185*7688df22SAndroid Build Coastguard Worker int pm4_dw = 256;
2186*7688df22SAndroid Build Coastguard Worker int sdma_write_length = 4;
2187*7688df22SAndroid Build Coastguard Worker amdgpu_bo_handle handle;
2188*7688df22SAndroid Build Coastguard Worker amdgpu_context_handle context_handle;
2189*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_ib_info *ib_info;
2190*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_request *ibs_request;
2191*7688df22SAndroid Build Coastguard Worker amdgpu_bo_handle buf_handle;
2192*7688df22SAndroid Build Coastguard Worker amdgpu_va_handle va_handle;
2193*7688df22SAndroid Build Coastguard Worker
2194*7688df22SAndroid Build Coastguard Worker pm4 = calloc(pm4_dw, sizeof(*pm4));
2195*7688df22SAndroid Build Coastguard Worker CU_ASSERT_NOT_EQUAL(pm4, NULL);
2196*7688df22SAndroid Build Coastguard Worker
2197*7688df22SAndroid Build Coastguard Worker ib_info = calloc(1, sizeof(*ib_info));
2198*7688df22SAndroid Build Coastguard Worker CU_ASSERT_NOT_EQUAL(ib_info, NULL);
2199*7688df22SAndroid Build Coastguard Worker
2200*7688df22SAndroid Build Coastguard Worker ibs_request = calloc(1, sizeof(*ibs_request));
2201*7688df22SAndroid Build Coastguard Worker CU_ASSERT_NOT_EQUAL(ibs_request, NULL);
2202*7688df22SAndroid Build Coastguard Worker
2203*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_ctx_create(device_handle, &context_handle);
2204*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2205*7688df22SAndroid Build Coastguard Worker
2206*7688df22SAndroid Build Coastguard Worker posix_memalign(&ptr, sysconf(_SC_PAGE_SIZE), BUFFER_SIZE);
2207*7688df22SAndroid Build Coastguard Worker CU_ASSERT_NOT_EQUAL(ptr, NULL);
2208*7688df22SAndroid Build Coastguard Worker memset(ptr, 0, BUFFER_SIZE);
2209*7688df22SAndroid Build Coastguard Worker
2210*7688df22SAndroid Build Coastguard Worker r = amdgpu_create_bo_from_user_mem(device_handle,
2211*7688df22SAndroid Build Coastguard Worker ptr, BUFFER_SIZE, &buf_handle);
2212*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2213*7688df22SAndroid Build Coastguard Worker
2214*7688df22SAndroid Build Coastguard Worker r = amdgpu_va_range_alloc(device_handle,
2215*7688df22SAndroid Build Coastguard Worker amdgpu_gpu_va_range_general,
2216*7688df22SAndroid Build Coastguard Worker BUFFER_SIZE, 1, 0, &bo_mc,
2217*7688df22SAndroid Build Coastguard Worker &va_handle, 0);
2218*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2219*7688df22SAndroid Build Coastguard Worker
2220*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_va_op(buf_handle, 0, BUFFER_SIZE, bo_mc, 0, AMDGPU_VA_OP_MAP);
2221*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2222*7688df22SAndroid Build Coastguard Worker
2223*7688df22SAndroid Build Coastguard Worker handle = buf_handle;
2224*7688df22SAndroid Build Coastguard Worker
2225*7688df22SAndroid Build Coastguard Worker j = i = 0;
2226*7688df22SAndroid Build Coastguard Worker
2227*7688df22SAndroid Build Coastguard Worker if (family_id == AMDGPU_FAMILY_SI)
2228*7688df22SAndroid Build Coastguard Worker pm4[i++] = SDMA_PACKET_SI(SDMA_OPCODE_WRITE, 0, 0, 0,
2229*7688df22SAndroid Build Coastguard Worker sdma_write_length);
2230*7688df22SAndroid Build Coastguard Worker else
2231*7688df22SAndroid Build Coastguard Worker pm4[i++] = SDMA_PACKET(SDMA_OPCODE_WRITE,
2232*7688df22SAndroid Build Coastguard Worker SDMA_WRITE_SUB_OPCODE_LINEAR, 0);
2233*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0xffffffff & bo_mc;
2234*7688df22SAndroid Build Coastguard Worker pm4[i++] = (0xffffffff00000000 & bo_mc) >> 32;
2235*7688df22SAndroid Build Coastguard Worker if (family_id >= AMDGPU_FAMILY_AI)
2236*7688df22SAndroid Build Coastguard Worker pm4[i++] = sdma_write_length - 1;
2237*7688df22SAndroid Build Coastguard Worker else if (family_id != AMDGPU_FAMILY_SI)
2238*7688df22SAndroid Build Coastguard Worker pm4[i++] = sdma_write_length;
2239*7688df22SAndroid Build Coastguard Worker
2240*7688df22SAndroid Build Coastguard Worker while (j++ < sdma_write_length)
2241*7688df22SAndroid Build Coastguard Worker pm4[i++] = 0xdeadbeaf;
2242*7688df22SAndroid Build Coastguard Worker
2243*7688df22SAndroid Build Coastguard Worker if (!fork()) {
2244*7688df22SAndroid Build Coastguard Worker pm4[0] = 0x0;
2245*7688df22SAndroid Build Coastguard Worker exit(0);
2246*7688df22SAndroid Build Coastguard Worker }
2247*7688df22SAndroid Build Coastguard Worker
2248*7688df22SAndroid Build Coastguard Worker amdgpu_test_exec_cs_helper(context_handle,
2249*7688df22SAndroid Build Coastguard Worker AMDGPU_HW_IP_DMA, 0,
2250*7688df22SAndroid Build Coastguard Worker i, pm4,
2251*7688df22SAndroid Build Coastguard Worker 1, &handle,
2252*7688df22SAndroid Build Coastguard Worker ib_info, ibs_request);
2253*7688df22SAndroid Build Coastguard Worker i = 0;
2254*7688df22SAndroid Build Coastguard Worker while (i < sdma_write_length) {
2255*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(((int*)ptr)[i++], 0xdeadbeaf);
2256*7688df22SAndroid Build Coastguard Worker }
2257*7688df22SAndroid Build Coastguard Worker free(ibs_request);
2258*7688df22SAndroid Build Coastguard Worker free(ib_info);
2259*7688df22SAndroid Build Coastguard Worker free(pm4);
2260*7688df22SAndroid Build Coastguard Worker
2261*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_va_op(buf_handle, 0, BUFFER_SIZE, bo_mc, 0, AMDGPU_VA_OP_UNMAP);
2262*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2263*7688df22SAndroid Build Coastguard Worker r = amdgpu_va_range_free(va_handle);
2264*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2265*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_free(buf_handle);
2266*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2267*7688df22SAndroid Build Coastguard Worker free(ptr);
2268*7688df22SAndroid Build Coastguard Worker
2269*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_ctx_free(context_handle);
2270*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2271*7688df22SAndroid Build Coastguard Worker
2272*7688df22SAndroid Build Coastguard Worker wait(NULL);
2273*7688df22SAndroid Build Coastguard Worker }
2274*7688df22SAndroid Build Coastguard Worker
amdgpu_sync_dependency_test(void)2275*7688df22SAndroid Build Coastguard Worker static void amdgpu_sync_dependency_test(void)
2276*7688df22SAndroid Build Coastguard Worker {
2277*7688df22SAndroid Build Coastguard Worker amdgpu_context_handle context_handle[2];
2278*7688df22SAndroid Build Coastguard Worker amdgpu_bo_handle ib_result_handle;
2279*7688df22SAndroid Build Coastguard Worker void *ib_result_cpu;
2280*7688df22SAndroid Build Coastguard Worker uint64_t ib_result_mc_address;
2281*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_request ibs_request;
2282*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_ib_info ib_info;
2283*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_fence fence_status;
2284*7688df22SAndroid Build Coastguard Worker uint32_t expired;
2285*7688df22SAndroid Build Coastguard Worker int i, j, r;
2286*7688df22SAndroid Build Coastguard Worker amdgpu_bo_list_handle bo_list;
2287*7688df22SAndroid Build Coastguard Worker amdgpu_va_handle va_handle;
2288*7688df22SAndroid Build Coastguard Worker static uint32_t *ptr;
2289*7688df22SAndroid Build Coastguard Worker uint64_t seq_no;
2290*7688df22SAndroid Build Coastguard Worker
2291*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_ctx_create(device_handle, &context_handle[0]);
2292*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2293*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_ctx_create(device_handle, &context_handle[1]);
2294*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2295*7688df22SAndroid Build Coastguard Worker
2296*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_alloc_and_map(device_handle, 8192, 4096,
2297*7688df22SAndroid Build Coastguard Worker AMDGPU_GEM_DOMAIN_GTT, 0,
2298*7688df22SAndroid Build Coastguard Worker &ib_result_handle, &ib_result_cpu,
2299*7688df22SAndroid Build Coastguard Worker &ib_result_mc_address, &va_handle);
2300*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2301*7688df22SAndroid Build Coastguard Worker
2302*7688df22SAndroid Build Coastguard Worker r = amdgpu_get_bo_list(device_handle, ib_result_handle, NULL,
2303*7688df22SAndroid Build Coastguard Worker &bo_list);
2304*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2305*7688df22SAndroid Build Coastguard Worker
2306*7688df22SAndroid Build Coastguard Worker ptr = ib_result_cpu;
2307*7688df22SAndroid Build Coastguard Worker i = 0;
2308*7688df22SAndroid Build Coastguard Worker
2309*7688df22SAndroid Build Coastguard Worker memcpy(ptr + CODE_OFFSET , shader_bin, sizeof(shader_bin));
2310*7688df22SAndroid Build Coastguard Worker
2311*7688df22SAndroid Build Coastguard Worker /* Dispatch minimal init config and verify it's executed */
2312*7688df22SAndroid Build Coastguard Worker ptr[i++] = PACKET3(PKT3_CONTEXT_CONTROL, 1);
2313*7688df22SAndroid Build Coastguard Worker ptr[i++] = 0x80000000;
2314*7688df22SAndroid Build Coastguard Worker ptr[i++] = 0x80000000;
2315*7688df22SAndroid Build Coastguard Worker
2316*7688df22SAndroid Build Coastguard Worker ptr[i++] = PACKET3(PKT3_CLEAR_STATE, 0);
2317*7688df22SAndroid Build Coastguard Worker ptr[i++] = 0x80000000;
2318*7688df22SAndroid Build Coastguard Worker
2319*7688df22SAndroid Build Coastguard Worker
2320*7688df22SAndroid Build Coastguard Worker /* Program compute regs */
2321*7688df22SAndroid Build Coastguard Worker ptr[i++] = PACKET3(PKT3_SET_SH_REG, 2);
2322*7688df22SAndroid Build Coastguard Worker ptr[i++] = mmCOMPUTE_PGM_LO - PACKET3_SET_SH_REG_START;
2323*7688df22SAndroid Build Coastguard Worker ptr[i++] = (ib_result_mc_address + CODE_OFFSET * 4) >> 8;
2324*7688df22SAndroid Build Coastguard Worker ptr[i++] = (ib_result_mc_address + CODE_OFFSET * 4) >> 40;
2325*7688df22SAndroid Build Coastguard Worker
2326*7688df22SAndroid Build Coastguard Worker
2327*7688df22SAndroid Build Coastguard Worker ptr[i++] = PACKET3(PKT3_SET_SH_REG, 2);
2328*7688df22SAndroid Build Coastguard Worker ptr[i++] = mmCOMPUTE_PGM_RSRC1 - PACKET3_SET_SH_REG_START;
2329*7688df22SAndroid Build Coastguard Worker /*
2330*7688df22SAndroid Build Coastguard Worker * 002c0040 COMPUTE_PGM_RSRC1 <- VGPRS = 0
2331*7688df22SAndroid Build Coastguard Worker SGPRS = 1
2332*7688df22SAndroid Build Coastguard Worker PRIORITY = 0
2333*7688df22SAndroid Build Coastguard Worker FLOAT_MODE = 192 (0xc0)
2334*7688df22SAndroid Build Coastguard Worker PRIV = 0
2335*7688df22SAndroid Build Coastguard Worker DX10_CLAMP = 1
2336*7688df22SAndroid Build Coastguard Worker DEBUG_MODE = 0
2337*7688df22SAndroid Build Coastguard Worker IEEE_MODE = 0
2338*7688df22SAndroid Build Coastguard Worker BULKY = 0
2339*7688df22SAndroid Build Coastguard Worker CDBG_USER = 0
2340*7688df22SAndroid Build Coastguard Worker *
2341*7688df22SAndroid Build Coastguard Worker */
2342*7688df22SAndroid Build Coastguard Worker ptr[i++] = 0x002c0040;
2343*7688df22SAndroid Build Coastguard Worker
2344*7688df22SAndroid Build Coastguard Worker
2345*7688df22SAndroid Build Coastguard Worker /*
2346*7688df22SAndroid Build Coastguard Worker * 00000010 COMPUTE_PGM_RSRC2 <- SCRATCH_EN = 0
2347*7688df22SAndroid Build Coastguard Worker USER_SGPR = 8
2348*7688df22SAndroid Build Coastguard Worker TRAP_PRESENT = 0
2349*7688df22SAndroid Build Coastguard Worker TGID_X_EN = 0
2350*7688df22SAndroid Build Coastguard Worker TGID_Y_EN = 0
2351*7688df22SAndroid Build Coastguard Worker TGID_Z_EN = 0
2352*7688df22SAndroid Build Coastguard Worker TG_SIZE_EN = 0
2353*7688df22SAndroid Build Coastguard Worker TIDIG_COMP_CNT = 0
2354*7688df22SAndroid Build Coastguard Worker EXCP_EN_MSB = 0
2355*7688df22SAndroid Build Coastguard Worker LDS_SIZE = 0
2356*7688df22SAndroid Build Coastguard Worker EXCP_EN = 0
2357*7688df22SAndroid Build Coastguard Worker *
2358*7688df22SAndroid Build Coastguard Worker */
2359*7688df22SAndroid Build Coastguard Worker ptr[i++] = 0x00000010;
2360*7688df22SAndroid Build Coastguard Worker
2361*7688df22SAndroid Build Coastguard Worker
2362*7688df22SAndroid Build Coastguard Worker /*
2363*7688df22SAndroid Build Coastguard Worker * 00000100 COMPUTE_TMPRING_SIZE <- WAVES = 256 (0x100)
2364*7688df22SAndroid Build Coastguard Worker WAVESIZE = 0
2365*7688df22SAndroid Build Coastguard Worker *
2366*7688df22SAndroid Build Coastguard Worker */
2367*7688df22SAndroid Build Coastguard Worker ptr[i++] = PACKET3(PKT3_SET_SH_REG, 1);
2368*7688df22SAndroid Build Coastguard Worker ptr[i++] = mmCOMPUTE_TMPRING_SIZE - PACKET3_SET_SH_REG_START;
2369*7688df22SAndroid Build Coastguard Worker ptr[i++] = 0x00000100;
2370*7688df22SAndroid Build Coastguard Worker
2371*7688df22SAndroid Build Coastguard Worker ptr[i++] = PACKET3(PKT3_SET_SH_REG, 2);
2372*7688df22SAndroid Build Coastguard Worker ptr[i++] = mmCOMPUTE_USER_DATA_0 - PACKET3_SET_SH_REG_START;
2373*7688df22SAndroid Build Coastguard Worker ptr[i++] = 0xffffffff & (ib_result_mc_address + DATA_OFFSET * 4);
2374*7688df22SAndroid Build Coastguard Worker ptr[i++] = (0xffffffff00000000 & (ib_result_mc_address + DATA_OFFSET * 4)) >> 32;
2375*7688df22SAndroid Build Coastguard Worker
2376*7688df22SAndroid Build Coastguard Worker ptr[i++] = PACKET3(PKT3_SET_SH_REG, 1);
2377*7688df22SAndroid Build Coastguard Worker ptr[i++] = mmCOMPUTE_RESOURCE_LIMITS - PACKET3_SET_SH_REG_START;
2378*7688df22SAndroid Build Coastguard Worker ptr[i++] = 0;
2379*7688df22SAndroid Build Coastguard Worker
2380*7688df22SAndroid Build Coastguard Worker ptr[i++] = PACKET3(PKT3_SET_SH_REG, 3);
2381*7688df22SAndroid Build Coastguard Worker ptr[i++] = mmCOMPUTE_NUM_THREAD_X - PACKET3_SET_SH_REG_START;
2382*7688df22SAndroid Build Coastguard Worker ptr[i++] = 1;
2383*7688df22SAndroid Build Coastguard Worker ptr[i++] = 1;
2384*7688df22SAndroid Build Coastguard Worker ptr[i++] = 1;
2385*7688df22SAndroid Build Coastguard Worker
2386*7688df22SAndroid Build Coastguard Worker
2387*7688df22SAndroid Build Coastguard Worker /* Dispatch */
2388*7688df22SAndroid Build Coastguard Worker ptr[i++] = PACKET3(PACKET3_DISPATCH_DIRECT, 3);
2389*7688df22SAndroid Build Coastguard Worker ptr[i++] = 1;
2390*7688df22SAndroid Build Coastguard Worker ptr[i++] = 1;
2391*7688df22SAndroid Build Coastguard Worker ptr[i++] = 1;
2392*7688df22SAndroid Build Coastguard Worker ptr[i++] = 0x00000045; /* DISPATCH DIRECT field */
2393*7688df22SAndroid Build Coastguard Worker
2394*7688df22SAndroid Build Coastguard Worker
2395*7688df22SAndroid Build Coastguard Worker while (i & 7)
2396*7688df22SAndroid Build Coastguard Worker ptr[i++] = 0xffff1000; /* type3 nop packet */
2397*7688df22SAndroid Build Coastguard Worker
2398*7688df22SAndroid Build Coastguard Worker memset(&ib_info, 0, sizeof(struct amdgpu_cs_ib_info));
2399*7688df22SAndroid Build Coastguard Worker ib_info.ib_mc_address = ib_result_mc_address;
2400*7688df22SAndroid Build Coastguard Worker ib_info.size = i;
2401*7688df22SAndroid Build Coastguard Worker
2402*7688df22SAndroid Build Coastguard Worker memset(&ibs_request, 0, sizeof(struct amdgpu_cs_request));
2403*7688df22SAndroid Build Coastguard Worker ibs_request.ip_type = AMDGPU_HW_IP_GFX;
2404*7688df22SAndroid Build Coastguard Worker ibs_request.ring = 0;
2405*7688df22SAndroid Build Coastguard Worker ibs_request.number_of_ibs = 1;
2406*7688df22SAndroid Build Coastguard Worker ibs_request.ibs = &ib_info;
2407*7688df22SAndroid Build Coastguard Worker ibs_request.resources = bo_list;
2408*7688df22SAndroid Build Coastguard Worker ibs_request.fence_info.handle = NULL;
2409*7688df22SAndroid Build Coastguard Worker
2410*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_submit(context_handle[1], 0,&ibs_request, 1);
2411*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2412*7688df22SAndroid Build Coastguard Worker seq_no = ibs_request.seq_no;
2413*7688df22SAndroid Build Coastguard Worker
2414*7688df22SAndroid Build Coastguard Worker
2415*7688df22SAndroid Build Coastguard Worker
2416*7688df22SAndroid Build Coastguard Worker /* Prepare second command with dependency on the first */
2417*7688df22SAndroid Build Coastguard Worker j = i;
2418*7688df22SAndroid Build Coastguard Worker ptr[i++] = PACKET3(PACKET3_WRITE_DATA, 3);
2419*7688df22SAndroid Build Coastguard Worker ptr[i++] = WRITE_DATA_DST_SEL(5) | WR_CONFIRM;
2420*7688df22SAndroid Build Coastguard Worker ptr[i++] = 0xfffffffc & (ib_result_mc_address + DATA_OFFSET * 4);
2421*7688df22SAndroid Build Coastguard Worker ptr[i++] = (0xffffffff00000000 & (ib_result_mc_address + DATA_OFFSET * 4)) >> 32;
2422*7688df22SAndroid Build Coastguard Worker ptr[i++] = 99;
2423*7688df22SAndroid Build Coastguard Worker
2424*7688df22SAndroid Build Coastguard Worker while (i & 7)
2425*7688df22SAndroid Build Coastguard Worker ptr[i++] = 0xffff1000; /* type3 nop packet */
2426*7688df22SAndroid Build Coastguard Worker
2427*7688df22SAndroid Build Coastguard Worker memset(&ib_info, 0, sizeof(struct amdgpu_cs_ib_info));
2428*7688df22SAndroid Build Coastguard Worker ib_info.ib_mc_address = ib_result_mc_address + j * 4;
2429*7688df22SAndroid Build Coastguard Worker ib_info.size = i - j;
2430*7688df22SAndroid Build Coastguard Worker
2431*7688df22SAndroid Build Coastguard Worker memset(&ibs_request, 0, sizeof(struct amdgpu_cs_request));
2432*7688df22SAndroid Build Coastguard Worker ibs_request.ip_type = AMDGPU_HW_IP_GFX;
2433*7688df22SAndroid Build Coastguard Worker ibs_request.ring = 0;
2434*7688df22SAndroid Build Coastguard Worker ibs_request.number_of_ibs = 1;
2435*7688df22SAndroid Build Coastguard Worker ibs_request.ibs = &ib_info;
2436*7688df22SAndroid Build Coastguard Worker ibs_request.resources = bo_list;
2437*7688df22SAndroid Build Coastguard Worker ibs_request.fence_info.handle = NULL;
2438*7688df22SAndroid Build Coastguard Worker
2439*7688df22SAndroid Build Coastguard Worker ibs_request.number_of_dependencies = 1;
2440*7688df22SAndroid Build Coastguard Worker
2441*7688df22SAndroid Build Coastguard Worker ibs_request.dependencies = calloc(1, sizeof(*ibs_request.dependencies));
2442*7688df22SAndroid Build Coastguard Worker ibs_request.dependencies[0].context = context_handle[1];
2443*7688df22SAndroid Build Coastguard Worker ibs_request.dependencies[0].ip_instance = 0;
2444*7688df22SAndroid Build Coastguard Worker ibs_request.dependencies[0].ring = 0;
2445*7688df22SAndroid Build Coastguard Worker ibs_request.dependencies[0].fence = seq_no;
2446*7688df22SAndroid Build Coastguard Worker
2447*7688df22SAndroid Build Coastguard Worker
2448*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_submit(context_handle[0], 0,&ibs_request, 1);
2449*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2450*7688df22SAndroid Build Coastguard Worker
2451*7688df22SAndroid Build Coastguard Worker
2452*7688df22SAndroid Build Coastguard Worker memset(&fence_status, 0, sizeof(struct amdgpu_cs_fence));
2453*7688df22SAndroid Build Coastguard Worker fence_status.context = context_handle[0];
2454*7688df22SAndroid Build Coastguard Worker fence_status.ip_type = AMDGPU_HW_IP_GFX;
2455*7688df22SAndroid Build Coastguard Worker fence_status.ip_instance = 0;
2456*7688df22SAndroid Build Coastguard Worker fence_status.ring = 0;
2457*7688df22SAndroid Build Coastguard Worker fence_status.fence = ibs_request.seq_no;
2458*7688df22SAndroid Build Coastguard Worker
2459*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_query_fence_status(&fence_status,
2460*7688df22SAndroid Build Coastguard Worker AMDGPU_TIMEOUT_INFINITE,0, &expired);
2461*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2462*7688df22SAndroid Build Coastguard Worker
2463*7688df22SAndroid Build Coastguard Worker /* Expect the second command to wait for shader to complete */
2464*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(ptr[DATA_OFFSET], 99);
2465*7688df22SAndroid Build Coastguard Worker
2466*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_list_destroy(bo_list);
2467*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2468*7688df22SAndroid Build Coastguard Worker
2469*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_unmap_and_free(ib_result_handle, va_handle,
2470*7688df22SAndroid Build Coastguard Worker ib_result_mc_address, 4096);
2471*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2472*7688df22SAndroid Build Coastguard Worker
2473*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_ctx_free(context_handle[0]);
2474*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2475*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_ctx_free(context_handle[1]);
2476*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2477*7688df22SAndroid Build Coastguard Worker
2478*7688df22SAndroid Build Coastguard Worker free(ibs_request.dependencies);
2479*7688df22SAndroid Build Coastguard Worker }
2480*7688df22SAndroid Build Coastguard Worker
amdgpu_compute_dispatch_test(void)2481*7688df22SAndroid Build Coastguard Worker static void amdgpu_compute_dispatch_test(void)
2482*7688df22SAndroid Build Coastguard Worker {
2483*7688df22SAndroid Build Coastguard Worker amdgpu_test_dispatch_helper(device_handle, AMDGPU_HW_IP_COMPUTE);
2484*7688df22SAndroid Build Coastguard Worker }
amdgpu_gfx_dispatch_test(void)2485*7688df22SAndroid Build Coastguard Worker static void amdgpu_gfx_dispatch_test(void)
2486*7688df22SAndroid Build Coastguard Worker {
2487*7688df22SAndroid Build Coastguard Worker amdgpu_test_dispatch_helper(device_handle, AMDGPU_HW_IP_GFX);
2488*7688df22SAndroid Build Coastguard Worker }
2489*7688df22SAndroid Build Coastguard Worker
amdgpu_draw_test(void)2490*7688df22SAndroid Build Coastguard Worker static void amdgpu_draw_test(void)
2491*7688df22SAndroid Build Coastguard Worker {
2492*7688df22SAndroid Build Coastguard Worker amdgpu_test_draw_helper(device_handle);
2493*7688df22SAndroid Build Coastguard Worker }
amdgpu_gpu_reset_test(void)2494*7688df22SAndroid Build Coastguard Worker static void amdgpu_gpu_reset_test(void)
2495*7688df22SAndroid Build Coastguard Worker {
2496*7688df22SAndroid Build Coastguard Worker int r;
2497*7688df22SAndroid Build Coastguard Worker char debugfs_path[256], tmp[10];
2498*7688df22SAndroid Build Coastguard Worker int fd;
2499*7688df22SAndroid Build Coastguard Worker struct stat sbuf;
2500*7688df22SAndroid Build Coastguard Worker amdgpu_context_handle context_handle;
2501*7688df22SAndroid Build Coastguard Worker uint32_t hang_state, hangs;
2502*7688df22SAndroid Build Coastguard Worker
2503*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_ctx_create(device_handle, &context_handle);
2504*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2505*7688df22SAndroid Build Coastguard Worker
2506*7688df22SAndroid Build Coastguard Worker r = fstat(drm_amdgpu[0], &sbuf);
2507*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2508*7688df22SAndroid Build Coastguard Worker
2509*7688df22SAndroid Build Coastguard Worker sprintf(debugfs_path, "/sys/kernel/debug/dri/%d/amdgpu_gpu_recover", minor(sbuf.st_rdev));
2510*7688df22SAndroid Build Coastguard Worker fd = open(debugfs_path, O_RDONLY);
2511*7688df22SAndroid Build Coastguard Worker CU_ASSERT(fd >= 0);
2512*7688df22SAndroid Build Coastguard Worker
2513*7688df22SAndroid Build Coastguard Worker r = read(fd, tmp, sizeof(tmp)/sizeof(char));
2514*7688df22SAndroid Build Coastguard Worker CU_ASSERT(r > 0);
2515*7688df22SAndroid Build Coastguard Worker
2516*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_query_reset_state(context_handle, &hang_state, &hangs);
2517*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2518*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(hang_state, AMDGPU_CTX_UNKNOWN_RESET);
2519*7688df22SAndroid Build Coastguard Worker
2520*7688df22SAndroid Build Coastguard Worker close(fd);
2521*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_ctx_free(context_handle);
2522*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2523*7688df22SAndroid Build Coastguard Worker
2524*7688df22SAndroid Build Coastguard Worker amdgpu_compute_dispatch_test();
2525*7688df22SAndroid Build Coastguard Worker amdgpu_gfx_dispatch_test();
2526*7688df22SAndroid Build Coastguard Worker }
2527*7688df22SAndroid Build Coastguard Worker
amdgpu_stable_pstate_test(void)2528*7688df22SAndroid Build Coastguard Worker static void amdgpu_stable_pstate_test(void)
2529*7688df22SAndroid Build Coastguard Worker {
2530*7688df22SAndroid Build Coastguard Worker int r;
2531*7688df22SAndroid Build Coastguard Worker amdgpu_context_handle context_handle;
2532*7688df22SAndroid Build Coastguard Worker uint32_t current_pstate = 0, new_pstate = 0;
2533*7688df22SAndroid Build Coastguard Worker
2534*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_ctx_create(device_handle, &context_handle);
2535*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2536*7688df22SAndroid Build Coastguard Worker
2537*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_ctx_stable_pstate(context_handle,
2538*7688df22SAndroid Build Coastguard Worker AMDGPU_CTX_OP_GET_STABLE_PSTATE,
2539*7688df22SAndroid Build Coastguard Worker 0, ¤t_pstate);
2540*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2541*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(new_pstate, AMDGPU_CTX_STABLE_PSTATE_NONE);
2542*7688df22SAndroid Build Coastguard Worker
2543*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_ctx_stable_pstate(context_handle,
2544*7688df22SAndroid Build Coastguard Worker AMDGPU_CTX_OP_SET_STABLE_PSTATE,
2545*7688df22SAndroid Build Coastguard Worker AMDGPU_CTX_STABLE_PSTATE_PEAK, NULL);
2546*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2547*7688df22SAndroid Build Coastguard Worker
2548*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_ctx_stable_pstate(context_handle,
2549*7688df22SAndroid Build Coastguard Worker AMDGPU_CTX_OP_GET_STABLE_PSTATE,
2550*7688df22SAndroid Build Coastguard Worker 0, &new_pstate);
2551*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2552*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(new_pstate, AMDGPU_CTX_STABLE_PSTATE_PEAK);
2553*7688df22SAndroid Build Coastguard Worker
2554*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_ctx_free(context_handle);
2555*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
2556*7688df22SAndroid Build Coastguard Worker }
2557