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 #ifdef HAVE_CONFIG_H
25 #include "config.h"
26 #endif
27 
28 #include <string.h>
29 #include <stdio.h>
30 #include <stdlib.h>
31 #include <unistd.h>
32 #include <string.h>
33 #include <ctype.h>
34 #include <fcntl.h>
35 #include <errno.h>
36 #include <signal.h>
37 #include <time.h>
38 #include <sys/types.h>
39 #include <sys/stat.h>
40 #include <sys/ioctl.h>
41 #include <sys/time.h>
42 #include <stdarg.h>
43 #include <stdint.h>
44 
45 #include "drm.h"
46 #include "xf86drmMode.h"
47 #include "xf86drm.h"
48 
49 #include "CUnit/Basic.h"
50 
51 #include "amdgpu_test.h"
52 
53 /**
54  *  Open handles for amdgpu devices
55  *
56  */
57 int drm_amdgpu[MAX_CARDS_SUPPORTED];
58 
59 /** The table of all known test suites to run */
60 static CU_SuiteInfo suites[] = {
61 	{
62 		.pName = "Basic Tests",
63 		.pInitFunc = suite_basic_tests_init,
64 		.pCleanupFunc = suite_basic_tests_clean,
65 		.pTests = basic_tests,
66 	},
67 	{
68 		.pName = "BO Tests",
69 		.pInitFunc = suite_bo_tests_init,
70 		.pCleanupFunc = suite_bo_tests_clean,
71 		.pTests = bo_tests,
72 	},
73 	{
74 		.pName = "CS Tests",
75 		.pInitFunc = suite_cs_tests_init,
76 		.pCleanupFunc = suite_cs_tests_clean,
77 		.pTests = cs_tests,
78 	},
79 	{
80 		.pName = "VCE Tests",
81 		.pInitFunc = suite_vce_tests_init,
82 		.pCleanupFunc = suite_vce_tests_clean,
83 		.pTests = vce_tests,
84 	},
85 	CU_SUITE_INFO_NULL,
86 };
87 
88 
89 /** Display information about all  suites and their tests */
display_test_suites(void)90 static void display_test_suites(void)
91 {
92 	int iSuite;
93 	int iTest;
94 
95 	printf("Suites\n");
96 
97 	for (iSuite = 0; suites[iSuite].pName != NULL; iSuite++) {
98 		printf("Suite id = %d: Name '%s'\n",
99 				iSuite + 1, suites[iSuite].pName);
100 
101 		for (iTest = 0; suites[iSuite].pTests[iTest].pName != NULL;
102 			iTest++) {
103 			printf("	Test id %d: Name: '%s'\n", iTest + 1,
104 					suites[iSuite].pTests[iTest].pName);
105 		}
106 	}
107 }
108 
109 
110 /** Help string for command line parameters */
111 static const char usage[] = "Usage: %s [-hl] [<-s <suite id>> [-t <test id>]]\n"
112 				"where:\n"
113 				"       l - Display all suites and their tests\n"
114 				"       h - Display this help\n";
115 /** Specified options strings for getopt */
116 static const char options[]   = "hls:t:";
117 
118 /* The main() function for setting up and running the tests.
119  * Returns a CUE_SUCCESS on successful running, another
120  * CUnit error code on failure.
121  */
main(int argc,char ** argv)122 int main(int argc, char **argv)
123 {
124 	int c;			/* Character received from getopt */
125 	int i = 0;
126 	int suite_id = -1;	/* By default run everything */
127 	int test_id  = -1;	/* By default run all tests in the suite */
128 	CU_pSuite pSuite = NULL;
129 	CU_pTest  pTest  = NULL;
130 
131 	int aval = drmAvailable();
132 
133 	if (aval == 0) {
134 		fprintf(stderr, "DRM driver is not available\n");
135 		exit(EXIT_FAILURE);
136 	}
137 
138 
139 	for (i = 0; i < MAX_CARDS_SUPPORTED; i++)
140 		drm_amdgpu[i] = -1;
141 
142 
143 	/* Parse command line string */
144 	opterr = 0;		/* Do not print error messages from getopt */
145 	while ((c = getopt(argc, argv, options)) != -1) {
146 		switch (c) {
147 		case 'l':
148 			display_test_suites();
149 			exit(EXIT_SUCCESS);
150 		case 's':
151 			suite_id = atoi(optarg);
152 			break;
153 		case 't':
154 			test_id = atoi(optarg);
155 			break;
156 		case '?':
157 		case 'h':
158 			fprintf(stderr, usage, argv[0]);
159 			exit(EXIT_SUCCESS);
160 		default:
161 			fprintf(stderr, usage, argv[0]);
162 			exit(EXIT_FAILURE);
163 		}
164 	}
165 
166 	/* Try to open all possible radeon connections
167 	 * Right now: Open only the 0.
168 	 */
169 	printf("Try to open the card 0..\n");
170 	drm_amdgpu[0] = open("/dev/dri/card0", O_RDWR | O_CLOEXEC);
171 
172 	if (drm_amdgpu[0] < 0) {
173 		perror("Cannot open /dev/dri/card0\n");
174 		exit(EXIT_FAILURE);
175 	}
176 
177 	/** Display version of DRM driver */
178 	drmVersionPtr retval = drmGetVersion(drm_amdgpu[0]);
179 
180 	if (retval == NULL) {
181 		perror("Could not get information about DRM driver");
182 		exit(EXIT_FAILURE);
183 	}
184 
185 	printf("DRM Driver: Name: [%s] : Date [%s] : Description [%s]\n",
186 	       retval->name, retval->date, retval->desc);
187 
188 	drmFreeVersion(retval);
189 
190 	/* Initialize test suites to run */
191 
192 	/* initialize the CUnit test registry */
193 	if (CUE_SUCCESS != CU_initialize_registry()) {
194 		close(drm_amdgpu[0]);
195 		return CU_get_error();
196 	}
197 
198 	/* Register suites. */
199 	if (CU_register_suites(suites) != CUE_SUCCESS) {
200 		fprintf(stderr, "suite registration failed - %s\n",
201 				CU_get_error_msg());
202 		CU_cleanup_registry();
203 		close(drm_amdgpu[0]);
204 		exit(EXIT_FAILURE);
205 	}
206 
207 	/* Run tests using the CUnit Basic interface */
208 	CU_basic_set_mode(CU_BRM_VERBOSE);
209 
210 	if (suite_id != -1) {	/* If user specify particular suite? */
211 		pSuite = CU_get_suite_by_index((unsigned int) suite_id,
212 						CU_get_registry());
213 
214 		if (pSuite) {
215 			if (test_id != -1) {   /* If user specify test id */
216 				pTest = CU_get_test_by_index(
217 						(unsigned int) test_id,
218 						pSuite);
219 				if (pTest)
220 					CU_basic_run_test(pSuite, pTest);
221 				else {
222 					fprintf(stderr, "Invalid test id: %d\n",
223 								test_id);
224 					CU_cleanup_registry();
225 					close(drm_amdgpu[0]);
226 					exit(EXIT_FAILURE);
227 				}
228 			} else
229 				CU_basic_run_suite(pSuite);
230 		} else {
231 			fprintf(stderr, "Invalid suite id : %d\n",
232 					suite_id);
233 			CU_cleanup_registry();
234 			close(drm_amdgpu[0]);
235 			exit(EXIT_FAILURE);
236 		}
237 	} else
238 		CU_basic_run_tests();
239 
240 	CU_cleanup_registry();
241 	close(drm_amdgpu[0]);
242 	return CU_get_error();
243 }
244