13c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher/* 23c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * Copyright 2014 Advanced Micro Devices, Inc. 33c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * 43c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * Permission is hereby granted, free of charge, to any person obtaining a 53c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * copy of this software and associated documentation files (the "Software"), 63c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * to deal in the Software without restriction, including without limitation 73c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * the rights to use, copy, modify, merge, publish, distribute, sublicense, 83c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * and/or sell copies of the Software, and to permit persons to whom the 93c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * Software is furnished to do so, subject to the following conditions: 103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * 113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * The above copyright notice and this permission notice shall be included in 123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * all copies or substantial portions of the Software. 133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * 143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * OTHER DEALINGS IN THE SOFTWARE. 213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * 223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher*/ 2325784d3af2f37d86fb25ee6cfa4afa6f3448af9bMichel Dänzer 2425784d3af2f37d86fb25ee6cfa4afa6f3448af9bMichel Dänzer#ifdef HAVE_CONFIG_H 2525784d3af2f37d86fb25ee6cfa4afa6f3448af9bMichel Dänzer#include "config.h" 2625784d3af2f37d86fb25ee6cfa4afa6f3448af9bMichel Dänzer#endif 2725784d3af2f37d86fb25ee6cfa4afa6f3448af9bMichel Dänzer 283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include <string.h> 293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include <stdio.h> 303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include <stdlib.h> 313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include <unistd.h> 323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include <string.h> 333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include <ctype.h> 343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include <fcntl.h> 353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include <errno.h> 363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include <signal.h> 373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include <time.h> 383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include <sys/types.h> 393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include <sys/stat.h> 403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include <sys/ioctl.h> 413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include <sys/time.h> 423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include <stdarg.h> 433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include <stdint.h> 443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include "drm.h" 463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include "xf86drmMode.h" 473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include "xf86drm.h" 483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include "CUnit/Basic.h" 503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher#include "amdgpu_test.h" 523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher/** 543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * Open handles for amdgpu devices 553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * 563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher */ 573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherint drm_amdgpu[MAX_CARDS_SUPPORTED]; 583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher/** The table of all known test suites to run */ 603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic CU_SuiteInfo suites[] = { 61ae2cf4507c32f0e16fdb41472ac68d72bfb007acEmil Velikov { 62ae2cf4507c32f0e16fdb41472ac68d72bfb007acEmil Velikov .pName = "Basic Tests", 63ae2cf4507c32f0e16fdb41472ac68d72bfb007acEmil Velikov .pInitFunc = suite_basic_tests_init, 64ae2cf4507c32f0e16fdb41472ac68d72bfb007acEmil Velikov .pCleanupFunc = suite_basic_tests_clean, 65ae2cf4507c32f0e16fdb41472ac68d72bfb007acEmil Velikov .pTests = basic_tests, 66ae2cf4507c32f0e16fdb41472ac68d72bfb007acEmil Velikov }, 67ae2cf4507c32f0e16fdb41472ac68d72bfb007acEmil Velikov { 68ae2cf4507c32f0e16fdb41472ac68d72bfb007acEmil Velikov .pName = "BO Tests", 69ae2cf4507c32f0e16fdb41472ac68d72bfb007acEmil Velikov .pInitFunc = suite_bo_tests_init, 70ae2cf4507c32f0e16fdb41472ac68d72bfb007acEmil Velikov .pCleanupFunc = suite_bo_tests_clean, 71ae2cf4507c32f0e16fdb41472ac68d72bfb007acEmil Velikov .pTests = bo_tests, 72ae2cf4507c32f0e16fdb41472ac68d72bfb007acEmil Velikov }, 73ae2cf4507c32f0e16fdb41472ac68d72bfb007acEmil Velikov { 74ae2cf4507c32f0e16fdb41472ac68d72bfb007acEmil Velikov .pName = "CS Tests", 75ae2cf4507c32f0e16fdb41472ac68d72bfb007acEmil Velikov .pInitFunc = suite_cs_tests_init, 76ae2cf4507c32f0e16fdb41472ac68d72bfb007acEmil Velikov .pCleanupFunc = suite_cs_tests_clean, 77ae2cf4507c32f0e16fdb41472ac68d72bfb007acEmil Velikov .pTests = cs_tests, 78ae2cf4507c32f0e16fdb41472ac68d72bfb007acEmil Velikov }, 79ae2cf4507c32f0e16fdb41472ac68d72bfb007acEmil Velikov { 80ae2cf4507c32f0e16fdb41472ac68d72bfb007acEmil Velikov .pName = "VCE Tests", 81ae2cf4507c32f0e16fdb41472ac68d72bfb007acEmil Velikov .pInitFunc = suite_vce_tests_init, 82ae2cf4507c32f0e16fdb41472ac68d72bfb007acEmil Velikov .pCleanupFunc = suite_vce_tests_clean, 83ae2cf4507c32f0e16fdb41472ac68d72bfb007acEmil Velikov .pTests = vce_tests, 84ae2cf4507c32f0e16fdb41472ac68d72bfb007acEmil Velikov }, 853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_SUITE_INFO_NULL, 863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher}; 873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher/** Display information about all suites and their tests */ 903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic void display_test_suites(void) 913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int iSuite; 933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int iTest; 943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher printf("Suites\n"); 963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher for (iSuite = 0; suites[iSuite].pName != NULL; iSuite++) { 983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher printf("Suite id = %d: Name '%s'\n", 993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher iSuite + 1, suites[iSuite].pName); 1003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher for (iTest = 0; suites[iSuite].pTests[iTest].pName != NULL; 1023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher iTest++) { 1033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher printf(" Test id %d: Name: '%s'\n", iTest + 1, 1043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher suites[iSuite].pTests[iTest].pName); 1053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 1063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 1073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 1083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher/** Help string for command line parameters */ 1113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic const char usage[] = "Usage: %s [-hl] [<-s <suite id>> [-t <test id>]]\n" 1123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher "where:\n" 1133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher " l - Display all suites and their tests\n" 1143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher " h - Display this help\n"; 1153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher/** Specified options strings for getopt */ 1163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherstatic const char options[] = "hls:t:"; 1173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher/* The main() function for setting up and running the tests. 1193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * Returns a CUE_SUCCESS on successful running, another 1203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * CUnit error code on failure. 1213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher */ 1223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucherint main(int argc, char **argv) 1233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher{ 1243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int c; /* Character received from getopt */ 1253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int i = 0; 1263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int suite_id = -1; /* By default run everything */ 1273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int test_id = -1; /* By default run all tests in the suite */ 1283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_pSuite pSuite = NULL; 1293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_pTest pTest = NULL; 1303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher int aval = drmAvailable(); 1323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher if (aval == 0) { 1343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fprintf(stderr, "DRM driver is not available\n"); 1353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher exit(EXIT_FAILURE); 1363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 1373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher for (i = 0; i < MAX_CARDS_SUPPORTED; i++) 1403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher drm_amdgpu[i] = -1; 1413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* Parse command line string */ 1443c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher opterr = 0; /* Do not print error messages from getopt */ 1453c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher while ((c = getopt(argc, argv, options)) != -1) { 1463c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher switch (c) { 1473c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher case 'l': 1483c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher display_test_suites(); 1493c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher exit(EXIT_SUCCESS); 1503c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher case 's': 1513c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher suite_id = atoi(optarg); 1523c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher break; 1533c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher case 't': 1543c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher test_id = atoi(optarg); 1553c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher break; 1563c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher case '?': 1573c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher case 'h': 1583c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fprintf(stderr, usage, argv[0]); 1593c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher exit(EXIT_SUCCESS); 1603c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher default: 1613c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fprintf(stderr, usage, argv[0]); 1623c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher exit(EXIT_FAILURE); 1633c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 1643c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 1653c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1663c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* Try to open all possible radeon connections 1673c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher * Right now: Open only the 0. 1683c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher */ 1693c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher printf("Try to open the card 0..\n"); 1703c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher drm_amdgpu[0] = open("/dev/dri/card0", O_RDWR | O_CLOEXEC); 1713c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1723c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher if (drm_amdgpu[0] < 0) { 1733c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher perror("Cannot open /dev/dri/card0\n"); 1743c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher exit(EXIT_FAILURE); 1753c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 1763c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1773c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /** Display version of DRM driver */ 1783c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher drmVersionPtr retval = drmGetVersion(drm_amdgpu[0]); 1793c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1803c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher if (retval == NULL) { 1813c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher perror("Could not get information about DRM driver"); 1823c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher exit(EXIT_FAILURE); 1833c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 1843c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1853c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher printf("DRM Driver: Name: [%s] : Date [%s] : Description [%s]\n", 1863c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher retval->name, retval->date, retval->desc); 1873c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1883c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher drmFreeVersion(retval); 1893c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1903c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* Initialize test suites to run */ 1913c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1923c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* initialize the CUnit test registry */ 1933c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher if (CUE_SUCCESS != CU_initialize_registry()) { 1943c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher close(drm_amdgpu[0]); 1953c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher return CU_get_error(); 1963c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 1973c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 1983c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* Register suites. */ 1993c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher if (CU_register_suites(suites) != CUE_SUCCESS) { 2003c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fprintf(stderr, "suite registration failed - %s\n", 2013c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_get_error_msg()); 2023c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_cleanup_registry(); 2033c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher close(drm_amdgpu[0]); 2043c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher exit(EXIT_FAILURE); 2053c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 2063c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2073c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher /* Run tests using the CUnit Basic interface */ 2083c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_basic_set_mode(CU_BRM_VERBOSE); 2093c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2103c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher if (suite_id != -1) { /* If user specify particular suite? */ 2113c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pSuite = CU_get_suite_by_index((unsigned int) suite_id, 2123c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_get_registry()); 2133c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2143c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher if (pSuite) { 2153c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher if (test_id != -1) { /* If user specify test id */ 2163c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pTest = CU_get_test_by_index( 2173c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher (unsigned int) test_id, 2183c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher pSuite); 2193c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher if (pTest) 2203c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_basic_run_test(pSuite, pTest); 2213c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher else { 2223c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fprintf(stderr, "Invalid test id: %d\n", 2233c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher test_id); 2243c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_cleanup_registry(); 2253c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher close(drm_amdgpu[0]); 2263c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher exit(EXIT_FAILURE); 2273c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 2283c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } else 2293c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_basic_run_suite(pSuite); 2303c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } else { 2313c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher fprintf(stderr, "Invalid suite id : %d\n", 2323c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher suite_id); 2333c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_cleanup_registry(); 2343c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher close(drm_amdgpu[0]); 2353c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher exit(EXIT_FAILURE); 2363c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } 2373c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher } else 2383c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_basic_run_tests(); 2393c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher 2403c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher CU_cleanup_registry(); 2413c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher close(drm_amdgpu[0]); 2423c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher return CU_get_error(); 2433c5fe78801dbadc82cc25f4a63a983fea15d938bAlex Deucher} 244