amdgpu_test.h revision 41687f09
1/* 2 * Copyright 2014 Advanced Micro Devices, Inc. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice shall be included in 12 * all copies or substantial portions of the Software. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 * OTHER DEALINGS IN THE SOFTWARE. 21 * 22*/ 23 24#ifndef _AMDGPU_TEST_H_ 25#define _AMDGPU_TEST_H_ 26 27#include "amdgpu.h" 28#include "amdgpu_drm.h" 29 30/** 31 * Define max. number of card in system which we are able to handle 32 */ 33#define MAX_CARDS_SUPPORTED 128 34 35/* Forward reference for array to keep "drm" handles */ 36extern int drm_amdgpu[MAX_CARDS_SUPPORTED]; 37 38/* Global variables */ 39extern int open_render_node; 40 41/************************* Basic test suite ********************************/ 42 43/* 44 * Define basic test suite to serve as the starting point for future testing 45*/ 46 47/** 48 * Initialize basic test suite 49 */ 50int suite_basic_tests_init(); 51 52/** 53 * Deinitialize basic test suite 54 */ 55int suite_basic_tests_clean(); 56 57/** 58 * Decide if the suite is enabled by default or not. 59 */ 60CU_BOOL suite_basic_tests_enable(void); 61 62/** 63 * Tests in basic test suite 64 */ 65extern CU_TestInfo basic_tests[]; 66 67/** 68 * Initialize bo test suite 69 */ 70int suite_bo_tests_init(); 71 72/** 73 * Deinitialize bo test suite 74 */ 75int suite_bo_tests_clean(); 76 77/** 78 * Tests in bo test suite 79 */ 80extern CU_TestInfo bo_tests[]; 81 82/** 83 * Initialize cs test suite 84 */ 85int suite_cs_tests_init(); 86 87/** 88 * Deinitialize cs test suite 89 */ 90int suite_cs_tests_clean(); 91 92/** 93 * Decide if the suite is enabled by default or not. 94 */ 95CU_BOOL suite_cs_tests_enable(void); 96 97/** 98 * Tests in cs test suite 99 */ 100extern CU_TestInfo cs_tests[]; 101 102/** 103 * Initialize vce test suite 104 */ 105int suite_vce_tests_init(); 106 107/** 108 * Deinitialize vce test suite 109 */ 110int suite_vce_tests_clean(); 111 112/** 113 * Decide if the suite is enabled by default or not. 114 */ 115CU_BOOL suite_vce_tests_enable(void); 116 117/** 118 * Tests in vce test suite 119 */ 120extern CU_TestInfo vce_tests[]; 121 122/** 123+ * Initialize vcn test suite 124+ */ 125int suite_vcn_tests_init(); 126 127/** 128+ * Deinitialize vcn test suite 129+ */ 130int suite_vcn_tests_clean(); 131 132/** 133 * Decide if the suite is enabled by default or not. 134 */ 135CU_BOOL suite_vcn_tests_enable(void); 136 137/** 138+ * Tests in vcn test suite 139+ */ 140extern CU_TestInfo vcn_tests[]; 141 142/** 143 * Initialize uvd enc test suite 144 */ 145int suite_uvd_enc_tests_init(); 146 147/** 148 * Deinitialize uvd enc test suite 149 */ 150int suite_uvd_enc_tests_clean(); 151 152/** 153 * Decide if the suite is enabled by default or not. 154 */ 155CU_BOOL suite_uvd_enc_tests_enable(void); 156 157/** 158 * Tests in uvd enc test suite 159 */ 160extern CU_TestInfo uvd_enc_tests[]; 161 162/** 163 * Initialize deadlock test suite 164 */ 165int suite_deadlock_tests_init(); 166 167/** 168 * Deinitialize deadlock test suite 169 */ 170int suite_deadlock_tests_clean(); 171 172/** 173 * Decide if the suite is enabled by default or not. 174 */ 175CU_BOOL suite_deadlock_tests_enable(void); 176 177/** 178 * Tests in uvd enc test suite 179 */ 180extern CU_TestInfo deadlock_tests[]; 181 182/** 183 * Initialize vm test suite 184 */ 185int suite_vm_tests_init(); 186 187/** 188 * Deinitialize deadlock test suite 189 */ 190int suite_vm_tests_clean(); 191 192/** 193 * Decide if the suite is enabled by default or not. 194 */ 195CU_BOOL suite_vm_tests_enable(void); 196 197/** 198 * Tests in vm test suite 199 */ 200extern CU_TestInfo vm_tests[]; 201 202 203/** 204 * Initialize ras test suite 205 */ 206int suite_ras_tests_init(); 207 208/** 209 * Deinitialize deadlock test suite 210 */ 211int suite_ras_tests_clean(); 212 213/** 214 * Decide if the suite is enabled by default or not. 215 */ 216CU_BOOL suite_ras_tests_enable(void); 217 218/** 219 * Tests in ras test suite 220 */ 221extern CU_TestInfo ras_tests[]; 222 223 224/** 225 * Initialize syncobj timeline test suite 226 */ 227int suite_syncobj_timeline_tests_init(); 228 229/** 230 * Deinitialize syncobj timeline test suite 231 */ 232int suite_syncobj_timeline_tests_clean(); 233 234/** 235 * Decide if the suite is enabled by default or not. 236 */ 237CU_BOOL suite_syncobj_timeline_tests_enable(void); 238 239/** 240 * Tests in syncobj timeline test suite 241 */ 242extern CU_TestInfo syncobj_timeline_tests[]; 243 244void amdgpu_dispatch_hang_helper(amdgpu_device_handle device_handle, uint32_t ip_type); 245void amdgpu_dispatch_hang_slow_helper(amdgpu_device_handle device_handle, uint32_t ip_type); 246void amdgpu_memcpy_draw_test(amdgpu_device_handle device_handle, uint32_t ring, 247 int hang); 248void amdgpu_memcpy_draw_hang_slow_test(amdgpu_device_handle device_handle, uint32_t ring); 249 250/** 251 * Initialize security test suite 252 */ 253int suite_security_tests_init(); 254 255/** 256 * Deinitialize security test suite 257 */ 258int suite_security_tests_clean(); 259 260/** 261 * Decide if the suite is enabled by default or not. 262 */ 263CU_BOOL suite_security_tests_enable(void); 264 265/** 266 * Tests in security test suite 267 */ 268extern CU_TestInfo security_tests[]; 269 270extern void 271amdgpu_command_submission_write_linear_helper_with_secure(amdgpu_device_handle 272 device, 273 unsigned ip_type, 274 bool secure); 275 276/** 277 * Helper functions 278 */ 279static inline amdgpu_bo_handle gpu_mem_alloc( 280 amdgpu_device_handle device_handle, 281 uint64_t size, 282 uint64_t alignment, 283 uint32_t type, 284 uint64_t flags, 285 uint64_t *vmc_addr, 286 amdgpu_va_handle *va_handle) 287{ 288 struct amdgpu_bo_alloc_request req = {0}; 289 amdgpu_bo_handle buf_handle = NULL; 290 int r; 291 292 req.alloc_size = size; 293 req.phys_alignment = alignment; 294 req.preferred_heap = type; 295 req.flags = flags; 296 297 r = amdgpu_bo_alloc(device_handle, &req, &buf_handle); 298 CU_ASSERT_EQUAL(r, 0); 299 if (r) 300 return NULL; 301 302 if (vmc_addr && va_handle) { 303 r = amdgpu_va_range_alloc(device_handle, 304 amdgpu_gpu_va_range_general, 305 size, alignment, 0, vmc_addr, 306 va_handle, 0); 307 CU_ASSERT_EQUAL(r, 0); 308 if (r) 309 goto error_free_bo; 310 311 r = amdgpu_bo_va_op(buf_handle, 0, size, *vmc_addr, 0, 312 AMDGPU_VA_OP_MAP); 313 CU_ASSERT_EQUAL(r, 0); 314 if (r) 315 goto error_free_va; 316 } 317 318 return buf_handle; 319 320error_free_va: 321 r = amdgpu_va_range_free(*va_handle); 322 CU_ASSERT_EQUAL(r, 0); 323 324error_free_bo: 325 r = amdgpu_bo_free(buf_handle); 326 CU_ASSERT_EQUAL(r, 0); 327 328 return NULL; 329} 330 331static inline int gpu_mem_free(amdgpu_bo_handle bo, 332 amdgpu_va_handle va_handle, 333 uint64_t vmc_addr, 334 uint64_t size) 335{ 336 int r; 337 338 if (!bo) 339 return 0; 340 341 if (va_handle) { 342 r = amdgpu_bo_va_op(bo, 0, size, vmc_addr, 0, 343 AMDGPU_VA_OP_UNMAP); 344 CU_ASSERT_EQUAL(r, 0); 345 if (r) 346 return r; 347 348 r = amdgpu_va_range_free(va_handle); 349 CU_ASSERT_EQUAL(r, 0); 350 if (r) 351 return r; 352 } 353 354 r = amdgpu_bo_free(bo); 355 CU_ASSERT_EQUAL(r, 0); 356 357 return r; 358} 359 360static inline int 361amdgpu_bo_alloc_wrap(amdgpu_device_handle dev, unsigned size, 362 unsigned alignment, unsigned heap, uint64_t flags, 363 amdgpu_bo_handle *bo) 364{ 365 struct amdgpu_bo_alloc_request request = {}; 366 amdgpu_bo_handle buf_handle; 367 int r; 368 369 request.alloc_size = size; 370 request.phys_alignment = alignment; 371 request.preferred_heap = heap; 372 request.flags = flags; 373 374 r = amdgpu_bo_alloc(dev, &request, &buf_handle); 375 if (r) 376 return r; 377 378 *bo = buf_handle; 379 380 return 0; 381} 382 383int amdgpu_bo_alloc_and_map_raw(amdgpu_device_handle dev, unsigned size, 384 unsigned alignment, unsigned heap, uint64_t alloc_flags, 385 uint64_t mapping_flags, amdgpu_bo_handle *bo, void **cpu, 386 uint64_t *mc_address, 387 amdgpu_va_handle *va_handle); 388 389static inline int 390amdgpu_bo_alloc_and_map(amdgpu_device_handle dev, unsigned size, 391 unsigned alignment, unsigned heap, uint64_t alloc_flags, 392 amdgpu_bo_handle *bo, void **cpu, uint64_t *mc_address, 393 amdgpu_va_handle *va_handle) 394{ 395 return amdgpu_bo_alloc_and_map_raw(dev, size, alignment, heap, 396 alloc_flags, 0, bo, cpu, mc_address, va_handle); 397} 398 399static inline int 400amdgpu_bo_unmap_and_free(amdgpu_bo_handle bo, amdgpu_va_handle va_handle, 401 uint64_t mc_addr, uint64_t size) 402{ 403 amdgpu_bo_cpu_unmap(bo); 404 amdgpu_bo_va_op(bo, 0, size, mc_addr, 0, AMDGPU_VA_OP_UNMAP); 405 amdgpu_va_range_free(va_handle); 406 amdgpu_bo_free(bo); 407 408 return 0; 409 410} 411 412static inline int 413amdgpu_get_bo_list(amdgpu_device_handle dev, amdgpu_bo_handle bo1, 414 amdgpu_bo_handle bo2, amdgpu_bo_list_handle *list) 415{ 416 amdgpu_bo_handle resources[] = {bo1, bo2}; 417 418 return amdgpu_bo_list_create(dev, bo2 ? 2 : 1, resources, NULL, list); 419} 420 421 422static inline CU_ErrorCode amdgpu_set_suite_active(const char *suite_name, 423 CU_BOOL active) 424{ 425 CU_ErrorCode r = CU_set_suite_active(CU_get_suite(suite_name), active); 426 427 if (r != CUE_SUCCESS) 428 fprintf(stderr, "Failed to obtain suite %s\n", suite_name); 429 430 return r; 431} 432 433static inline CU_ErrorCode amdgpu_set_test_active(const char *suite_name, 434 const char *test_name, CU_BOOL active) 435{ 436 CU_ErrorCode r; 437 CU_pSuite pSuite = CU_get_suite(suite_name); 438 439 if (!pSuite) { 440 fprintf(stderr, "Failed to obtain suite %s\n", 441 suite_name); 442 return CUE_NOSUITE; 443 } 444 445 r = CU_set_test_active(CU_get_test(pSuite, test_name), active); 446 if (r != CUE_SUCCESS) 447 fprintf(stderr, "Failed to obtain test %s\n", test_name); 448 449 return r; 450} 451 452static inline bool asic_is_arcturus(uint32_t asic_id) 453{ 454 switch(asic_id) { 455 /* Arcturus asic DID */ 456 case 0x738C: 457 case 0x7388: 458 case 0x738E: 459 return true; 460 default: 461 return false; 462 } 463} 464 465void amdgpu_test_exec_cs_helper_raw(amdgpu_device_handle device_handle, 466 amdgpu_context_handle context_handle, 467 unsigned ip_type, int instance, int pm4_dw, 468 uint32_t *pm4_src, int res_cnt, 469 amdgpu_bo_handle *resources, 470 struct amdgpu_cs_ib_info *ib_info, 471 struct amdgpu_cs_request *ibs_request, 472 bool secure); 473 474#endif /* #ifdef _AMDGPU_TEST_H_ */ 475