amdgpu_test.h revision 7cdc0497
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 * Tests in basic test suite 59 */ 60extern CU_TestInfo basic_tests[]; 61 62/** 63 * Initialize bo test suite 64 */ 65int suite_bo_tests_init(); 66 67/** 68 * Deinitialize bo test suite 69 */ 70int suite_bo_tests_clean(); 71 72/** 73 * Tests in bo test suite 74 */ 75extern CU_TestInfo bo_tests[]; 76 77/** 78 * Initialize cs test suite 79 */ 80int suite_cs_tests_init(); 81 82/** 83 * Deinitialize cs test suite 84 */ 85int suite_cs_tests_clean(); 86 87/** 88 * Decide if the suite is enabled by default or not. 89 */ 90CU_BOOL suite_cs_tests_enable(void); 91 92/** 93 * Tests in cs test suite 94 */ 95extern CU_TestInfo cs_tests[]; 96 97/** 98 * Initialize vce test suite 99 */ 100int suite_vce_tests_init(); 101 102/** 103 * Deinitialize vce test suite 104 */ 105int suite_vce_tests_clean(); 106 107/** 108 * Decide if the suite is enabled by default or not. 109 */ 110CU_BOOL suite_vce_tests_enable(void); 111 112/** 113 * Tests in vce test suite 114 */ 115extern CU_TestInfo vce_tests[]; 116 117/** 118+ * Initialize vcn test suite 119+ */ 120int suite_vcn_tests_init(); 121 122/** 123+ * Deinitialize vcn test suite 124+ */ 125int suite_vcn_tests_clean(); 126 127/** 128 * Decide if the suite is enabled by default or not. 129 */ 130CU_BOOL suite_vcn_tests_enable(void); 131 132/** 133+ * Tests in vcn test suite 134+ */ 135extern CU_TestInfo vcn_tests[]; 136 137/** 138 * Initialize uvd enc test suite 139 */ 140int suite_uvd_enc_tests_init(); 141 142/** 143 * Deinitialize uvd enc test suite 144 */ 145int suite_uvd_enc_tests_clean(); 146 147/** 148 * Decide if the suite is enabled by default or not. 149 */ 150CU_BOOL suite_uvd_enc_tests_enable(void); 151 152/** 153 * Tests in uvd enc test suite 154 */ 155extern CU_TestInfo uvd_enc_tests[]; 156 157/** 158 * Initialize deadlock test suite 159 */ 160int suite_deadlock_tests_init(); 161 162/** 163 * Deinitialize deadlock test suite 164 */ 165int suite_deadlock_tests_clean(); 166 167/** 168 * Decide if the suite is enabled by default or not. 169 */ 170CU_BOOL suite_deadlock_tests_enable(void); 171 172/** 173 * Tests in uvd enc test suite 174 */ 175extern CU_TestInfo deadlock_tests[]; 176 177/** 178 * Initialize vm test suite 179 */ 180int suite_vm_tests_init(); 181 182/** 183 * Deinitialize deadlock test suite 184 */ 185int suite_vm_tests_clean(); 186 187/** 188 * Decide if the suite is enabled by default or not. 189 */ 190CU_BOOL suite_vm_tests_enable(void); 191 192/** 193 * Tests in vm test suite 194 */ 195extern CU_TestInfo vm_tests[]; 196 197/** 198 * Helper functions 199 */ 200static inline amdgpu_bo_handle gpu_mem_alloc( 201 amdgpu_device_handle device_handle, 202 uint64_t size, 203 uint64_t alignment, 204 uint32_t type, 205 uint64_t flags, 206 uint64_t *vmc_addr, 207 amdgpu_va_handle *va_handle) 208{ 209 struct amdgpu_bo_alloc_request req = {0}; 210 amdgpu_bo_handle buf_handle = NULL; 211 int r; 212 213 req.alloc_size = size; 214 req.phys_alignment = alignment; 215 req.preferred_heap = type; 216 req.flags = flags; 217 218 r = amdgpu_bo_alloc(device_handle, &req, &buf_handle); 219 CU_ASSERT_EQUAL(r, 0); 220 if (r) 221 return NULL; 222 223 if (vmc_addr && va_handle) { 224 r = amdgpu_va_range_alloc(device_handle, 225 amdgpu_gpu_va_range_general, 226 size, alignment, 0, vmc_addr, 227 va_handle, 0); 228 CU_ASSERT_EQUAL(r, 0); 229 if (r) 230 goto error_free_bo; 231 232 r = amdgpu_bo_va_op(buf_handle, 0, size, *vmc_addr, 0, 233 AMDGPU_VA_OP_MAP); 234 CU_ASSERT_EQUAL(r, 0); 235 if (r) 236 goto error_free_va; 237 } 238 239 return buf_handle; 240 241error_free_va: 242 r = amdgpu_va_range_free(*va_handle); 243 CU_ASSERT_EQUAL(r, 0); 244 245error_free_bo: 246 r = amdgpu_bo_free(buf_handle); 247 CU_ASSERT_EQUAL(r, 0); 248 249 return NULL; 250} 251 252static inline int gpu_mem_free(amdgpu_bo_handle bo, 253 amdgpu_va_handle va_handle, 254 uint64_t vmc_addr, 255 uint64_t size) 256{ 257 int r; 258 259 if (!bo) 260 return 0; 261 262 if (va_handle) { 263 r = amdgpu_bo_va_op(bo, 0, size, vmc_addr, 0, 264 AMDGPU_VA_OP_UNMAP); 265 CU_ASSERT_EQUAL(r, 0); 266 if (r) 267 return r; 268 269 r = amdgpu_va_range_free(va_handle); 270 CU_ASSERT_EQUAL(r, 0); 271 if (r) 272 return r; 273 } 274 275 r = amdgpu_bo_free(bo); 276 CU_ASSERT_EQUAL(r, 0); 277 278 return r; 279} 280 281static inline int 282amdgpu_bo_alloc_wrap(amdgpu_device_handle dev, unsigned size, 283 unsigned alignment, unsigned heap, uint64_t flags, 284 amdgpu_bo_handle *bo) 285{ 286 struct amdgpu_bo_alloc_request request = {}; 287 amdgpu_bo_handle buf_handle; 288 int r; 289 290 request.alloc_size = size; 291 request.phys_alignment = alignment; 292 request.preferred_heap = heap; 293 request.flags = flags; 294 295 r = amdgpu_bo_alloc(dev, &request, &buf_handle); 296 if (r) 297 return r; 298 299 *bo = buf_handle; 300 301 return 0; 302} 303 304int amdgpu_bo_alloc_and_map_raw(amdgpu_device_handle dev, unsigned size, 305 unsigned alignment, unsigned heap, uint64_t alloc_flags, 306 uint64_t mapping_flags, amdgpu_bo_handle *bo, void **cpu, 307 uint64_t *mc_address, 308 amdgpu_va_handle *va_handle); 309 310static inline int 311amdgpu_bo_alloc_and_map(amdgpu_device_handle dev, unsigned size, 312 unsigned alignment, unsigned heap, uint64_t alloc_flags, 313 amdgpu_bo_handle *bo, void **cpu, uint64_t *mc_address, 314 amdgpu_va_handle *va_handle) 315{ 316 return amdgpu_bo_alloc_and_map_raw(dev, size, alignment, heap, 317 alloc_flags, 0, bo, cpu, mc_address, va_handle); 318} 319 320static inline int 321amdgpu_bo_unmap_and_free(amdgpu_bo_handle bo, amdgpu_va_handle va_handle, 322 uint64_t mc_addr, uint64_t size) 323{ 324 amdgpu_bo_cpu_unmap(bo); 325 amdgpu_bo_va_op(bo, 0, size, mc_addr, 0, AMDGPU_VA_OP_UNMAP); 326 amdgpu_va_range_free(va_handle); 327 amdgpu_bo_free(bo); 328 329 return 0; 330 331} 332 333static inline int 334amdgpu_get_bo_list(amdgpu_device_handle dev, amdgpu_bo_handle bo1, 335 amdgpu_bo_handle bo2, amdgpu_bo_list_handle *list) 336{ 337 amdgpu_bo_handle resources[] = {bo1, bo2}; 338 339 return amdgpu_bo_list_create(dev, bo2 ? 2 : 1, resources, NULL, list); 340} 341 342 343static inline CU_ErrorCode amdgpu_set_suite_active(const char *suite_name, 344 CU_BOOL active) 345{ 346 CU_ErrorCode r = CU_set_suite_active(CU_get_suite(suite_name), active); 347 348 if (r != CUE_SUCCESS) 349 fprintf(stderr, "Failed to obtain suite %s\n", suite_name); 350 351 return r; 352} 353 354static inline CU_ErrorCode amdgpu_set_test_active(const char *suite_name, 355 const char *test_name, CU_BOOL active) 356{ 357 CU_ErrorCode r; 358 CU_pSuite pSuite = CU_get_suite(suite_name); 359 360 if (!pSuite) { 361 fprintf(stderr, "Failed to obtain suite %s\n", 362 suite_name); 363 return CUE_NOSUITE; 364 } 365 366 r = CU_set_test_active(CU_get_test(pSuite, test_name), active); 367 if (r != CUE_SUCCESS) 368 fprintf(stderr, "Failed to obtain test %s\n", test_name); 369 370 return r; 371} 372 373#endif /* #ifdef _AMDGPU_TEST_H_ */ 374