xref: /aosp_15_r20/external/OpenCL-CTS/test_conformance/computeinfo/main.cpp (revision 6467f958c7de8070b317fc65bcb0f6472e388d82)
1*6467f958SSadaf Ebrahimi //
2*6467f958SSadaf Ebrahimi // Copyright (c) 2017-2019 The Khronos Group Inc.
3*6467f958SSadaf Ebrahimi //
4*6467f958SSadaf Ebrahimi // Licensed under the Apache License, Version 2.0 (the "License");
5*6467f958SSadaf Ebrahimi // you may not use this file except in compliance with the License.
6*6467f958SSadaf Ebrahimi // You may obtain a copy of the License at
7*6467f958SSadaf Ebrahimi //
8*6467f958SSadaf Ebrahimi //    http://www.apache.org/licenses/LICENSE-2.0
9*6467f958SSadaf Ebrahimi //
10*6467f958SSadaf Ebrahimi // Unless required by applicable law or agreed to in writing, software
11*6467f958SSadaf Ebrahimi // distributed under the License is distributed on an "AS IS" BASIS,
12*6467f958SSadaf Ebrahimi // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6467f958SSadaf Ebrahimi // See the License for the specific language governing permissions and
14*6467f958SSadaf Ebrahimi // limitations under the License.
15*6467f958SSadaf Ebrahimi //
16*6467f958SSadaf Ebrahimi #include "harness/compat.h"
17*6467f958SSadaf Ebrahimi 
18*6467f958SSadaf Ebrahimi #include <inttypes.h>
19*6467f958SSadaf Ebrahimi #include <stdio.h>
20*6467f958SSadaf Ebrahimi #include <string.h>
21*6467f958SSadaf Ebrahimi #include <errno.h>
22*6467f958SSadaf Ebrahimi #include "harness/testHarness.h"
23*6467f958SSadaf Ebrahimi #include "harness/errorHelpers.h"
24*6467f958SSadaf Ebrahimi #include "harness/kernelHelpers.h"
25*6467f958SSadaf Ebrahimi 
26*6467f958SSadaf Ebrahimi static int dump_supported_formats;
27*6467f958SSadaf Ebrahimi 
28*6467f958SSadaf Ebrahimi typedef struct
29*6467f958SSadaf Ebrahimi {
30*6467f958SSadaf Ebrahimi     cl_device_type device_type;
31*6467f958SSadaf Ebrahimi     const char* device_type_name;
32*6467f958SSadaf Ebrahimi     unsigned num_devices;
33*6467f958SSadaf Ebrahimi     cl_device_id* devices;
34*6467f958SSadaf Ebrahimi     // more infos here
35*6467f958SSadaf Ebrahimi } device_info;
36*6467f958SSadaf Ebrahimi 
37*6467f958SSadaf Ebrahimi device_info device_infos[] = {
38*6467f958SSadaf Ebrahimi     { CL_DEVICE_TYPE_DEFAULT, "CL_DEVICE_TYPE_DEFAULT", -1, NULL },
39*6467f958SSadaf Ebrahimi     { CL_DEVICE_TYPE_CPU, "CL_DEVICE_TYPE_CPU", -1, NULL },
40*6467f958SSadaf Ebrahimi     { CL_DEVICE_TYPE_GPU, "CL_DEVICE_TYPE_GPU", -1, NULL },
41*6467f958SSadaf Ebrahimi     { CL_DEVICE_TYPE_ACCELERATOR, "CL_DEVICE_TYPE_ACCELERATOR", -1, NULL },
42*6467f958SSadaf Ebrahimi     { CL_DEVICE_TYPE_ALL, "CL_DEVICE_TYPE_ALL", -1, NULL },
43*6467f958SSadaf Ebrahimi };
44*6467f958SSadaf Ebrahimi 
45*6467f958SSadaf Ebrahimi // config types
46*6467f958SSadaf Ebrahimi enum
47*6467f958SSadaf Ebrahimi {
48*6467f958SSadaf Ebrahimi     type_cl_device_type,
49*6467f958SSadaf Ebrahimi     type_cl_device_fp_config,
50*6467f958SSadaf Ebrahimi     type_cl_device_mem_cache_type,
51*6467f958SSadaf Ebrahimi     type_cl_local_mem_type,
52*6467f958SSadaf Ebrahimi     type_cl_device_exec_capabilities,
53*6467f958SSadaf Ebrahimi     type_cl_command_queue_properties,
54*6467f958SSadaf Ebrahimi     type_cl_device_id,
55*6467f958SSadaf Ebrahimi     type_cl_device_affinity_domain,
56*6467f958SSadaf Ebrahimi     type_cl_uint,
57*6467f958SSadaf Ebrahimi     type_size_t,
58*6467f958SSadaf Ebrahimi     type_size_t_arr,
59*6467f958SSadaf Ebrahimi     type_cl_ulong,
60*6467f958SSadaf Ebrahimi     type_string,
61*6467f958SSadaf Ebrahimi     type_cl_device_svm_capabilities,
62*6467f958SSadaf Ebrahimi     type_cl_device_atomic_capabilities,
63*6467f958SSadaf Ebrahimi     type_cl_device_device_enqueue_capabilities,
64*6467f958SSadaf Ebrahimi     type_cl_name_version_array,
65*6467f958SSadaf Ebrahimi     type_cl_name_version,
66*6467f958SSadaf Ebrahimi };
67*6467f958SSadaf Ebrahimi 
68*6467f958SSadaf Ebrahimi typedef union {
69*6467f958SSadaf Ebrahimi     cl_device_type type;
70*6467f958SSadaf Ebrahimi     cl_device_fp_config fp_config;
71*6467f958SSadaf Ebrahimi     cl_device_mem_cache_type mem_cache_type;
72*6467f958SSadaf Ebrahimi     cl_device_local_mem_type local_mem_type;
73*6467f958SSadaf Ebrahimi     cl_device_exec_capabilities exec_capabilities;
74*6467f958SSadaf Ebrahimi     cl_command_queue_properties queue_properties;
75*6467f958SSadaf Ebrahimi     cl_device_id device_id;
76*6467f958SSadaf Ebrahimi     cl_device_affinity_domain affinity_domain;
77*6467f958SSadaf Ebrahimi     cl_int uint;
78*6467f958SSadaf Ebrahimi     size_t sizet;
79*6467f958SSadaf Ebrahimi     size_t sizet_arr[3];
80*6467f958SSadaf Ebrahimi     cl_ulong ull;
81*6467f958SSadaf Ebrahimi     char* string;
82*6467f958SSadaf Ebrahimi     cl_device_svm_capabilities svmCapabilities;
83*6467f958SSadaf Ebrahimi     cl_device_atomic_capabilities atomicCapabilities;
84*6467f958SSadaf Ebrahimi     cl_device_device_enqueue_capabilities deviceEnqueueCapabilities;
85*6467f958SSadaf Ebrahimi     cl_name_version* cl_name_version_array;
86*6467f958SSadaf Ebrahimi     cl_name_version cl_name_version_single;
87*6467f958SSadaf Ebrahimi } config_data;
88*6467f958SSadaf Ebrahimi 
89*6467f958SSadaf Ebrahimi struct _version
90*6467f958SSadaf Ebrahimi {
91*6467f958SSadaf Ebrahimi     int major;
92*6467f958SSadaf Ebrahimi     int minor;
93*6467f958SSadaf Ebrahimi };
94*6467f958SSadaf Ebrahimi typedef struct _version version_t;
95*6467f958SSadaf Ebrahimi 
96*6467f958SSadaf Ebrahimi struct _extensions
97*6467f958SSadaf Ebrahimi {
98*6467f958SSadaf Ebrahimi     int has_cl_khr_fp64;
99*6467f958SSadaf Ebrahimi     int has_cl_khr_fp16;
100*6467f958SSadaf Ebrahimi };
101*6467f958SSadaf Ebrahimi typedef struct _extensions extensions_t;
102*6467f958SSadaf Ebrahimi 
103*6467f958SSadaf Ebrahimi // Compare two versions, return -1 (the first is lesser), 0 (equal), 1 (the
104*6467f958SSadaf Ebrahimi // first is greater).
vercmp(version_t a,version_t b)105*6467f958SSadaf Ebrahimi int vercmp(version_t a, version_t b)
106*6467f958SSadaf Ebrahimi {
107*6467f958SSadaf Ebrahimi     if (a.major < b.major || (a.major == b.major && a.minor < b.minor))
108*6467f958SSadaf Ebrahimi     {
109*6467f958SSadaf Ebrahimi         return -1;
110*6467f958SSadaf Ebrahimi     }
111*6467f958SSadaf Ebrahimi     else if (a.major == b.major && a.minor == b.minor)
112*6467f958SSadaf Ebrahimi     {
113*6467f958SSadaf Ebrahimi         return 0;
114*6467f958SSadaf Ebrahimi     }
115*6467f958SSadaf Ebrahimi     else
116*6467f958SSadaf Ebrahimi     {
117*6467f958SSadaf Ebrahimi         return 1;
118*6467f958SSadaf Ebrahimi     }
119*6467f958SSadaf Ebrahimi }
120*6467f958SSadaf Ebrahimi 
121*6467f958SSadaf Ebrahimi typedef struct
122*6467f958SSadaf Ebrahimi {
123*6467f958SSadaf Ebrahimi     version_t version; // Opcode is introduced in this version of OpenCL spec.
124*6467f958SSadaf Ebrahimi     cl_device_info opcode;
125*6467f958SSadaf Ebrahimi     const char* opcode_name;
126*6467f958SSadaf Ebrahimi     int config_type;
127*6467f958SSadaf Ebrahimi     config_data config;
128*6467f958SSadaf Ebrahimi     size_t opcode_ret_size;
129*6467f958SSadaf Ebrahimi } config_info;
130*6467f958SSadaf Ebrahimi 
131*6467f958SSadaf Ebrahimi #define CONFIG_INFO(major, minor, opcode, type)                                \
132*6467f958SSadaf Ebrahimi     {                                                                          \
133*6467f958SSadaf Ebrahimi         { major, minor }, opcode, #opcode, type_##type, { 0 }                  \
134*6467f958SSadaf Ebrahimi     }
135*6467f958SSadaf Ebrahimi 
136*6467f958SSadaf Ebrahimi config_info image_buffer_config_infos[] = {
137*6467f958SSadaf Ebrahimi #ifdef CL_DEVICE_IMAGE_PITCH_ALIGNMENT
138*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 2, CL_DEVICE_IMAGE_PITCH_ALIGNMENT, cl_uint),
139*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 2, CL_DEVICE_IMAGE_BASE_ADDRESS_ALIGNMENT, cl_uint),
140*6467f958SSadaf Ebrahimi #endif
141*6467f958SSadaf Ebrahimi };
142*6467f958SSadaf Ebrahimi 
143*6467f958SSadaf Ebrahimi config_info config_infos[] = {
144*6467f958SSadaf Ebrahimi     // `CL_DEVICE_VERSION' must be the first item in the list! It's version must
145*6467f958SSadaf Ebrahimi     // be 0, 0.
146*6467f958SSadaf Ebrahimi     CONFIG_INFO(0, 0, CL_DEVICE_VERSION, string),
147*6467f958SSadaf Ebrahimi     // `CL_DEVICE_EXTENSIONS' must be the second!
148*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_EXTENSIONS, string),
149*6467f958SSadaf Ebrahimi 
150*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_TYPE, cl_device_type),
151*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_VENDOR_ID, cl_uint),
152*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_MAX_COMPUTE_UNITS, cl_uint),
153*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS, cl_uint),
154*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_MAX_WORK_ITEM_SIZES, size_t_arr),
155*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_MAX_WORK_GROUP_SIZE, size_t),
156*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR, cl_uint),
157*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT, cl_uint),
158*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT, cl_uint),
159*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG, cl_uint),
160*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT, cl_uint),
161*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE, cl_uint),
162*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF, cl_uint),
163*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR, cl_uint),
164*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT, cl_uint),
165*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_NATIVE_VECTOR_WIDTH_INT, cl_uint),
166*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG, cl_uint),
167*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT, cl_uint),
168*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE, cl_uint),
169*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF, cl_uint),
170*6467f958SSadaf Ebrahimi 
171*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_MAX_CLOCK_FREQUENCY, cl_uint),
172*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_ADDRESS_BITS, cl_uint),
173*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_MAX_READ_IMAGE_ARGS, cl_uint),
174*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_MAX_WRITE_IMAGE_ARGS, cl_uint),
175*6467f958SSadaf Ebrahimi     CONFIG_INFO(2, 0, CL_DEVICE_MAX_READ_WRITE_IMAGE_ARGS, cl_uint),
176*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_MAX_MEM_ALLOC_SIZE, cl_ulong),
177*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_IMAGE2D_MAX_WIDTH, size_t),
178*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_IMAGE2D_MAX_HEIGHT, size_t),
179*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_IMAGE3D_MAX_WIDTH, size_t),
180*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_IMAGE3D_MAX_HEIGHT, size_t),
181*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_IMAGE3D_MAX_DEPTH, size_t),
182*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 2, CL_DEVICE_IMAGE_MAX_ARRAY_SIZE, size_t),
183*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 2, CL_DEVICE_IMAGE_MAX_BUFFER_SIZE, size_t),
184*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_IMAGE_SUPPORT, cl_uint),
185*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_MAX_PARAMETER_SIZE, size_t),
186*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_MAX_SAMPLERS, cl_uint),
187*6467f958SSadaf Ebrahimi     CONFIG_INFO(2, 0, CL_DEVICE_IMAGE_PITCH_ALIGNMENT, cl_uint),
188*6467f958SSadaf Ebrahimi     CONFIG_INFO(2, 0, CL_DEVICE_IMAGE_BASE_ADDRESS_ALIGNMENT, cl_uint),
189*6467f958SSadaf Ebrahimi 
190*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_MEM_BASE_ADDR_ALIGN, cl_uint),
191*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_SINGLE_FP_CONFIG, cl_device_fp_config),
192*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_DOUBLE_FP_CONFIG, cl_device_fp_config),
193*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_GLOBAL_MEM_CACHE_TYPE,
194*6467f958SSadaf Ebrahimi                 cl_device_mem_cache_type),
195*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE, cl_uint),
196*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_GLOBAL_MEM_CACHE_SIZE, cl_ulong),
197*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_GLOBAL_MEM_SIZE, cl_ulong),
198*6467f958SSadaf Ebrahimi 
199*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE, cl_ulong),
200*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_MAX_CONSTANT_ARGS, cl_uint),
201*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_LOCAL_MEM_TYPE, cl_local_mem_type),
202*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_LOCAL_MEM_SIZE, cl_ulong),
203*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_ERROR_CORRECTION_SUPPORT, cl_uint),
204*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_HOST_UNIFIED_MEMORY, cl_uint),
205*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_PROFILING_TIMER_RESOLUTION, size_t),
206*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_ENDIAN_LITTLE, cl_uint),
207*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_AVAILABLE, cl_uint),
208*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_COMPILER_AVAILABLE, cl_uint),
209*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 2, CL_DEVICE_LINKER_AVAILABLE, cl_uint),
210*6467f958SSadaf Ebrahimi 
211*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 2, CL_DEVICE_BUILT_IN_KERNELS, string),
212*6467f958SSadaf Ebrahimi 
213*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 2, CL_DEVICE_PRINTF_BUFFER_SIZE, size_t),
214*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 2, CL_DEVICE_PREFERRED_INTEROP_USER_SYNC, cl_uint),
215*6467f958SSadaf Ebrahimi 
216*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 2, CL_DEVICE_PARENT_DEVICE, cl_device_id),
217*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 2, CL_DEVICE_PARTITION_MAX_SUB_DEVICES, cl_uint),
218*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 2, CL_DEVICE_PARTITION_AFFINITY_DOMAIN,
219*6467f958SSadaf Ebrahimi                 cl_device_affinity_domain),
220*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 2, CL_DEVICE_REFERENCE_COUNT, cl_uint),
221*6467f958SSadaf Ebrahimi 
222*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_EXECUTION_CAPABILITIES,
223*6467f958SSadaf Ebrahimi                 cl_device_exec_capabilities),
224*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_QUEUE_ON_HOST_PROPERTIES,
225*6467f958SSadaf Ebrahimi                 cl_command_queue_properties),
226*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_NAME, string),
227*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_VENDOR, string),
228*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DRIVER_VERSION, string),
229*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_PROFILE, string),
230*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_DEVICE_OPENCL_C_VERSION, string),
231*6467f958SSadaf Ebrahimi 
232*6467f958SSadaf Ebrahimi     CONFIG_INFO(2, 0, CL_DEVICE_MAX_PIPE_ARGS, cl_uint),
233*6467f958SSadaf Ebrahimi     CONFIG_INFO(2, 0, CL_DEVICE_PIPE_MAX_ACTIVE_RESERVATIONS, cl_uint),
234*6467f958SSadaf Ebrahimi     CONFIG_INFO(2, 0, CL_DEVICE_PIPE_MAX_PACKET_SIZE, cl_uint),
235*6467f958SSadaf Ebrahimi 
236*6467f958SSadaf Ebrahimi     CONFIG_INFO(2, 0, CL_DEVICE_MAX_GLOBAL_VARIABLE_SIZE, size_t),
237*6467f958SSadaf Ebrahimi     CONFIG_INFO(2, 0, CL_DEVICE_GLOBAL_VARIABLE_PREFERRED_TOTAL_SIZE, size_t),
238*6467f958SSadaf Ebrahimi 
239*6467f958SSadaf Ebrahimi     CONFIG_INFO(2, 0, CL_DEVICE_QUEUE_ON_HOST_PROPERTIES,
240*6467f958SSadaf Ebrahimi                 cl_command_queue_properties),
241*6467f958SSadaf Ebrahimi     CONFIG_INFO(2, 0, CL_DEVICE_QUEUE_ON_DEVICE_PROPERTIES,
242*6467f958SSadaf Ebrahimi                 cl_command_queue_properties),
243*6467f958SSadaf Ebrahimi     CONFIG_INFO(2, 0, CL_DEVICE_QUEUE_ON_DEVICE_PREFERRED_SIZE, cl_uint),
244*6467f958SSadaf Ebrahimi     CONFIG_INFO(2, 0, CL_DEVICE_QUEUE_ON_DEVICE_MAX_SIZE, cl_uint),
245*6467f958SSadaf Ebrahimi     CONFIG_INFO(2, 0, CL_DEVICE_MAX_ON_DEVICE_QUEUES, cl_uint),
246*6467f958SSadaf Ebrahimi     CONFIG_INFO(2, 0, CL_DEVICE_MAX_ON_DEVICE_EVENTS, cl_uint),
247*6467f958SSadaf Ebrahimi 
248*6467f958SSadaf Ebrahimi     CONFIG_INFO(2, 0, CL_DEVICE_PREFERRED_PLATFORM_ATOMIC_ALIGNMENT, cl_uint),
249*6467f958SSadaf Ebrahimi     CONFIG_INFO(2, 0, CL_DEVICE_PREFERRED_GLOBAL_ATOMIC_ALIGNMENT, cl_uint),
250*6467f958SSadaf Ebrahimi     CONFIG_INFO(2, 0, CL_DEVICE_PREFERRED_LOCAL_ATOMIC_ALIGNMENT, cl_uint),
251*6467f958SSadaf Ebrahimi 
252*6467f958SSadaf Ebrahimi     CONFIG_INFO(2, 0, CL_DEVICE_SVM_CAPABILITIES, cl_device_svm_capabilities),
253*6467f958SSadaf Ebrahimi 
254*6467f958SSadaf Ebrahimi     CONFIG_INFO(2, 1, CL_DEVICE_IL_VERSION, string),
255*6467f958SSadaf Ebrahimi     CONFIG_INFO(2, 1, CL_DEVICE_MAX_NUM_SUB_GROUPS, cl_uint),
256*6467f958SSadaf Ebrahimi     CONFIG_INFO(2, 1, CL_DEVICE_SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS,
257*6467f958SSadaf Ebrahimi                 cl_uint),
258*6467f958SSadaf Ebrahimi     CONFIG_INFO(3, 0, CL_DEVICE_ATOMIC_MEMORY_CAPABILITIES,
259*6467f958SSadaf Ebrahimi                 cl_device_atomic_capabilities),
260*6467f958SSadaf Ebrahimi     CONFIG_INFO(3, 0, CL_DEVICE_ATOMIC_FENCE_CAPABILITIES,
261*6467f958SSadaf Ebrahimi                 cl_device_atomic_capabilities),
262*6467f958SSadaf Ebrahimi     CONFIG_INFO(3, 0, CL_DEVICE_NON_UNIFORM_WORK_GROUP_SUPPORT, cl_uint),
263*6467f958SSadaf Ebrahimi     CONFIG_INFO(3, 0, CL_DEVICE_PREFERRED_WORK_GROUP_SIZE_MULTIPLE, size_t),
264*6467f958SSadaf Ebrahimi     CONFIG_INFO(3, 0, CL_DEVICE_WORK_GROUP_COLLECTIVE_FUNCTIONS_SUPPORT,
265*6467f958SSadaf Ebrahimi                 cl_uint),
266*6467f958SSadaf Ebrahimi     CONFIG_INFO(3, 0, CL_DEVICE_GENERIC_ADDRESS_SPACE_SUPPORT, cl_uint),
267*6467f958SSadaf Ebrahimi     CONFIG_INFO(3, 0, CL_DEVICE_OPENCL_C_FEATURES, cl_name_version_array),
268*6467f958SSadaf Ebrahimi     CONFIG_INFO(3, 0, CL_DEVICE_DEVICE_ENQUEUE_CAPABILITIES,
269*6467f958SSadaf Ebrahimi                 cl_device_device_enqueue_capabilities),
270*6467f958SSadaf Ebrahimi     CONFIG_INFO(3, 0, CL_DEVICE_PIPE_SUPPORT, cl_uint),
271*6467f958SSadaf Ebrahimi     CONFIG_INFO(3, 0, CL_DEVICE_NUMERIC_VERSION, cl_name_version),
272*6467f958SSadaf Ebrahimi     CONFIG_INFO(3, 0, CL_DEVICE_EXTENSIONS_WITH_VERSION, cl_name_version_array),
273*6467f958SSadaf Ebrahimi     CONFIG_INFO(3, 0, CL_DEVICE_OPENCL_C_ALL_VERSIONS, cl_name_version_array),
274*6467f958SSadaf Ebrahimi     CONFIG_INFO(3, 0, CL_DEVICE_ILS_WITH_VERSION, cl_name_version_array),
275*6467f958SSadaf Ebrahimi     CONFIG_INFO(3, 0, CL_DEVICE_BUILT_IN_KERNELS_WITH_VERSION,
276*6467f958SSadaf Ebrahimi                 cl_name_version_array),
277*6467f958SSadaf Ebrahimi };
278*6467f958SSadaf Ebrahimi 
279*6467f958SSadaf Ebrahimi #define ENTRY(major, minor, T)                                                 \
280*6467f958SSadaf Ebrahimi     {                                                                          \
281*6467f958SSadaf Ebrahimi         { major, minor }, T, #T                                                \
282*6467f958SSadaf Ebrahimi     }
283*6467f958SSadaf Ebrahimi struct image_type_entry
284*6467f958SSadaf Ebrahimi {
285*6467f958SSadaf Ebrahimi     version_t
286*6467f958SSadaf Ebrahimi         version; // Image type is introduced in this version of OpenCL spec.
287*6467f958SSadaf Ebrahimi     cl_mem_object_type val;
288*6467f958SSadaf Ebrahimi     const char* str;
289*6467f958SSadaf Ebrahimi };
290*6467f958SSadaf Ebrahimi static const struct image_type_entry image_types[] = {
291*6467f958SSadaf Ebrahimi     ENTRY(1, 2, CL_MEM_OBJECT_IMAGE1D),
292*6467f958SSadaf Ebrahimi     ENTRY(1, 2, CL_MEM_OBJECT_IMAGE1D_BUFFER),
293*6467f958SSadaf Ebrahimi     ENTRY(1, 0, CL_MEM_OBJECT_IMAGE2D),
294*6467f958SSadaf Ebrahimi     ENTRY(1, 0, CL_MEM_OBJECT_IMAGE3D),
295*6467f958SSadaf Ebrahimi     ENTRY(1, 2, CL_MEM_OBJECT_IMAGE1D_ARRAY),
296*6467f958SSadaf Ebrahimi     ENTRY(1, 2, CL_MEM_OBJECT_IMAGE2D_ARRAY)
297*6467f958SSadaf Ebrahimi };
298*6467f958SSadaf Ebrahimi 
299*6467f958SSadaf Ebrahimi struct supported_flags_entry
300*6467f958SSadaf Ebrahimi {
301*6467f958SSadaf Ebrahimi     version_t
302*6467f958SSadaf Ebrahimi         version; // Memory flag is introduced in this version of OpenCL spec.
303*6467f958SSadaf Ebrahimi     cl_mem_flags val;
304*6467f958SSadaf Ebrahimi     const char* str;
305*6467f958SSadaf Ebrahimi };
306*6467f958SSadaf Ebrahimi 
307*6467f958SSadaf Ebrahimi static const struct supported_flags_entry supported_flags[] = {
308*6467f958SSadaf Ebrahimi     ENTRY(1, 0, CL_MEM_READ_ONLY), ENTRY(1, 0, CL_MEM_WRITE_ONLY),
309*6467f958SSadaf Ebrahimi     ENTRY(1, 0, CL_MEM_READ_WRITE), ENTRY(2, 0, CL_MEM_KERNEL_READ_AND_WRITE)
310*6467f958SSadaf Ebrahimi };
311*6467f958SSadaf Ebrahimi 
getImageInfo(cl_device_id device,const version_t & version)312*6467f958SSadaf Ebrahimi int getImageInfo(cl_device_id device, const version_t& version)
313*6467f958SSadaf Ebrahimi {
314*6467f958SSadaf Ebrahimi     cl_context ctx;
315*6467f958SSadaf Ebrahimi     cl_int err;
316*6467f958SSadaf Ebrahimi     cl_uint i, num_supported;
317*6467f958SSadaf Ebrahimi     cl_image_format* formats;
318*6467f958SSadaf Ebrahimi     int num_errors;
319*6467f958SSadaf Ebrahimi     int ii, ni = sizeof(image_types) / sizeof(image_types[0]);
320*6467f958SSadaf Ebrahimi     int fi, nf = sizeof(supported_flags) / sizeof(supported_flags[0]);
321*6467f958SSadaf Ebrahimi 
322*6467f958SSadaf Ebrahimi     ctx = clCreateContext(NULL, 1, &device, notify_callback, NULL, &err);
323*6467f958SSadaf Ebrahimi     if (!ctx)
324*6467f958SSadaf Ebrahimi     {
325*6467f958SSadaf Ebrahimi         print_error(err, "Unable to create context from device");
326*6467f958SSadaf Ebrahimi         return 1;
327*6467f958SSadaf Ebrahimi     }
328*6467f958SSadaf Ebrahimi 
329*6467f958SSadaf Ebrahimi     num_errors = 0;
330*6467f958SSadaf Ebrahimi     for (ii = 0; ii < ni; ++ii)
331*6467f958SSadaf Ebrahimi     {
332*6467f958SSadaf Ebrahimi         if (vercmp(version, image_types[ii].version) < 0)
333*6467f958SSadaf Ebrahimi         {
334*6467f958SSadaf Ebrahimi             continue;
335*6467f958SSadaf Ebrahimi         }
336*6467f958SSadaf Ebrahimi 
337*6467f958SSadaf Ebrahimi         log_info("\t%s supported formats:\n", image_types[ii].str);
338*6467f958SSadaf Ebrahimi         for (fi = 0; fi < nf; ++fi)
339*6467f958SSadaf Ebrahimi         {
340*6467f958SSadaf Ebrahimi             if (vercmp(version, supported_flags[fi].version) < 0)
341*6467f958SSadaf Ebrahimi             {
342*6467f958SSadaf Ebrahimi                 continue;
343*6467f958SSadaf Ebrahimi             }
344*6467f958SSadaf Ebrahimi 
345*6467f958SSadaf Ebrahimi             err = clGetSupportedImageFormats(ctx, supported_flags[fi].val,
346*6467f958SSadaf Ebrahimi                                              image_types[ii].val, 5000, NULL,
347*6467f958SSadaf Ebrahimi                                              &num_supported);
348*6467f958SSadaf Ebrahimi             if (err != CL_SUCCESS)
349*6467f958SSadaf Ebrahimi             {
350*6467f958SSadaf Ebrahimi                 print_error(err, "clGetSupportedImageFormats failed");
351*6467f958SSadaf Ebrahimi                 ++num_errors;
352*6467f958SSadaf Ebrahimi                 continue;
353*6467f958SSadaf Ebrahimi             }
354*6467f958SSadaf Ebrahimi 
355*6467f958SSadaf Ebrahimi             log_info("\t\t%s: %u supported formats\n", supported_flags[fi].str,
356*6467f958SSadaf Ebrahimi                      num_supported);
357*6467f958SSadaf Ebrahimi 
358*6467f958SSadaf Ebrahimi             if (num_supported == 0 || dump_supported_formats == 0) continue;
359*6467f958SSadaf Ebrahimi 
360*6467f958SSadaf Ebrahimi             formats = (cl_image_format*)malloc(num_supported
361*6467f958SSadaf Ebrahimi                                                * sizeof(cl_image_format));
362*6467f958SSadaf Ebrahimi             if (formats == NULL)
363*6467f958SSadaf Ebrahimi             {
364*6467f958SSadaf Ebrahimi                 log_error("malloc failed\n");
365*6467f958SSadaf Ebrahimi                 clReleaseContext(ctx);
366*6467f958SSadaf Ebrahimi                 return num_errors + 1;
367*6467f958SSadaf Ebrahimi             }
368*6467f958SSadaf Ebrahimi 
369*6467f958SSadaf Ebrahimi             err = clGetSupportedImageFormats(ctx, supported_flags[fi].val,
370*6467f958SSadaf Ebrahimi                                              image_types[ii].val, num_supported,
371*6467f958SSadaf Ebrahimi                                              formats, NULL);
372*6467f958SSadaf Ebrahimi             if (err != CL_SUCCESS)
373*6467f958SSadaf Ebrahimi             {
374*6467f958SSadaf Ebrahimi                 print_error(err, "clGetSupportedImageFormats failed");
375*6467f958SSadaf Ebrahimi                 ++num_errors;
376*6467f958SSadaf Ebrahimi                 free(formats);
377*6467f958SSadaf Ebrahimi                 continue;
378*6467f958SSadaf Ebrahimi             }
379*6467f958SSadaf Ebrahimi 
380*6467f958SSadaf Ebrahimi             for (i = 0; i < num_supported; ++i)
381*6467f958SSadaf Ebrahimi                 log_info(
382*6467f958SSadaf Ebrahimi                     "\t\t\t%s / %s\n",
383*6467f958SSadaf Ebrahimi                     GetChannelOrderName(formats[i].image_channel_order),
384*6467f958SSadaf Ebrahimi                     GetChannelTypeName(formats[i].image_channel_data_type));
385*6467f958SSadaf Ebrahimi 
386*6467f958SSadaf Ebrahimi             free(formats);
387*6467f958SSadaf Ebrahimi         }
388*6467f958SSadaf Ebrahimi     }
389*6467f958SSadaf Ebrahimi 
390*6467f958SSadaf Ebrahimi     err = clReleaseContext(ctx);
391*6467f958SSadaf Ebrahimi     if (err)
392*6467f958SSadaf Ebrahimi     {
393*6467f958SSadaf Ebrahimi         print_error(err, "Failed to release context\n");
394*6467f958SSadaf Ebrahimi         ++num_errors;
395*6467f958SSadaf Ebrahimi     }
396*6467f958SSadaf Ebrahimi 
397*6467f958SSadaf Ebrahimi     return num_errors;
398*6467f958SSadaf Ebrahimi }
getPlatformConfigInfo(cl_platform_id platform,config_info * info)399*6467f958SSadaf Ebrahimi int getPlatformConfigInfo(cl_platform_id platform, config_info* info)
400*6467f958SSadaf Ebrahimi {
401*6467f958SSadaf Ebrahimi     int err = CL_SUCCESS;
402*6467f958SSadaf Ebrahimi     int size_err = 0;
403*6467f958SSadaf Ebrahimi     size_t config_size_set;
404*6467f958SSadaf Ebrahimi     size_t config_size_ret;
405*6467f958SSadaf Ebrahimi     switch (info->config_type)
406*6467f958SSadaf Ebrahimi     {
407*6467f958SSadaf Ebrahimi         case type_string:
408*6467f958SSadaf Ebrahimi             err = clGetPlatformInfo(platform, info->opcode, 0, NULL,
409*6467f958SSadaf Ebrahimi                                     &config_size_set);
410*6467f958SSadaf Ebrahimi             info->config.string = NULL;
411*6467f958SSadaf Ebrahimi             if (err == CL_SUCCESS && config_size_set > 0)
412*6467f958SSadaf Ebrahimi             {
413*6467f958SSadaf Ebrahimi                 info->config.string = (char*)malloc(config_size_set);
414*6467f958SSadaf Ebrahimi                 err = clGetPlatformInfo(platform, info->opcode, config_size_set,
415*6467f958SSadaf Ebrahimi                                         info->config.string, &config_size_ret);
416*6467f958SSadaf Ebrahimi                 size_err = config_size_set != config_size_ret;
417*6467f958SSadaf Ebrahimi             }
418*6467f958SSadaf Ebrahimi             break;
419*6467f958SSadaf Ebrahimi         case type_cl_name_version_array:
420*6467f958SSadaf Ebrahimi             err = clGetPlatformInfo(platform, info->opcode, 0, NULL,
421*6467f958SSadaf Ebrahimi                                     &config_size_set);
422*6467f958SSadaf Ebrahimi             info->config.cl_name_version_array = NULL;
423*6467f958SSadaf Ebrahimi             if (err == CL_SUCCESS && config_size_set > 0)
424*6467f958SSadaf Ebrahimi             {
425*6467f958SSadaf Ebrahimi                 info->config.cl_name_version_array = (cl_name_version*)malloc(
426*6467f958SSadaf Ebrahimi                     config_size_set * sizeof(cl_name_version));
427*6467f958SSadaf Ebrahimi                 err = clGetPlatformInfo(platform, info->opcode, config_size_set,
428*6467f958SSadaf Ebrahimi                                         info->config.cl_name_version_array,
429*6467f958SSadaf Ebrahimi                                         &config_size_ret);
430*6467f958SSadaf Ebrahimi                 size_err = config_size_set != config_size_ret;
431*6467f958SSadaf Ebrahimi                 info->opcode_ret_size = config_size_ret;
432*6467f958SSadaf Ebrahimi             }
433*6467f958SSadaf Ebrahimi             break;
434*6467f958SSadaf Ebrahimi         case type_cl_name_version:
435*6467f958SSadaf Ebrahimi             err = clGetPlatformInfo(platform, info->opcode, 0, NULL,
436*6467f958SSadaf Ebrahimi                                     &config_size_set);
437*6467f958SSadaf Ebrahimi             if (err == CL_SUCCESS && config_size_set > 0)
438*6467f958SSadaf Ebrahimi             {
439*6467f958SSadaf Ebrahimi                 err = clGetPlatformInfo(platform, info->opcode, config_size_set,
440*6467f958SSadaf Ebrahimi                                         &info->config.cl_name_version_single,
441*6467f958SSadaf Ebrahimi                                         &config_size_ret);
442*6467f958SSadaf Ebrahimi                 size_err = config_size_set != config_size_ret;
443*6467f958SSadaf Ebrahimi             }
444*6467f958SSadaf Ebrahimi             break;
445*6467f958SSadaf Ebrahimi         default:
446*6467f958SSadaf Ebrahimi             log_error("Unknown config type: %d\n", info->config_type);
447*6467f958SSadaf Ebrahimi             break;
448*6467f958SSadaf Ebrahimi     }
449*6467f958SSadaf Ebrahimi     if (err || size_err)
450*6467f958SSadaf Ebrahimi         log_error("\tFailed clGetPlatformInfo for %s.\n", info->opcode_name);
451*6467f958SSadaf Ebrahimi     if (err) print_error(err, "\t\tclGetPlatformInfo failed.");
452*6467f958SSadaf Ebrahimi     if (size_err) log_error("\t\tWrong size return from clGetPlatformInfo.\n");
453*6467f958SSadaf Ebrahimi     return err || size_err;
454*6467f958SSadaf Ebrahimi }
455*6467f958SSadaf Ebrahimi 
getConfigInfo(cl_device_id device,config_info * info)456*6467f958SSadaf Ebrahimi int getConfigInfo(cl_device_id device, config_info* info)
457*6467f958SSadaf Ebrahimi {
458*6467f958SSadaf Ebrahimi     int err = CL_SUCCESS;
459*6467f958SSadaf Ebrahimi     int size_err = 0;
460*6467f958SSadaf Ebrahimi     size_t config_size_set;
461*6467f958SSadaf Ebrahimi     size_t config_size_ret;
462*6467f958SSadaf Ebrahimi     switch (info->config_type)
463*6467f958SSadaf Ebrahimi     {
464*6467f958SSadaf Ebrahimi         case type_cl_device_type:
465*6467f958SSadaf Ebrahimi             err =
466*6467f958SSadaf Ebrahimi                 clGetDeviceInfo(device, info->opcode, sizeof(info->config.type),
467*6467f958SSadaf Ebrahimi                                 &info->config.type, &config_size_ret);
468*6467f958SSadaf Ebrahimi             size_err = config_size_ret != sizeof(info->config.type);
469*6467f958SSadaf Ebrahimi             break;
470*6467f958SSadaf Ebrahimi         case type_cl_device_fp_config:
471*6467f958SSadaf Ebrahimi             err = clGetDeviceInfo(device, info->opcode,
472*6467f958SSadaf Ebrahimi                                   sizeof(info->config.fp_config),
473*6467f958SSadaf Ebrahimi                                   &info->config.fp_config, &config_size_ret);
474*6467f958SSadaf Ebrahimi             size_err = config_size_ret != sizeof(info->config.fp_config);
475*6467f958SSadaf Ebrahimi             break;
476*6467f958SSadaf Ebrahimi         case type_cl_device_mem_cache_type:
477*6467f958SSadaf Ebrahimi             err = clGetDeviceInfo(
478*6467f958SSadaf Ebrahimi                 device, info->opcode, sizeof(info->config.mem_cache_type),
479*6467f958SSadaf Ebrahimi                 &info->config.mem_cache_type, &config_size_ret);
480*6467f958SSadaf Ebrahimi             size_err = config_size_ret != sizeof(info->config.mem_cache_type);
481*6467f958SSadaf Ebrahimi             break;
482*6467f958SSadaf Ebrahimi         case type_cl_local_mem_type:
483*6467f958SSadaf Ebrahimi             err = clGetDeviceInfo(
484*6467f958SSadaf Ebrahimi                 device, info->opcode, sizeof(info->config.local_mem_type),
485*6467f958SSadaf Ebrahimi                 &info->config.local_mem_type, &config_size_ret);
486*6467f958SSadaf Ebrahimi             size_err = config_size_ret != sizeof(info->config.local_mem_type);
487*6467f958SSadaf Ebrahimi             break;
488*6467f958SSadaf Ebrahimi         case type_cl_device_exec_capabilities:
489*6467f958SSadaf Ebrahimi             err = clGetDeviceInfo(
490*6467f958SSadaf Ebrahimi                 device, info->opcode, sizeof(info->config.exec_capabilities),
491*6467f958SSadaf Ebrahimi                 &info->config.exec_capabilities, &config_size_ret);
492*6467f958SSadaf Ebrahimi             size_err =
493*6467f958SSadaf Ebrahimi                 config_size_ret != sizeof(info->config.exec_capabilities);
494*6467f958SSadaf Ebrahimi             break;
495*6467f958SSadaf Ebrahimi         case type_cl_command_queue_properties:
496*6467f958SSadaf Ebrahimi             err = clGetDeviceInfo(
497*6467f958SSadaf Ebrahimi                 device, info->opcode, sizeof(info->config.queue_properties),
498*6467f958SSadaf Ebrahimi                 &info->config.queue_properties, &config_size_ret);
499*6467f958SSadaf Ebrahimi             size_err = config_size_ret != sizeof(info->config.queue_properties);
500*6467f958SSadaf Ebrahimi             break;
501*6467f958SSadaf Ebrahimi         case type_cl_device_id:
502*6467f958SSadaf Ebrahimi             err = clGetDeviceInfo(device, info->opcode,
503*6467f958SSadaf Ebrahimi                                   sizeof(info->config.device_id),
504*6467f958SSadaf Ebrahimi                                   &info->config.device_id, &config_size_ret);
505*6467f958SSadaf Ebrahimi             size_err = config_size_ret != sizeof(info->config.device_id);
506*6467f958SSadaf Ebrahimi             break;
507*6467f958SSadaf Ebrahimi         case type_cl_device_affinity_domain:
508*6467f958SSadaf Ebrahimi             err = clGetDeviceInfo(
509*6467f958SSadaf Ebrahimi                 device, info->opcode, sizeof(info->config.affinity_domain),
510*6467f958SSadaf Ebrahimi                 &info->config.affinity_domain, &config_size_ret);
511*6467f958SSadaf Ebrahimi             size_err = config_size_ret != sizeof(info->config.affinity_domain);
512*6467f958SSadaf Ebrahimi             break;
513*6467f958SSadaf Ebrahimi         case type_cl_uint:
514*6467f958SSadaf Ebrahimi             err =
515*6467f958SSadaf Ebrahimi                 clGetDeviceInfo(device, info->opcode, sizeof(info->config.uint),
516*6467f958SSadaf Ebrahimi                                 &info->config.uint, &config_size_ret);
517*6467f958SSadaf Ebrahimi             size_err = config_size_ret != sizeof(info->config.uint);
518*6467f958SSadaf Ebrahimi             break;
519*6467f958SSadaf Ebrahimi         case type_size_t_arr:
520*6467f958SSadaf Ebrahimi             err = clGetDeviceInfo(device, info->opcode,
521*6467f958SSadaf Ebrahimi                                   sizeof(info->config.sizet_arr),
522*6467f958SSadaf Ebrahimi                                   &info->config.sizet_arr, &config_size_ret);
523*6467f958SSadaf Ebrahimi             size_err = config_size_ret != sizeof(info->config.sizet_arr);
524*6467f958SSadaf Ebrahimi             break;
525*6467f958SSadaf Ebrahimi         case type_size_t:
526*6467f958SSadaf Ebrahimi             err = clGetDeviceInfo(device, info->opcode,
527*6467f958SSadaf Ebrahimi                                   sizeof(info->config.sizet),
528*6467f958SSadaf Ebrahimi                                   &info->config.sizet, &config_size_ret);
529*6467f958SSadaf Ebrahimi             size_err = config_size_ret != sizeof(info->config.sizet);
530*6467f958SSadaf Ebrahimi             break;
531*6467f958SSadaf Ebrahimi         case type_cl_ulong:
532*6467f958SSadaf Ebrahimi             err =
533*6467f958SSadaf Ebrahimi                 clGetDeviceInfo(device, info->opcode, sizeof(info->config.ull),
534*6467f958SSadaf Ebrahimi                                 &info->config.ull, &config_size_ret);
535*6467f958SSadaf Ebrahimi             size_err = config_size_ret != sizeof(info->config.ull);
536*6467f958SSadaf Ebrahimi             break;
537*6467f958SSadaf Ebrahimi         case type_string:
538*6467f958SSadaf Ebrahimi             err = clGetDeviceInfo(device, info->opcode, 0, NULL,
539*6467f958SSadaf Ebrahimi                                   &config_size_set);
540*6467f958SSadaf Ebrahimi             info->config.string = NULL;
541*6467f958SSadaf Ebrahimi             if (err == CL_SUCCESS && config_size_set > 0)
542*6467f958SSadaf Ebrahimi             {
543*6467f958SSadaf Ebrahimi                 info->config.string = (char*)malloc(config_size_set);
544*6467f958SSadaf Ebrahimi                 err = clGetDeviceInfo(device, info->opcode, config_size_set,
545*6467f958SSadaf Ebrahimi                                       info->config.string, &config_size_ret);
546*6467f958SSadaf Ebrahimi                 size_err = config_size_set != config_size_ret;
547*6467f958SSadaf Ebrahimi             }
548*6467f958SSadaf Ebrahimi             break;
549*6467f958SSadaf Ebrahimi         case type_cl_device_svm_capabilities:
550*6467f958SSadaf Ebrahimi             err = clGetDeviceInfo(
551*6467f958SSadaf Ebrahimi                 device, info->opcode, sizeof(info->config.svmCapabilities),
552*6467f958SSadaf Ebrahimi                 &info->config.svmCapabilities, &config_size_ret);
553*6467f958SSadaf Ebrahimi             break;
554*6467f958SSadaf Ebrahimi         case type_cl_device_device_enqueue_capabilities:
555*6467f958SSadaf Ebrahimi             err = clGetDeviceInfo(
556*6467f958SSadaf Ebrahimi                 device, info->opcode,
557*6467f958SSadaf Ebrahimi                 sizeof(info->config.deviceEnqueueCapabilities),
558*6467f958SSadaf Ebrahimi                 &info->config.deviceEnqueueCapabilities, &config_size_ret);
559*6467f958SSadaf Ebrahimi             break;
560*6467f958SSadaf Ebrahimi         case type_cl_device_atomic_capabilities:
561*6467f958SSadaf Ebrahimi             err = clGetDeviceInfo(
562*6467f958SSadaf Ebrahimi                 device, info->opcode, sizeof(info->config.atomicCapabilities),
563*6467f958SSadaf Ebrahimi                 &info->config.atomicCapabilities, &config_size_ret);
564*6467f958SSadaf Ebrahimi             break;
565*6467f958SSadaf Ebrahimi         case type_cl_name_version_array:
566*6467f958SSadaf Ebrahimi             err = clGetDeviceInfo(device, info->opcode, 0, NULL,
567*6467f958SSadaf Ebrahimi                                   &config_size_set);
568*6467f958SSadaf Ebrahimi             info->config.cl_name_version_array = NULL;
569*6467f958SSadaf Ebrahimi             if (err == CL_SUCCESS && config_size_set > 0)
570*6467f958SSadaf Ebrahimi             {
571*6467f958SSadaf Ebrahimi                 info->config.cl_name_version_array = (cl_name_version*)malloc(
572*6467f958SSadaf Ebrahimi                     config_size_set * sizeof(cl_name_version));
573*6467f958SSadaf Ebrahimi                 err = clGetDeviceInfo(device, info->opcode, config_size_set,
574*6467f958SSadaf Ebrahimi                                       info->config.cl_name_version_array,
575*6467f958SSadaf Ebrahimi                                       &config_size_ret);
576*6467f958SSadaf Ebrahimi                 size_err = config_size_set != config_size_ret;
577*6467f958SSadaf Ebrahimi                 info->opcode_ret_size = config_size_ret;
578*6467f958SSadaf Ebrahimi             }
579*6467f958SSadaf Ebrahimi             break;
580*6467f958SSadaf Ebrahimi         case type_cl_name_version:
581*6467f958SSadaf Ebrahimi             err = clGetDeviceInfo(device, info->opcode, 0, NULL,
582*6467f958SSadaf Ebrahimi                                   &config_size_set);
583*6467f958SSadaf Ebrahimi             if (err == CL_SUCCESS && config_size_set > 0)
584*6467f958SSadaf Ebrahimi             {
585*6467f958SSadaf Ebrahimi                 err = clGetDeviceInfo(device, info->opcode, config_size_set,
586*6467f958SSadaf Ebrahimi                                       &info->config.cl_name_version_single,
587*6467f958SSadaf Ebrahimi                                       &config_size_ret);
588*6467f958SSadaf Ebrahimi                 size_err = config_size_set != config_size_ret;
589*6467f958SSadaf Ebrahimi             }
590*6467f958SSadaf Ebrahimi             break;
591*6467f958SSadaf Ebrahimi         default:
592*6467f958SSadaf Ebrahimi             log_error("Unknown config type: %d\n", info->config_type);
593*6467f958SSadaf Ebrahimi             break;
594*6467f958SSadaf Ebrahimi     }
595*6467f958SSadaf Ebrahimi     if (err || size_err)
596*6467f958SSadaf Ebrahimi         log_error("\tFailed clGetDeviceInfo for %s.\n", info->opcode_name);
597*6467f958SSadaf Ebrahimi     if (err) print_error(err, "\t\tclGetDeviceInfo failed.");
598*6467f958SSadaf Ebrahimi     if (size_err) log_error("\t\tWrong size return from clGetDeviceInfo.\n");
599*6467f958SSadaf Ebrahimi     return err || size_err;
600*6467f958SSadaf Ebrahimi }
601*6467f958SSadaf Ebrahimi 
dumpConfigInfo(config_info * info)602*6467f958SSadaf Ebrahimi void dumpConfigInfo(config_info* info)
603*6467f958SSadaf Ebrahimi {
604*6467f958SSadaf Ebrahimi     // We should not error if we find an unknown configuration since vendors
605*6467f958SSadaf Ebrahimi     // may specify their own options beyond the list in the specification.
606*6467f958SSadaf Ebrahimi     switch (info->config_type)
607*6467f958SSadaf Ebrahimi     {
608*6467f958SSadaf Ebrahimi         case type_cl_device_type:
609*6467f958SSadaf Ebrahimi             log_info("\t%s == %s|%s|%s|%s\n", info->opcode_name,
610*6467f958SSadaf Ebrahimi                      (info->config.fp_config & CL_DEVICE_TYPE_CPU)
611*6467f958SSadaf Ebrahimi                          ? "CL_DEVICE_TYPE_CPU"
612*6467f958SSadaf Ebrahimi                          : "",
613*6467f958SSadaf Ebrahimi                      (info->config.fp_config & CL_DEVICE_TYPE_GPU)
614*6467f958SSadaf Ebrahimi                          ? "CL_DEVICE_TYPE_GPU"
615*6467f958SSadaf Ebrahimi                          : "",
616*6467f958SSadaf Ebrahimi                      (info->config.fp_config & CL_DEVICE_TYPE_ACCELERATOR)
617*6467f958SSadaf Ebrahimi                          ? "CL_DEVICE_TYPE_ACCELERATOR"
618*6467f958SSadaf Ebrahimi                          : "",
619*6467f958SSadaf Ebrahimi                      (info->config.fp_config & CL_DEVICE_TYPE_DEFAULT)
620*6467f958SSadaf Ebrahimi                          ? "CL_DEVICE_TYPE_DEFAULT"
621*6467f958SSadaf Ebrahimi                          : "");
622*6467f958SSadaf Ebrahimi             {
623*6467f958SSadaf Ebrahimi                 cl_device_type all_device_types = CL_DEVICE_TYPE_CPU
624*6467f958SSadaf Ebrahimi                     | CL_DEVICE_TYPE_GPU | CL_DEVICE_TYPE_ACCELERATOR
625*6467f958SSadaf Ebrahimi                     | CL_DEVICE_TYPE_DEFAULT;
626*6467f958SSadaf Ebrahimi                 if (info->config.fp_config & ~all_device_types)
627*6467f958SSadaf Ebrahimi                 {
628*6467f958SSadaf Ebrahimi                     log_info("WARNING: %s unknown bits found 0x%08" PRIX64,
629*6467f958SSadaf Ebrahimi                              info->opcode_name,
630*6467f958SSadaf Ebrahimi                              (info->config.fp_config & ~all_device_types));
631*6467f958SSadaf Ebrahimi                 }
632*6467f958SSadaf Ebrahimi             }
633*6467f958SSadaf Ebrahimi             break;
634*6467f958SSadaf Ebrahimi         case type_cl_device_fp_config:
635*6467f958SSadaf Ebrahimi             log_info(
636*6467f958SSadaf Ebrahimi                 "\t%s == %s|%s|%s|%s|%s|%s|%s\n", info->opcode_name,
637*6467f958SSadaf Ebrahimi                 (info->config.fp_config & CL_FP_DENORM) ? "CL_FP_DENORM" : "",
638*6467f958SSadaf Ebrahimi                 (info->config.fp_config & CL_FP_INF_NAN) ? "CL_FP_INF_NAN" : "",
639*6467f958SSadaf Ebrahimi                 (info->config.fp_config & CL_FP_ROUND_TO_NEAREST)
640*6467f958SSadaf Ebrahimi                     ? "CL_FP_ROUND_TO_NEAREST"
641*6467f958SSadaf Ebrahimi                     : "",
642*6467f958SSadaf Ebrahimi                 (info->config.fp_config & CL_FP_ROUND_TO_ZERO)
643*6467f958SSadaf Ebrahimi                     ? "CL_FP_ROUND_TO_ZERO"
644*6467f958SSadaf Ebrahimi                     : "",
645*6467f958SSadaf Ebrahimi                 (info->config.fp_config & CL_FP_ROUND_TO_INF)
646*6467f958SSadaf Ebrahimi                     ? "CL_FP_ROUND_TO_INF"
647*6467f958SSadaf Ebrahimi                     : "",
648*6467f958SSadaf Ebrahimi                 (info->config.fp_config & CL_FP_FMA) ? "CL_FP_FMA" : "",
649*6467f958SSadaf Ebrahimi                 (info->config.fp_config & CL_FP_CORRECTLY_ROUNDED_DIVIDE_SQRT)
650*6467f958SSadaf Ebrahimi                     ? "CL_FP_CORRECTLY_ROUNDED_DIVIDE_SQRT"
651*6467f958SSadaf Ebrahimi                     : "");
652*6467f958SSadaf Ebrahimi             {
653*6467f958SSadaf Ebrahimi                 cl_device_fp_config all_fp_config = CL_FP_DENORM | CL_FP_INF_NAN
654*6467f958SSadaf Ebrahimi                     | CL_FP_ROUND_TO_NEAREST | CL_FP_ROUND_TO_ZERO
655*6467f958SSadaf Ebrahimi                     | CL_FP_ROUND_TO_INF | CL_FP_FMA
656*6467f958SSadaf Ebrahimi                     | CL_FP_CORRECTLY_ROUNDED_DIVIDE_SQRT;
657*6467f958SSadaf Ebrahimi                 if (info->config.fp_config & ~all_fp_config)
658*6467f958SSadaf Ebrahimi                     log_info("WARNING: %s unknown bits found 0x%08" PRIX64,
659*6467f958SSadaf Ebrahimi                              info->opcode_name,
660*6467f958SSadaf Ebrahimi                              (info->config.fp_config & ~all_fp_config));
661*6467f958SSadaf Ebrahimi             }
662*6467f958SSadaf Ebrahimi             break;
663*6467f958SSadaf Ebrahimi         case type_cl_device_mem_cache_type:
664*6467f958SSadaf Ebrahimi             switch (info->config.mem_cache_type)
665*6467f958SSadaf Ebrahimi             {
666*6467f958SSadaf Ebrahimi                 case CL_NONE:
667*6467f958SSadaf Ebrahimi                     log_info("\t%s == CL_NONE\n", info->opcode_name);
668*6467f958SSadaf Ebrahimi                     break;
669*6467f958SSadaf Ebrahimi                 case CL_READ_ONLY_CACHE:
670*6467f958SSadaf Ebrahimi                     log_info("\t%s == CL_READ_ONLY_CACHE\n", info->opcode_name);
671*6467f958SSadaf Ebrahimi                     break;
672*6467f958SSadaf Ebrahimi                 case CL_READ_WRITE_CACHE:
673*6467f958SSadaf Ebrahimi                     log_info("\t%s == CL_READ_WRITE_CACHE\n",
674*6467f958SSadaf Ebrahimi                              info->opcode_name);
675*6467f958SSadaf Ebrahimi                     break;
676*6467f958SSadaf Ebrahimi                 default:
677*6467f958SSadaf Ebrahimi                     log_error("ERROR: %s out of range, %d\n", info->opcode_name,
678*6467f958SSadaf Ebrahimi                               info->config.mem_cache_type);
679*6467f958SSadaf Ebrahimi                     break;
680*6467f958SSadaf Ebrahimi             }
681*6467f958SSadaf Ebrahimi             break;
682*6467f958SSadaf Ebrahimi         case type_cl_local_mem_type:
683*6467f958SSadaf Ebrahimi             switch (info->config.local_mem_type)
684*6467f958SSadaf Ebrahimi             {
685*6467f958SSadaf Ebrahimi                 case CL_NONE:
686*6467f958SSadaf Ebrahimi                     log_info("\t%s == CL_NONE\n", info->opcode_name);
687*6467f958SSadaf Ebrahimi                     break;
688*6467f958SSadaf Ebrahimi                 case CL_LOCAL:
689*6467f958SSadaf Ebrahimi                     log_info("\t%s == CL_LOCAL\n", info->opcode_name);
690*6467f958SSadaf Ebrahimi                     break;
691*6467f958SSadaf Ebrahimi                 case CL_GLOBAL:
692*6467f958SSadaf Ebrahimi                     log_info("\t%s == CL_GLOBAL\n", info->opcode_name);
693*6467f958SSadaf Ebrahimi                     break;
694*6467f958SSadaf Ebrahimi                 default:
695*6467f958SSadaf Ebrahimi                     log_info("WARNING: %s out of range, %d\n",
696*6467f958SSadaf Ebrahimi                              info->opcode_name, info->config.local_mem_type);
697*6467f958SSadaf Ebrahimi                     break;
698*6467f958SSadaf Ebrahimi             }
699*6467f958SSadaf Ebrahimi             break;
700*6467f958SSadaf Ebrahimi         case type_cl_device_exec_capabilities:
701*6467f958SSadaf Ebrahimi             log_info("\t%s == %s|%s\n", info->opcode_name,
702*6467f958SSadaf Ebrahimi                      (info->config.exec_capabilities & CL_EXEC_KERNEL)
703*6467f958SSadaf Ebrahimi                          ? "CL_EXEC_KERNEL"
704*6467f958SSadaf Ebrahimi                          : "",
705*6467f958SSadaf Ebrahimi                      (info->config.exec_capabilities & CL_EXEC_NATIVE_KERNEL)
706*6467f958SSadaf Ebrahimi                          ? "CL_EXEC_NATIVE_KERNEL"
707*6467f958SSadaf Ebrahimi                          : "");
708*6467f958SSadaf Ebrahimi             {
709*6467f958SSadaf Ebrahimi                 cl_device_exec_capabilities all_exec_cap =
710*6467f958SSadaf Ebrahimi                     CL_EXEC_KERNEL | CL_EXEC_NATIVE_KERNEL;
711*6467f958SSadaf Ebrahimi                 if (info->config.exec_capabilities & ~all_exec_cap)
712*6467f958SSadaf Ebrahimi                     log_info("WARNING: %s unknown bits found 0x%08" PRIX64,
713*6467f958SSadaf Ebrahimi                              info->opcode_name,
714*6467f958SSadaf Ebrahimi                              (info->config.exec_capabilities & ~all_exec_cap));
715*6467f958SSadaf Ebrahimi             }
716*6467f958SSadaf Ebrahimi             break;
717*6467f958SSadaf Ebrahimi         case type_cl_command_queue_properties:
718*6467f958SSadaf Ebrahimi             log_info("\t%s == %s|%s\n", info->opcode_name,
719*6467f958SSadaf Ebrahimi                      (info->config.queue_properties
720*6467f958SSadaf Ebrahimi                       & CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE)
721*6467f958SSadaf Ebrahimi                          ? "CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE"
722*6467f958SSadaf Ebrahimi                          : "",
723*6467f958SSadaf Ebrahimi                      (info->config.queue_properties & CL_QUEUE_PROFILING_ENABLE)
724*6467f958SSadaf Ebrahimi                          ? "CL_QUEUE_PROFILING_ENABLE"
725*6467f958SSadaf Ebrahimi                          : "");
726*6467f958SSadaf Ebrahimi             {
727*6467f958SSadaf Ebrahimi                 cl_command_queue_properties all_queue_properties =
728*6467f958SSadaf Ebrahimi                     CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE
729*6467f958SSadaf Ebrahimi                     | CL_QUEUE_PROFILING_ENABLE;
730*6467f958SSadaf Ebrahimi                 if (info->config.queue_properties & ~all_queue_properties)
731*6467f958SSadaf Ebrahimi                     log_info("WARNING: %s unknown bits found 0x%08" PRIX64,
732*6467f958SSadaf Ebrahimi                              info->opcode_name,
733*6467f958SSadaf Ebrahimi                              (info->config.exec_capabilities
734*6467f958SSadaf Ebrahimi                               & ~all_queue_properties));
735*6467f958SSadaf Ebrahimi             }
736*6467f958SSadaf Ebrahimi             break;
737*6467f958SSadaf Ebrahimi         case type_cl_device_id:
738*6467f958SSadaf Ebrahimi             log_info("\t%s == %ld\n", info->opcode_name,
739*6467f958SSadaf Ebrahimi                      (intptr_t)info->config.device_id);
740*6467f958SSadaf Ebrahimi             break;
741*6467f958SSadaf Ebrahimi         case type_cl_device_affinity_domain:
742*6467f958SSadaf Ebrahimi             log_info(
743*6467f958SSadaf Ebrahimi                 "\t%s == %s|%s|%s|%s|%s|%s\n", info->opcode_name,
744*6467f958SSadaf Ebrahimi                 (info->config.affinity_domain & CL_DEVICE_AFFINITY_DOMAIN_NUMA)
745*6467f958SSadaf Ebrahimi                     ? "CL_DEVICE_AFFINITY_DOMAIN_NUMA"
746*6467f958SSadaf Ebrahimi                     : "",
747*6467f958SSadaf Ebrahimi                 (info->config.affinity_domain
748*6467f958SSadaf Ebrahimi                  & CL_DEVICE_AFFINITY_DOMAIN_L4_CACHE)
749*6467f958SSadaf Ebrahimi                     ? "CL_DEVICE_AFFINITY_DOMAIN_L4_CACHE"
750*6467f958SSadaf Ebrahimi                     : "",
751*6467f958SSadaf Ebrahimi                 (info->config.affinity_domain
752*6467f958SSadaf Ebrahimi                  & CL_DEVICE_AFFINITY_DOMAIN_L3_CACHE)
753*6467f958SSadaf Ebrahimi                     ? "CL_DEVICE_AFFINITY_DOMAIN_L3_CACHE"
754*6467f958SSadaf Ebrahimi                     : "",
755*6467f958SSadaf Ebrahimi                 (info->config.affinity_domain
756*6467f958SSadaf Ebrahimi                  & CL_DEVICE_AFFINITY_DOMAIN_L2_CACHE)
757*6467f958SSadaf Ebrahimi                     ? "CL_DEVICE_AFFINITY_DOMAIN_L2_CACHE"
758*6467f958SSadaf Ebrahimi                     : "",
759*6467f958SSadaf Ebrahimi                 (info->config.affinity_domain
760*6467f958SSadaf Ebrahimi                  & CL_DEVICE_AFFINITY_DOMAIN_L1_CACHE)
761*6467f958SSadaf Ebrahimi                     ? "CL_DEVICE_AFFINITY_DOMAIN_L1_CACHE"
762*6467f958SSadaf Ebrahimi                     : "",
763*6467f958SSadaf Ebrahimi                 (info->config.affinity_domain
764*6467f958SSadaf Ebrahimi                  & CL_DEVICE_AFFINITY_DOMAIN_NEXT_PARTITIONABLE)
765*6467f958SSadaf Ebrahimi                     ? "CL_DEVICE_AFFINITY_DOMAIN_NEXT_PARTITIONABLE"
766*6467f958SSadaf Ebrahimi                     : "");
767*6467f958SSadaf Ebrahimi             {
768*6467f958SSadaf Ebrahimi                 cl_device_affinity_domain all_affinity_domain =
769*6467f958SSadaf Ebrahimi                     CL_DEVICE_AFFINITY_DOMAIN_NUMA
770*6467f958SSadaf Ebrahimi                     | CL_DEVICE_AFFINITY_DOMAIN_L4_CACHE
771*6467f958SSadaf Ebrahimi                     | CL_DEVICE_AFFINITY_DOMAIN_L3_CACHE
772*6467f958SSadaf Ebrahimi                     | CL_DEVICE_AFFINITY_DOMAIN_L2_CACHE
773*6467f958SSadaf Ebrahimi                     | CL_DEVICE_AFFINITY_DOMAIN_L1_CACHE
774*6467f958SSadaf Ebrahimi                     | CL_DEVICE_AFFINITY_DOMAIN_NEXT_PARTITIONABLE;
775*6467f958SSadaf Ebrahimi                 if (info->config.affinity_domain & ~all_affinity_domain)
776*6467f958SSadaf Ebrahimi                     log_error(
777*6467f958SSadaf Ebrahimi                         "ERROR: %s unknown bits found 0x%08" PRIX64,
778*6467f958SSadaf Ebrahimi                         info->opcode_name,
779*6467f958SSadaf Ebrahimi                         (info->config.affinity_domain & ~all_affinity_domain));
780*6467f958SSadaf Ebrahimi             }
781*6467f958SSadaf Ebrahimi             break;
782*6467f958SSadaf Ebrahimi         case type_cl_uint:
783*6467f958SSadaf Ebrahimi             log_info("\t%s == %u\n", info->opcode_name, info->config.uint);
784*6467f958SSadaf Ebrahimi             break;
785*6467f958SSadaf Ebrahimi         case type_size_t_arr:
786*6467f958SSadaf Ebrahimi             log_info("\t%s == %zu %zu %zu\n", info->opcode_name,
787*6467f958SSadaf Ebrahimi                      info->config.sizet_arr[0], info->config.sizet_arr[1],
788*6467f958SSadaf Ebrahimi                      info->config.sizet_arr[2]);
789*6467f958SSadaf Ebrahimi             break;
790*6467f958SSadaf Ebrahimi         case type_size_t:
791*6467f958SSadaf Ebrahimi             log_info("\t%s == %zu\n", info->opcode_name, info->config.sizet);
792*6467f958SSadaf Ebrahimi             break;
793*6467f958SSadaf Ebrahimi         case type_cl_ulong:
794*6467f958SSadaf Ebrahimi             log_info("\t%s == %" PRIu64 "\n", info->opcode_name,
795*6467f958SSadaf Ebrahimi                      info->config.ull);
796*6467f958SSadaf Ebrahimi             break;
797*6467f958SSadaf Ebrahimi         case type_string:
798*6467f958SSadaf Ebrahimi             log_info("\t%s == \"%s\"\n", info->opcode_name,
799*6467f958SSadaf Ebrahimi                      info->config.string ? info->config.string : "");
800*6467f958SSadaf Ebrahimi             break;
801*6467f958SSadaf Ebrahimi         case type_cl_device_svm_capabilities:
802*6467f958SSadaf Ebrahimi             log_info(
803*6467f958SSadaf Ebrahimi                 "\t%s == %s|%s|%s|%s\n", info->opcode_name,
804*6467f958SSadaf Ebrahimi                 (info->config.svmCapabilities
805*6467f958SSadaf Ebrahimi                  & CL_DEVICE_SVM_COARSE_GRAIN_BUFFER)
806*6467f958SSadaf Ebrahimi                     ? "CL_DEVICE_SVM_COARSE_GRAIN_BUFFER"
807*6467f958SSadaf Ebrahimi                     : "",
808*6467f958SSadaf Ebrahimi                 (info->config.svmCapabilities & CL_DEVICE_SVM_FINE_GRAIN_BUFFER)
809*6467f958SSadaf Ebrahimi                     ? "CL_DEVICE_SVM_FINE_GRAIN_BUFFER"
810*6467f958SSadaf Ebrahimi                     : "",
811*6467f958SSadaf Ebrahimi                 (info->config.svmCapabilities & CL_DEVICE_SVM_FINE_GRAIN_SYSTEM)
812*6467f958SSadaf Ebrahimi                     ? "CL_DEVICE_SVM_FINE_GRAIN_SYSTEM"
813*6467f958SSadaf Ebrahimi                     : "",
814*6467f958SSadaf Ebrahimi                 (info->config.svmCapabilities & CL_DEVICE_SVM_ATOMICS)
815*6467f958SSadaf Ebrahimi                     ? "CL_DEVICE_SVM_ATOMICS"
816*6467f958SSadaf Ebrahimi                     : "");
817*6467f958SSadaf Ebrahimi             {
818*6467f958SSadaf Ebrahimi                 cl_device_svm_capabilities all_svm_capabilities =
819*6467f958SSadaf Ebrahimi                     CL_DEVICE_SVM_COARSE_GRAIN_BUFFER
820*6467f958SSadaf Ebrahimi                     | CL_DEVICE_SVM_FINE_GRAIN_BUFFER
821*6467f958SSadaf Ebrahimi                     | CL_DEVICE_SVM_FINE_GRAIN_SYSTEM | CL_DEVICE_SVM_ATOMICS;
822*6467f958SSadaf Ebrahimi                 if (info->config.svmCapabilities & ~all_svm_capabilities)
823*6467f958SSadaf Ebrahimi                     log_info(
824*6467f958SSadaf Ebrahimi                         "WARNING: %s unknown bits found 0x%08" PRIX64,
825*6467f958SSadaf Ebrahimi                         info->opcode_name,
826*6467f958SSadaf Ebrahimi                         (info->config.svmCapabilities & ~all_svm_capabilities));
827*6467f958SSadaf Ebrahimi             }
828*6467f958SSadaf Ebrahimi             break;
829*6467f958SSadaf Ebrahimi         case type_cl_device_device_enqueue_capabilities:
830*6467f958SSadaf Ebrahimi             log_info("\t%s == %s|%s\n", info->opcode_name,
831*6467f958SSadaf Ebrahimi                      (info->config.deviceEnqueueCapabilities
832*6467f958SSadaf Ebrahimi                       & CL_DEVICE_QUEUE_SUPPORTED)
833*6467f958SSadaf Ebrahimi                          ? "CL_DEVICE_QUEUE_SUPPORTED"
834*6467f958SSadaf Ebrahimi                          : "",
835*6467f958SSadaf Ebrahimi                      (info->config.deviceEnqueueCapabilities
836*6467f958SSadaf Ebrahimi                       & CL_DEVICE_QUEUE_REPLACEABLE_DEFAULT)
837*6467f958SSadaf Ebrahimi                          ? "CL_DEVICE_QUEUE_REPLACEABLE_DEFAULT"
838*6467f958SSadaf Ebrahimi                          : "");
839*6467f958SSadaf Ebrahimi             {
840*6467f958SSadaf Ebrahimi                 cl_device_device_enqueue_capabilities
841*6467f958SSadaf Ebrahimi                     all_device_enqueue_capabilities = CL_DEVICE_QUEUE_SUPPORTED
842*6467f958SSadaf Ebrahimi                     | CL_DEVICE_QUEUE_REPLACEABLE_DEFAULT;
843*6467f958SSadaf Ebrahimi                 if (info->config.deviceEnqueueCapabilities
844*6467f958SSadaf Ebrahimi                     & ~all_device_enqueue_capabilities)
845*6467f958SSadaf Ebrahimi                     log_info("WARNING: %s unknown bits found 0x%08" PRIX64,
846*6467f958SSadaf Ebrahimi                              info->opcode_name,
847*6467f958SSadaf Ebrahimi                              (info->config.deviceEnqueueCapabilities
848*6467f958SSadaf Ebrahimi                               & ~all_device_enqueue_capabilities));
849*6467f958SSadaf Ebrahimi             }
850*6467f958SSadaf Ebrahimi             break;
851*6467f958SSadaf Ebrahimi         case type_cl_device_atomic_capabilities:
852*6467f958SSadaf Ebrahimi             log_info("\t%s == %s|%s|%s|%s|%s|%s|%s\n", info->opcode_name,
853*6467f958SSadaf Ebrahimi                      (info->config.atomicCapabilities
854*6467f958SSadaf Ebrahimi                       & CL_DEVICE_ATOMIC_ORDER_RELAXED)
855*6467f958SSadaf Ebrahimi                          ? "CL_DEVICE_ATOMIC_ORDER_RELAXED"
856*6467f958SSadaf Ebrahimi                          : "",
857*6467f958SSadaf Ebrahimi                      (info->config.atomicCapabilities
858*6467f958SSadaf Ebrahimi                       & CL_DEVICE_ATOMIC_ORDER_ACQ_REL)
859*6467f958SSadaf Ebrahimi                          ? "CL_DEVICE_ATOMIC_ORDER_ACQ_REL"
860*6467f958SSadaf Ebrahimi                          : "",
861*6467f958SSadaf Ebrahimi                      (info->config.atomicCapabilities
862*6467f958SSadaf Ebrahimi                       & CL_DEVICE_ATOMIC_ORDER_SEQ_CST)
863*6467f958SSadaf Ebrahimi                          ? "CL_DEVICE_ATOMIC_ORDER_SEQ_CST"
864*6467f958SSadaf Ebrahimi                          : "",
865*6467f958SSadaf Ebrahimi                      (info->config.atomicCapabilities
866*6467f958SSadaf Ebrahimi                       & CL_DEVICE_ATOMIC_SCOPE_WORK_ITEM)
867*6467f958SSadaf Ebrahimi                          ? "CL_DEVICE_ATOMIC_SCOPE_WORK_ITEM"
868*6467f958SSadaf Ebrahimi                          : "",
869*6467f958SSadaf Ebrahimi                      (info->config.atomicCapabilities
870*6467f958SSadaf Ebrahimi                       & CL_DEVICE_ATOMIC_SCOPE_WORK_GROUP)
871*6467f958SSadaf Ebrahimi                          ? "CL_DEVICE_ATOMIC_SCOPE_WORK_GROUP"
872*6467f958SSadaf Ebrahimi                          : "",
873*6467f958SSadaf Ebrahimi                      (info->config.atomicCapabilities
874*6467f958SSadaf Ebrahimi                       & CL_DEVICE_ATOMIC_SCOPE_DEVICE)
875*6467f958SSadaf Ebrahimi                          ? "CL_DEVICE_ATOMIC_SCOPE_DEVICE"
876*6467f958SSadaf Ebrahimi                          : "",
877*6467f958SSadaf Ebrahimi                      (info->config.atomicCapabilities
878*6467f958SSadaf Ebrahimi                       & CL_DEVICE_ATOMIC_SCOPE_ALL_DEVICES)
879*6467f958SSadaf Ebrahimi                          ? "CL_DEVICE_ATOMIC_SCOPE_ALL_DEVICES"
880*6467f958SSadaf Ebrahimi                          : "");
881*6467f958SSadaf Ebrahimi             {
882*6467f958SSadaf Ebrahimi                 cl_device_atomic_capabilities all_atomic_capabilities =
883*6467f958SSadaf Ebrahimi                     CL_DEVICE_ATOMIC_ORDER_RELAXED
884*6467f958SSadaf Ebrahimi                     | CL_DEVICE_ATOMIC_ORDER_ACQ_REL
885*6467f958SSadaf Ebrahimi                     | CL_DEVICE_ATOMIC_ORDER_SEQ_CST
886*6467f958SSadaf Ebrahimi                     | CL_DEVICE_ATOMIC_SCOPE_WORK_ITEM
887*6467f958SSadaf Ebrahimi                     | CL_DEVICE_ATOMIC_SCOPE_WORK_GROUP
888*6467f958SSadaf Ebrahimi                     | CL_DEVICE_ATOMIC_SCOPE_DEVICE
889*6467f958SSadaf Ebrahimi                     | CL_DEVICE_ATOMIC_SCOPE_ALL_DEVICES;
890*6467f958SSadaf Ebrahimi                 if (info->config.atomicCapabilities & ~all_atomic_capabilities)
891*6467f958SSadaf Ebrahimi                     log_info("WARNING: %s unknown bits found 0x%08" PRIX64,
892*6467f958SSadaf Ebrahimi                              info->opcode_name,
893*6467f958SSadaf Ebrahimi                              (info->config.atomicCapabilities
894*6467f958SSadaf Ebrahimi                               & ~all_atomic_capabilities));
895*6467f958SSadaf Ebrahimi             }
896*6467f958SSadaf Ebrahimi             break;
897*6467f958SSadaf Ebrahimi         case type_cl_name_version_array: {
898*6467f958SSadaf Ebrahimi             int number_of_version_items = info->opcode_ret_size
899*6467f958SSadaf Ebrahimi                 / sizeof(*info->config.cl_name_version_array);
900*6467f958SSadaf Ebrahimi             log_info("\t%s supported name and version:\n", info->opcode_name);
901*6467f958SSadaf Ebrahimi             if (number_of_version_items == 0)
902*6467f958SSadaf Ebrahimi             {
903*6467f958SSadaf Ebrahimi                 log_info("\t\t\"\"\n");
904*6467f958SSadaf Ebrahimi             }
905*6467f958SSadaf Ebrahimi             else
906*6467f958SSadaf Ebrahimi             {
907*6467f958SSadaf Ebrahimi                 for (int f = 0; f < number_of_version_items; f++)
908*6467f958SSadaf Ebrahimi                 {
909*6467f958SSadaf Ebrahimi                     cl_name_version new_version_item =
910*6467f958SSadaf Ebrahimi                         info->config.cl_name_version_array[f];
911*6467f958SSadaf Ebrahimi                     log_info("\t\t\"%s\" %d.%d.%d\n", new_version_item.name,
912*6467f958SSadaf Ebrahimi                              CL_VERSION_MAJOR_KHR(new_version_item.version),
913*6467f958SSadaf Ebrahimi                              CL_VERSION_MINOR_KHR(new_version_item.version),
914*6467f958SSadaf Ebrahimi                              CL_VERSION_PATCH_KHR(new_version_item.version));
915*6467f958SSadaf Ebrahimi                 }
916*6467f958SSadaf Ebrahimi             }
917*6467f958SSadaf Ebrahimi             break;
918*6467f958SSadaf Ebrahimi         }
919*6467f958SSadaf Ebrahimi         case type_cl_name_version:
920*6467f958SSadaf Ebrahimi             log_info("\t%s == %d.%d.%d\n", info->opcode_name,
921*6467f958SSadaf Ebrahimi                      CL_VERSION_MAJOR_KHR(
922*6467f958SSadaf Ebrahimi                          info->config.cl_name_version_single.version),
923*6467f958SSadaf Ebrahimi                      CL_VERSION_MINOR_KHR(
924*6467f958SSadaf Ebrahimi                          info->config.cl_name_version_single.version),
925*6467f958SSadaf Ebrahimi                      CL_VERSION_PATCH_KHR(
926*6467f958SSadaf Ebrahimi                          info->config.cl_name_version_single.version));
927*6467f958SSadaf Ebrahimi             break;
928*6467f958SSadaf Ebrahimi     }
929*6467f958SSadaf Ebrahimi }
930*6467f958SSadaf Ebrahimi 
print_platform_string_selector(cl_platform_id platform,const char * selector_name,cl_platform_info selector)931*6467f958SSadaf Ebrahimi void print_platform_string_selector(cl_platform_id platform,
932*6467f958SSadaf Ebrahimi                                     const char* selector_name,
933*6467f958SSadaf Ebrahimi                                     cl_platform_info selector)
934*6467f958SSadaf Ebrahimi {
935*6467f958SSadaf Ebrahimi     // Currently all the selectors are strings
936*6467f958SSadaf Ebrahimi     size_t size = 0;
937*6467f958SSadaf Ebrahimi     char* value;
938*6467f958SSadaf Ebrahimi     int err;
939*6467f958SSadaf Ebrahimi 
940*6467f958SSadaf Ebrahimi     if ((err = clGetPlatformInfo(platform, selector, 0, NULL, &size)))
941*6467f958SSadaf Ebrahimi     {
942*6467f958SSadaf Ebrahimi         log_error("FAILURE: Unable to get platform info size for %s.\n",
943*6467f958SSadaf Ebrahimi                   selector_name);
944*6467f958SSadaf Ebrahimi         exit(-1);
945*6467f958SSadaf Ebrahimi     }
946*6467f958SSadaf Ebrahimi 
947*6467f958SSadaf Ebrahimi     if (size == 0)
948*6467f958SSadaf Ebrahimi     {
949*6467f958SSadaf Ebrahimi         log_error("FAILURE: The size of %s was returned to be zero.\n",
950*6467f958SSadaf Ebrahimi                   selector_name);
951*6467f958SSadaf Ebrahimi         exit(-1);
952*6467f958SSadaf Ebrahimi     }
953*6467f958SSadaf Ebrahimi 
954*6467f958SSadaf Ebrahimi     value = (char*)malloc(size);
955*6467f958SSadaf Ebrahimi     if (NULL == value)
956*6467f958SSadaf Ebrahimi     {
957*6467f958SSadaf Ebrahimi         log_error("Internal test failure:  Unable to allocate %zu bytes\n",
958*6467f958SSadaf Ebrahimi                   size);
959*6467f958SSadaf Ebrahimi         exit(-1);
960*6467f958SSadaf Ebrahimi     }
961*6467f958SSadaf Ebrahimi 
962*6467f958SSadaf Ebrahimi     memset(value, -1, size);
963*6467f958SSadaf Ebrahimi     if ((err = clGetPlatformInfo(platform, selector, size, value, NULL)))
964*6467f958SSadaf Ebrahimi     {
965*6467f958SSadaf Ebrahimi         log_error("FAILURE: Unable to get platform info for %s.\n",
966*6467f958SSadaf Ebrahimi                   selector_name);
967*6467f958SSadaf Ebrahimi         free(value);
968*6467f958SSadaf Ebrahimi         exit(-1);
969*6467f958SSadaf Ebrahimi     }
970*6467f958SSadaf Ebrahimi 
971*6467f958SSadaf Ebrahimi     if (value[size - 1] != '\0')
972*6467f958SSadaf Ebrahimi     {
973*6467f958SSadaf Ebrahimi         log_error("FAILURE: platform info for %s is either not NUL terminated, "
974*6467f958SSadaf Ebrahimi                   "or the size is wrong.\n",
975*6467f958SSadaf Ebrahimi                   selector_name);
976*6467f958SSadaf Ebrahimi         free(value);
977*6467f958SSadaf Ebrahimi         exit(-1);
978*6467f958SSadaf Ebrahimi     }
979*6467f958SSadaf Ebrahimi 
980*6467f958SSadaf Ebrahimi     log_info("\t%s: %s\n", selector_name, value);
981*6467f958SSadaf Ebrahimi     free(value);
982*6467f958SSadaf Ebrahimi }
983*6467f958SSadaf Ebrahimi 
parseVersion(char const * str,version_t * version)984*6467f958SSadaf Ebrahimi int parseVersion(char const* str, version_t* version)
985*6467f958SSadaf Ebrahimi {
986*6467f958SSadaf Ebrahimi     int rc = -1;
987*6467f958SSadaf Ebrahimi     version->major = 0;
988*6467f958SSadaf Ebrahimi     version->minor = 0;
989*6467f958SSadaf Ebrahimi     if (strncmp(str, "OpenCL 1.2", 10) == 0 && (str[10] == 0 || str[10] == ' '))
990*6467f958SSadaf Ebrahimi     {
991*6467f958SSadaf Ebrahimi         version->major = 1;
992*6467f958SSadaf Ebrahimi         version->minor = 2;
993*6467f958SSadaf Ebrahimi         rc = 0;
994*6467f958SSadaf Ebrahimi     }
995*6467f958SSadaf Ebrahimi     else if (strncmp(str, "OpenCL 1.0", 10) == 0
996*6467f958SSadaf Ebrahimi              && (str[10] == 0 || str[10] == ' '))
997*6467f958SSadaf Ebrahimi     {
998*6467f958SSadaf Ebrahimi         version->major = 1;
999*6467f958SSadaf Ebrahimi         version->minor = 0;
1000*6467f958SSadaf Ebrahimi         rc = 0;
1001*6467f958SSadaf Ebrahimi     }
1002*6467f958SSadaf Ebrahimi     else if (strncmp(str, "OpenCL 1.1", 10) == 0
1003*6467f958SSadaf Ebrahimi              && (str[10] == 0 || str[10] == ' '))
1004*6467f958SSadaf Ebrahimi     {
1005*6467f958SSadaf Ebrahimi         version->major = 1;
1006*6467f958SSadaf Ebrahimi         version->minor = 1;
1007*6467f958SSadaf Ebrahimi         rc = 0;
1008*6467f958SSadaf Ebrahimi     }
1009*6467f958SSadaf Ebrahimi     else if (strncmp(str, "OpenCL 2.0", 10) == 0
1010*6467f958SSadaf Ebrahimi              && (str[10] == 0 || str[10] == ' '))
1011*6467f958SSadaf Ebrahimi     {
1012*6467f958SSadaf Ebrahimi         version->major = 2;
1013*6467f958SSadaf Ebrahimi         version->minor = 0;
1014*6467f958SSadaf Ebrahimi         rc = 0;
1015*6467f958SSadaf Ebrahimi     }
1016*6467f958SSadaf Ebrahimi     else if (strncmp(str, "OpenCL 2.1", 10) == 0
1017*6467f958SSadaf Ebrahimi              && (str[10] == 0 || str[10] == ' '))
1018*6467f958SSadaf Ebrahimi     {
1019*6467f958SSadaf Ebrahimi         version->major = 2;
1020*6467f958SSadaf Ebrahimi         version->minor = 1;
1021*6467f958SSadaf Ebrahimi         rc = 0;
1022*6467f958SSadaf Ebrahimi     }
1023*6467f958SSadaf Ebrahimi     else if (strncmp(str, "OpenCL 2.2", 10) == 0
1024*6467f958SSadaf Ebrahimi              && (str[10] == 0 || str[10] == ' '))
1025*6467f958SSadaf Ebrahimi     {
1026*6467f958SSadaf Ebrahimi         version->major = 2;
1027*6467f958SSadaf Ebrahimi         version->minor = 2;
1028*6467f958SSadaf Ebrahimi         rc = 0;
1029*6467f958SSadaf Ebrahimi     }
1030*6467f958SSadaf Ebrahimi     else if (strncmp(str, "OpenCL 3.0", 10) == 0
1031*6467f958SSadaf Ebrahimi              && (str[10] == 0 || str[10] == ' '))
1032*6467f958SSadaf Ebrahimi     {
1033*6467f958SSadaf Ebrahimi         version->major = 3;
1034*6467f958SSadaf Ebrahimi         version->minor = 0;
1035*6467f958SSadaf Ebrahimi         rc = 0;
1036*6467f958SSadaf Ebrahimi     }
1037*6467f958SSadaf Ebrahimi     else
1038*6467f958SSadaf Ebrahimi     {
1039*6467f958SSadaf Ebrahimi         log_error("ERROR: Unexpected version string: `%s'.\n", str);
1040*6467f958SSadaf Ebrahimi     };
1041*6467f958SSadaf Ebrahimi     return rc;
1042*6467f958SSadaf Ebrahimi }
1043*6467f958SSadaf Ebrahimi 
parseExtensions(char const * str,extensions_t * extensions)1044*6467f958SSadaf Ebrahimi int parseExtensions(char const* str, extensions_t* extensions)
1045*6467f958SSadaf Ebrahimi {
1046*6467f958SSadaf Ebrahimi     char const* begin = NULL;
1047*6467f958SSadaf Ebrahimi     char const* space = NULL;
1048*6467f958SSadaf Ebrahimi     size_t length = 0;
1049*6467f958SSadaf Ebrahimi 
1050*6467f958SSadaf Ebrahimi     memset(extensions, 0, sizeof(extensions_t));
1051*6467f958SSadaf Ebrahimi 
1052*6467f958SSadaf Ebrahimi     begin = str;
1053*6467f958SSadaf Ebrahimi     while (begin[0] != 0)
1054*6467f958SSadaf Ebrahimi     {
1055*6467f958SSadaf Ebrahimi         space = strchr(begin, ' '); // Find space position.
1056*6467f958SSadaf Ebrahimi         if (space != NULL)
1057*6467f958SSadaf Ebrahimi         { // Calculate length of word.
1058*6467f958SSadaf Ebrahimi             length = space - begin;
1059*6467f958SSadaf Ebrahimi         }
1060*6467f958SSadaf Ebrahimi         else
1061*6467f958SSadaf Ebrahimi         {
1062*6467f958SSadaf Ebrahimi             length = strlen(begin);
1063*6467f958SSadaf Ebrahimi         }
1064*6467f958SSadaf Ebrahimi         if (strncmp(begin, "cl_khr_fp64", length) == 0)
1065*6467f958SSadaf Ebrahimi         {
1066*6467f958SSadaf Ebrahimi             extensions->has_cl_khr_fp64 = 1;
1067*6467f958SSadaf Ebrahimi         }
1068*6467f958SSadaf Ebrahimi         if (strncmp(begin, "cl_khr_fp16", length) == 0)
1069*6467f958SSadaf Ebrahimi         {
1070*6467f958SSadaf Ebrahimi             extensions->has_cl_khr_fp16 = 1;
1071*6467f958SSadaf Ebrahimi         }
1072*6467f958SSadaf Ebrahimi         begin += length; // Skip word.
1073*6467f958SSadaf Ebrahimi         if (begin[0] == ' ')
1074*6467f958SSadaf Ebrahimi         { // Skip space, if any.
1075*6467f958SSadaf Ebrahimi             begin += 1;
1076*6467f958SSadaf Ebrahimi         }
1077*6467f958SSadaf Ebrahimi     }
1078*6467f958SSadaf Ebrahimi 
1079*6467f958SSadaf Ebrahimi     return 0;
1080*6467f958SSadaf Ebrahimi }
1081*6467f958SSadaf Ebrahimi 
getConfigInfos(cl_device_id device)1082*6467f958SSadaf Ebrahimi int getConfigInfos(cl_device_id device)
1083*6467f958SSadaf Ebrahimi {
1084*6467f958SSadaf Ebrahimi     int total_errors = 0;
1085*6467f958SSadaf Ebrahimi     unsigned onConfigInfo;
1086*6467f958SSadaf Ebrahimi     version_t version = { 0, 0 }; // Version of the device. Will get real value
1087*6467f958SSadaf Ebrahimi                                   // on the first loop iteration.
1088*6467f958SSadaf Ebrahimi     version_t const ver11 = { 1, 1 }; // Version 1.1.
1089*6467f958SSadaf Ebrahimi     extensions_t extensions = { 0 };
1090*6467f958SSadaf Ebrahimi     int get; // Boolean flag: true = get property, false = skip it.
1091*6467f958SSadaf Ebrahimi     int err;
1092*6467f958SSadaf Ebrahimi     for (onConfigInfo = 0;
1093*6467f958SSadaf Ebrahimi          onConfigInfo < sizeof(config_infos) / sizeof(config_infos[0]);
1094*6467f958SSadaf Ebrahimi          onConfigInfo++)
1095*6467f958SSadaf Ebrahimi     {
1096*6467f958SSadaf Ebrahimi         config_info info = config_infos[onConfigInfo];
1097*6467f958SSadaf Ebrahimi         // Get a property only if device version is equal or greater than
1098*6467f958SSadaf Ebrahimi         // property version.
1099*6467f958SSadaf Ebrahimi         get = (vercmp(version, info.version) >= 0);
1100*6467f958SSadaf Ebrahimi         if (info.opcode == CL_DEVICE_DOUBLE_FP_CONFIG
1101*6467f958SSadaf Ebrahimi             && vercmp(version, ver11) <= 0)
1102*6467f958SSadaf Ebrahimi         {
1103*6467f958SSadaf Ebrahimi             // CL_DEVICE_DOUBLE_FP_CONFIG is a special case. It was introduced
1104*6467f958SSadaf Ebrahimi             // in OpenCL 1.1, but device is required to report it only if
1105*6467f958SSadaf Ebrahimi             // doubles are supported. So, before querying it on device
1106*6467f958SSadaf Ebrahimi             // version 1.1, we have to check doubles are sopported. In
1107*6467f958SSadaf Ebrahimi             // OpenCL 1.2 CL_DEVICE_DOUBLE_FP_CONFIG should be reported
1108*6467f958SSadaf Ebrahimi             // unconditionally.
1109*6467f958SSadaf Ebrahimi             get = extensions.has_cl_khr_fp64;
1110*6467f958SSadaf Ebrahimi         };
1111*6467f958SSadaf Ebrahimi         if (info.opcode == CL_DEVICE_HALF_FP_CONFIG)
1112*6467f958SSadaf Ebrahimi         {
1113*6467f958SSadaf Ebrahimi             // CL_DEVICE_HALF_FP_CONFIG should be reported only when cl_khr_fp16
1114*6467f958SSadaf Ebrahimi             // extension is available
1115*6467f958SSadaf Ebrahimi             get = extensions.has_cl_khr_fp16;
1116*6467f958SSadaf Ebrahimi         };
1117*6467f958SSadaf Ebrahimi         if (get)
1118*6467f958SSadaf Ebrahimi         {
1119*6467f958SSadaf Ebrahimi             err = getConfigInfo(device, &info);
1120*6467f958SSadaf Ebrahimi             if (!err)
1121*6467f958SSadaf Ebrahimi             {
1122*6467f958SSadaf Ebrahimi                 dumpConfigInfo(&info);
1123*6467f958SSadaf Ebrahimi                 if (info.opcode == CL_DEVICE_VERSION)
1124*6467f958SSadaf Ebrahimi                 {
1125*6467f958SSadaf Ebrahimi                     err = parseVersion(info.config.string, &version);
1126*6467f958SSadaf Ebrahimi                     if (err)
1127*6467f958SSadaf Ebrahimi                     {
1128*6467f958SSadaf Ebrahimi                         total_errors++;
1129*6467f958SSadaf Ebrahimi                         free(info.config.string);
1130*6467f958SSadaf Ebrahimi                         break;
1131*6467f958SSadaf Ebrahimi                     }
1132*6467f958SSadaf Ebrahimi                 }
1133*6467f958SSadaf Ebrahimi                 else if (info.opcode == CL_DEVICE_EXTENSIONS)
1134*6467f958SSadaf Ebrahimi                 {
1135*6467f958SSadaf Ebrahimi                     err = parseExtensions(info.config.string, &extensions);
1136*6467f958SSadaf Ebrahimi                     if (err)
1137*6467f958SSadaf Ebrahimi                     {
1138*6467f958SSadaf Ebrahimi                         total_errors++;
1139*6467f958SSadaf Ebrahimi                         free(info.config.string);
1140*6467f958SSadaf Ebrahimi                         break;
1141*6467f958SSadaf Ebrahimi                     }
1142*6467f958SSadaf Ebrahimi                 }
1143*6467f958SSadaf Ebrahimi                 if (info.config_type == type_string)
1144*6467f958SSadaf Ebrahimi                 {
1145*6467f958SSadaf Ebrahimi                     free(info.config.string);
1146*6467f958SSadaf Ebrahimi                 }
1147*6467f958SSadaf Ebrahimi                 if (info.config_type == type_cl_name_version_array)
1148*6467f958SSadaf Ebrahimi                 {
1149*6467f958SSadaf Ebrahimi                     free(info.config.cl_name_version_array);
1150*6467f958SSadaf Ebrahimi                 }
1151*6467f958SSadaf Ebrahimi             }
1152*6467f958SSadaf Ebrahimi             else
1153*6467f958SSadaf Ebrahimi             {
1154*6467f958SSadaf Ebrahimi                 total_errors++;
1155*6467f958SSadaf Ebrahimi             }
1156*6467f958SSadaf Ebrahimi         }
1157*6467f958SSadaf Ebrahimi         else
1158*6467f958SSadaf Ebrahimi         {
1159*6467f958SSadaf Ebrahimi             log_info("\tSkipped: %s.\n", info.opcode_name);
1160*6467f958SSadaf Ebrahimi         }
1161*6467f958SSadaf Ebrahimi     }
1162*6467f958SSadaf Ebrahimi 
1163*6467f958SSadaf Ebrahimi     if (is_extension_available(device, "cl_khr_image2d_from_buffer"))
1164*6467f958SSadaf Ebrahimi     {
1165*6467f958SSadaf Ebrahimi         for (onConfigInfo = 0; onConfigInfo < sizeof(image_buffer_config_infos)
1166*6467f958SSadaf Ebrahimi                  / sizeof(image_buffer_config_infos[0]);
1167*6467f958SSadaf Ebrahimi              onConfigInfo++)
1168*6467f958SSadaf Ebrahimi         {
1169*6467f958SSadaf Ebrahimi             config_info info = image_buffer_config_infos[onConfigInfo];
1170*6467f958SSadaf Ebrahimi             get = (vercmp(version, info.version) >= 0);
1171*6467f958SSadaf Ebrahimi             if (get)
1172*6467f958SSadaf Ebrahimi             {
1173*6467f958SSadaf Ebrahimi                 err = getConfigInfo(device, &info);
1174*6467f958SSadaf Ebrahimi                 if (!err)
1175*6467f958SSadaf Ebrahimi                 {
1176*6467f958SSadaf Ebrahimi                     dumpConfigInfo(&info);
1177*6467f958SSadaf Ebrahimi                 }
1178*6467f958SSadaf Ebrahimi                 else
1179*6467f958SSadaf Ebrahimi                 {
1180*6467f958SSadaf Ebrahimi                     total_errors++;
1181*6467f958SSadaf Ebrahimi                 }
1182*6467f958SSadaf Ebrahimi             }
1183*6467f958SSadaf Ebrahimi         }
1184*6467f958SSadaf Ebrahimi     }
1185*6467f958SSadaf Ebrahimi 
1186*6467f958SSadaf Ebrahimi     total_errors += getImageInfo(device, version);
1187*6467f958SSadaf Ebrahimi 
1188*6467f958SSadaf Ebrahimi     return total_errors;
1189*6467f958SSadaf Ebrahimi }
1190*6467f958SSadaf Ebrahimi 
1191*6467f958SSadaf Ebrahimi config_info config_platform_infos[] = {
1192*6467f958SSadaf Ebrahimi     // CL_PLATFORM_VERSION has to be first defined with version 0 0.
1193*6467f958SSadaf Ebrahimi     CONFIG_INFO(0, 0, CL_PLATFORM_VERSION, string),
1194*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_PLATFORM_PROFILE, string),
1195*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_PLATFORM_NAME, string),
1196*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_PLATFORM_VENDOR, string),
1197*6467f958SSadaf Ebrahimi     CONFIG_INFO(1, 1, CL_PLATFORM_EXTENSIONS, string),
1198*6467f958SSadaf Ebrahimi     CONFIG_INFO(3, 0, CL_PLATFORM_EXTENSIONS_WITH_VERSION,
1199*6467f958SSadaf Ebrahimi                 cl_name_version_array),
1200*6467f958SSadaf Ebrahimi     CONFIG_INFO(3, 0, CL_PLATFORM_NUMERIC_VERSION, cl_name_version)
1201*6467f958SSadaf Ebrahimi };
1202*6467f958SSadaf Ebrahimi 
getPlatformCapabilities(cl_platform_id platform)1203*6467f958SSadaf Ebrahimi int getPlatformCapabilities(cl_platform_id platform)
1204*6467f958SSadaf Ebrahimi {
1205*6467f958SSadaf Ebrahimi     int total_errors = 0;
1206*6467f958SSadaf Ebrahimi     version_t version = { 0, 0 }; // Version of the device. Will get real value
1207*6467f958SSadaf Ebrahimi                                   // on the first loop iteration.
1208*6467f958SSadaf Ebrahimi     int err;
1209*6467f958SSadaf Ebrahimi     for (unsigned onConfigInfo = 0; onConfigInfo
1210*6467f958SSadaf Ebrahimi          < sizeof(config_platform_infos) / sizeof(config_platform_infos[0]);
1211*6467f958SSadaf Ebrahimi          onConfigInfo++)
1212*6467f958SSadaf Ebrahimi     {
1213*6467f958SSadaf Ebrahimi         config_info info = config_platform_infos[onConfigInfo];
1214*6467f958SSadaf Ebrahimi 
1215*6467f958SSadaf Ebrahimi         if (vercmp(version, info.version) >= 0)
1216*6467f958SSadaf Ebrahimi         {
1217*6467f958SSadaf Ebrahimi             err = getPlatformConfigInfo(platform, &info);
1218*6467f958SSadaf Ebrahimi             if (!err)
1219*6467f958SSadaf Ebrahimi             {
1220*6467f958SSadaf Ebrahimi                 dumpConfigInfo(&info);
1221*6467f958SSadaf Ebrahimi                 if (info.opcode == CL_PLATFORM_VERSION)
1222*6467f958SSadaf Ebrahimi                 {
1223*6467f958SSadaf Ebrahimi                     err = parseVersion(info.config.string, &version);
1224*6467f958SSadaf Ebrahimi                     if (err)
1225*6467f958SSadaf Ebrahimi                     {
1226*6467f958SSadaf Ebrahimi                         total_errors++;
1227*6467f958SSadaf Ebrahimi                         free(info.config.string);
1228*6467f958SSadaf Ebrahimi                         break;
1229*6467f958SSadaf Ebrahimi                     }
1230*6467f958SSadaf Ebrahimi                 }
1231*6467f958SSadaf Ebrahimi                 if (info.config_type == type_string)
1232*6467f958SSadaf Ebrahimi                 {
1233*6467f958SSadaf Ebrahimi                     free(info.config.string);
1234*6467f958SSadaf Ebrahimi                 }
1235*6467f958SSadaf Ebrahimi                 if (info.config_type == type_cl_name_version_array)
1236*6467f958SSadaf Ebrahimi                 {
1237*6467f958SSadaf Ebrahimi                     free(info.config.cl_name_version_array);
1238*6467f958SSadaf Ebrahimi                 }
1239*6467f958SSadaf Ebrahimi             }
1240*6467f958SSadaf Ebrahimi             else
1241*6467f958SSadaf Ebrahimi             {
1242*6467f958SSadaf Ebrahimi                 total_errors++;
1243*6467f958SSadaf Ebrahimi             }
1244*6467f958SSadaf Ebrahimi         }
1245*6467f958SSadaf Ebrahimi         else
1246*6467f958SSadaf Ebrahimi         {
1247*6467f958SSadaf Ebrahimi             log_info("\tSkipped: %s.\n", info.opcode_name);
1248*6467f958SSadaf Ebrahimi         }
1249*6467f958SSadaf Ebrahimi     }
1250*6467f958SSadaf Ebrahimi     return total_errors;
1251*6467f958SSadaf Ebrahimi }
1252*6467f958SSadaf Ebrahimi 
test_computeinfo(cl_device_id deviceID,cl_context context,cl_command_queue ignoreQueue,int num_elements)1253*6467f958SSadaf Ebrahimi int test_computeinfo(cl_device_id deviceID, cl_context context,
1254*6467f958SSadaf Ebrahimi                      cl_command_queue ignoreQueue, int num_elements)
1255*6467f958SSadaf Ebrahimi {
1256*6467f958SSadaf Ebrahimi     int err;
1257*6467f958SSadaf Ebrahimi     int total_errors = 0;
1258*6467f958SSadaf Ebrahimi     cl_platform_id platform;
1259*6467f958SSadaf Ebrahimi 
1260*6467f958SSadaf Ebrahimi     err = clGetPlatformIDs(1, &platform, NULL);
1261*6467f958SSadaf Ebrahimi     test_error(err, "clGetPlatformIDs failed");
1262*6467f958SSadaf Ebrahimi 
1263*6467f958SSadaf Ebrahimi     // print platform info
1264*6467f958SSadaf Ebrahimi     log_info("\nclGetPlatformInfo:\n------------------\n");
1265*6467f958SSadaf Ebrahimi     err = getPlatformCapabilities(platform);
1266*6467f958SSadaf Ebrahimi     test_error(err, "getPlatformCapabilities failed");
1267*6467f958SSadaf Ebrahimi     log_info("\n");
1268*6467f958SSadaf Ebrahimi 
1269*6467f958SSadaf Ebrahimi     // Check to see if this test is being run on a specific device
1270*6467f958SSadaf Ebrahimi     char* device_type_env = getenv("CL_DEVICE_TYPE");
1271*6467f958SSadaf Ebrahimi     char* device_index_env = getenv("CL_DEVICE_INDEX");
1272*6467f958SSadaf Ebrahimi 
1273*6467f958SSadaf Ebrahimi     if (device_type_env || device_index_env)
1274*6467f958SSadaf Ebrahimi     {
1275*6467f958SSadaf Ebrahimi 
1276*6467f958SSadaf Ebrahimi         cl_device_type device_type = CL_DEVICE_TYPE_DEFAULT;
1277*6467f958SSadaf Ebrahimi         size_t device_type_idx = 0;
1278*6467f958SSadaf Ebrahimi         size_t device_index = 0;
1279*6467f958SSadaf Ebrahimi 
1280*6467f958SSadaf Ebrahimi         // Check to see if a device type was specified.
1281*6467f958SSadaf Ebrahimi         if (device_type_env)
1282*6467f958SSadaf Ebrahimi         {
1283*6467f958SSadaf Ebrahimi             if (!strcmp(device_type_env, "default")
1284*6467f958SSadaf Ebrahimi                 || !strcmp(device_type_env, "CL_DEVICE_TYPE_DEFAULT"))
1285*6467f958SSadaf Ebrahimi             {
1286*6467f958SSadaf Ebrahimi                 device_type = CL_DEVICE_TYPE_DEFAULT;
1287*6467f958SSadaf Ebrahimi                 device_type_idx = 0;
1288*6467f958SSadaf Ebrahimi             }
1289*6467f958SSadaf Ebrahimi             else if (!strcmp(device_type_env, "cpu")
1290*6467f958SSadaf Ebrahimi                      || !strcmp(device_type_env, "CL_DEVICE_TYPE_CPU"))
1291*6467f958SSadaf Ebrahimi             {
1292*6467f958SSadaf Ebrahimi                 device_type = CL_DEVICE_TYPE_CPU;
1293*6467f958SSadaf Ebrahimi                 device_type_idx = 1;
1294*6467f958SSadaf Ebrahimi             }
1295*6467f958SSadaf Ebrahimi             else if (!strcmp(device_type_env, "gpu")
1296*6467f958SSadaf Ebrahimi                      || !strcmp(device_type_env, "CL_DEVICE_TYPE_GPU"))
1297*6467f958SSadaf Ebrahimi             {
1298*6467f958SSadaf Ebrahimi                 device_type = CL_DEVICE_TYPE_GPU;
1299*6467f958SSadaf Ebrahimi                 device_type_idx = 2;
1300*6467f958SSadaf Ebrahimi             }
1301*6467f958SSadaf Ebrahimi             else if (!strcmp(device_type_env, "accelerator")
1302*6467f958SSadaf Ebrahimi                      || !strcmp(device_type_env, "CL_DEVICE_TYPE_ACCELERATOR"))
1303*6467f958SSadaf Ebrahimi             {
1304*6467f958SSadaf Ebrahimi                 device_type = CL_DEVICE_TYPE_ACCELERATOR;
1305*6467f958SSadaf Ebrahimi                 device_type_idx = 3;
1306*6467f958SSadaf Ebrahimi             }
1307*6467f958SSadaf Ebrahimi             else
1308*6467f958SSadaf Ebrahimi             {
1309*6467f958SSadaf Ebrahimi                 log_error("CL_DEVICE_TYPE=\"%s\" is invalid\n",
1310*6467f958SSadaf Ebrahimi                           device_type_env);
1311*6467f958SSadaf Ebrahimi                 return -1;
1312*6467f958SSadaf Ebrahimi             }
1313*6467f958SSadaf Ebrahimi         }
1314*6467f958SSadaf Ebrahimi 
1315*6467f958SSadaf Ebrahimi         // Check to see if a device index was specified
1316*6467f958SSadaf Ebrahimi         if (device_index_env) device_index = atoi(device_index_env);
1317*6467f958SSadaf Ebrahimi 
1318*6467f958SSadaf Ebrahimi         // Look up the device
1319*6467f958SSadaf Ebrahimi         cl_uint num_devices;
1320*6467f958SSadaf Ebrahimi         err = clGetDeviceIDs(platform, device_type, 0, NULL, &num_devices);
1321*6467f958SSadaf Ebrahimi         if (err)
1322*6467f958SSadaf Ebrahimi         {
1323*6467f958SSadaf Ebrahimi             log_error("No devices of type %s found.\n", device_type_env);
1324*6467f958SSadaf Ebrahimi             return -1;
1325*6467f958SSadaf Ebrahimi         }
1326*6467f958SSadaf Ebrahimi 
1327*6467f958SSadaf Ebrahimi         if (device_index >= num_devices)
1328*6467f958SSadaf Ebrahimi         {
1329*6467f958SSadaf Ebrahimi             log_error("CL_DEVICE_INDEX=%d is greater than the number of "
1330*6467f958SSadaf Ebrahimi                       "matching devices %d\n",
1331*6467f958SSadaf Ebrahimi                       (unsigned)device_index, num_devices);
1332*6467f958SSadaf Ebrahimi             return -1;
1333*6467f958SSadaf Ebrahimi         }
1334*6467f958SSadaf Ebrahimi 
1335*6467f958SSadaf Ebrahimi         if (num_devices == 0)
1336*6467f958SSadaf Ebrahimi         {
1337*6467f958SSadaf Ebrahimi             log_error("No devices of type %s found.\n", device_type_env);
1338*6467f958SSadaf Ebrahimi             return -1;
1339*6467f958SSadaf Ebrahimi         }
1340*6467f958SSadaf Ebrahimi 
1341*6467f958SSadaf Ebrahimi         cl_device_id* devices =
1342*6467f958SSadaf Ebrahimi             (cl_device_id*)malloc(num_devices * sizeof(cl_device_id));
1343*6467f958SSadaf Ebrahimi         err = clGetDeviceIDs(platform, device_type, num_devices, devices, NULL);
1344*6467f958SSadaf Ebrahimi         if (err)
1345*6467f958SSadaf Ebrahimi         {
1346*6467f958SSadaf Ebrahimi             log_error("No devices of type %s found.\n", device_type_env);
1347*6467f958SSadaf Ebrahimi             free(devices);
1348*6467f958SSadaf Ebrahimi             return -1;
1349*6467f958SSadaf Ebrahimi         }
1350*6467f958SSadaf Ebrahimi 
1351*6467f958SSadaf Ebrahimi         cl_device_id device = devices[device_index];
1352*6467f958SSadaf Ebrahimi         free(devices);
1353*6467f958SSadaf Ebrahimi 
1354*6467f958SSadaf Ebrahimi         log_info("%s Device %d of %d Info:\n",
1355*6467f958SSadaf Ebrahimi                  device_infos[device_type_idx].device_type_name,
1356*6467f958SSadaf Ebrahimi                  (unsigned)device_index + 1, num_devices);
1357*6467f958SSadaf Ebrahimi         total_errors += getConfigInfos(device);
1358*6467f958SSadaf Ebrahimi         log_info("\n");
1359*6467f958SSadaf Ebrahimi     }
1360*6467f958SSadaf Ebrahimi 
1361*6467f958SSadaf Ebrahimi     // Otherwise iterate over all of the devices in the platform
1362*6467f958SSadaf Ebrahimi     else
1363*6467f958SSadaf Ebrahimi     {
1364*6467f958SSadaf Ebrahimi         // print device info
1365*6467f958SSadaf Ebrahimi         for (size_t onInfo = 0;
1366*6467f958SSadaf Ebrahimi              onInfo < sizeof(device_infos) / sizeof(device_infos[0]); onInfo++)
1367*6467f958SSadaf Ebrahimi         {
1368*6467f958SSadaf Ebrahimi             log_info("Getting device IDs for %s devices\n",
1369*6467f958SSadaf Ebrahimi                      device_infos[onInfo].device_type_name);
1370*6467f958SSadaf Ebrahimi             err = clGetDeviceIDs(platform, device_infos[onInfo].device_type, 0,
1371*6467f958SSadaf Ebrahimi                                  NULL, &device_infos[onInfo].num_devices);
1372*6467f958SSadaf Ebrahimi             if (err == CL_DEVICE_NOT_FOUND)
1373*6467f958SSadaf Ebrahimi             {
1374*6467f958SSadaf Ebrahimi                 log_info("No devices of type %s found.\n",
1375*6467f958SSadaf Ebrahimi                          device_infos[onInfo].device_type_name);
1376*6467f958SSadaf Ebrahimi                 continue;
1377*6467f958SSadaf Ebrahimi             }
1378*6467f958SSadaf Ebrahimi             test_error(err, "clGetDeviceIDs failed");
1379*6467f958SSadaf Ebrahimi 
1380*6467f958SSadaf Ebrahimi             log_info("Found %d %s devices:\n", device_infos[onInfo].num_devices,
1381*6467f958SSadaf Ebrahimi                      device_infos[onInfo].device_type_name);
1382*6467f958SSadaf Ebrahimi             if (device_infos[onInfo].num_devices)
1383*6467f958SSadaf Ebrahimi             {
1384*6467f958SSadaf Ebrahimi                 device_infos[onInfo].devices = (cl_device_id*)malloc(
1385*6467f958SSadaf Ebrahimi                     sizeof(cl_device_id) * device_infos[onInfo].num_devices);
1386*6467f958SSadaf Ebrahimi                 err = clGetDeviceIDs(platform, device_infos[onInfo].device_type,
1387*6467f958SSadaf Ebrahimi                                      device_infos[onInfo].num_devices,
1388*6467f958SSadaf Ebrahimi                                      device_infos[onInfo].devices, NULL);
1389*6467f958SSadaf Ebrahimi                 test_error(err, "clGetDeviceIDs failed");
1390*6467f958SSadaf Ebrahimi             }
1391*6467f958SSadaf Ebrahimi 
1392*6467f958SSadaf Ebrahimi             for (size_t onDevice = 0;
1393*6467f958SSadaf Ebrahimi                  onDevice < device_infos[onInfo].num_devices; onDevice++)
1394*6467f958SSadaf Ebrahimi             {
1395*6467f958SSadaf Ebrahimi                 log_info("%s Device %d of %d Info:\n",
1396*6467f958SSadaf Ebrahimi                          device_infos[onInfo].device_type_name, onDevice + 1,
1397*6467f958SSadaf Ebrahimi                          device_infos[onInfo].num_devices);
1398*6467f958SSadaf Ebrahimi                 total_errors +=
1399*6467f958SSadaf Ebrahimi                     getConfigInfos(device_infos[onInfo].devices[onDevice]);
1400*6467f958SSadaf Ebrahimi                 log_info("\n");
1401*6467f958SSadaf Ebrahimi             }
1402*6467f958SSadaf Ebrahimi 
1403*6467f958SSadaf Ebrahimi             if (device_infos[onInfo].num_devices)
1404*6467f958SSadaf Ebrahimi             {
1405*6467f958SSadaf Ebrahimi                 free(device_infos[onInfo].devices);
1406*6467f958SSadaf Ebrahimi             }
1407*6467f958SSadaf Ebrahimi         }
1408*6467f958SSadaf Ebrahimi     }
1409*6467f958SSadaf Ebrahimi 
1410*6467f958SSadaf Ebrahimi     return total_errors;
1411*6467f958SSadaf Ebrahimi }
1412*6467f958SSadaf Ebrahimi 
1413*6467f958SSadaf Ebrahimi extern int test_extended_versioning(cl_device_id, cl_context, cl_command_queue,
1414*6467f958SSadaf Ebrahimi                                     int);
1415*6467f958SSadaf Ebrahimi extern int test_device_uuid(cl_device_id, cl_context, cl_command_queue, int);
1416*6467f958SSadaf Ebrahimi extern int test_conformance_version(cl_device_id, cl_context, cl_command_queue,
1417*6467f958SSadaf Ebrahimi                                     int);
1418*6467f958SSadaf Ebrahimi extern int test_pci_bus_info(cl_device_id, cl_context, cl_command_queue, int);
1419*6467f958SSadaf Ebrahimi 
1420*6467f958SSadaf Ebrahimi test_definition test_list[] = {
1421*6467f958SSadaf Ebrahimi     ADD_TEST(computeinfo),
1422*6467f958SSadaf Ebrahimi     ADD_TEST(extended_versioning),
1423*6467f958SSadaf Ebrahimi     ADD_TEST(device_uuid),
1424*6467f958SSadaf Ebrahimi     ADD_TEST_VERSION(conformance_version, Version(3, 0)),
1425*6467f958SSadaf Ebrahimi     ADD_TEST(pci_bus_info),
1426*6467f958SSadaf Ebrahimi };
1427*6467f958SSadaf Ebrahimi 
1428*6467f958SSadaf Ebrahimi const int test_num = ARRAY_SIZE(test_list);
1429*6467f958SSadaf Ebrahimi 
main(int argc,const char ** argv)1430*6467f958SSadaf Ebrahimi int main(int argc, const char** argv)
1431*6467f958SSadaf Ebrahimi {
1432*6467f958SSadaf Ebrahimi     const char** argList = (const char**)calloc(argc, sizeof(char*));
1433*6467f958SSadaf Ebrahimi     if (NULL == argList)
1434*6467f958SSadaf Ebrahimi     {
1435*6467f958SSadaf Ebrahimi         log_error("Failed to allocate memory for argList array.\n");
1436*6467f958SSadaf Ebrahimi         return 1;
1437*6467f958SSadaf Ebrahimi     }
1438*6467f958SSadaf Ebrahimi 
1439*6467f958SSadaf Ebrahimi     argList[0] = argv[0];
1440*6467f958SSadaf Ebrahimi     size_t argCount = 1;
1441*6467f958SSadaf Ebrahimi 
1442*6467f958SSadaf Ebrahimi     for (int i = 1; i < argc; i++)
1443*6467f958SSadaf Ebrahimi     {
1444*6467f958SSadaf Ebrahimi         if (strcmp(argv[1], "-v") == 0)
1445*6467f958SSadaf Ebrahimi         {
1446*6467f958SSadaf Ebrahimi             dump_supported_formats = 1;
1447*6467f958SSadaf Ebrahimi         }
1448*6467f958SSadaf Ebrahimi         else
1449*6467f958SSadaf Ebrahimi         {
1450*6467f958SSadaf Ebrahimi             argList[argCount] = argv[i];
1451*6467f958SSadaf Ebrahimi             argCount++;
1452*6467f958SSadaf Ebrahimi         }
1453*6467f958SSadaf Ebrahimi     }
1454*6467f958SSadaf Ebrahimi 
1455*6467f958SSadaf Ebrahimi     return runTestHarness(argCount, argList, test_num, test_list, true, 0);
1456*6467f958SSadaf Ebrahimi }
1457