xref: /OK3568_Linux_fs/kernel/drivers/gpu/arm/midgard/mali_kbase_ioctl.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  *
3*4882a593Smuzhiyun  * (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * This program is free software and is provided to you under the terms of the
6*4882a593Smuzhiyun  * GNU General Public License version 2 as published by the Free Software
7*4882a593Smuzhiyun  * Foundation, and any use by you of this program is subject to the terms
8*4882a593Smuzhiyun  * of such GNU licence.
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * A copy of the licence is included with the program, and can also be obtained
11*4882a593Smuzhiyun  * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
12*4882a593Smuzhiyun  * Boston, MA  02110-1301, USA.
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  */
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #ifndef _KBASE_IOCTL_H_
19*4882a593Smuzhiyun #define _KBASE_IOCTL_H_
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #ifdef __cpluscplus
22*4882a593Smuzhiyun extern "C" {
23*4882a593Smuzhiyun #endif
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #include <linux/types.h>
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #define KBASE_IOCTL_TYPE 0x80
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun #ifdef ANDROID
30*4882a593Smuzhiyun /* Android's definition of ioctl is incorrect, specifying the type argument as
31*4882a593Smuzhiyun  * 'int'. This creates a warning when using _IOWR (as the top bit is set). Work
32*4882a593Smuzhiyun  * round this by redefining _IOC to include a case to 'int'.
33*4882a593Smuzhiyun  */
34*4882a593Smuzhiyun #undef _IOC
35*4882a593Smuzhiyun #define _IOC(dir, type, nr, size) \
36*4882a593Smuzhiyun 	((int)(((dir) << _IOC_DIRSHIFT) | ((type) << _IOC_TYPESHIFT) | \
37*4882a593Smuzhiyun 	((nr) << _IOC_NRSHIFT) | ((size) << _IOC_SIZESHIFT)))
38*4882a593Smuzhiyun #endif
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun /**
41*4882a593Smuzhiyun  * struct kbase_ioctl_version_check - Check version compatibility with kernel
42*4882a593Smuzhiyun  *
43*4882a593Smuzhiyun  * @major: Major version number
44*4882a593Smuzhiyun  * @minor: Minor version number
45*4882a593Smuzhiyun  */
46*4882a593Smuzhiyun struct kbase_ioctl_version_check {
47*4882a593Smuzhiyun 	__u16 major;
48*4882a593Smuzhiyun 	__u16 minor;
49*4882a593Smuzhiyun };
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun #define KBASE_IOCTL_VERSION_CHECK \
52*4882a593Smuzhiyun 	_IOWR(KBASE_IOCTL_TYPE, 0, struct kbase_ioctl_version_check)
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun /**
55*4882a593Smuzhiyun  * struct kbase_ioctl_set_flags - Set kernel context creation flags
56*4882a593Smuzhiyun  *
57*4882a593Smuzhiyun  * @create_flags: Flags - see base_context_create_flags
58*4882a593Smuzhiyun  */
59*4882a593Smuzhiyun struct kbase_ioctl_set_flags {
60*4882a593Smuzhiyun 	__u32 create_flags;
61*4882a593Smuzhiyun };
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun #define KBASE_IOCTL_SET_FLAGS \
64*4882a593Smuzhiyun 	_IOW(KBASE_IOCTL_TYPE, 1, struct kbase_ioctl_set_flags)
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun /**
67*4882a593Smuzhiyun  * struct kbase_ioctl_job_submit - Submit jobs/atoms to the kernel
68*4882a593Smuzhiyun  *
69*4882a593Smuzhiyun  * @addr: Memory address of an array of struct base_jd_atom_v2
70*4882a593Smuzhiyun  * @nr_atoms: Number of entries in the array
71*4882a593Smuzhiyun  * @stride: sizeof(struct base_jd_atom_v2)
72*4882a593Smuzhiyun  */
73*4882a593Smuzhiyun struct kbase_ioctl_job_submit {
74*4882a593Smuzhiyun 	union kbase_pointer addr;
75*4882a593Smuzhiyun 	__u32 nr_atoms;
76*4882a593Smuzhiyun 	__u32 stride;
77*4882a593Smuzhiyun };
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun #define KBASE_IOCTL_JOB_SUBMIT \
80*4882a593Smuzhiyun 	_IOW(KBASE_IOCTL_TYPE, 2, struct kbase_ioctl_job_submit)
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun /**
83*4882a593Smuzhiyun  * struct kbase_ioctl_get_gpuprops - Read GPU properties from the kernel
84*4882a593Smuzhiyun  *
85*4882a593Smuzhiyun  * @buffer: Pointer to the buffer to store properties into
86*4882a593Smuzhiyun  * @size: Size of the buffer
87*4882a593Smuzhiyun  * @flags: Flags - must be zero for now
88*4882a593Smuzhiyun  *
89*4882a593Smuzhiyun  * The ioctl will return the number of bytes stored into @buffer or an error
90*4882a593Smuzhiyun  * on failure (e.g. @size is too small). If @size is specified as 0 then no
91*4882a593Smuzhiyun  * data will be written but the return value will be the number of bytes needed
92*4882a593Smuzhiyun  * for all the properties.
93*4882a593Smuzhiyun  *
94*4882a593Smuzhiyun  * @flags may be used in the future to request a different format for the
95*4882a593Smuzhiyun  * buffer. With @flags == 0 the following format is used.
96*4882a593Smuzhiyun  *
97*4882a593Smuzhiyun  * The buffer will be filled with pairs of values, a u32 key identifying the
98*4882a593Smuzhiyun  * property followed by the value. The size of the value is identified using
99*4882a593Smuzhiyun  * the bottom bits of the key. The value then immediately followed the key and
100*4882a593Smuzhiyun  * is tightly packed (there is no padding). All keys and values are
101*4882a593Smuzhiyun  * little-endian.
102*4882a593Smuzhiyun  *
103*4882a593Smuzhiyun  * 00 = u8
104*4882a593Smuzhiyun  * 01 = u16
105*4882a593Smuzhiyun  * 10 = u32
106*4882a593Smuzhiyun  * 11 = u64
107*4882a593Smuzhiyun  */
108*4882a593Smuzhiyun struct kbase_ioctl_get_gpuprops {
109*4882a593Smuzhiyun 	union kbase_pointer buffer;
110*4882a593Smuzhiyun 	__u32 size;
111*4882a593Smuzhiyun 	__u32 flags;
112*4882a593Smuzhiyun };
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun #define KBASE_IOCTL_GET_GPUPROPS \
115*4882a593Smuzhiyun 	_IOW(KBASE_IOCTL_TYPE, 3, struct kbase_ioctl_get_gpuprops)
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun #define KBASE_IOCTL_POST_TERM \
118*4882a593Smuzhiyun 	_IO(KBASE_IOCTL_TYPE, 4)
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun /**
121*4882a593Smuzhiyun  * union kbase_ioctl_mem_alloc - Allocate memory on the GPU
122*4882a593Smuzhiyun  *
123*4882a593Smuzhiyun  * @va_pages: The number of pages of virtual address space to reserve
124*4882a593Smuzhiyun  * @commit_pages: The number of physical pages to allocate
125*4882a593Smuzhiyun  * @extent: The number of extra pages to allocate on each GPU fault which grows
126*4882a593Smuzhiyun  *          the region
127*4882a593Smuzhiyun  * @flags: Flags
128*4882a593Smuzhiyun  * @gpu_va: The GPU virtual address which is allocated
129*4882a593Smuzhiyun  *
130*4882a593Smuzhiyun  * @in: Input parameters
131*4882a593Smuzhiyun  * @out: Output parameters
132*4882a593Smuzhiyun  */
133*4882a593Smuzhiyun union kbase_ioctl_mem_alloc {
134*4882a593Smuzhiyun 	struct {
135*4882a593Smuzhiyun 		__u64 va_pages;
136*4882a593Smuzhiyun 		__u64 commit_pages;
137*4882a593Smuzhiyun 		__u64 extent;
138*4882a593Smuzhiyun 		__u64 flags;
139*4882a593Smuzhiyun 	} in;
140*4882a593Smuzhiyun 	struct {
141*4882a593Smuzhiyun 		__u64 flags;
142*4882a593Smuzhiyun 		__u64 gpu_va;
143*4882a593Smuzhiyun 	} out;
144*4882a593Smuzhiyun };
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun #define KBASE_IOCTL_MEM_ALLOC \
147*4882a593Smuzhiyun 	_IOWR(KBASE_IOCTL_TYPE, 5, union kbase_ioctl_mem_alloc)
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun /**
150*4882a593Smuzhiyun  * struct kbase_ioctl_mem_query - Query properties of a GPU memory region
151*4882a593Smuzhiyun  * @gpu_addr: A GPU address contained within the region
152*4882a593Smuzhiyun  * @query: The type of query
153*4882a593Smuzhiyun  * @value: The result of the query
154*4882a593Smuzhiyun  *
155*4882a593Smuzhiyun  * Use a %KBASE_MEM_QUERY_xxx flag as input for @query.
156*4882a593Smuzhiyun  *
157*4882a593Smuzhiyun  * @in: Input parameters
158*4882a593Smuzhiyun  * @out: Output parameters
159*4882a593Smuzhiyun  */
160*4882a593Smuzhiyun union kbase_ioctl_mem_query {
161*4882a593Smuzhiyun 	struct {
162*4882a593Smuzhiyun 		__u64 gpu_addr;
163*4882a593Smuzhiyun 		__u64 query;
164*4882a593Smuzhiyun 	} in;
165*4882a593Smuzhiyun 	struct {
166*4882a593Smuzhiyun 		__u64 value;
167*4882a593Smuzhiyun 	} out;
168*4882a593Smuzhiyun };
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun #define KBASE_IOCTL_MEM_QUERY \
171*4882a593Smuzhiyun 	_IOWR(KBASE_IOCTL_TYPE, 6, union kbase_ioctl_mem_query)
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun #define KBASE_MEM_QUERY_COMMIT_SIZE	1
174*4882a593Smuzhiyun #define KBASE_MEM_QUERY_VA_SIZE		2
175*4882a593Smuzhiyun #define KBASE_MEM_QUERY_FLAGS		3
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun /**
178*4882a593Smuzhiyun  * struct kbase_ioctl_mem_free - Free a memory region
179*4882a593Smuzhiyun  * @gpu_addr: Handle to the region to free
180*4882a593Smuzhiyun  */
181*4882a593Smuzhiyun struct kbase_ioctl_mem_free {
182*4882a593Smuzhiyun 	__u64 gpu_addr;
183*4882a593Smuzhiyun };
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun #define KBASE_IOCTL_MEM_FREE \
186*4882a593Smuzhiyun 	_IOW(KBASE_IOCTL_TYPE, 7, struct kbase_ioctl_mem_free)
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun /**
189*4882a593Smuzhiyun  * struct kbase_ioctl_hwcnt_reader_setup - Setup HWC dumper/reader
190*4882a593Smuzhiyun  * @buffer_count: requested number of dumping buffers
191*4882a593Smuzhiyun  * @jm_bm:        counters selection bitmask (JM)
192*4882a593Smuzhiyun  * @shader_bm:    counters selection bitmask (Shader)
193*4882a593Smuzhiyun  * @tiler_bm:     counters selection bitmask (Tiler)
194*4882a593Smuzhiyun  * @mmu_l2_bm:    counters selection bitmask (MMU_L2)
195*4882a593Smuzhiyun  *
196*4882a593Smuzhiyun  * A fd is returned from the ioctl if successful, or a negative value on error
197*4882a593Smuzhiyun  */
198*4882a593Smuzhiyun struct kbase_ioctl_hwcnt_reader_setup {
199*4882a593Smuzhiyun 	__u32 buffer_count;
200*4882a593Smuzhiyun 	__u32 jm_bm;
201*4882a593Smuzhiyun 	__u32 shader_bm;
202*4882a593Smuzhiyun 	__u32 tiler_bm;
203*4882a593Smuzhiyun 	__u32 mmu_l2_bm;
204*4882a593Smuzhiyun };
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun #define KBASE_IOCTL_HWCNT_READER_SETUP \
207*4882a593Smuzhiyun 	_IOW(KBASE_IOCTL_TYPE, 8, struct kbase_ioctl_hwcnt_reader_setup)
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun /**
210*4882a593Smuzhiyun  * struct kbase_ioctl_hwcnt_enable - Enable hardware counter collection
211*4882a593Smuzhiyun  * @dump_buffer:  GPU address to write counters to
212*4882a593Smuzhiyun  * @jm_bm:        counters selection bitmask (JM)
213*4882a593Smuzhiyun  * @shader_bm:    counters selection bitmask (Shader)
214*4882a593Smuzhiyun  * @tiler_bm:     counters selection bitmask (Tiler)
215*4882a593Smuzhiyun  * @mmu_l2_bm:    counters selection bitmask (MMU_L2)
216*4882a593Smuzhiyun  */
217*4882a593Smuzhiyun struct kbase_ioctl_hwcnt_enable {
218*4882a593Smuzhiyun 	__u64 dump_buffer;
219*4882a593Smuzhiyun 	__u32 jm_bm;
220*4882a593Smuzhiyun 	__u32 shader_bm;
221*4882a593Smuzhiyun 	__u32 tiler_bm;
222*4882a593Smuzhiyun 	__u32 mmu_l2_bm;
223*4882a593Smuzhiyun };
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun #define KBASE_IOCTL_HWCNT_ENABLE \
226*4882a593Smuzhiyun 	_IOW(KBASE_IOCTL_TYPE, 9, struct kbase_ioctl_hwcnt_enable)
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun #define KBASE_IOCTL_HWCNT_DUMP \
229*4882a593Smuzhiyun 	_IO(KBASE_IOCTL_TYPE, 10)
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun #define KBASE_IOCTL_HWCNT_CLEAR \
232*4882a593Smuzhiyun 	_IO(KBASE_IOCTL_TYPE, 11)
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun /**
235*4882a593Smuzhiyun  * struct kbase_ioctl_disjoint_query - Query the disjoint counter
236*4882a593Smuzhiyun  * @counter:   A counter of disjoint events in the kernel
237*4882a593Smuzhiyun  */
238*4882a593Smuzhiyun struct kbase_ioctl_disjoint_query {
239*4882a593Smuzhiyun 	__u32 counter;
240*4882a593Smuzhiyun };
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun #define KBASE_IOCTL_DISJOINT_QUERY \
243*4882a593Smuzhiyun 	_IOR(KBASE_IOCTL_TYPE, 12, struct kbase_ioctl_disjoint_query)
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun /**
246*4882a593Smuzhiyun  * struct kbase_ioctl_get_ddk_version - Query the kernel version
247*4882a593Smuzhiyun  * @version_buffer: Buffer to receive the kernel version string
248*4882a593Smuzhiyun  * @size: Size of the buffer
249*4882a593Smuzhiyun  *
250*4882a593Smuzhiyun  * The ioctl will return the number of bytes written into version_buffer
251*4882a593Smuzhiyun  * (which includes a NULL byte) or a negative error code
252*4882a593Smuzhiyun  */
253*4882a593Smuzhiyun struct kbase_ioctl_get_ddk_version {
254*4882a593Smuzhiyun 	union kbase_pointer version_buffer;
255*4882a593Smuzhiyun 	__u32 size;
256*4882a593Smuzhiyun };
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun #define KBASE_IOCTL_GET_DDK_VERSION \
259*4882a593Smuzhiyun 	_IOW(KBASE_IOCTL_TYPE, 13, struct kbase_ioctl_get_ddk_version)
260*4882a593Smuzhiyun 
261*4882a593Smuzhiyun /**
262*4882a593Smuzhiyun  * struct kbase_ioctl_mem_jit_init - Initialise the JIT memory allocator
263*4882a593Smuzhiyun  *
264*4882a593Smuzhiyun  * @va_pages: Number of VA pages to reserve for JIT
265*4882a593Smuzhiyun  *
266*4882a593Smuzhiyun  * Note that depending on the VA size of the application and GPU, the value
267*4882a593Smuzhiyun  * specified in @va_pages may be ignored.
268*4882a593Smuzhiyun  */
269*4882a593Smuzhiyun struct kbase_ioctl_mem_jit_init {
270*4882a593Smuzhiyun 	__u64 va_pages;
271*4882a593Smuzhiyun };
272*4882a593Smuzhiyun 
273*4882a593Smuzhiyun #define KBASE_IOCTL_MEM_JIT_INIT \
274*4882a593Smuzhiyun 	_IOW(KBASE_IOCTL_TYPE, 14, struct kbase_ioctl_mem_jit_init)
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun /**
277*4882a593Smuzhiyun  * struct kbase_ioctl_mem_sync - Perform cache maintenance on memory
278*4882a593Smuzhiyun  *
279*4882a593Smuzhiyun  * @handle: GPU memory handle (GPU VA)
280*4882a593Smuzhiyun  * @user_addr: The address where it is mapped in user space
281*4882a593Smuzhiyun  * @size: The number of bytes to synchronise
282*4882a593Smuzhiyun  * @type: The direction to synchronise: 0 is sync to memory (clean),
283*4882a593Smuzhiyun  * 1 is sync from memory (invalidate). Use the BASE_SYNCSET_OP_xxx constants.
284*4882a593Smuzhiyun  * @padding: Padding to round up to a multiple of 8 bytes, must be zero
285*4882a593Smuzhiyun  */
286*4882a593Smuzhiyun struct kbase_ioctl_mem_sync {
287*4882a593Smuzhiyun 	__u64 handle;
288*4882a593Smuzhiyun 	__u64 user_addr;
289*4882a593Smuzhiyun 	__u64 size;
290*4882a593Smuzhiyun 	__u8 type;
291*4882a593Smuzhiyun 	__u8 padding[7];
292*4882a593Smuzhiyun };
293*4882a593Smuzhiyun 
294*4882a593Smuzhiyun #define KBASE_IOCTL_MEM_SYNC \
295*4882a593Smuzhiyun 	_IOW(KBASE_IOCTL_TYPE, 15, struct kbase_ioctl_mem_sync)
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun /**
298*4882a593Smuzhiyun  * union kbase_ioctl_mem_find_cpu_offset - Find the offset of a CPU pointer
299*4882a593Smuzhiyun  *
300*4882a593Smuzhiyun  * @gpu_addr: The GPU address of the memory region
301*4882a593Smuzhiyun  * @cpu_addr: The CPU address to locate
302*4882a593Smuzhiyun  * @size: A size in bytes to validate is contained within the region
303*4882a593Smuzhiyun  * @offset: The offset from the start of the memory region to @cpu_addr
304*4882a593Smuzhiyun  *
305*4882a593Smuzhiyun  * @in: Input parameters
306*4882a593Smuzhiyun  * @out: Output parameters
307*4882a593Smuzhiyun  */
308*4882a593Smuzhiyun union kbase_ioctl_mem_find_cpu_offset {
309*4882a593Smuzhiyun 	struct {
310*4882a593Smuzhiyun 		__u64 gpu_addr;
311*4882a593Smuzhiyun 		__u64 cpu_addr;
312*4882a593Smuzhiyun 		__u64 size;
313*4882a593Smuzhiyun 	} in;
314*4882a593Smuzhiyun 	struct {
315*4882a593Smuzhiyun 		__u64 offset;
316*4882a593Smuzhiyun 	} out;
317*4882a593Smuzhiyun };
318*4882a593Smuzhiyun 
319*4882a593Smuzhiyun #define KBASE_IOCTL_MEM_FIND_CPU_OFFSET \
320*4882a593Smuzhiyun 	_IOWR(KBASE_IOCTL_TYPE, 16, union kbase_ioctl_mem_find_cpu_offset)
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun /**
323*4882a593Smuzhiyun  * struct kbase_ioctl_get_context_id - Get the kernel context ID
324*4882a593Smuzhiyun  *
325*4882a593Smuzhiyun  * @id: The kernel context ID
326*4882a593Smuzhiyun  */
327*4882a593Smuzhiyun struct kbase_ioctl_get_context_id {
328*4882a593Smuzhiyun 	int id; /* This should really be __u32, but see GPUCORE-10048 */
329*4882a593Smuzhiyun };
330*4882a593Smuzhiyun 
331*4882a593Smuzhiyun #define KBASE_IOCTL_GET_CONTEXT_ID \
332*4882a593Smuzhiyun 	_IOR(KBASE_IOCTL_TYPE, 17, struct kbase_ioctl_get_context_id)
333*4882a593Smuzhiyun 
334*4882a593Smuzhiyun /**
335*4882a593Smuzhiyun  * struct kbase_ioctl_tlstream_acquire - Acquire a tlstream fd
336*4882a593Smuzhiyun  *
337*4882a593Smuzhiyun  * @flags: Flags
338*4882a593Smuzhiyun  *
339*4882a593Smuzhiyun  * The ioctl returns a file descriptor when successful
340*4882a593Smuzhiyun  */
341*4882a593Smuzhiyun struct kbase_ioctl_tlstream_acquire {
342*4882a593Smuzhiyun 	__u32 flags;
343*4882a593Smuzhiyun };
344*4882a593Smuzhiyun 
345*4882a593Smuzhiyun #define KBASE_IOCTL_TLSTREAM_ACQUIRE \
346*4882a593Smuzhiyun 	_IOW(KBASE_IOCTL_TYPE, 18, struct kbase_ioctl_tlstream_acquire)
347*4882a593Smuzhiyun 
348*4882a593Smuzhiyun #define KBASE_IOCTL_TLSTREAM_FLUSH \
349*4882a593Smuzhiyun 	_IO(KBASE_IOCTL_TYPE, 19)
350*4882a593Smuzhiyun 
351*4882a593Smuzhiyun /**
352*4882a593Smuzhiyun  * struct kbase_ioctl_mem_commit - Change the amount of memory backing a region
353*4882a593Smuzhiyun  *
354*4882a593Smuzhiyun  * @gpu_addr: The memory region to modify
355*4882a593Smuzhiyun  * @pages:    The number of physical pages that should be present
356*4882a593Smuzhiyun  *
357*4882a593Smuzhiyun  * The ioctl may return on the following error codes or 0 for success:
358*4882a593Smuzhiyun  *   -ENOMEM: Out of memory
359*4882a593Smuzhiyun  *   -EINVAL: Invalid arguments
360*4882a593Smuzhiyun  */
361*4882a593Smuzhiyun struct kbase_ioctl_mem_commit {
362*4882a593Smuzhiyun 	__u64 gpu_addr;
363*4882a593Smuzhiyun 	__u64 pages;
364*4882a593Smuzhiyun };
365*4882a593Smuzhiyun 
366*4882a593Smuzhiyun #define KBASE_IOCTL_MEM_COMMIT \
367*4882a593Smuzhiyun 	_IOW(KBASE_IOCTL_TYPE, 20, struct kbase_ioctl_mem_commit)
368*4882a593Smuzhiyun 
369*4882a593Smuzhiyun /**
370*4882a593Smuzhiyun  * union kbase_ioctl_mem_alias - Create an alias of memory regions
371*4882a593Smuzhiyun  * @flags: Flags, see BASE_MEM_xxx
372*4882a593Smuzhiyun  * @stride: Bytes between start of each memory region
373*4882a593Smuzhiyun  * @nents: The number of regions to pack together into the alias
374*4882a593Smuzhiyun  * @aliasing_info: Pointer to an array of struct base_mem_aliasing_info
375*4882a593Smuzhiyun  * @gpu_va: Address of the new alias
376*4882a593Smuzhiyun  * @va_pages: Size of the new alias
377*4882a593Smuzhiyun  *
378*4882a593Smuzhiyun  * @in: Input parameters
379*4882a593Smuzhiyun  * @out: Output parameters
380*4882a593Smuzhiyun  */
381*4882a593Smuzhiyun union kbase_ioctl_mem_alias {
382*4882a593Smuzhiyun 	struct {
383*4882a593Smuzhiyun 		__u64 flags;
384*4882a593Smuzhiyun 		__u64 stride;
385*4882a593Smuzhiyun 		__u64 nents;
386*4882a593Smuzhiyun 		union kbase_pointer aliasing_info;
387*4882a593Smuzhiyun 	} in;
388*4882a593Smuzhiyun 	struct {
389*4882a593Smuzhiyun 		__u64 flags;
390*4882a593Smuzhiyun 		__u64 gpu_va;
391*4882a593Smuzhiyun 		__u64 va_pages;
392*4882a593Smuzhiyun 	} out;
393*4882a593Smuzhiyun };
394*4882a593Smuzhiyun 
395*4882a593Smuzhiyun #define KBASE_IOCTL_MEM_ALIAS \
396*4882a593Smuzhiyun 	_IOWR(KBASE_IOCTL_TYPE, 21, union kbase_ioctl_mem_alias)
397*4882a593Smuzhiyun 
398*4882a593Smuzhiyun /**
399*4882a593Smuzhiyun  * union kbase_ioctl_mem_import - Import memory for use by the GPU
400*4882a593Smuzhiyun  * @flags: Flags, see BASE_MEM_xxx
401*4882a593Smuzhiyun  * @phandle: Handle to the external memory
402*4882a593Smuzhiyun  * @type: Type of external memory, see base_mem_import_type
403*4882a593Smuzhiyun  * @padding: Amount of extra VA pages to append to the imported buffer
404*4882a593Smuzhiyun  * @gpu_va: Address of the new alias
405*4882a593Smuzhiyun  * @va_pages: Size of the new alias
406*4882a593Smuzhiyun  *
407*4882a593Smuzhiyun  * @in: Input parameters
408*4882a593Smuzhiyun  * @out: Output parameters
409*4882a593Smuzhiyun  */
410*4882a593Smuzhiyun union kbase_ioctl_mem_import {
411*4882a593Smuzhiyun 	struct {
412*4882a593Smuzhiyun 		__u64 flags;
413*4882a593Smuzhiyun 		union kbase_pointer phandle;
414*4882a593Smuzhiyun 		__u32 type;
415*4882a593Smuzhiyun 		__u32 padding;
416*4882a593Smuzhiyun 	} in;
417*4882a593Smuzhiyun 	struct {
418*4882a593Smuzhiyun 		__u64 flags;
419*4882a593Smuzhiyun 		__u64 gpu_va;
420*4882a593Smuzhiyun 		__u64 va_pages;
421*4882a593Smuzhiyun 	} out;
422*4882a593Smuzhiyun };
423*4882a593Smuzhiyun 
424*4882a593Smuzhiyun #define KBASE_IOCTL_MEM_IMPORT \
425*4882a593Smuzhiyun 	_IOWR(KBASE_IOCTL_TYPE, 22, union kbase_ioctl_mem_import)
426*4882a593Smuzhiyun 
427*4882a593Smuzhiyun /**
428*4882a593Smuzhiyun  * struct kbase_ioctl_mem_flags_change - Change the flags for a memory region
429*4882a593Smuzhiyun  * @gpu_va: The GPU region to modify
430*4882a593Smuzhiyun  * @flags: The new flags to set
431*4882a593Smuzhiyun  * @mask: Mask of the flags to modify
432*4882a593Smuzhiyun  */
433*4882a593Smuzhiyun struct kbase_ioctl_mem_flags_change {
434*4882a593Smuzhiyun 	__u64 gpu_va;
435*4882a593Smuzhiyun 	__u64 flags;
436*4882a593Smuzhiyun 	__u64 mask;
437*4882a593Smuzhiyun };
438*4882a593Smuzhiyun 
439*4882a593Smuzhiyun #define KBASE_IOCTL_MEM_FLAGS_CHANGE \
440*4882a593Smuzhiyun 	_IOW(KBASE_IOCTL_TYPE, 23, struct kbase_ioctl_mem_flags_change)
441*4882a593Smuzhiyun 
442*4882a593Smuzhiyun /**
443*4882a593Smuzhiyun  * struct kbase_ioctl_stream_create - Create a synchronisation stream
444*4882a593Smuzhiyun  * @name: A name to identify this stream. Must be NULL-terminated.
445*4882a593Smuzhiyun  *
446*4882a593Smuzhiyun  * Note that this is also called a "timeline", but is named stream to avoid
447*4882a593Smuzhiyun  * confusion with other uses of the word.
448*4882a593Smuzhiyun  *
449*4882a593Smuzhiyun  * Unused bytes in @name (after the first NULL byte) must be also be NULL bytes.
450*4882a593Smuzhiyun  *
451*4882a593Smuzhiyun  * The ioctl returns a file descriptor.
452*4882a593Smuzhiyun  */
453*4882a593Smuzhiyun struct kbase_ioctl_stream_create {
454*4882a593Smuzhiyun 	char name[32];
455*4882a593Smuzhiyun };
456*4882a593Smuzhiyun 
457*4882a593Smuzhiyun #define KBASE_IOCTL_STREAM_CREATE \
458*4882a593Smuzhiyun 	_IOW(KBASE_IOCTL_TYPE, 24, struct kbase_ioctl_stream_create)
459*4882a593Smuzhiyun 
460*4882a593Smuzhiyun /**
461*4882a593Smuzhiyun  * struct kbase_ioctl_fence_validate - Validate a fd refers to a fence
462*4882a593Smuzhiyun  * @fd: The file descriptor to validate
463*4882a593Smuzhiyun  */
464*4882a593Smuzhiyun struct kbase_ioctl_fence_validate {
465*4882a593Smuzhiyun 	int fd;
466*4882a593Smuzhiyun };
467*4882a593Smuzhiyun 
468*4882a593Smuzhiyun #define KBASE_IOCTL_FENCE_VALIDATE \
469*4882a593Smuzhiyun 	_IOW(KBASE_IOCTL_TYPE, 25, struct kbase_ioctl_fence_validate)
470*4882a593Smuzhiyun 
471*4882a593Smuzhiyun /**
472*4882a593Smuzhiyun  * struct kbase_ioctl_get_profiling_controls - Get the profiling controls
473*4882a593Smuzhiyun  * @count: The size of @buffer in u32 words
474*4882a593Smuzhiyun  * @buffer: The buffer to receive the profiling controls
475*4882a593Smuzhiyun  */
476*4882a593Smuzhiyun struct kbase_ioctl_get_profiling_controls {
477*4882a593Smuzhiyun 	union kbase_pointer buffer;
478*4882a593Smuzhiyun 	__u32 count;
479*4882a593Smuzhiyun };
480*4882a593Smuzhiyun 
481*4882a593Smuzhiyun #define KBASE_IOCTL_GET_PROFILING_CONTROLS \
482*4882a593Smuzhiyun 	_IOW(KBASE_IOCTL_TYPE, 26, struct kbase_ioctl_get_profiling_controls)
483*4882a593Smuzhiyun 
484*4882a593Smuzhiyun /**
485*4882a593Smuzhiyun  * struct kbase_ioctl_mem_profile_add - Provide profiling information to kernel
486*4882a593Smuzhiyun  * @buffer: Pointer to the information
487*4882a593Smuzhiyun  * @len: Length
488*4882a593Smuzhiyun  * @padding: Padding
489*4882a593Smuzhiyun  *
490*4882a593Smuzhiyun  * The data provided is accessible through a debugfs file
491*4882a593Smuzhiyun  */
492*4882a593Smuzhiyun struct kbase_ioctl_mem_profile_add {
493*4882a593Smuzhiyun 	union kbase_pointer buffer;
494*4882a593Smuzhiyun 	__u32 len;
495*4882a593Smuzhiyun 	__u32 padding;
496*4882a593Smuzhiyun };
497*4882a593Smuzhiyun 
498*4882a593Smuzhiyun #define KBASE_IOCTL_MEM_PROFILE_ADD \
499*4882a593Smuzhiyun 	_IOW(KBASE_IOCTL_TYPE, 27, struct kbase_ioctl_mem_profile_add)
500*4882a593Smuzhiyun 
501*4882a593Smuzhiyun /**
502*4882a593Smuzhiyun  * struct kbase_ioctl_soft_event_update - Update the status of a soft-event
503*4882a593Smuzhiyun  * @event: GPU address of the event which has been updated
504*4882a593Smuzhiyun  * @new_status: The new status to set
505*4882a593Smuzhiyun  * @flags: Flags for future expansion
506*4882a593Smuzhiyun  */
507*4882a593Smuzhiyun struct kbase_ioctl_soft_event_update {
508*4882a593Smuzhiyun 	__u64 event;
509*4882a593Smuzhiyun 	__u32 new_status;
510*4882a593Smuzhiyun 	__u32 flags;
511*4882a593Smuzhiyun };
512*4882a593Smuzhiyun 
513*4882a593Smuzhiyun #define KBASE_IOCTL_SOFT_EVENT_UPDATE \
514*4882a593Smuzhiyun 	_IOW(KBASE_IOCTL_TYPE, 28, struct kbase_ioctl_soft_event_update)
515*4882a593Smuzhiyun 
516*4882a593Smuzhiyun /***************
517*4882a593Smuzhiyun  * test ioctls *
518*4882a593Smuzhiyun  ***************/
519*4882a593Smuzhiyun #if MALI_UNIT_TEST
520*4882a593Smuzhiyun /* These ioctls are purely for test purposes and are not used in the production
521*4882a593Smuzhiyun  * driver, they therefore may change without notice
522*4882a593Smuzhiyun  */
523*4882a593Smuzhiyun 
524*4882a593Smuzhiyun #define KBASE_IOCTL_TEST_TYPE (KBASE_IOCTL_TYPE + 1)
525*4882a593Smuzhiyun 
526*4882a593Smuzhiyun /**
527*4882a593Smuzhiyun  * struct kbase_ioctl_tlstream_test - Start a timeline stream test
528*4882a593Smuzhiyun  *
529*4882a593Smuzhiyun  * @tpw_count: number of trace point writers in each context
530*4882a593Smuzhiyun  * @msg_delay: time delay between tracepoints from one writer in milliseconds
531*4882a593Smuzhiyun  * @msg_count: number of trace points written by one writer
532*4882a593Smuzhiyun  * @aux_msg:   if non-zero aux messages will be included
533*4882a593Smuzhiyun  */
534*4882a593Smuzhiyun struct kbase_ioctl_tlstream_test {
535*4882a593Smuzhiyun 	__u32 tpw_count;
536*4882a593Smuzhiyun 	__u32 msg_delay;
537*4882a593Smuzhiyun 	__u32 msg_count;
538*4882a593Smuzhiyun 	__u32 aux_msg;
539*4882a593Smuzhiyun };
540*4882a593Smuzhiyun 
541*4882a593Smuzhiyun #define KBASE_IOCTL_TLSTREAM_TEST \
542*4882a593Smuzhiyun 	_IOW(KBASE_IOCTL_TEST_TYPE, 1, struct kbase_ioctl_tlstream_test)
543*4882a593Smuzhiyun 
544*4882a593Smuzhiyun /**
545*4882a593Smuzhiyun  * struct kbase_ioctl_tlstream_stats - Read tlstream stats for test purposes
546*4882a593Smuzhiyun  * @bytes_collected: number of bytes read by user
547*4882a593Smuzhiyun  * @bytes_generated: number of bytes generated by tracepoints
548*4882a593Smuzhiyun  */
549*4882a593Smuzhiyun struct kbase_ioctl_tlstream_stats {
550*4882a593Smuzhiyun 	__u32 bytes_collected;
551*4882a593Smuzhiyun 	__u32 bytes_generated;
552*4882a593Smuzhiyun };
553*4882a593Smuzhiyun 
554*4882a593Smuzhiyun #define KBASE_IOCTL_TLSTREAM_STATS \
555*4882a593Smuzhiyun 	_IOR(KBASE_IOCTL_TEST_TYPE, 2, struct kbase_ioctl_tlstream_stats)
556*4882a593Smuzhiyun 
557*4882a593Smuzhiyun #endif
558*4882a593Smuzhiyun 
559*4882a593Smuzhiyun /**********************************
560*4882a593Smuzhiyun  * Definitions for GPU properties *
561*4882a593Smuzhiyun  **********************************/
562*4882a593Smuzhiyun #define KBASE_GPUPROP_VALUE_SIZE_U8	(0x0)
563*4882a593Smuzhiyun #define KBASE_GPUPROP_VALUE_SIZE_U16	(0x1)
564*4882a593Smuzhiyun #define KBASE_GPUPROP_VALUE_SIZE_U32	(0x2)
565*4882a593Smuzhiyun #define KBASE_GPUPROP_VALUE_SIZE_U64	(0x3)
566*4882a593Smuzhiyun 
567*4882a593Smuzhiyun #define KBASE_GPUPROP_PRODUCT_ID			1
568*4882a593Smuzhiyun #define KBASE_GPUPROP_VERSION_STATUS			2
569*4882a593Smuzhiyun #define KBASE_GPUPROP_MINOR_REVISION			3
570*4882a593Smuzhiyun #define KBASE_GPUPROP_MAJOR_REVISION			4
571*4882a593Smuzhiyun #define KBASE_GPUPROP_GPU_SPEED_MHZ			5
572*4882a593Smuzhiyun #define KBASE_GPUPROP_GPU_FREQ_KHZ_MAX			6
573*4882a593Smuzhiyun #define KBASE_GPUPROP_GPU_FREQ_KHZ_MIN			7
574*4882a593Smuzhiyun #define KBASE_GPUPROP_LOG2_PROGRAM_COUNTER_SIZE		8
575*4882a593Smuzhiyun #define KBASE_GPUPROP_TEXTURE_FEATURES_0		9
576*4882a593Smuzhiyun #define KBASE_GPUPROP_TEXTURE_FEATURES_1		10
577*4882a593Smuzhiyun #define KBASE_GPUPROP_TEXTURE_FEATURES_2		11
578*4882a593Smuzhiyun #define KBASE_GPUPROP_GPU_AVAILABLE_MEMORY_SIZE		12
579*4882a593Smuzhiyun 
580*4882a593Smuzhiyun #define KBASE_GPUPROP_L2_LOG2_LINE_SIZE			13
581*4882a593Smuzhiyun #define KBASE_GPUPROP_L2_LOG2_CACHE_SIZE		14
582*4882a593Smuzhiyun #define KBASE_GPUPROP_L2_NUM_L2_SLICES			15
583*4882a593Smuzhiyun 
584*4882a593Smuzhiyun #define KBASE_GPUPROP_TILER_BIN_SIZE_BYTES		16
585*4882a593Smuzhiyun #define KBASE_GPUPROP_TILER_MAX_ACTIVE_LEVELS		17
586*4882a593Smuzhiyun 
587*4882a593Smuzhiyun #define KBASE_GPUPROP_MAX_THREADS			18
588*4882a593Smuzhiyun #define KBASE_GPUPROP_MAX_WORKGROUP_SIZE		19
589*4882a593Smuzhiyun #define KBASE_GPUPROP_MAX_BARRIER_SIZE			20
590*4882a593Smuzhiyun #define KBASE_GPUPROP_MAX_REGISTERS			21
591*4882a593Smuzhiyun #define KBASE_GPUPROP_MAX_TASK_QUEUE			22
592*4882a593Smuzhiyun #define KBASE_GPUPROP_MAX_THREAD_GROUP_SPLIT		23
593*4882a593Smuzhiyun #define KBASE_GPUPROP_IMPL_TECH				24
594*4882a593Smuzhiyun 
595*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_SHADER_PRESENT		25
596*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_TILER_PRESENT			26
597*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_L2_PRESENT			27
598*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_STACK_PRESENT			28
599*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_L2_FEATURES			29
600*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_SUSPEND_SIZE			30
601*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_MEM_FEATURES			31
602*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_MMU_FEATURES			32
603*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_AS_PRESENT			33
604*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_JS_PRESENT			34
605*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_JS_FEATURES_0			35
606*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_JS_FEATURES_1			36
607*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_JS_FEATURES_2			37
608*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_JS_FEATURES_3			38
609*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_JS_FEATURES_4			39
610*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_JS_FEATURES_5			40
611*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_JS_FEATURES_6			41
612*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_JS_FEATURES_7			42
613*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_JS_FEATURES_8			43
614*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_JS_FEATURES_9			44
615*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_JS_FEATURES_10		45
616*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_JS_FEATURES_11		46
617*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_JS_FEATURES_12		47
618*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_JS_FEATURES_13		48
619*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_JS_FEATURES_14		49
620*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_JS_FEATURES_15		50
621*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_TILER_FEATURES		51
622*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_TEXTURE_FEATURES_0		52
623*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_TEXTURE_FEATURES_1		53
624*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_TEXTURE_FEATURES_2		54
625*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_GPU_ID			55
626*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_THREAD_MAX_THREADS		56
627*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_THREAD_MAX_WORKGROUP_SIZE	57
628*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_THREAD_MAX_BARRIER_SIZE	58
629*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_THREAD_FEATURES		59
630*4882a593Smuzhiyun #define KBASE_GPUPROP_RAW_COHERENCY_MODE		60
631*4882a593Smuzhiyun 
632*4882a593Smuzhiyun #define KBASE_GPUPROP_COHERENCY_NUM_GROUPS		61
633*4882a593Smuzhiyun #define KBASE_GPUPROP_COHERENCY_NUM_CORE_GROUPS		62
634*4882a593Smuzhiyun #define KBASE_GPUPROP_COHERENCY_COHERENCY		63
635*4882a593Smuzhiyun #define KBASE_GPUPROP_COHERENCY_GROUP_0			64
636*4882a593Smuzhiyun #define KBASE_GPUPROP_COHERENCY_GROUP_1			65
637*4882a593Smuzhiyun #define KBASE_GPUPROP_COHERENCY_GROUP_2			66
638*4882a593Smuzhiyun #define KBASE_GPUPROP_COHERENCY_GROUP_3			67
639*4882a593Smuzhiyun #define KBASE_GPUPROP_COHERENCY_GROUP_4			68
640*4882a593Smuzhiyun #define KBASE_GPUPROP_COHERENCY_GROUP_5			69
641*4882a593Smuzhiyun #define KBASE_GPUPROP_COHERENCY_GROUP_6			70
642*4882a593Smuzhiyun #define KBASE_GPUPROP_COHERENCY_GROUP_7			71
643*4882a593Smuzhiyun #define KBASE_GPUPROP_COHERENCY_GROUP_8			72
644*4882a593Smuzhiyun #define KBASE_GPUPROP_COHERENCY_GROUP_9			73
645*4882a593Smuzhiyun #define KBASE_GPUPROP_COHERENCY_GROUP_10		74
646*4882a593Smuzhiyun #define KBASE_GPUPROP_COHERENCY_GROUP_11		75
647*4882a593Smuzhiyun #define KBASE_GPUPROP_COHERENCY_GROUP_12		76
648*4882a593Smuzhiyun #define KBASE_GPUPROP_COHERENCY_GROUP_13		77
649*4882a593Smuzhiyun #define KBASE_GPUPROP_COHERENCY_GROUP_14		78
650*4882a593Smuzhiyun #define KBASE_GPUPROP_COHERENCY_GROUP_15		79
651*4882a593Smuzhiyun 
652*4882a593Smuzhiyun #ifdef __cpluscplus
653*4882a593Smuzhiyun }
654*4882a593Smuzhiyun #endif
655*4882a593Smuzhiyun 
656*4882a593Smuzhiyun #endif
657