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