blob: d2d7ce23491b06096bbfa5962b7c4a01c6b96fc2 [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
/*
*
* (C) COPYRIGHT 2020-2021 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 license.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you can access it online at
* http://www.gnu.org/licenses/gpl-2.0.html.
*
*/
#ifndef _UAPI_KBASE_CSF_IOCTL_H_
#define _UAPI_KBASE_CSF_IOCTL_H_
#include <asm-generic/ioctl.h>
#include <linux/types.h>
/*
* 1.0:
* - CSF IOCTL header separated from JM
* 1.1:
* - Add a new priority level BASE_QUEUE_GROUP_PRIORITY_REALTIME
* - Add ioctl 54: This controls the priority setting.
* 1.2:
* - Add new CSF GPU_FEATURES register into the property structure
* returned by KBASE_IOCTL_GET_GPUPROPS
* 1.3:
* - Add __u32 group_uid member to
* &struct_kbase_ioctl_cs_queue_group_create.out
* 1.4:
* - Replace padding in kbase_ioctl_cs_get_glb_iface with
* instr_features member of same size
* 1.5:
* - Add ioctl 40: kbase_ioctl_cs_queue_register_ex, this is a new
* queue registration call with extended format for supporting CS
* trace configurations with CSF trace_command.
*/
#define BASE_UK_VERSION_MAJOR 1
#define BASE_UK_VERSION_MINOR 5
/**
* struct kbase_ioctl_version_check - Check version compatibility between
* kernel and userspace
*
* @major: Major version number
* @minor: Minor version number
*/
struct kbase_ioctl_version_check {
__u16 major;
__u16 minor;
};
#define KBASE_IOCTL_VERSION_CHECK_RESERVED \
_IOWR(KBASE_IOCTL_TYPE, 0, struct kbase_ioctl_version_check)
/**
* struct kbase_ioctl_cs_queue_register - Register a GPU command queue with the
* base back-end
*
* @buffer_gpu_addr: GPU address of the buffer backing the queue
* @buffer_size: Size of the buffer in bytes
* @priority: Priority of the queue within a group when run within a process
* @padding: Currently unused, must be zero
*
* @Note: There is an identical sub-section in kbase_ioctl_cs_queue_register_ex.
* Any change of this struct should also be mirrored to the latter.
*/
struct kbase_ioctl_cs_queue_register {
__u64 buffer_gpu_addr;
__u32 buffer_size;
__u8 priority;
__u8 padding[3];
};
#define KBASE_IOCTL_CS_QUEUE_REGISTER \
_IOW(KBASE_IOCTL_TYPE, 36, struct kbase_ioctl_cs_queue_register)
/**
* struct kbase_ioctl_cs_queue_kick - Kick the GPU command queue group scheduler
* to notify that a queue has been updated
*
* @buffer_gpu_addr: GPU address of the buffer backing the queue
*/
struct kbase_ioctl_cs_queue_kick {
__u64 buffer_gpu_addr;
};
#define KBASE_IOCTL_CS_QUEUE_KICK \
_IOW(KBASE_IOCTL_TYPE, 37, struct kbase_ioctl_cs_queue_kick)
/**
* union kbase_ioctl_cs_queue_bind - Bind a GPU command queue to a group
*
* @in: Input parameters
* @in.buffer_gpu_addr: GPU address of the buffer backing the queue
* @in.group_handle: Handle of the group to which the queue should be bound
* @in.csi_index: Index of the CSF interface the queue should be bound to
* @in.padding: Currently unused, must be zero
* @out: Output parameters
* @out.mmap_handle: Handle to be used for creating the mapping of CS
* input/output pages
*/
union kbase_ioctl_cs_queue_bind {
struct {
__u64 buffer_gpu_addr;
__u8 group_handle;
__u8 csi_index;
__u8 padding[6];
} in;
struct {
__u64 mmap_handle;
} out;
};
#define KBASE_IOCTL_CS_QUEUE_BIND \
_IOWR(KBASE_IOCTL_TYPE, 39, union kbase_ioctl_cs_queue_bind)
/**
* struct kbase_ioctl_cs_queue_register_ex - Register a GPU command queue with the
* base back-end in extended format,
* involving trace buffer configuration
*
* @buffer_gpu_addr: GPU address of the buffer backing the queue
* @buffer_size: Size of the buffer in bytes
* @priority: Priority of the queue within a group when run within a process
* @padding: Currently unused, must be zero
* @ex_offset_var_addr: GPU address of the trace buffer write offset variable
* @ex_buffer_base: Trace buffer GPU base address for the queue
* @ex_buffer_size: Size of the trace buffer in bytes
* @ex_event_size: Trace event write size, in log2 designation
* @ex_event_state: Trace event states configuration
* @ex_padding: Currently unused, must be zero
*
* @Note: There is an identical sub-section at the start of this struct to that
* of @ref kbase_ioctl_cs_queue_register. Any change of this sub-section
* must also be mirrored to the latter. Following the said sub-section,
* the remaining fields forms the extension, marked with ex_*.
*/
struct kbase_ioctl_cs_queue_register_ex {
__u64 buffer_gpu_addr;
__u32 buffer_size;
__u8 priority;
__u8 padding[3];
__u64 ex_offset_var_addr;
__u64 ex_buffer_base;
__u32 ex_buffer_size;
__u8 ex_event_size;
__u8 ex_event_state;
__u8 ex_padding[2];
};
#define KBASE_IOCTL_CS_QUEUE_REGISTER_EX \
_IOW(KBASE_IOCTL_TYPE, 40, struct kbase_ioctl_cs_queue_register_ex)
/**
* struct kbase_ioctl_cs_queue_terminate - Terminate a GPU command queue
*
* @buffer_gpu_addr: GPU address of the buffer backing the queue
*/
struct kbase_ioctl_cs_queue_terminate {
__u64 buffer_gpu_addr;
};
#define KBASE_IOCTL_CS_QUEUE_TERMINATE \
_IOW(KBASE_IOCTL_TYPE, 41, struct kbase_ioctl_cs_queue_terminate)
/**
* union kbase_ioctl_cs_queue_group_create - Create a GPU command queue group
* @in: Input parameters
* @in.tiler_mask: Mask of tiler endpoints the group is allowed to use.
* @in.fragment_mask: Mask of fragment endpoints the group is allowed to use.
* @in.compute_mask: Mask of compute endpoints the group is allowed to use.
* @in.cs_min: Minimum number of CSs required.
* @in.priority: Queue group's priority within a process.
* @in.tiler_max: Maximum number of tiler endpoints the group is allowed
* to use.
* @in.fragment_max: Maximum number of fragment endpoints the group is
* allowed to use.
* @in.compute_max: Maximum number of compute endpoints the group is allowed
* to use.
* @in.padding: Currently unused, must be zero
* @out: Output parameters
* @out.group_handle: Handle of a newly created queue group.
* @out.padding: Currently unused, must be zero
* @out.group_uid: UID of the queue group available to base.
*/
union kbase_ioctl_cs_queue_group_create {
struct {
__u64 tiler_mask;
__u64 fragment_mask;
__u64 compute_mask;
__u8 cs_min;
__u8 priority;
__u8 tiler_max;
__u8 fragment_max;
__u8 compute_max;
__u8 padding[3];
} in;
struct {
__u8 group_handle;
__u8 padding[3];
__u32 group_uid;
} out;
};
#define KBASE_IOCTL_CS_QUEUE_GROUP_CREATE \
_IOWR(KBASE_IOCTL_TYPE, 42, union kbase_ioctl_cs_queue_group_create)
/**
* struct kbase_ioctl_cs_queue_group_term - Terminate a GPU command queue group
*
* @group_handle: Handle of the queue group to be terminated
* @padding: Padding to round up to a multiple of 8 bytes, must be zero
*/
struct kbase_ioctl_cs_queue_group_term {
__u8 group_handle;
__u8 padding[7];
};
#define KBASE_IOCTL_CS_QUEUE_GROUP_TERMINATE \
_IOW(KBASE_IOCTL_TYPE, 43, struct kbase_ioctl_cs_queue_group_term)
#define KBASE_IOCTL_CS_EVENT_SIGNAL \
_IO(KBASE_IOCTL_TYPE, 44)
typedef __u8 base_kcpu_queue_id; /* We support up to 256 active KCPU queues */
/**
* struct kbase_ioctl_kcpu_queue_new - Create a KCPU command queue
*
* @id: ID of the new command queue returned by the kernel
* @padding: Padding to round up to a multiple of 8 bytes, must be zero
*/
struct kbase_ioctl_kcpu_queue_new {
base_kcpu_queue_id id;
__u8 padding[7];
};
#define KBASE_IOCTL_KCPU_QUEUE_CREATE \
_IOR(KBASE_IOCTL_TYPE, 45, struct kbase_ioctl_kcpu_queue_new)
/**
* struct kbase_ioctl_kcpu_queue_delete - Destroy a KCPU command queue
*
* @id: ID of the command queue to be destroyed
* @padding: Padding to round up to a multiple of 8 bytes, must be zero
*/
struct kbase_ioctl_kcpu_queue_delete {
base_kcpu_queue_id id;
__u8 padding[7];
};
#define KBASE_IOCTL_KCPU_QUEUE_DELETE \
_IOW(KBASE_IOCTL_TYPE, 46, struct kbase_ioctl_kcpu_queue_delete)
/**
* struct kbase_ioctl_kcpu_queue_enqueue - Enqueue commands into the KCPU queue
*
* @addr: Memory address of an array of struct base_kcpu_queue_command
* @nr_commands: Number of commands in the array
* @id: kcpu queue identifier, returned by KBASE_IOCTL_KCPU_QUEUE_CREATE ioctl
* @padding: Padding to round up to a multiple of 8 bytes, must be zero
*/
struct kbase_ioctl_kcpu_queue_enqueue {
__u64 addr;
__u32 nr_commands;
base_kcpu_queue_id id;
__u8 padding[3];
};
#define KBASE_IOCTL_KCPU_QUEUE_ENQUEUE \
_IOW(KBASE_IOCTL_TYPE, 47, struct kbase_ioctl_kcpu_queue_enqueue)
/**
* union kbase_ioctl_cs_tiler_heap_init - Initialize chunked tiler memory heap
* @in: Input parameters
* @in.chunk_size: Size of each chunk.
* @in.initial_chunks: Initial number of chunks that heap will be created with.
* @in.max_chunks: Maximum number of chunks that the heap is allowed to use.
* @in.target_in_flight: Number of render-passes that the driver should attempt to
* keep in flight for which allocation of new chunks is
* allowed.
* @in.group_id: Group ID to be used for physical allocations.
* @in.padding: Padding
* @out: Output parameters
* @out.gpu_heap_va: GPU VA (virtual address) of Heap context that was set up
* for the heap.
* @out.first_chunk_va: GPU VA of the first chunk allocated for the heap,
* actually points to the header of heap chunk and not to
* the low address of free memory in the chunk.
*/
union kbase_ioctl_cs_tiler_heap_init {
struct {
__u32 chunk_size;
__u32 initial_chunks;
__u32 max_chunks;
__u16 target_in_flight;
__u8 group_id;
__u8 padding;
} in;
struct {
__u64 gpu_heap_va;
__u64 first_chunk_va;
} out;
};
#define KBASE_IOCTL_CS_TILER_HEAP_INIT \
_IOWR(KBASE_IOCTL_TYPE, 48, union kbase_ioctl_cs_tiler_heap_init)
/**
* struct kbase_ioctl_cs_tiler_heap_term - Terminate a chunked tiler heap
* instance
*
* @gpu_heap_va: GPU VA of Heap context that was set up for the heap.
*/
struct kbase_ioctl_cs_tiler_heap_term {
__u64 gpu_heap_va;
};
#define KBASE_IOCTL_CS_TILER_HEAP_TERM \
_IOW(KBASE_IOCTL_TYPE, 49, struct kbase_ioctl_cs_tiler_heap_term)
/**
* union kbase_ioctl_cs_get_glb_iface - Request the global control block
* of CSF interface capabilities
*
* @in: Input parameters
* @in.max_group_num: The maximum number of groups to be read. Can be 0, in
* which case groups_ptr is unused.
* @in.max_total_stream _num: The maximum number of CSs to be read. Can be 0, in
* which case streams_ptr is unused.
* @in.groups_ptr: Pointer where to store all the group data (sequentially).
* @in.streams_ptr: Pointer where to store all the CS data (sequentially).
* @out: Output parameters
* @out.glb_version: Global interface version.
* @out.features: Bit mask of features (e.g. whether certain types of job
* can be suspended).
* @out.group_num: Number of CSGs supported.
* @out.prfcnt_size: Size of CSF performance counters, in bytes. Bits 31:16
* hold the size of firmware performance counter data
* and 15:0 hold the size of hardware performance counter
* data.
* @out.total_stream_num: Total number of CSs, summed across all groups.
* @out.instr_features: Instrumentation features. Bits 7:4 hold the maximum
* size of events. Bits 3:0 hold the offset update rate.
* (csf >= 1.1.0)
*
*/
union kbase_ioctl_cs_get_glb_iface {
struct {
__u32 max_group_num;
__u32 max_total_stream_num;
__u64 groups_ptr;
__u64 streams_ptr;
} in;
struct {
__u32 glb_version;
__u32 features;
__u32 group_num;
__u32 prfcnt_size;
__u32 total_stream_num;
__u32 instr_features;
} out;
};
#define KBASE_IOCTL_CS_GET_GLB_IFACE \
_IOWR(KBASE_IOCTL_TYPE, 51, union kbase_ioctl_cs_get_glb_iface)
struct kbase_ioctl_cs_cpu_queue_info {
__u64 buffer;
__u64 size;
};
#define KBASE_IOCTL_VERSION_CHECK \
_IOWR(KBASE_IOCTL_TYPE, 52, struct kbase_ioctl_version_check)
#define KBASE_IOCTL_CS_CPU_QUEUE_DUMP \
_IOW(KBASE_IOCTL_TYPE, 53, struct kbase_ioctl_cs_cpu_queue_info)
/***************
* test ioctls *
***************/
#if MALI_UNIT_TEST
/* These ioctls are purely for test purposes and are not used in the production
* driver, they therefore may change without notice
*/
/**
* struct kbase_ioctl_cs_event_memory_write - Write an event memory address
* @cpu_addr: Memory address to write
* @value: Value to write
* @padding: Currently unused, must be zero
*/
struct kbase_ioctl_cs_event_memory_write {
__u64 cpu_addr;
__u8 value;
__u8 padding[7];
};
/**
* union kbase_ioctl_cs_event_memory_read - Read an event memory address
* @in: Input parameters
* @in.cpu_addr: Memory address to read
* @out: Output parameters
* @out.value: Value read
* @out.padding: Currently unused, must be zero
*/
union kbase_ioctl_cs_event_memory_read {
struct {
__u64 cpu_addr;
} in;
struct {
__u8 value;
__u8 padding[7];
} out;
};
#endif /* MALI_UNIT_TEST */
#endif /* _UAPI_KBASE_CSF_IOCTL_H_ */