xref: /aosp_15_r20/external/ComputeLibrary/tests/framework/instruments/hwc.hpp (revision c217d954acce2dbc11938adb493fc0abd69584f3)
1*c217d954SCole Faust /*
2*c217d954SCole Faust  * Copyright (c) 2017-2018 Arm Limited.
3*c217d954SCole Faust  *
4*c217d954SCole Faust  * SPDX-License-Identifier: MIT
5*c217d954SCole Faust  *
6*c217d954SCole Faust  * Permission is hereby granted, free of charge, to any person obtaining a copy
7*c217d954SCole Faust  * of this software and associated documentation files (the "Software"), to
8*c217d954SCole Faust  * deal in the Software without restriction, including without limitation the
9*c217d954SCole Faust  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10*c217d954SCole Faust  * sell copies of the Software, and to permit persons to whom the Software is
11*c217d954SCole Faust  * furnished to do so, subject to the following conditions:
12*c217d954SCole Faust  *
13*c217d954SCole Faust  * The above copyright notice and this permission notice shall be included in all
14*c217d954SCole Faust  * copies or substantial portions of the Software.
15*c217d954SCole Faust  *
16*c217d954SCole Faust  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17*c217d954SCole Faust  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*c217d954SCole Faust  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19*c217d954SCole Faust  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20*c217d954SCole Faust  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21*c217d954SCole Faust  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22*c217d954SCole Faust  * SOFTWARE.
23*c217d954SCole Faust  */
24*c217d954SCole Faust #ifndef ARM_COMPUTE_TEST_HWC
25*c217d954SCole Faust #define ARM_COMPUTE_TEST_HWC
26*c217d954SCole Faust 
27*c217d954SCole Faust #include "hwc_names.hpp"
28*c217d954SCole Faust 
29*c217d954SCole Faust #include <errno.h>
30*c217d954SCole Faust #include <fcntl.h>
31*c217d954SCole Faust #include <poll.h>
32*c217d954SCole Faust #include <stddef.h>
33*c217d954SCole Faust #include <stdint.h>
34*c217d954SCole Faust #include <stdlib.h>
35*c217d954SCole Faust #include <string.h>
36*c217d954SCole Faust #include <sys/ioctl.h>
37*c217d954SCole Faust #include <sys/mman.h>
38*c217d954SCole Faust #include <unistd.h>
39*c217d954SCole Faust 
40*c217d954SCole Faust #ifndef DOXYGEN_SKIP_THIS
41*c217d954SCole Faust 
42*c217d954SCole Faust #if defined(ANDROID) || defined(__ANDROID__)
43*c217d954SCole Faust /* We use _IOR_BAD/_IOW_BAD rather than _IOR/_IOW otherwise fails to compile with NDK-BUILD because of _IOC_TYPECHECK is defined, not because the paramter is invalid */
44*c217d954SCole Faust #define MALI_IOR(a, b, c) _IOR_BAD(a, b, c)
45*c217d954SCole Faust #define MALI_IOW(a, b, c) _IOW_BAD(a, b, c)
46*c217d954SCole Faust #else /* defined(ANDROID) || defined(__ANDROID__) */
47*c217d954SCole Faust #define MALI_IOR(a, b, c) _IOR(a, b, c)
48*c217d954SCole Faust #define MALI_IOW(a, b, c) _IOW(a, b, c)
49*c217d954SCole Faust #endif /* defined(ANDROID) || defined(__ANDROID__) */
50*c217d954SCole Faust 
51*c217d954SCole Faust namespace mali_userspace
52*c217d954SCole Faust {
53*c217d954SCole Faust union uk_header
54*c217d954SCole Faust {
55*c217d954SCole Faust     uint32_t id;
56*c217d954SCole Faust     uint32_t ret;
57*c217d954SCole Faust     uint64_t sizer;
58*c217d954SCole Faust };
59*c217d954SCole Faust 
60*c217d954SCole Faust #define BASE_GPU_NUM_TEXTURE_FEATURES_REGISTERS 3
61*c217d954SCole Faust #define BASE_MAX_COHERENT_GROUPS 16
62*c217d954SCole Faust 
63*c217d954SCole Faust struct mali_base_gpu_core_props
64*c217d954SCole Faust {
65*c217d954SCole Faust     uint32_t product_id;
66*c217d954SCole Faust     uint16_t version_status;
67*c217d954SCole Faust     uint16_t minor_revision;
68*c217d954SCole Faust     uint16_t major_revision;
69*c217d954SCole Faust     uint16_t padding;
70*c217d954SCole Faust     uint32_t gpu_speed_mhz;
71*c217d954SCole Faust     uint32_t gpu_freq_khz_max;
72*c217d954SCole Faust     uint32_t gpu_freq_khz_min;
73*c217d954SCole Faust     uint32_t log2_program_counter_size;
74*c217d954SCole Faust     uint32_t texture_features[BASE_GPU_NUM_TEXTURE_FEATURES_REGISTERS];
75*c217d954SCole Faust     uint64_t gpu_available_memory_size;
76*c217d954SCole Faust };
77*c217d954SCole Faust 
78*c217d954SCole Faust struct mali_base_gpu_l2_cache_props
79*c217d954SCole Faust {
80*c217d954SCole Faust     uint8_t log2_line_size;
81*c217d954SCole Faust     uint8_t log2_cache_size;
82*c217d954SCole Faust     uint8_t num_l2_slices;
83*c217d954SCole Faust     uint8_t padding[5];
84*c217d954SCole Faust };
85*c217d954SCole Faust 
86*c217d954SCole Faust struct mali_base_gpu_tiler_props
87*c217d954SCole Faust {
88*c217d954SCole Faust     uint32_t bin_size_bytes;
89*c217d954SCole Faust     uint32_t max_active_levels;
90*c217d954SCole Faust };
91*c217d954SCole Faust 
92*c217d954SCole Faust struct mali_base_gpu_thread_props
93*c217d954SCole Faust {
94*c217d954SCole Faust     uint32_t max_threads;
95*c217d954SCole Faust     uint32_t max_workgroup_size;
96*c217d954SCole Faust     uint32_t max_barrier_size;
97*c217d954SCole Faust     uint16_t max_registers;
98*c217d954SCole Faust     uint8_t  max_task_queue;
99*c217d954SCole Faust     uint8_t  max_thread_group_split;
100*c217d954SCole Faust     uint8_t  impl_tech;
101*c217d954SCole Faust     uint8_t  padding[7];
102*c217d954SCole Faust };
103*c217d954SCole Faust 
104*c217d954SCole Faust struct mali_base_gpu_coherent_group
105*c217d954SCole Faust {
106*c217d954SCole Faust     uint64_t core_mask;
107*c217d954SCole Faust     uint16_t num_cores;
108*c217d954SCole Faust     uint16_t padding[3];
109*c217d954SCole Faust };
110*c217d954SCole Faust 
111*c217d954SCole Faust struct mali_base_gpu_coherent_group_info
112*c217d954SCole Faust {
113*c217d954SCole Faust     uint32_t                     num_groups;
114*c217d954SCole Faust     uint32_t                     num_core_groups;
115*c217d954SCole Faust     uint32_t                     coherency;
116*c217d954SCole Faust     uint32_t                     padding;
117*c217d954SCole Faust     mali_base_gpu_coherent_group group[BASE_MAX_COHERENT_GROUPS];
118*c217d954SCole Faust };
119*c217d954SCole Faust 
120*c217d954SCole Faust #define GPU_MAX_JOB_SLOTS 16
121*c217d954SCole Faust struct gpu_raw_gpu_props
122*c217d954SCole Faust {
123*c217d954SCole Faust     uint64_t shader_present;
124*c217d954SCole Faust     uint64_t tiler_present;
125*c217d954SCole Faust     uint64_t l2_present;
126*c217d954SCole Faust     uint64_t unused_1;
127*c217d954SCole Faust 
128*c217d954SCole Faust     uint32_t l2_features;
129*c217d954SCole Faust     uint32_t suspend_size;
130*c217d954SCole Faust     uint32_t mem_features;
131*c217d954SCole Faust     uint32_t mmu_features;
132*c217d954SCole Faust 
133*c217d954SCole Faust     uint32_t as_present;
134*c217d954SCole Faust 
135*c217d954SCole Faust     uint32_t js_present;
136*c217d954SCole Faust     uint32_t js_features[GPU_MAX_JOB_SLOTS];
137*c217d954SCole Faust     uint32_t tiler_features;
138*c217d954SCole Faust     uint32_t texture_features[3];
139*c217d954SCole Faust 
140*c217d954SCole Faust     uint32_t gpu_id;
141*c217d954SCole Faust 
142*c217d954SCole Faust     uint32_t thread_max_threads;
143*c217d954SCole Faust     uint32_t thread_max_workgroup_size;
144*c217d954SCole Faust     uint32_t thread_max_barrier_size;
145*c217d954SCole Faust     uint32_t thread_features;
146*c217d954SCole Faust 
147*c217d954SCole Faust     uint32_t coherency_mode;
148*c217d954SCole Faust };
149*c217d954SCole Faust 
150*c217d954SCole Faust struct mali_base_gpu_props
151*c217d954SCole Faust {
152*c217d954SCole Faust     mali_base_gpu_core_props          core_props;
153*c217d954SCole Faust     mali_base_gpu_l2_cache_props      l2_props;
154*c217d954SCole Faust     uint64_t                          unused;
155*c217d954SCole Faust     mali_base_gpu_tiler_props         tiler_props;
156*c217d954SCole Faust     mali_base_gpu_thread_props        thread_props;
157*c217d954SCole Faust     gpu_raw_gpu_props                 raw_props;
158*c217d954SCole Faust     mali_base_gpu_coherent_group_info coherency_info;
159*c217d954SCole Faust };
160*c217d954SCole Faust 
161*c217d954SCole Faust struct kbase_uk_gpuprops
162*c217d954SCole Faust {
163*c217d954SCole Faust     uk_header           header;
164*c217d954SCole Faust     mali_base_gpu_props props;
165*c217d954SCole Faust };
166*c217d954SCole Faust 
167*c217d954SCole Faust #define KBASE_GPUPROP_VALUE_SIZE_U8 (0x0)
168*c217d954SCole Faust #define KBASE_GPUPROP_VALUE_SIZE_U16 (0x1)
169*c217d954SCole Faust #define KBASE_GPUPROP_VALUE_SIZE_U32 (0x2)
170*c217d954SCole Faust #define KBASE_GPUPROP_VALUE_SIZE_U64 (0x3)
171*c217d954SCole Faust 
172*c217d954SCole Faust #define KBASE_GPUPROP_PRODUCT_ID 1
173*c217d954SCole Faust #define KBASE_GPUPROP_MINOR_REVISION 3
174*c217d954SCole Faust #define KBASE_GPUPROP_MAJOR_REVISION 4
175*c217d954SCole Faust 
176*c217d954SCole Faust #define KBASE_GPUPROP_COHERENCY_NUM_GROUPS 61
177*c217d954SCole Faust #define KBASE_GPUPROP_COHERENCY_NUM_CORE_GROUPS 62
178*c217d954SCole Faust #define KBASE_GPUPROP_COHERENCY_GROUP_0 64
179*c217d954SCole Faust #define KBASE_GPUPROP_COHERENCY_GROUP_1 65
180*c217d954SCole Faust #define KBASE_GPUPROP_COHERENCY_GROUP_2 66
181*c217d954SCole Faust #define KBASE_GPUPROP_COHERENCY_GROUP_3 67
182*c217d954SCole Faust #define KBASE_GPUPROP_COHERENCY_GROUP_4 68
183*c217d954SCole Faust #define KBASE_GPUPROP_COHERENCY_GROUP_5 69
184*c217d954SCole Faust #define KBASE_GPUPROP_COHERENCY_GROUP_6 70
185*c217d954SCole Faust #define KBASE_GPUPROP_COHERENCY_GROUP_7 71
186*c217d954SCole Faust #define KBASE_GPUPROP_COHERENCY_GROUP_8 72
187*c217d954SCole Faust #define KBASE_GPUPROP_COHERENCY_GROUP_9 73
188*c217d954SCole Faust #define KBASE_GPUPROP_COHERENCY_GROUP_10 74
189*c217d954SCole Faust #define KBASE_GPUPROP_COHERENCY_GROUP_11 75
190*c217d954SCole Faust #define KBASE_GPUPROP_COHERENCY_GROUP_12 76
191*c217d954SCole Faust #define KBASE_GPUPROP_COHERENCY_GROUP_13 77
192*c217d954SCole Faust #define KBASE_GPUPROP_COHERENCY_GROUP_14 78
193*c217d954SCole Faust #define KBASE_GPUPROP_COHERENCY_GROUP_15 79
194*c217d954SCole Faust 
195*c217d954SCole Faust struct gpu_props
196*c217d954SCole Faust {
197*c217d954SCole Faust     uint32_t product_id;
198*c217d954SCole Faust     uint16_t minor_revision;
199*c217d954SCole Faust     uint16_t major_revision;
200*c217d954SCole Faust     uint32_t num_groups;
201*c217d954SCole Faust     uint32_t num_core_groups;
202*c217d954SCole Faust     uint64_t core_mask[16];
203*c217d954SCole Faust };
204*c217d954SCole Faust 
205*c217d954SCole Faust static const struct
206*c217d954SCole Faust {
207*c217d954SCole Faust     uint32_t type;
208*c217d954SCole Faust     size_t   offset;
209*c217d954SCole Faust     int      size;
210*c217d954SCole Faust } gpu_property_mapping[] =
211*c217d954SCole Faust {
212*c217d954SCole Faust #define PROP(name, member)                                        \
213*c217d954SCole Faust     {                                                             \
214*c217d954SCole Faust         KBASE_GPUPROP_##name, offsetof(struct gpu_props, member), \
215*c217d954SCole Faust         sizeof(((struct gpu_props *)0)->member)               \
216*c217d954SCole Faust     }
217*c217d954SCole Faust #define PROP2(name, member, off)                                        \
218*c217d954SCole Faust     {                                                                   \
219*c217d954SCole Faust         KBASE_GPUPROP_##name, offsetof(struct gpu_props, member) + off, \
220*c217d954SCole Faust         sizeof(((struct gpu_props *)0)->member)                     \
221*c217d954SCole Faust     }
222*c217d954SCole Faust     PROP(PRODUCT_ID, product_id),
223*c217d954SCole Faust     PROP(MINOR_REVISION, minor_revision),
224*c217d954SCole Faust     PROP(MAJOR_REVISION, major_revision),
225*c217d954SCole Faust     PROP(COHERENCY_NUM_GROUPS, num_groups),
226*c217d954SCole Faust     PROP(COHERENCY_NUM_CORE_GROUPS, num_core_groups),
227*c217d954SCole Faust     PROP2(COHERENCY_GROUP_0, core_mask, 0),
228*c217d954SCole Faust     PROP2(COHERENCY_GROUP_1, core_mask, 1),
229*c217d954SCole Faust     PROP2(COHERENCY_GROUP_2, core_mask, 2),
230*c217d954SCole Faust     PROP2(COHERENCY_GROUP_3, core_mask, 3),
231*c217d954SCole Faust     PROP2(COHERENCY_GROUP_4, core_mask, 4),
232*c217d954SCole Faust     PROP2(COHERENCY_GROUP_5, core_mask, 5),
233*c217d954SCole Faust     PROP2(COHERENCY_GROUP_6, core_mask, 6),
234*c217d954SCole Faust     PROP2(COHERENCY_GROUP_7, core_mask, 7),
235*c217d954SCole Faust     PROP2(COHERENCY_GROUP_8, core_mask, 8),
236*c217d954SCole Faust     PROP2(COHERENCY_GROUP_9, core_mask, 9),
237*c217d954SCole Faust     PROP2(COHERENCY_GROUP_10, core_mask, 10),
238*c217d954SCole Faust     PROP2(COHERENCY_GROUP_11, core_mask, 11),
239*c217d954SCole Faust     PROP2(COHERENCY_GROUP_12, core_mask, 12),
240*c217d954SCole Faust     PROP2(COHERENCY_GROUP_13, core_mask, 13),
241*c217d954SCole Faust     PROP2(COHERENCY_GROUP_14, core_mask, 14),
242*c217d954SCole Faust     PROP2(COHERENCY_GROUP_15, core_mask, 15),
243*c217d954SCole Faust #undef PROP
244*c217d954SCole Faust #undef PROP2
245*c217d954SCole Faust     { 0, 0, 0 }
246*c217d954SCole Faust };
247*c217d954SCole Faust 
248*c217d954SCole Faust struct kbase_hwcnt_reader_metadata
249*c217d954SCole Faust {
250*c217d954SCole Faust     uint64_t timestamp  = 0;
251*c217d954SCole Faust     uint32_t event_id   = 0;
252*c217d954SCole Faust     uint32_t buffer_idx = 0;
253*c217d954SCole Faust };
254*c217d954SCole Faust 
255*c217d954SCole Faust namespace
256*c217d954SCole Faust {
257*c217d954SCole Faust /** Message header */
258*c217d954SCole Faust union kbase_uk_hwcnt_header
259*c217d954SCole Faust {
260*c217d954SCole Faust     /* 32-bit number identifying the UK function to be called. */
261*c217d954SCole Faust     uint32_t id;
262*c217d954SCole Faust     /* The int return code returned by the called UK function. */
263*c217d954SCole Faust     uint32_t ret;
264*c217d954SCole Faust     /* Used to ensure 64-bit alignment of this union. Do not remove. */
265*c217d954SCole Faust     uint64_t sizer;
266*c217d954SCole Faust };
267*c217d954SCole Faust 
268*c217d954SCole Faust /** IOCTL parameters to check version */
269*c217d954SCole Faust struct kbase_uk_hwcnt_reader_version_check_args
270*c217d954SCole Faust {
271*c217d954SCole Faust     union kbase_uk_hwcnt_header header;
272*c217d954SCole Faust 
273*c217d954SCole Faust     uint16_t major;
274*c217d954SCole Faust     uint16_t minor;
275*c217d954SCole Faust     uint8_t  padding[4];
276*c217d954SCole Faust };
277*c217d954SCole Faust 
278*c217d954SCole Faust union kbase_pointer
279*c217d954SCole Faust {
280*c217d954SCole Faust     void    *value;
281*c217d954SCole Faust     uint32_t compat_value;
282*c217d954SCole Faust     uint64_t sizer;
283*c217d954SCole Faust };
284*c217d954SCole Faust 
285*c217d954SCole Faust struct kbase_ioctl_get_gpuprops
286*c217d954SCole Faust {
287*c217d954SCole Faust     kbase_pointer buffer;
288*c217d954SCole Faust     uint32_t      size;
289*c217d954SCole Faust     uint32_t      flags;
290*c217d954SCole Faust };
291*c217d954SCole Faust 
292*c217d954SCole Faust #define KBASE_IOCTL_TYPE 0x80
293*c217d954SCole Faust #define KBASE_IOCTL_GET_GPUPROPS MALI_IOW(KBASE_IOCTL_TYPE, 3, struct kbase_ioctl_get_gpuprops)
294*c217d954SCole Faust 
295*c217d954SCole Faust /** IOCTL parameters to set flags */
296*c217d954SCole Faust struct kbase_uk_hwcnt_reader_set_flags
297*c217d954SCole Faust {
298*c217d954SCole Faust     union kbase_uk_hwcnt_header header;
299*c217d954SCole Faust 
300*c217d954SCole Faust     uint32_t create_flags;
301*c217d954SCole Faust     uint32_t padding;
302*c217d954SCole Faust };
303*c217d954SCole Faust 
304*c217d954SCole Faust /** IOCTL parameters to configure reader */
305*c217d954SCole Faust struct kbase_uk_hwcnt_reader_setup
306*c217d954SCole Faust {
307*c217d954SCole Faust     union kbase_uk_hwcnt_header header;
308*c217d954SCole Faust 
309*c217d954SCole Faust     /* IN */
310*c217d954SCole Faust     uint32_t buffer_count;
311*c217d954SCole Faust     uint32_t jm_bm;
312*c217d954SCole Faust     uint32_t shader_bm;
313*c217d954SCole Faust     uint32_t tiler_bm;
314*c217d954SCole Faust     uint32_t mmu_l2_bm;
315*c217d954SCole Faust 
316*c217d954SCole Faust     /* OUT */
317*c217d954SCole Faust     int32_t fd;
318*c217d954SCole Faust };
319*c217d954SCole Faust 
320*c217d954SCole Faust static const uint32_t HWCNT_READER_API = 1;
321*c217d954SCole Faust 
322*c217d954SCole Faust struct uku_version_check_args
323*c217d954SCole Faust {
324*c217d954SCole Faust     uk_header header;
325*c217d954SCole Faust     uint16_t  major;
326*c217d954SCole Faust     uint16_t  minor;
327*c217d954SCole Faust     uint8_t   padding[4];
328*c217d954SCole Faust };
329*c217d954SCole Faust 
330*c217d954SCole Faust enum
331*c217d954SCole Faust {
332*c217d954SCole Faust     UKP_FUNC_ID_CHECK_VERSION = 0,
333*c217d954SCole Faust     /* Related to mali0 ioctl interface */
334*c217d954SCole Faust     LINUX_UK_BASE_MAGIC              = 0x80,
335*c217d954SCole Faust     BASE_CONTEXT_CREATE_KERNEL_FLAGS = 0x2,
336*c217d954SCole Faust     KBASE_FUNC_HWCNT_UK_FUNC_ID      = 512,
337*c217d954SCole Faust     KBASE_FUNC_GPU_PROPS_REG_DUMP    = KBASE_FUNC_HWCNT_UK_FUNC_ID + 14,
338*c217d954SCole Faust     KBASE_FUNC_HWCNT_READER_SETUP    = KBASE_FUNC_HWCNT_UK_FUNC_ID + 36,
339*c217d954SCole Faust     KBASE_FUNC_HWCNT_DUMP            = KBASE_FUNC_HWCNT_UK_FUNC_ID + 11,
340*c217d954SCole Faust     KBASE_FUNC_HWCNT_CLEAR           = KBASE_FUNC_HWCNT_UK_FUNC_ID + 12,
341*c217d954SCole Faust     KBASE_FUNC_SET_FLAGS             = KBASE_FUNC_HWCNT_UK_FUNC_ID + 18,
342*c217d954SCole Faust 
343*c217d954SCole Faust     /* The ids of ioctl commands for the reader interface */
344*c217d954SCole Faust     KBASE_HWCNT_READER                 = 0xBE,
345*c217d954SCole Faust     KBASE_HWCNT_READER_GET_HWVER       = MALI_IOR(KBASE_HWCNT_READER, 0x00, uint32_t),
346*c217d954SCole Faust     KBASE_HWCNT_READER_GET_BUFFER_SIZE = MALI_IOR(KBASE_HWCNT_READER, 0x01, uint32_t),
347*c217d954SCole Faust     KBASE_HWCNT_READER_DUMP            = MALI_IOW(KBASE_HWCNT_READER, 0x10, uint32_t),
348*c217d954SCole Faust     KBASE_HWCNT_READER_CLEAR           = MALI_IOW(KBASE_HWCNT_READER, 0x11, uint32_t),
349*c217d954SCole Faust     KBASE_HWCNT_READER_GET_BUFFER      = MALI_IOR(KBASE_HWCNT_READER, 0x20, struct kbase_hwcnt_reader_metadata),
350*c217d954SCole Faust     KBASE_HWCNT_READER_PUT_BUFFER      = MALI_IOW(KBASE_HWCNT_READER, 0x21, struct kbase_hwcnt_reader_metadata),
351*c217d954SCole Faust     KBASE_HWCNT_READER_SET_INTERVAL    = MALI_IOW(KBASE_HWCNT_READER, 0x30, uint32_t),
352*c217d954SCole Faust     KBASE_HWCNT_READER_ENABLE_EVENT    = MALI_IOW(KBASE_HWCNT_READER, 0x40, uint32_t),
353*c217d954SCole Faust     KBASE_HWCNT_READER_DISABLE_EVENT   = MALI_IOW(KBASE_HWCNT_READER, 0x41, uint32_t),
354*c217d954SCole Faust     KBASE_HWCNT_READER_GET_API_VERSION = MALI_IOW(KBASE_HWCNT_READER, 0xFF, uint32_t)
355*c217d954SCole Faust 
356*c217d954SCole Faust };
357*c217d954SCole Faust 
358*c217d954SCole Faust enum
359*c217d954SCole Faust {
360*c217d954SCole Faust     PIPE_DESCRIPTOR_IN,  /**< The index of a pipe's input descriptor. */
361*c217d954SCole Faust     PIPE_DESCRIPTOR_OUT, /**< The index of a pipe's output descriptor. */
362*c217d954SCole Faust 
363*c217d954SCole Faust     PIPE_DESCRIPTOR_COUNT /**< The number of descriptors forming a pipe. */
364*c217d954SCole Faust };
365*c217d954SCole Faust 
366*c217d954SCole Faust enum
367*c217d954SCole Faust {
368*c217d954SCole Faust     POLL_DESCRIPTOR_SIGNAL,       /**< The index of the signal descriptor in poll fds array. */
369*c217d954SCole Faust     POLL_DESCRIPTOR_HWCNT_READER, /**< The index of the hwcnt reader descriptor in poll fds array. */
370*c217d954SCole Faust 
371*c217d954SCole Faust     POLL_DESCRIPTOR_COUNT /**< The number of descriptors poll is waiting for. */
372*c217d954SCole Faust };
373*c217d954SCole Faust 
374*c217d954SCole Faust /** Write a single byte into the pipe to interrupt the reader thread */
375*c217d954SCole Faust typedef char poll_data_t;
376*c217d954SCole Faust }
377*c217d954SCole Faust 
378*c217d954SCole Faust template <typename T>
mali_ioctl(int fd,T & arg)379*c217d954SCole Faust static inline int mali_ioctl(int fd, T &arg)
380*c217d954SCole Faust {
381*c217d954SCole Faust     auto     *hdr = &arg.header;
382*c217d954SCole Faust     const int cmd = _IOC(_IOC_READ | _IOC_WRITE, LINUX_UK_BASE_MAGIC, hdr->id, sizeof(T));
383*c217d954SCole Faust 
384*c217d954SCole Faust     if(ioctl(fd, cmd, &arg))
385*c217d954SCole Faust         return -1;
386*c217d954SCole Faust     if(hdr->ret)
387*c217d954SCole Faust         return -1;
388*c217d954SCole Faust 
389*c217d954SCole Faust     return 0;
390*c217d954SCole Faust }
391*c217d954SCole Faust } // namespace mali_userspace
392*c217d954SCole Faust 
393*c217d954SCole Faust #endif /* DOXYGEN_SKIP_THIS */
394*c217d954SCole Faust 
395*c217d954SCole Faust #endif /* ARM_COMPUTE_TEST_HWC */
396