/* 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 #include /* * 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_ */