/* * Copyright 2014 Advanced Micro Devices, Inc. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include <string.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <ctype.h> #include <fcntl.h> #include <errno.h> #include <signal.h> #include <time.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/ioctl.h> #include <sys/time.h> #include <stdarg.h> #include <stdint.h> #include "drm.h" #include "xf86drmMode.h" #include "xf86drm.h" #include "CUnit/Basic.h" #include "amdgpu_test.h" /** * Open handles for amdgpu devices * */ int drm_amdgpu[MAX_CARDS_SUPPORTED]; /** The table of all known test suites to run */ static CU_SuiteInfo suites[] = { { .pName = "Basic Tests", .pInitFunc = suite_basic_tests_init, .pCleanupFunc = suite_basic_tests_clean, .pTests = basic_tests, }, { .pName = "BO Tests", .pInitFunc = suite_bo_tests_init, .pCleanupFunc = suite_bo_tests_clean, .pTests = bo_tests, }, { .pName = "CS Tests", .pInitFunc = suite_cs_tests_init, .pCleanupFunc = suite_cs_tests_clean, .pTests = cs_tests, }, { .pName = "VCE Tests", .pInitFunc = suite_vce_tests_init, .pCleanupFunc = suite_vce_tests_clean, .pTests = vce_tests, }, CU_SUITE_INFO_NULL, }; /** Display information about all suites and their tests */ static void display_test_suites(void) { int iSuite; int iTest; printf("Suites\n"); for (iSuite = 0; suites[iSuite].pName != NULL; iSuite++) { printf("Suite id = %d: Name '%s'\n", iSuite + 1, suites[iSuite].pName); for (iTest = 0; suites[iSuite].pTests[iTest].pName != NULL; iTest++) { printf(" Test id %d: Name: '%s'\n", iTest + 1, suites[iSuite].pTests[iTest].pName); } } } /** Help string for command line parameters */ static const char usage[] = "Usage: %s [-hl] [<-s <suite id>> [-t <test id>]]\n" "where:\n" " l - Display all suites and their tests\n" " h - Display this help\n"; /** Specified options strings for getopt */ static const char options[] = "hls:t:"; /* The main() function for setting up and running the tests. * Returns a CUE_SUCCESS on successful running, another * CUnit error code on failure. */ int main(int argc, char **argv) { int c; /* Character received from getopt */ int i = 0; int suite_id = -1; /* By default run everything */ int test_id = -1; /* By default run all tests in the suite */ CU_pSuite pSuite = NULL; CU_pTest pTest = NULL; int aval = drmAvailable(); if (aval == 0) { fprintf(stderr, "DRM driver is not available\n"); exit(EXIT_FAILURE); } for (i = 0; i < MAX_CARDS_SUPPORTED; i++) drm_amdgpu[i] = -1; /* Parse command line string */ opterr = 0; /* Do not print error messages from getopt */ while ((c = getopt(argc, argv, options)) != -1) { switch (c) { case 'l': display_test_suites(); exit(EXIT_SUCCESS); case 's': suite_id = atoi(optarg); break; case 't': test_id = atoi(optarg); break; case '?': case 'h': fprintf(stderr, usage, argv[0]); exit(EXIT_SUCCESS); default: fprintf(stderr, usage, argv[0]); exit(EXIT_FAILURE); } } /* Try to open all possible radeon connections * Right now: Open only the 0. */ printf("Try to open the card 0..\n"); drm_amdgpu[0] = open("/dev/dri/card0", O_RDWR | O_CLOEXEC); if (drm_amdgpu[0] < 0) { perror("Cannot open /dev/dri/card0\n"); exit(EXIT_FAILURE); } /** Display version of DRM driver */ drmVersionPtr retval = drmGetVersion(drm_amdgpu[0]); if (retval == NULL) { perror("Could not get information about DRM driver"); exit(EXIT_FAILURE); } printf("DRM Driver: Name: [%s] : Date [%s] : Description [%s]\n", retval->name, retval->date, retval->desc); drmFreeVersion(retval); /* Initialize test suites to run */ /* initialize the CUnit test registry */ if (CUE_SUCCESS != CU_initialize_registry()) { close(drm_amdgpu[0]); return CU_get_error(); } /* Register suites. */ if (CU_register_suites(suites) != CUE_SUCCESS) { fprintf(stderr, "suite registration failed - %s\n", CU_get_error_msg()); CU_cleanup_registry(); close(drm_amdgpu[0]); exit(EXIT_FAILURE); } /* Run tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); if (suite_id != -1) { /* If user specify particular suite? */ pSuite = CU_get_suite_by_index((unsigned int) suite_id, CU_get_registry()); if (pSuite) { if (test_id != -1) { /* If user specify test id */ pTest = CU_get_test_by_index( (unsigned int) test_id, pSuite); if (pTest) CU_basic_run_test(pSuite, pTest); else { fprintf(stderr, "Invalid test id: %d\n", test_id); CU_cleanup_registry(); close(drm_amdgpu[0]); exit(EXIT_FAILURE); } } else CU_basic_run_suite(pSuite); } else { fprintf(stderr, "Invalid suite id : %d\n", suite_id); CU_cleanup_registry(); close(drm_amdgpu[0]); exit(EXIT_FAILURE); } } else CU_basic_run_tests(); CU_cleanup_registry(); close(drm_amdgpu[0]); return CU_get_error(); }