aboutsummaryrefslogtreecommitdiff
path: root/tests/framework/instruments/hwc.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/framework/instruments/hwc.hpp')
-rw-r--r--tests/framework/instruments/hwc.hpp379
1 files changed, 379 insertions, 0 deletions
diff --git a/tests/framework/instruments/hwc.hpp b/tests/framework/instruments/hwc.hpp
new file mode 100644
index 0000000000..8411576299
--- /dev/null
+++ b/tests/framework/instruments/hwc.hpp
@@ -0,0 +1,379 @@
+/*
+ * Copyright (c) 2017 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef ARM_COMPUTE_TEST_HWC
+#define ARM_COMPUTE_TEST_HWC
+
+#include "hwc_names.hpp"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <poll.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#include <unistd.h>
+
+#if defined(ANDROID) || defined(__ANDROID__)
+/* 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 */
+#define MALI_IOR(a,b,c) _IOR_BAD(a, b, c)
+#define MALI_IOW(a,b,c) _IOW_BAD(a, b, c)
+#else /* defined(ANDROID) || defined(__ANDROID__) */
+#define MALI_IOR(a,b,c) _IOR(a, b, c)
+#define MALI_IOW(a,b,c) _IOW(a, b, c)
+#endif /* defined(ANDROID) || defined(__ANDROID__) */
+
+namespace mali_userspace
+{
+union uk_header
+{
+ uint32_t id;
+ uint32_t ret;
+ uint64_t sizer;
+};
+
+#define BASE_GPU_NUM_TEXTURE_FEATURES_REGISTERS 3
+#define BASE_MAX_COHERENT_GROUPS 16
+
+struct mali_base_gpu_core_props
+{
+ uint32_t product_id;
+ uint16_t version_status;
+ uint16_t minor_revision;
+ uint16_t major_revision;
+ uint16_t padding;
+ uint32_t gpu_speed_mhz;
+ uint32_t gpu_freq_khz_max;
+ uint32_t gpu_freq_khz_min;
+ uint32_t log2_program_counter_size;
+ uint32_t texture_features[BASE_GPU_NUM_TEXTURE_FEATURES_REGISTERS];
+ uint64_t gpu_available_memory_size;
+};
+
+struct mali_base_gpu_l2_cache_props
+{
+ uint8_t log2_line_size;
+ uint8_t log2_cache_size;
+ uint8_t num_l2_slices;
+ uint8_t padding[5];
+};
+
+struct mali_base_gpu_tiler_props
+{
+ uint32_t bin_size_bytes;
+ uint32_t max_active_levels;
+};
+
+struct mali_base_gpu_thread_props
+{
+ uint32_t max_threads;
+ uint32_t max_workgroup_size;
+ uint32_t max_barrier_size;
+ uint16_t max_registers;
+ uint8_t max_task_queue;
+ uint8_t max_thread_group_split;
+ uint8_t impl_tech;
+ uint8_t padding[7];
+};
+
+struct mali_base_gpu_coherent_group
+{
+ uint64_t core_mask;
+ uint16_t num_cores;
+ uint16_t padding[3];
+};
+
+struct mali_base_gpu_coherent_group_info
+{
+ uint32_t num_groups;
+ uint32_t num_core_groups;
+ uint32_t coherency;
+ uint32_t padding;
+ mali_base_gpu_coherent_group group[BASE_MAX_COHERENT_GROUPS];
+};
+
+#define GPU_MAX_JOB_SLOTS 16
+struct gpu_raw_gpu_props
+{
+ uint64_t shader_present;
+ uint64_t tiler_present;
+ uint64_t l2_present;
+ uint64_t unused_1;
+
+ uint32_t l2_features;
+ uint32_t suspend_size;
+ uint32_t mem_features;
+ uint32_t mmu_features;
+
+ uint32_t as_present;
+
+ uint32_t js_present;
+ uint32_t js_features[GPU_MAX_JOB_SLOTS];
+ uint32_t tiler_features;
+ uint32_t texture_features[3];
+
+ uint32_t gpu_id;
+
+ uint32_t thread_max_threads;
+ uint32_t thread_max_workgroup_size;
+ uint32_t thread_max_barrier_size;
+ uint32_t thread_features;
+
+ uint32_t coherency_mode;
+};
+
+struct mali_base_gpu_props
+{
+ mali_base_gpu_core_props core_props;
+ mali_base_gpu_l2_cache_props l2_props;
+ uint64_t unused;
+ mali_base_gpu_tiler_props tiler_props;
+ mali_base_gpu_thread_props thread_props;
+ gpu_raw_gpu_props raw_props;
+ mali_base_gpu_coherent_group_info coherency_info;
+};
+
+struct kbase_uk_gpuprops
+{
+ uk_header header;
+ mali_base_gpu_props props;
+};
+
+#define KBASE_GPUPROP_VALUE_SIZE_U8 (0x0)
+#define KBASE_GPUPROP_VALUE_SIZE_U16 (0x1)
+#define KBASE_GPUPROP_VALUE_SIZE_U32 (0x2)
+#define KBASE_GPUPROP_VALUE_SIZE_U64 (0x3)
+
+#define KBASE_GPUPROP_PRODUCT_ID 1
+#define KBASE_GPUPROP_MINOR_REVISION 3
+#define KBASE_GPUPROP_MAJOR_REVISION 4
+
+#define KBASE_GPUPROP_COHERENCY_NUM_GROUPS 61
+#define KBASE_GPUPROP_COHERENCY_NUM_CORE_GROUPS 62
+#define KBASE_GPUPROP_COHERENCY_GROUP_0 64
+#define KBASE_GPUPROP_COHERENCY_GROUP_1 65
+#define KBASE_GPUPROP_COHERENCY_GROUP_2 66
+#define KBASE_GPUPROP_COHERENCY_GROUP_3 67
+#define KBASE_GPUPROP_COHERENCY_GROUP_4 68
+#define KBASE_GPUPROP_COHERENCY_GROUP_5 69
+#define KBASE_GPUPROP_COHERENCY_GROUP_6 70
+#define KBASE_GPUPROP_COHERENCY_GROUP_7 71
+#define KBASE_GPUPROP_COHERENCY_GROUP_8 72
+#define KBASE_GPUPROP_COHERENCY_GROUP_9 73
+#define KBASE_GPUPROP_COHERENCY_GROUP_10 74
+#define KBASE_GPUPROP_COHERENCY_GROUP_11 75
+#define KBASE_GPUPROP_COHERENCY_GROUP_12 76
+#define KBASE_GPUPROP_COHERENCY_GROUP_13 77
+#define KBASE_GPUPROP_COHERENCY_GROUP_14 78
+#define KBASE_GPUPROP_COHERENCY_GROUP_15 79
+
+struct gpu_props
+{
+ uint32_t product_id;
+ uint16_t minor_revision;
+ uint16_t major_revision;
+ uint32_t num_groups;
+ uint32_t num_core_groups;
+ uint64_t core_mask[16];
+};
+
+static const struct {
+ uint32_t type;
+ size_t offset;
+ int size;
+} gpu_property_mapping[] = {
+#define PROP(name, member) \
+ {KBASE_GPUPROP_ ## name, offsetof(struct gpu_props, member), \
+ sizeof(((struct gpu_props*)0)->member)}
+#define PROP2(name, member, off) \
+ {KBASE_GPUPROP_ ## name, offsetof(struct gpu_props, member) + off, \
+ sizeof(((struct gpu_props*)0)->member)}
+ PROP(PRODUCT_ID, product_id),
+ PROP(MINOR_REVISION, minor_revision),
+ PROP(MAJOR_REVISION, major_revision),
+ PROP(COHERENCY_NUM_GROUPS, num_groups),
+ PROP(COHERENCY_NUM_CORE_GROUPS, num_core_groups),
+ PROP2(COHERENCY_GROUP_0, core_mask, 0),
+ PROP2(COHERENCY_GROUP_1, core_mask, 1),
+ PROP2(COHERENCY_GROUP_2, core_mask, 2),
+ PROP2(COHERENCY_GROUP_3, core_mask, 3),
+ PROP2(COHERENCY_GROUP_4, core_mask, 4),
+ PROP2(COHERENCY_GROUP_5, core_mask, 5),
+ PROP2(COHERENCY_GROUP_6, core_mask, 6),
+ PROP2(COHERENCY_GROUP_7, core_mask, 7),
+ PROP2(COHERENCY_GROUP_8, core_mask, 8),
+ PROP2(COHERENCY_GROUP_9, core_mask, 9),
+ PROP2(COHERENCY_GROUP_10, core_mask, 10),
+ PROP2(COHERENCY_GROUP_11, core_mask, 11),
+ PROP2(COHERENCY_GROUP_12, core_mask, 12),
+ PROP2(COHERENCY_GROUP_13, core_mask, 13),
+ PROP2(COHERENCY_GROUP_14, core_mask, 14),
+ PROP2(COHERENCY_GROUP_15, core_mask, 15),
+#undef PROP
+#undef PROP2
+ {0, 0, 0}
+};
+
+struct kbase_hwcnt_reader_metadata
+{
+ uint64_t timestamp = 0;
+ uint32_t event_id = 0;
+ uint32_t buffer_idx = 0;
+};
+
+namespace
+{
+/** Message header */
+union kbase_uk_hwcnt_header {
+ /* 32-bit number identifying the UK function to be called. */
+ uint32_t id;
+ /* The int return code returned by the called UK function. */
+ uint32_t ret;
+ /* Used to ensure 64-bit alignment of this union. Do not remove. */
+ uint64_t sizer;
+};
+
+/** IOCTL parameters to check version */
+struct kbase_uk_hwcnt_reader_version_check_args {
+ union kbase_uk_hwcnt_header header;
+
+ uint16_t major;
+ uint16_t minor;
+ uint8_t padding[4];
+};
+
+union kbase_pointer {
+ void *value;
+ uint32_t compat_value;
+ uint64_t sizer;
+};
+
+struct kbase_ioctl_get_gpuprops {
+ kbase_pointer buffer;
+ uint32_t size;
+ uint32_t flags;
+};
+
+#define KBASE_IOCTL_TYPE 0x80
+#define KBASE_IOCTL_GET_GPUPROPS MALI_IOW(KBASE_IOCTL_TYPE, 3, struct kbase_ioctl_get_gpuprops)
+
+/** IOCTL parameters to set flags */
+struct kbase_uk_hwcnt_reader_set_flags {
+ union kbase_uk_hwcnt_header header;
+
+ uint32_t create_flags;
+ uint32_t padding;
+};
+
+/** IOCTL parameters to configure reader */
+struct kbase_uk_hwcnt_reader_setup
+{
+ union kbase_uk_hwcnt_header header;
+
+ /* IN */
+ uint32_t buffer_count;
+ uint32_t jm_bm;
+ uint32_t shader_bm;
+ uint32_t tiler_bm;
+ uint32_t mmu_l2_bm;
+
+ /* OUT */
+ int32_t fd;
+};
+
+static const uint32_t HWCNT_READER_API = 1;
+
+
+struct uku_version_check_args
+{
+ uk_header header;
+ uint16_t major;
+ uint16_t minor;
+ uint8_t padding[4];
+};
+
+enum {
+ UKP_FUNC_ID_CHECK_VERSION = 0,
+ /* Related to mali0 ioctl interface */
+ LINUX_UK_BASE_MAGIC = 0x80,
+ BASE_CONTEXT_CREATE_KERNEL_FLAGS = 0x2,
+ KBASE_FUNC_HWCNT_UK_FUNC_ID = 512,
+ KBASE_FUNC_GPU_PROPS_REG_DUMP = KBASE_FUNC_HWCNT_UK_FUNC_ID + 14,
+ KBASE_FUNC_HWCNT_READER_SETUP = KBASE_FUNC_HWCNT_UK_FUNC_ID + 36,
+ KBASE_FUNC_HWCNT_DUMP = KBASE_FUNC_HWCNT_UK_FUNC_ID + 11,
+ KBASE_FUNC_HWCNT_CLEAR = KBASE_FUNC_HWCNT_UK_FUNC_ID + 12,
+ KBASE_FUNC_SET_FLAGS = KBASE_FUNC_HWCNT_UK_FUNC_ID + 18,
+
+ /* The ids of ioctl commands for the reader interface */
+ KBASE_HWCNT_READER = 0xBE,
+ KBASE_HWCNT_READER_GET_HWVER = MALI_IOR(KBASE_HWCNT_READER, 0x00, uint32_t),
+ KBASE_HWCNT_READER_GET_BUFFER_SIZE = MALI_IOR(KBASE_HWCNT_READER, 0x01, uint32_t),
+ KBASE_HWCNT_READER_DUMP = MALI_IOW(KBASE_HWCNT_READER, 0x10, uint32_t),
+ KBASE_HWCNT_READER_CLEAR = MALI_IOW(KBASE_HWCNT_READER, 0x11, uint32_t),
+ KBASE_HWCNT_READER_GET_BUFFER = MALI_IOR(KBASE_HWCNT_READER, 0x20, struct kbase_hwcnt_reader_metadata),
+ KBASE_HWCNT_READER_PUT_BUFFER = MALI_IOW(KBASE_HWCNT_READER, 0x21, struct kbase_hwcnt_reader_metadata),
+ KBASE_HWCNT_READER_SET_INTERVAL = MALI_IOW(KBASE_HWCNT_READER, 0x30, uint32_t),
+ KBASE_HWCNT_READER_ENABLE_EVENT = MALI_IOW(KBASE_HWCNT_READER, 0x40, uint32_t),
+ KBASE_HWCNT_READER_DISABLE_EVENT = MALI_IOW(KBASE_HWCNT_READER, 0x41, uint32_t),
+ KBASE_HWCNT_READER_GET_API_VERSION = MALI_IOW(KBASE_HWCNT_READER, 0xFF, uint32_t)
+
+};
+
+enum
+{
+ PIPE_DESCRIPTOR_IN, /**< The index of a pipe's input descriptor. */
+ PIPE_DESCRIPTOR_OUT, /**< The index of a pipe's output descriptor. */
+
+ PIPE_DESCRIPTOR_COUNT /**< The number of descriptors forming a pipe. */
+};
+
+enum
+{
+ POLL_DESCRIPTOR_SIGNAL, /**< The index of the signal descriptor in poll fds array. */
+ POLL_DESCRIPTOR_HWCNT_READER, /**< The index of the hwcnt reader descriptor in poll fds array. */
+
+ POLL_DESCRIPTOR_COUNT /**< The number of descriptors poll is waiting for. */
+};
+
+/** Write a single byte into the pipe to interrupt the reader thread */
+typedef char poll_data_t;
+}
+
+template<typename T>
+static inline int mali_ioctl(int fd, T &arg)
+{
+ auto *hdr = &arg.header;
+ const int cmd = _IOC(_IOC_READ | _IOC_WRITE, LINUX_UK_BASE_MAGIC, hdr->id, sizeof(T));
+
+ if (ioctl(fd, cmd, &arg))
+ return -1;
+ if (hdr->ret)
+ return -1;
+
+ return 0;
+}
+} // namespace mali_userspace
+#endif /* ARM_COMPUTE_TEST_HWC */