blob: 0d3e45df0037be5e27163ddd8bcbab2acbffdbfe [file] [log] [blame]
/*
*
* (C) COPYRIGHT 2008-2016 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
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;
union kbase_pointer ai;
/* OUT */
u64 gpu_va;
u64 va_pages;
};
struct kbase_uk_mem_import {
union uk_header header;
/* IN */
union kbase_pointer 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 */
union kbase_pointer 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 */
union kbase_pointer kctx; /**< base context created by process */
union kbase_pointer 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 */
#ifdef BASE_LEGACY_UK8_SUPPORT
struct kbase_uk_keep_gpu_powered {
union uk_header header;
u32 enabled;
u32 padding;
};
#endif /* BASE_LEGACY_UK8_SUPPORT */
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;
union kbase_pointer buf;
};
struct kbase_uk_context_id {
union uk_header header;
/* OUT */
int id;
};
#if (defined(MALI_MIPE_ENABLED) && MALI_MIPE_ENABLED) || \
!defined(MALI_MIPE_ENABLED)
/**
* 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 */
#endif /* MALI_MIPE_ENABLED */
/**
* 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),
#ifdef BASE_LEGACY_UK6_SUPPORT
KBASE_FUNC_JOB_SUBMIT_UK6 = (UK_FUNC_ID + 7),
#endif /* BASE_LEGACY_UK6_SUPPORT */
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),
#ifdef BASE_LEGACY_UK8_SUPPORT
KBASE_FUNC_KEEP_GPU_POWERED = (UK_FUNC_ID + 22),
#endif /* BASE_LEGACY_UK8_SUPPORT */
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),
#if (defined(MALI_MIPE_ENABLED) && MALI_MIPE_ENABLED) || \
!defined(MALI_MIPE_ENABLED)
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),
#endif /* MALI_MIPE_ENABLED */
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),
#if (defined(MALI_MIPE_ENABLED) && MALI_MIPE_ENABLED) || \
!defined(MALI_MIPE_ENABLED)
KBASE_FUNC_TLSTREAM_ACQUIRE = (UK_FUNC_ID + 40),
#endif /* MALI_MIPE_ENABLED */
KBASE_FUNC_MAX
};
#endif /* _KBASE_UKU_H_ */