/* * * (C) COPYRIGHT 2008-2017 ARM Limited. All rights reserved. * * This program is free software and is provided to you under the terms of the * GNU General Public License version 2 as published by the Free Software * Foundation, and any use by you of this program is subject to the terms * of such GNU licence. * * A copy of the licence is included with the program, and can also be obtained * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * */ #ifndef _KBASE_UKU_H_ #define _KBASE_UKU_H_ #include "mali_uk.h" #include "mali_base_kernel.h" /* This file needs to support being included from kernel and userside (which use different defines) */ #if defined(CONFIG_MALI_ERROR_INJECT) || MALI_ERROR_INJECT_ON #define SUPPORT_MALI_ERROR_INJECT #endif /* defined(CONFIG_MALI_ERROR_INJECT) || MALI_ERROR_INJECT_ON */ #if defined(CONFIG_MALI_NO_MALI) #define SUPPORT_MALI_NO_MALI #elif defined(MALI_NO_MALI) #if MALI_NO_MALI #define SUPPORT_MALI_NO_MALI #endif #endif #if defined(SUPPORT_MALI_NO_MALI) || defined(SUPPORT_MALI_ERROR_INJECT) #include "backend/gpu/mali_kbase_model_dummy.h" #endif #include "mali_kbase_gpuprops_types.h" /* * 10.1: * - Do mmap in kernel for SAME_VA memory allocations rather then * calling back into the kernel as a 2nd stage of the allocation request. * * 10.2: * - Add KBASE_FUNC_MEM_JIT_INIT which allows clients to request a custom VA * region for use with JIT (ignored on 32-bit platforms) * * 10.3: * - base_jd_core_req typedef-ed to u32 (instead of to u16) * - two flags added: BASE_JD_REQ_SKIP_CACHE_STAT / _END * * 10.4: * - Removed KBASE_FUNC_EXT_BUFFER_LOCK used only in internal tests * * 10.5: * - Reverted to performing mmap in user space so that tools like valgrind work. * * 10.6: * - Add flags input variable to KBASE_FUNC_TLSTREAM_ACQUIRE */ #define BASE_UK_VERSION_MAJOR 10 #define BASE_UK_VERSION_MINOR 6 #define LINUX_UK_BASE_MAGIC 0x80 struct kbase_uk_mem_alloc { union uk_header header; /* IN */ u64 va_pages; u64 commit_pages; u64 extent; /* IN/OUT */ u64 flags; /* OUT */ u64 gpu_va; u16 va_alignment; u8 padding[6]; }; struct kbase_uk_mem_free { union uk_header header; /* IN */ u64 gpu_addr; /* OUT */ }; struct kbase_uk_mem_alias { union uk_header header; /* IN/OUT */ u64 flags; /* IN */ u64 stride; u64 nents; u64 ai; /* OUT */ u64 gpu_va; u64 va_pages; }; struct kbase_uk_mem_import { union uk_header header; /* IN */ u64 phandle; u32 type; u32 padding; /* IN/OUT */ u64 flags; /* OUT */ u64 gpu_va; u64 va_pages; }; struct kbase_uk_mem_flags_change { union uk_header header; /* IN */ u64 gpu_va; u64 flags; u64 mask; }; struct kbase_uk_job_submit { union uk_header header; /* IN */ u64 addr; u32 nr_atoms; u32 stride; /* bytes between atoms, i.e. sizeof(base_jd_atom_v2) */ /* OUT */ }; struct kbase_uk_post_term { union uk_header header; }; struct kbase_uk_sync_now { union uk_header header; /* IN */ struct base_syncset sset; /* OUT */ }; struct kbase_uk_hwcnt_setup { union uk_header header; /* IN */ u64 dump_buffer; u32 jm_bm; u32 shader_bm; u32 tiler_bm; u32 unused_1; /* keep for backwards compatibility */ u32 mmu_l2_bm; u32 padding; /* OUT */ }; /** * struct kbase_uk_hwcnt_reader_setup - User/Kernel space data exchange structure * @header: UK structure header * @buffer_count: requested number of dumping buffers * @jm_bm: counters selection bitmask (JM) * @shader_bm: counters selection bitmask (Shader) * @tiler_bm: counters selection bitmask (Tiler) * @mmu_l2_bm: counters selection bitmask (MMU_L2) * @fd: dumping notification file descriptor * * This structure sets up HWC dumper/reader for this context. * Multiple instances can be created for single context. */ struct kbase_uk_hwcnt_reader_setup { union uk_header header; /* IN */ u32 buffer_count; u32 jm_bm; u32 shader_bm; u32 tiler_bm; u32 mmu_l2_bm; /* OUT */ s32 fd; }; struct kbase_uk_hwcnt_dump { union uk_header header; }; struct kbase_uk_hwcnt_clear { union uk_header header; }; struct kbase_uk_fence_validate { union uk_header header; /* IN */ s32 fd; u32 padding; /* OUT */ }; struct kbase_uk_stream_create { union uk_header header; /* IN */ char name[32]; /* OUT */ s32 fd; u32 padding; }; struct kbase_uk_gpuprops { union uk_header header; /* IN */ struct mali_base_gpu_props props; /* OUT */ }; struct kbase_uk_mem_query { union uk_header header; /* IN */ u64 gpu_addr; #define KBASE_MEM_QUERY_COMMIT_SIZE 1 #define KBASE_MEM_QUERY_VA_SIZE 2 #define KBASE_MEM_QUERY_FLAGS 3 u64 query; /* OUT */ u64 value; }; struct kbase_uk_mem_commit { union uk_header header; /* IN */ u64 gpu_addr; u64 pages; /* OUT */ u32 result_subcode; u32 padding; }; struct kbase_uk_find_cpu_offset { union uk_header header; /* IN */ u64 gpu_addr; u64 cpu_addr; u64 size; /* OUT */ u64 offset; }; #define KBASE_GET_VERSION_BUFFER_SIZE 64 struct kbase_uk_get_ddk_version { union uk_header header; /* OUT */ char version_buffer[KBASE_GET_VERSION_BUFFER_SIZE]; u32 version_string_size; u32 padding; }; struct kbase_uk_disjoint_query { union uk_header header; /* OUT */ u32 counter; u32 padding; }; struct kbase_uk_set_flags { union uk_header header; /* IN */ u32 create_flags; u32 padding; }; #if MALI_UNIT_TEST #define TEST_ADDR_COUNT 4 #define KBASE_TEST_BUFFER_SIZE 128 struct kbase_exported_test_data { u64 test_addr[TEST_ADDR_COUNT]; /**< memory address */ u32 test_addr_pages[TEST_ADDR_COUNT]; /**< memory size in pages */ u64 kctx; /**< base context created by process */ u64 mm; /**< pointer to process address space */ u8 buffer1[KBASE_TEST_BUFFER_SIZE]; /**< unit test defined parameter */ u8 buffer2[KBASE_TEST_BUFFER_SIZE]; /**< unit test defined parameter */ }; struct kbase_uk_set_test_data { union uk_header header; /* IN */ struct kbase_exported_test_data test_data; }; #endif /* MALI_UNIT_TEST */ #ifdef SUPPORT_MALI_ERROR_INJECT struct kbase_uk_error_params { union uk_header header; /* IN */ struct kbase_error_params params; }; #endif /* SUPPORT_MALI_ERROR_INJECT */ #ifdef SUPPORT_MALI_NO_MALI struct kbase_uk_model_control_params { union uk_header header; /* IN */ struct kbase_model_control_params params; }; #endif /* SUPPORT_MALI_NO_MALI */ struct kbase_uk_profiling_controls { union uk_header header; u32 profiling_controls[FBDUMP_CONTROL_MAX]; }; struct kbase_uk_debugfs_mem_profile_add { union uk_header header; u32 len; u32 padding; u64 buf; }; struct kbase_uk_context_id { union uk_header header; /* OUT */ int id; }; /** * struct kbase_uk_tlstream_acquire - User/Kernel space data exchange structure * @header: UK structure header * @flags: timeline stream flags * @fd: timeline stream file descriptor * * This structure is used when performing a call to acquire kernel side timeline * stream file descriptor. */ struct kbase_uk_tlstream_acquire { union uk_header header; /* IN */ u32 flags; /* OUT */ s32 fd; }; /** * struct kbase_uk_tlstream_acquire_v10_4 - User/Kernel space data exchange * structure * @header: UK structure header * @fd: timeline stream file descriptor * * This structure is used when performing a call to acquire kernel side timeline * stream file descriptor. */ struct kbase_uk_tlstream_acquire_v10_4 { union uk_header header; /* IN */ /* OUT */ s32 fd; }; /** * struct kbase_uk_tlstream_flush - User/Kernel space data exchange structure * @header: UK structure header * * This structure is used when performing a call to flush kernel side * timeline streams. */ struct kbase_uk_tlstream_flush { union uk_header header; /* IN */ /* OUT */ }; #if MALI_UNIT_TEST /** * struct kbase_uk_tlstream_test - User/Kernel space data exchange structure * @header: UK structure header * @tpw_count: number of trace point writers in each context * @msg_delay: time delay between tracepoints from one writer in milliseconds * @msg_count: number of trace points written by one writer * @aux_msg: if non-zero aux messages will be included * * This structure is used when performing a call to start timeline stream test * embedded in kernel. */ struct kbase_uk_tlstream_test { union uk_header header; /* IN */ u32 tpw_count; u32 msg_delay; u32 msg_count; u32 aux_msg; /* OUT */ }; /** * struct kbase_uk_tlstream_stats - User/Kernel space data exchange structure * @header: UK structure header * @bytes_collected: number of bytes read by user * @bytes_generated: number of bytes generated by tracepoints * * This structure is used when performing a call to obtain timeline stream * statistics. */ struct kbase_uk_tlstream_stats { union uk_header header; /**< UK structure header. */ /* IN */ /* OUT */ u32 bytes_collected; u32 bytes_generated; }; #endif /* MALI_UNIT_TEST */ /** * struct struct kbase_uk_prfcnt_value for the KBASE_FUNC_SET_PRFCNT_VALUES ioctl * @header: UK structure header * @data: Counter samples for the dummy model * @size:............Size of the counter sample data */ struct kbase_uk_prfcnt_values { union uk_header header; /* IN */ u32 *data; u32 size; }; /** * struct kbase_uk_soft_event_update - User/Kernel space data exchange structure * @header: UK structure header * @evt: the GPU address containing the event * @new_status: the new event status, must be either BASE_JD_SOFT_EVENT_SET or * BASE_JD_SOFT_EVENT_RESET * @flags: reserved for future uses, must be set to 0 * * This structure is used to update the status of a software event. If the * event's status is set to BASE_JD_SOFT_EVENT_SET, any job currently waiting * on this event will complete. */ struct kbase_uk_soft_event_update { union uk_header header; /* IN */ u64 evt; u32 new_status; u32 flags; }; /** * struct kbase_uk_mem_jit_init - User/Kernel space data exchange structure * @header: UK structure header * @va_pages: Number of virtual pages required for JIT * * This structure is used when requesting initialization of JIT. */ struct kbase_uk_mem_jit_init { union uk_header header; /* IN */ u64 va_pages; }; enum kbase_uk_function_id { KBASE_FUNC_MEM_ALLOC = (UK_FUNC_ID + 0), KBASE_FUNC_MEM_IMPORT = (UK_FUNC_ID + 1), KBASE_FUNC_MEM_COMMIT = (UK_FUNC_ID + 2), KBASE_FUNC_MEM_QUERY = (UK_FUNC_ID + 3), KBASE_FUNC_MEM_FREE = (UK_FUNC_ID + 4), KBASE_FUNC_MEM_FLAGS_CHANGE = (UK_FUNC_ID + 5), KBASE_FUNC_MEM_ALIAS = (UK_FUNC_ID + 6), /* UK_FUNC_ID + 7 not in use since BASE_LEGACY_UK6_SUPPORT dropped */ KBASE_FUNC_SYNC = (UK_FUNC_ID + 8), KBASE_FUNC_POST_TERM = (UK_FUNC_ID + 9), KBASE_FUNC_HWCNT_SETUP = (UK_FUNC_ID + 10), KBASE_FUNC_HWCNT_DUMP = (UK_FUNC_ID + 11), KBASE_FUNC_HWCNT_CLEAR = (UK_FUNC_ID + 12), KBASE_FUNC_GPU_PROPS_REG_DUMP = (UK_FUNC_ID + 14), KBASE_FUNC_FIND_CPU_OFFSET = (UK_FUNC_ID + 15), KBASE_FUNC_GET_VERSION = (UK_FUNC_ID + 16), KBASE_FUNC_SET_FLAGS = (UK_FUNC_ID + 18), KBASE_FUNC_SET_TEST_DATA = (UK_FUNC_ID + 19), KBASE_FUNC_INJECT_ERROR = (UK_FUNC_ID + 20), KBASE_FUNC_MODEL_CONTROL = (UK_FUNC_ID + 21), /* UK_FUNC_ID + 22 not in use since BASE_LEGACY_UK8_SUPPORT dropped */ KBASE_FUNC_FENCE_VALIDATE = (UK_FUNC_ID + 23), KBASE_FUNC_STREAM_CREATE = (UK_FUNC_ID + 24), KBASE_FUNC_GET_PROFILING_CONTROLS = (UK_FUNC_ID + 25), KBASE_FUNC_SET_PROFILING_CONTROLS = (UK_FUNC_ID + 26), /* to be used only for testing * purposes, otherwise these controls * are set through gator API */ KBASE_FUNC_DEBUGFS_MEM_PROFILE_ADD = (UK_FUNC_ID + 27), KBASE_FUNC_JOB_SUBMIT = (UK_FUNC_ID + 28), KBASE_FUNC_DISJOINT_QUERY = (UK_FUNC_ID + 29), KBASE_FUNC_GET_CONTEXT_ID = (UK_FUNC_ID + 31), KBASE_FUNC_TLSTREAM_ACQUIRE_V10_4 = (UK_FUNC_ID + 32), #if MALI_UNIT_TEST KBASE_FUNC_TLSTREAM_TEST = (UK_FUNC_ID + 33), KBASE_FUNC_TLSTREAM_STATS = (UK_FUNC_ID + 34), #endif /* MALI_UNIT_TEST */ KBASE_FUNC_TLSTREAM_FLUSH = (UK_FUNC_ID + 35), KBASE_FUNC_HWCNT_READER_SETUP = (UK_FUNC_ID + 36), #ifdef SUPPORT_MALI_NO_MALI KBASE_FUNC_SET_PRFCNT_VALUES = (UK_FUNC_ID + 37), #endif KBASE_FUNC_SOFT_EVENT_UPDATE = (UK_FUNC_ID + 38), KBASE_FUNC_MEM_JIT_INIT = (UK_FUNC_ID + 39), KBASE_FUNC_TLSTREAM_ACQUIRE = (UK_FUNC_ID + 40), KBASE_FUNC_MAX }; #endif /* _KBASE_UKU_H_ */