1*7688df22SAndroid Build Coastguard Worker /*
2*7688df22SAndroid Build Coastguard Worker * Copyright 2021 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 <stdlib.h>
25*7688df22SAndroid Build Coastguard Worker #include <unistd.h>
26*7688df22SAndroid Build Coastguard Worker #include <sys/types.h>
27*7688df22SAndroid Build Coastguard Worker #include <sys/stat.h>
28*7688df22SAndroid Build Coastguard Worker #include <fcntl.h>
29*7688df22SAndroid Build Coastguard Worker #if HAVE_ALLOCA_H
30*7688df22SAndroid Build Coastguard Worker # include <alloca.h>
31*7688df22SAndroid Build Coastguard Worker #endif
32*7688df22SAndroid Build Coastguard Worker
33*7688df22SAndroid Build Coastguard Worker #include "CUnit/Basic.h"
34*7688df22SAndroid Build Coastguard Worker
35*7688df22SAndroid Build Coastguard Worker #include "amdgpu_test.h"
36*7688df22SAndroid Build Coastguard Worker #include "amdgpu_drm.h"
37*7688df22SAndroid Build Coastguard Worker #include "amdgpu_internal.h"
38*7688df22SAndroid Build Coastguard Worker #include "xf86drm.h"
39*7688df22SAndroid Build Coastguard Worker #include <pthread.h>
40*7688df22SAndroid Build Coastguard Worker
41*7688df22SAndroid Build Coastguard Worker #define GFX_COMPUTE_NOP 0xffff1000
42*7688df22SAndroid Build Coastguard Worker
43*7688df22SAndroid Build Coastguard Worker static amdgpu_device_handle device_handle;
44*7688df22SAndroid Build Coastguard Worker static uint32_t major_version;
45*7688df22SAndroid Build Coastguard Worker static uint32_t minor_version;
46*7688df22SAndroid Build Coastguard Worker static char *sysfs_remove = NULL;
47*7688df22SAndroid Build Coastguard Worker static bool do_cs;
48*7688df22SAndroid Build Coastguard Worker
suite_hotunplug_tests_enable(void)49*7688df22SAndroid Build Coastguard Worker CU_BOOL suite_hotunplug_tests_enable(void)
50*7688df22SAndroid Build Coastguard Worker {
51*7688df22SAndroid Build Coastguard Worker CU_BOOL enable = CU_TRUE;
52*7688df22SAndroid Build Coastguard Worker drmDevicePtr device;
53*7688df22SAndroid Build Coastguard Worker
54*7688df22SAndroid Build Coastguard Worker if (drmGetDevice2(drm_amdgpu[0], DRM_DEVICE_GET_PCI_REVISION, &device)) {
55*7688df22SAndroid Build Coastguard Worker printf("\n\nGPU Failed to get DRM device PCI info!\n");
56*7688df22SAndroid Build Coastguard Worker return CU_FALSE;
57*7688df22SAndroid Build Coastguard Worker }
58*7688df22SAndroid Build Coastguard Worker
59*7688df22SAndroid Build Coastguard Worker if (device->bustype != DRM_BUS_PCI) {
60*7688df22SAndroid Build Coastguard Worker printf("\n\nGPU device is not on PCI bus!\n");
61*7688df22SAndroid Build Coastguard Worker amdgpu_device_deinitialize(device_handle);
62*7688df22SAndroid Build Coastguard Worker return CU_FALSE;
63*7688df22SAndroid Build Coastguard Worker }
64*7688df22SAndroid Build Coastguard Worker
65*7688df22SAndroid Build Coastguard Worker if (amdgpu_device_initialize(drm_amdgpu[0], &major_version,
66*7688df22SAndroid Build Coastguard Worker &minor_version, &device_handle))
67*7688df22SAndroid Build Coastguard Worker return CU_FALSE;
68*7688df22SAndroid Build Coastguard Worker
69*7688df22SAndroid Build Coastguard Worker /* Latest tested amdgpu version to work with all the tests */
70*7688df22SAndroid Build Coastguard Worker if (minor_version < 46)
71*7688df22SAndroid Build Coastguard Worker enable = false;
72*7688df22SAndroid Build Coastguard Worker
73*7688df22SAndroid Build Coastguard Worker /* skip hotplug test on APUs */
74*7688df22SAndroid Build Coastguard Worker if(device_handle->dev_info.ids_flags & AMDGPU_IDS_FLAGS_FUSION)
75*7688df22SAndroid Build Coastguard Worker enable = false;
76*7688df22SAndroid Build Coastguard Worker
77*7688df22SAndroid Build Coastguard Worker if (amdgpu_device_deinitialize(device_handle))
78*7688df22SAndroid Build Coastguard Worker return CU_FALSE;
79*7688df22SAndroid Build Coastguard Worker
80*7688df22SAndroid Build Coastguard Worker return enable;
81*7688df22SAndroid Build Coastguard Worker }
82*7688df22SAndroid Build Coastguard Worker
suite_hotunplug_tests_init(void)83*7688df22SAndroid Build Coastguard Worker int suite_hotunplug_tests_init(void)
84*7688df22SAndroid Build Coastguard Worker {
85*7688df22SAndroid Build Coastguard Worker /* We need to open/close device at each test manually */
86*7688df22SAndroid Build Coastguard Worker amdgpu_close_devices();
87*7688df22SAndroid Build Coastguard Worker
88*7688df22SAndroid Build Coastguard Worker return CUE_SUCCESS;
89*7688df22SAndroid Build Coastguard Worker }
90*7688df22SAndroid Build Coastguard Worker
suite_hotunplug_tests_clean(void)91*7688df22SAndroid Build Coastguard Worker int suite_hotunplug_tests_clean(void)
92*7688df22SAndroid Build Coastguard Worker {
93*7688df22SAndroid Build Coastguard Worker
94*7688df22SAndroid Build Coastguard Worker
95*7688df22SAndroid Build Coastguard Worker return CUE_SUCCESS;
96*7688df22SAndroid Build Coastguard Worker }
97*7688df22SAndroid Build Coastguard Worker
amdgpu_hotunplug_trigger(const char * pathname)98*7688df22SAndroid Build Coastguard Worker static int amdgpu_hotunplug_trigger(const char *pathname)
99*7688df22SAndroid Build Coastguard Worker {
100*7688df22SAndroid Build Coastguard Worker int fd, len;
101*7688df22SAndroid Build Coastguard Worker
102*7688df22SAndroid Build Coastguard Worker fd = open(pathname, O_WRONLY);
103*7688df22SAndroid Build Coastguard Worker if (fd < 0)
104*7688df22SAndroid Build Coastguard Worker return -errno;
105*7688df22SAndroid Build Coastguard Worker
106*7688df22SAndroid Build Coastguard Worker len = write(fd, "1", 1);
107*7688df22SAndroid Build Coastguard Worker close(fd);
108*7688df22SAndroid Build Coastguard Worker
109*7688df22SAndroid Build Coastguard Worker return len;
110*7688df22SAndroid Build Coastguard Worker }
111*7688df22SAndroid Build Coastguard Worker
amdgpu_hotunplug_setup_test()112*7688df22SAndroid Build Coastguard Worker static int amdgpu_hotunplug_setup_test()
113*7688df22SAndroid Build Coastguard Worker {
114*7688df22SAndroid Build Coastguard Worker int r;
115*7688df22SAndroid Build Coastguard Worker char *tmp_str;
116*7688df22SAndroid Build Coastguard Worker
117*7688df22SAndroid Build Coastguard Worker if (amdgpu_open_device_on_test_index(open_render_node) < 0) {
118*7688df22SAndroid Build Coastguard Worker printf("\n\n Failed to reopen device file!\n");
119*7688df22SAndroid Build Coastguard Worker return CUE_SINIT_FAILED;
120*7688df22SAndroid Build Coastguard Worker
121*7688df22SAndroid Build Coastguard Worker
122*7688df22SAndroid Build Coastguard Worker
123*7688df22SAndroid Build Coastguard Worker }
124*7688df22SAndroid Build Coastguard Worker
125*7688df22SAndroid Build Coastguard Worker r = amdgpu_device_initialize(drm_amdgpu[0], &major_version,
126*7688df22SAndroid Build Coastguard Worker &minor_version, &device_handle);
127*7688df22SAndroid Build Coastguard Worker
128*7688df22SAndroid Build Coastguard Worker if (r) {
129*7688df22SAndroid Build Coastguard Worker if ((r == -EACCES) && (errno == EACCES))
130*7688df22SAndroid Build Coastguard Worker printf("\n\nError:%s. "
131*7688df22SAndroid Build Coastguard Worker "Hint:Try to run this test program as root.",
132*7688df22SAndroid Build Coastguard Worker strerror(errno));
133*7688df22SAndroid Build Coastguard Worker return CUE_SINIT_FAILED;
134*7688df22SAndroid Build Coastguard Worker }
135*7688df22SAndroid Build Coastguard Worker
136*7688df22SAndroid Build Coastguard Worker tmp_str = amdgpu_get_device_from_fd(drm_amdgpu[0]);
137*7688df22SAndroid Build Coastguard Worker if (!tmp_str){
138*7688df22SAndroid Build Coastguard Worker printf("\n\n Device path not found!\n");
139*7688df22SAndroid Build Coastguard Worker return CUE_SINIT_FAILED;
140*7688df22SAndroid Build Coastguard Worker }
141*7688df22SAndroid Build Coastguard Worker
142*7688df22SAndroid Build Coastguard Worker sysfs_remove = realloc(tmp_str, strlen(tmp_str) * 2);
143*7688df22SAndroid Build Coastguard Worker strcat(sysfs_remove, "/remove");
144*7688df22SAndroid Build Coastguard Worker
145*7688df22SAndroid Build Coastguard Worker return 0;
146*7688df22SAndroid Build Coastguard Worker }
147*7688df22SAndroid Build Coastguard Worker
amdgpu_hotunplug_teardown_test()148*7688df22SAndroid Build Coastguard Worker static int amdgpu_hotunplug_teardown_test()
149*7688df22SAndroid Build Coastguard Worker {
150*7688df22SAndroid Build Coastguard Worker if (amdgpu_device_deinitialize(device_handle))
151*7688df22SAndroid Build Coastguard Worker return CUE_SCLEAN_FAILED;
152*7688df22SAndroid Build Coastguard Worker
153*7688df22SAndroid Build Coastguard Worker amdgpu_close_devices();
154*7688df22SAndroid Build Coastguard Worker
155*7688df22SAndroid Build Coastguard Worker if (sysfs_remove)
156*7688df22SAndroid Build Coastguard Worker free(sysfs_remove);
157*7688df22SAndroid Build Coastguard Worker
158*7688df22SAndroid Build Coastguard Worker return 0;
159*7688df22SAndroid Build Coastguard Worker }
160*7688df22SAndroid Build Coastguard Worker
amdgpu_hotunplug_remove()161*7688df22SAndroid Build Coastguard Worker static inline int amdgpu_hotunplug_remove()
162*7688df22SAndroid Build Coastguard Worker {
163*7688df22SAndroid Build Coastguard Worker return amdgpu_hotunplug_trigger(sysfs_remove);
164*7688df22SAndroid Build Coastguard Worker }
165*7688df22SAndroid Build Coastguard Worker
amdgpu_hotunplug_rescan()166*7688df22SAndroid Build Coastguard Worker static inline int amdgpu_hotunplug_rescan()
167*7688df22SAndroid Build Coastguard Worker {
168*7688df22SAndroid Build Coastguard Worker return amdgpu_hotunplug_trigger("/sys/bus/pci/rescan");
169*7688df22SAndroid Build Coastguard Worker }
170*7688df22SAndroid Build Coastguard Worker
amdgpu_cs_sync(amdgpu_context_handle context,unsigned int ip_type,int ring,unsigned int seqno)171*7688df22SAndroid Build Coastguard Worker static int amdgpu_cs_sync(amdgpu_context_handle context,
172*7688df22SAndroid Build Coastguard Worker unsigned int ip_type,
173*7688df22SAndroid Build Coastguard Worker int ring,
174*7688df22SAndroid Build Coastguard Worker unsigned int seqno)
175*7688df22SAndroid Build Coastguard Worker {
176*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_fence fence = {
177*7688df22SAndroid Build Coastguard Worker .context = context,
178*7688df22SAndroid Build Coastguard Worker .ip_type = ip_type,
179*7688df22SAndroid Build Coastguard Worker .ring = ring,
180*7688df22SAndroid Build Coastguard Worker .fence = seqno,
181*7688df22SAndroid Build Coastguard Worker };
182*7688df22SAndroid Build Coastguard Worker uint32_t expired;
183*7688df22SAndroid Build Coastguard Worker
184*7688df22SAndroid Build Coastguard Worker return amdgpu_cs_query_fence_status(&fence,
185*7688df22SAndroid Build Coastguard Worker AMDGPU_TIMEOUT_INFINITE,
186*7688df22SAndroid Build Coastguard Worker 0, &expired);
187*7688df22SAndroid Build Coastguard Worker }
188*7688df22SAndroid Build Coastguard Worker
amdgpu_nop_cs()189*7688df22SAndroid Build Coastguard Worker static void *amdgpu_nop_cs()
190*7688df22SAndroid Build Coastguard Worker {
191*7688df22SAndroid Build Coastguard Worker amdgpu_bo_handle ib_result_handle;
192*7688df22SAndroid Build Coastguard Worker void *ib_result_cpu;
193*7688df22SAndroid Build Coastguard Worker uint64_t ib_result_mc_address;
194*7688df22SAndroid Build Coastguard Worker uint32_t *ptr;
195*7688df22SAndroid Build Coastguard Worker int i, r;
196*7688df22SAndroid Build Coastguard Worker amdgpu_bo_list_handle bo_list;
197*7688df22SAndroid Build Coastguard Worker amdgpu_va_handle va_handle;
198*7688df22SAndroid Build Coastguard Worker amdgpu_context_handle context;
199*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_request ibs_request;
200*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_ib_info ib_info;
201*7688df22SAndroid Build Coastguard Worker
202*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_ctx_create(device_handle, &context);
203*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
204*7688df22SAndroid Build Coastguard Worker
205*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096,
206*7688df22SAndroid Build Coastguard Worker AMDGPU_GEM_DOMAIN_GTT, 0,
207*7688df22SAndroid Build Coastguard Worker &ib_result_handle, &ib_result_cpu,
208*7688df22SAndroid Build Coastguard Worker &ib_result_mc_address, &va_handle);
209*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
210*7688df22SAndroid Build Coastguard Worker
211*7688df22SAndroid Build Coastguard Worker ptr = ib_result_cpu;
212*7688df22SAndroid Build Coastguard Worker for (i = 0; i < 16; ++i)
213*7688df22SAndroid Build Coastguard Worker ptr[i] = GFX_COMPUTE_NOP;
214*7688df22SAndroid Build Coastguard Worker
215*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_list_create(device_handle, 1, &ib_result_handle, NULL, &bo_list);
216*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
217*7688df22SAndroid Build Coastguard Worker
218*7688df22SAndroid Build Coastguard Worker memset(&ib_info, 0, sizeof(struct amdgpu_cs_ib_info));
219*7688df22SAndroid Build Coastguard Worker ib_info.ib_mc_address = ib_result_mc_address;
220*7688df22SAndroid Build Coastguard Worker ib_info.size = 16;
221*7688df22SAndroid Build Coastguard Worker
222*7688df22SAndroid Build Coastguard Worker memset(&ibs_request, 0, sizeof(struct amdgpu_cs_request));
223*7688df22SAndroid Build Coastguard Worker ibs_request.ip_type = AMDGPU_HW_IP_GFX;
224*7688df22SAndroid Build Coastguard Worker ibs_request.ring = 0;
225*7688df22SAndroid Build Coastguard Worker ibs_request.number_of_ibs = 1;
226*7688df22SAndroid Build Coastguard Worker ibs_request.ibs = &ib_info;
227*7688df22SAndroid Build Coastguard Worker ibs_request.resources = bo_list;
228*7688df22SAndroid Build Coastguard Worker
229*7688df22SAndroid Build Coastguard Worker while (do_cs)
230*7688df22SAndroid Build Coastguard Worker amdgpu_cs_submit(context, 0, &ibs_request, 1);
231*7688df22SAndroid Build Coastguard Worker
232*7688df22SAndroid Build Coastguard Worker amdgpu_cs_sync(context, AMDGPU_HW_IP_GFX, 0, ibs_request.seq_no);
233*7688df22SAndroid Build Coastguard Worker amdgpu_bo_list_destroy(bo_list);
234*7688df22SAndroid Build Coastguard Worker amdgpu_bo_unmap_and_free(ib_result_handle, va_handle,
235*7688df22SAndroid Build Coastguard Worker ib_result_mc_address, 4096);
236*7688df22SAndroid Build Coastguard Worker
237*7688df22SAndroid Build Coastguard Worker amdgpu_cs_ctx_free(context);
238*7688df22SAndroid Build Coastguard Worker
239*7688df22SAndroid Build Coastguard Worker return (void *)0;
240*7688df22SAndroid Build Coastguard Worker }
241*7688df22SAndroid Build Coastguard Worker
amdgpu_create_cs_thread()242*7688df22SAndroid Build Coastguard Worker static pthread_t* amdgpu_create_cs_thread()
243*7688df22SAndroid Build Coastguard Worker {
244*7688df22SAndroid Build Coastguard Worker int r;
245*7688df22SAndroid Build Coastguard Worker pthread_t *thread = malloc(sizeof(*thread));
246*7688df22SAndroid Build Coastguard Worker if (!thread)
247*7688df22SAndroid Build Coastguard Worker return NULL;
248*7688df22SAndroid Build Coastguard Worker
249*7688df22SAndroid Build Coastguard Worker do_cs = true;
250*7688df22SAndroid Build Coastguard Worker
251*7688df22SAndroid Build Coastguard Worker r = pthread_create(thread, NULL, amdgpu_nop_cs, NULL);
252*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
253*7688df22SAndroid Build Coastguard Worker
254*7688df22SAndroid Build Coastguard Worker /* Give thread enough time to start*/
255*7688df22SAndroid Build Coastguard Worker usleep(100000);
256*7688df22SAndroid Build Coastguard Worker return thread;
257*7688df22SAndroid Build Coastguard Worker }
258*7688df22SAndroid Build Coastguard Worker
amdgpu_destroy_cs_thread(pthread_t * thread)259*7688df22SAndroid Build Coastguard Worker static void amdgpu_destroy_cs_thread(pthread_t *thread)
260*7688df22SAndroid Build Coastguard Worker {
261*7688df22SAndroid Build Coastguard Worker void *status;
262*7688df22SAndroid Build Coastguard Worker
263*7688df22SAndroid Build Coastguard Worker do_cs = false;
264*7688df22SAndroid Build Coastguard Worker
265*7688df22SAndroid Build Coastguard Worker pthread_join(*thread, &status);
266*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(status, 0);
267*7688df22SAndroid Build Coastguard Worker
268*7688df22SAndroid Build Coastguard Worker free(thread);
269*7688df22SAndroid Build Coastguard Worker }
270*7688df22SAndroid Build Coastguard Worker
271*7688df22SAndroid Build Coastguard Worker
amdgpu_hotunplug_test(bool with_cs)272*7688df22SAndroid Build Coastguard Worker static void amdgpu_hotunplug_test(bool with_cs)
273*7688df22SAndroid Build Coastguard Worker {
274*7688df22SAndroid Build Coastguard Worker int r;
275*7688df22SAndroid Build Coastguard Worker pthread_t *thread = NULL;
276*7688df22SAndroid Build Coastguard Worker
277*7688df22SAndroid Build Coastguard Worker r = amdgpu_hotunplug_setup_test();
278*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r , 0);
279*7688df22SAndroid Build Coastguard Worker
280*7688df22SAndroid Build Coastguard Worker if (with_cs) {
281*7688df22SAndroid Build Coastguard Worker thread = amdgpu_create_cs_thread();
282*7688df22SAndroid Build Coastguard Worker CU_ASSERT_NOT_EQUAL(thread, NULL);
283*7688df22SAndroid Build Coastguard Worker }
284*7688df22SAndroid Build Coastguard Worker
285*7688df22SAndroid Build Coastguard Worker r = amdgpu_hotunplug_remove();
286*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r > 0, 1);
287*7688df22SAndroid Build Coastguard Worker
288*7688df22SAndroid Build Coastguard Worker if (with_cs)
289*7688df22SAndroid Build Coastguard Worker amdgpu_destroy_cs_thread(thread);
290*7688df22SAndroid Build Coastguard Worker
291*7688df22SAndroid Build Coastguard Worker r = amdgpu_hotunplug_teardown_test();
292*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r , 0);
293*7688df22SAndroid Build Coastguard Worker
294*7688df22SAndroid Build Coastguard Worker r = amdgpu_hotunplug_rescan();
295*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r > 0, 1);
296*7688df22SAndroid Build Coastguard Worker }
297*7688df22SAndroid Build Coastguard Worker
amdgpu_hotunplug_simple(void)298*7688df22SAndroid Build Coastguard Worker static void amdgpu_hotunplug_simple(void)
299*7688df22SAndroid Build Coastguard Worker {
300*7688df22SAndroid Build Coastguard Worker amdgpu_hotunplug_test(false);
301*7688df22SAndroid Build Coastguard Worker }
302*7688df22SAndroid Build Coastguard Worker
amdgpu_hotunplug_with_cs(void)303*7688df22SAndroid Build Coastguard Worker static void amdgpu_hotunplug_with_cs(void)
304*7688df22SAndroid Build Coastguard Worker {
305*7688df22SAndroid Build Coastguard Worker amdgpu_hotunplug_test(true);
306*7688df22SAndroid Build Coastguard Worker }
307*7688df22SAndroid Build Coastguard Worker
amdgpu_hotunplug_with_exported_bo(void)308*7688df22SAndroid Build Coastguard Worker static void amdgpu_hotunplug_with_exported_bo(void)
309*7688df22SAndroid Build Coastguard Worker {
310*7688df22SAndroid Build Coastguard Worker int r;
311*7688df22SAndroid Build Coastguard Worker uint32_t dma_buf_fd;
312*7688df22SAndroid Build Coastguard Worker unsigned int *ptr;
313*7688df22SAndroid Build Coastguard Worker amdgpu_bo_handle bo_handle;
314*7688df22SAndroid Build Coastguard Worker
315*7688df22SAndroid Build Coastguard Worker struct amdgpu_bo_alloc_request request = {
316*7688df22SAndroid Build Coastguard Worker .alloc_size = 4096,
317*7688df22SAndroid Build Coastguard Worker .phys_alignment = 4096,
318*7688df22SAndroid Build Coastguard Worker .preferred_heap = AMDGPU_GEM_DOMAIN_GTT,
319*7688df22SAndroid Build Coastguard Worker .flags = 0,
320*7688df22SAndroid Build Coastguard Worker };
321*7688df22SAndroid Build Coastguard Worker
322*7688df22SAndroid Build Coastguard Worker r = amdgpu_hotunplug_setup_test();
323*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r , 0);
324*7688df22SAndroid Build Coastguard Worker
325*7688df22SAndroid Build Coastguard Worker amdgpu_bo_alloc(device_handle, &request, &bo_handle);
326*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
327*7688df22SAndroid Build Coastguard Worker
328*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_export(bo_handle, amdgpu_bo_handle_type_dma_buf_fd, &dma_buf_fd);
329*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
330*7688df22SAndroid Build Coastguard Worker
331*7688df22SAndroid Build Coastguard Worker ptr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, dma_buf_fd, 0);
332*7688df22SAndroid Build Coastguard Worker CU_ASSERT_NOT_EQUAL(ptr, MAP_FAILED);
333*7688df22SAndroid Build Coastguard Worker
334*7688df22SAndroid Build Coastguard Worker r = amdgpu_hotunplug_remove();
335*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r > 0, 1);
336*7688df22SAndroid Build Coastguard Worker
337*7688df22SAndroid Build Coastguard Worker amdgpu_bo_free(bo_handle);
338*7688df22SAndroid Build Coastguard Worker
339*7688df22SAndroid Build Coastguard Worker r = amdgpu_hotunplug_teardown_test();
340*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r , 0);
341*7688df22SAndroid Build Coastguard Worker
342*7688df22SAndroid Build Coastguard Worker *ptr = 0xdeafbeef;
343*7688df22SAndroid Build Coastguard Worker
344*7688df22SAndroid Build Coastguard Worker munmap(ptr, 4096);
345*7688df22SAndroid Build Coastguard Worker close (dma_buf_fd);
346*7688df22SAndroid Build Coastguard Worker
347*7688df22SAndroid Build Coastguard Worker r = amdgpu_hotunplug_rescan();
348*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r > 0, 1);
349*7688df22SAndroid Build Coastguard Worker }
350*7688df22SAndroid Build Coastguard Worker
amdgpu_hotunplug_with_exported_fence(void)351*7688df22SAndroid Build Coastguard Worker static void amdgpu_hotunplug_with_exported_fence(void)
352*7688df22SAndroid Build Coastguard Worker {
353*7688df22SAndroid Build Coastguard Worker amdgpu_bo_handle ib_result_handle;
354*7688df22SAndroid Build Coastguard Worker void *ib_result_cpu;
355*7688df22SAndroid Build Coastguard Worker uint64_t ib_result_mc_address;
356*7688df22SAndroid Build Coastguard Worker uint32_t *ptr, sync_obj_handle, sync_obj_handle2;
357*7688df22SAndroid Build Coastguard Worker int i, r;
358*7688df22SAndroid Build Coastguard Worker amdgpu_bo_list_handle bo_list;
359*7688df22SAndroid Build Coastguard Worker amdgpu_va_handle va_handle;
360*7688df22SAndroid Build Coastguard Worker uint32_t major2, minor2;
361*7688df22SAndroid Build Coastguard Worker amdgpu_device_handle device2;
362*7688df22SAndroid Build Coastguard Worker amdgpu_context_handle context;
363*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_request ibs_request;
364*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_ib_info ib_info;
365*7688df22SAndroid Build Coastguard Worker struct amdgpu_cs_fence fence_status = {0};
366*7688df22SAndroid Build Coastguard Worker int shared_fd;
367*7688df22SAndroid Build Coastguard Worker
368*7688df22SAndroid Build Coastguard Worker r = amdgpu_hotunplug_setup_test();
369*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r , 0);
370*7688df22SAndroid Build Coastguard Worker
371*7688df22SAndroid Build Coastguard Worker r = amdgpu_device_initialize(drm_amdgpu[1], &major2, &minor2, &device2);
372*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
373*7688df22SAndroid Build Coastguard Worker
374*7688df22SAndroid Build Coastguard Worker r = amdgpu_cs_ctx_create(device_handle, &context);
375*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
376*7688df22SAndroid Build Coastguard Worker
377*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096,
378*7688df22SAndroid Build Coastguard Worker AMDGPU_GEM_DOMAIN_GTT, 0,
379*7688df22SAndroid Build Coastguard Worker &ib_result_handle, &ib_result_cpu,
380*7688df22SAndroid Build Coastguard Worker &ib_result_mc_address, &va_handle);
381*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
382*7688df22SAndroid Build Coastguard Worker
383*7688df22SAndroid Build Coastguard Worker ptr = ib_result_cpu;
384*7688df22SAndroid Build Coastguard Worker for (i = 0; i < 16; ++i)
385*7688df22SAndroid Build Coastguard Worker ptr[i] = GFX_COMPUTE_NOP;
386*7688df22SAndroid Build Coastguard Worker
387*7688df22SAndroid Build Coastguard Worker r = amdgpu_bo_list_create(device_handle, 1, &ib_result_handle, NULL, &bo_list);
388*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r, 0);
389*7688df22SAndroid Build Coastguard Worker
390*7688df22SAndroid Build Coastguard Worker memset(&ib_info, 0, sizeof(struct amdgpu_cs_ib_info));
391*7688df22SAndroid Build Coastguard Worker ib_info.ib_mc_address = ib_result_mc_address;
392*7688df22SAndroid Build Coastguard Worker ib_info.size = 16;
393*7688df22SAndroid Build Coastguard Worker
394*7688df22SAndroid Build Coastguard Worker memset(&ibs_request, 0, sizeof(struct amdgpu_cs_request));
395*7688df22SAndroid Build Coastguard Worker ibs_request.ip_type = AMDGPU_HW_IP_GFX;
396*7688df22SAndroid Build Coastguard Worker ibs_request.ring = 0;
397*7688df22SAndroid Build Coastguard Worker ibs_request.number_of_ibs = 1;
398*7688df22SAndroid Build Coastguard Worker ibs_request.ibs = &ib_info;
399*7688df22SAndroid Build Coastguard Worker ibs_request.resources = bo_list;
400*7688df22SAndroid Build Coastguard Worker
401*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(amdgpu_cs_submit(context, 0, &ibs_request, 1), 0);
402*7688df22SAndroid Build Coastguard Worker
403*7688df22SAndroid Build Coastguard Worker fence_status.context = context;
404*7688df22SAndroid Build Coastguard Worker fence_status.ip_type = AMDGPU_HW_IP_GFX;
405*7688df22SAndroid Build Coastguard Worker fence_status.ip_instance = 0;
406*7688df22SAndroid Build Coastguard Worker fence_status.fence = ibs_request.seq_no;
407*7688df22SAndroid Build Coastguard Worker
408*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(amdgpu_cs_fence_to_handle(device_handle, &fence_status,
409*7688df22SAndroid Build Coastguard Worker AMDGPU_FENCE_TO_HANDLE_GET_SYNCOBJ,
410*7688df22SAndroid Build Coastguard Worker &sync_obj_handle),
411*7688df22SAndroid Build Coastguard Worker 0);
412*7688df22SAndroid Build Coastguard Worker
413*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(amdgpu_cs_export_syncobj(device_handle, sync_obj_handle, &shared_fd), 0);
414*7688df22SAndroid Build Coastguard Worker
415*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(amdgpu_cs_import_syncobj(device2, shared_fd, &sync_obj_handle2), 0);
416*7688df22SAndroid Build Coastguard Worker
417*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(amdgpu_cs_destroy_syncobj(device_handle, sync_obj_handle), 0);
418*7688df22SAndroid Build Coastguard Worker
419*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(amdgpu_bo_list_destroy(bo_list), 0);
420*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(amdgpu_bo_unmap_and_free(ib_result_handle, va_handle,
421*7688df22SAndroid Build Coastguard Worker ib_result_mc_address, 4096), 0);
422*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(amdgpu_cs_ctx_free(context), 0);
423*7688df22SAndroid Build Coastguard Worker
424*7688df22SAndroid Build Coastguard Worker r = amdgpu_hotunplug_remove();
425*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r > 0, 1);
426*7688df22SAndroid Build Coastguard Worker
427*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(amdgpu_cs_syncobj_wait(device2, &sync_obj_handle2, 1, 100000000, 0, NULL), 0);
428*7688df22SAndroid Build Coastguard Worker
429*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(amdgpu_cs_destroy_syncobj(device2, sync_obj_handle2), 0);
430*7688df22SAndroid Build Coastguard Worker
431*7688df22SAndroid Build Coastguard Worker amdgpu_device_deinitialize(device2);
432*7688df22SAndroid Build Coastguard Worker
433*7688df22SAndroid Build Coastguard Worker r = amdgpu_hotunplug_teardown_test();
434*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r , 0);
435*7688df22SAndroid Build Coastguard Worker
436*7688df22SAndroid Build Coastguard Worker r = amdgpu_hotunplug_rescan();
437*7688df22SAndroid Build Coastguard Worker CU_ASSERT_EQUAL(r > 0, 1);
438*7688df22SAndroid Build Coastguard Worker }
439*7688df22SAndroid Build Coastguard Worker
440*7688df22SAndroid Build Coastguard Worker
441*7688df22SAndroid Build Coastguard Worker CU_TestInfo hotunplug_tests[] = {
442*7688df22SAndroid Build Coastguard Worker { "Unplug card and rescan the bus to plug it back", amdgpu_hotunplug_simple },
443*7688df22SAndroid Build Coastguard Worker { "Same as first test but with command submission", amdgpu_hotunplug_with_cs },
444*7688df22SAndroid Build Coastguard Worker { "Unplug with exported bo", amdgpu_hotunplug_with_exported_bo },
445*7688df22SAndroid Build Coastguard Worker { "Unplug with exported fence", amdgpu_hotunplug_with_exported_fence },
446*7688df22SAndroid Build Coastguard Worker CU_TEST_INFO_NULL,
447*7688df22SAndroid Build Coastguard Worker };
448