xref: /OK3568_Linux_fs/kernel/include/uapi/drm/lima_drm.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: (GPL-2.0 WITH Linux-syscall-note) OR MIT */
2*4882a593Smuzhiyun /* Copyright 2017-2018 Qiang Yu <yuq825@gmail.com> */
3*4882a593Smuzhiyun 
4*4882a593Smuzhiyun #ifndef __LIMA_DRM_H__
5*4882a593Smuzhiyun #define __LIMA_DRM_H__
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include "drm.h"
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #if defined(__cplusplus)
10*4882a593Smuzhiyun extern "C" {
11*4882a593Smuzhiyun #endif
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun enum drm_lima_param_gpu_id {
14*4882a593Smuzhiyun 	DRM_LIMA_PARAM_GPU_ID_UNKNOWN,
15*4882a593Smuzhiyun 	DRM_LIMA_PARAM_GPU_ID_MALI400,
16*4882a593Smuzhiyun 	DRM_LIMA_PARAM_GPU_ID_MALI450,
17*4882a593Smuzhiyun };
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun enum drm_lima_param {
20*4882a593Smuzhiyun 	DRM_LIMA_PARAM_GPU_ID,
21*4882a593Smuzhiyun 	DRM_LIMA_PARAM_NUM_PP,
22*4882a593Smuzhiyun 	DRM_LIMA_PARAM_GP_VERSION,
23*4882a593Smuzhiyun 	DRM_LIMA_PARAM_PP_VERSION,
24*4882a593Smuzhiyun };
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun /**
27*4882a593Smuzhiyun  * get various information of the GPU
28*4882a593Smuzhiyun  */
29*4882a593Smuzhiyun struct drm_lima_get_param {
30*4882a593Smuzhiyun 	__u32 param; /* in, value in enum drm_lima_param */
31*4882a593Smuzhiyun 	__u32 pad;   /* pad, must be zero */
32*4882a593Smuzhiyun 	__u64 value; /* out, parameter value */
33*4882a593Smuzhiyun };
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun /*
36*4882a593Smuzhiyun  * heap buffer dynamically increase backup memory size when GP task fail
37*4882a593Smuzhiyun  * due to lack of heap memory. size field of heap buffer is an up bound of
38*4882a593Smuzhiyun  * the backup memory which can be set to a fairly large value.
39*4882a593Smuzhiyun  */
40*4882a593Smuzhiyun #define LIMA_BO_FLAG_HEAP  (1 << 0)
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun /**
43*4882a593Smuzhiyun  * create a buffer for used by GPU
44*4882a593Smuzhiyun  */
45*4882a593Smuzhiyun struct drm_lima_gem_create {
46*4882a593Smuzhiyun 	__u32 size;    /* in, buffer size */
47*4882a593Smuzhiyun 	__u32 flags;   /* in, buffer flags */
48*4882a593Smuzhiyun 	__u32 handle;  /* out, GEM buffer handle */
49*4882a593Smuzhiyun 	__u32 pad;     /* pad, must be zero */
50*4882a593Smuzhiyun };
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun /**
53*4882a593Smuzhiyun  * get information of a buffer
54*4882a593Smuzhiyun  */
55*4882a593Smuzhiyun struct drm_lima_gem_info {
56*4882a593Smuzhiyun 	__u32 handle;  /* in, GEM buffer handle */
57*4882a593Smuzhiyun 	__u32 va;      /* out, virtual address mapped into GPU MMU */
58*4882a593Smuzhiyun 	__u64 offset;  /* out, used to mmap this buffer to CPU */
59*4882a593Smuzhiyun };
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun #define LIMA_SUBMIT_BO_READ   0x01
62*4882a593Smuzhiyun #define LIMA_SUBMIT_BO_WRITE  0x02
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun /* buffer information used by one task */
65*4882a593Smuzhiyun struct drm_lima_gem_submit_bo {
66*4882a593Smuzhiyun 	__u32 handle;  /* in, GEM buffer handle */
67*4882a593Smuzhiyun 	__u32 flags;   /* in, buffer read/write by GPU */
68*4882a593Smuzhiyun };
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun #define LIMA_GP_FRAME_REG_NUM 6
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun /* frame used to setup GP for each task */
73*4882a593Smuzhiyun struct drm_lima_gp_frame {
74*4882a593Smuzhiyun 	__u32 frame[LIMA_GP_FRAME_REG_NUM];
75*4882a593Smuzhiyun };
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun #define LIMA_PP_FRAME_REG_NUM 23
78*4882a593Smuzhiyun #define LIMA_PP_WB_REG_NUM 12
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun /* frame used to setup mali400 GPU PP for each task */
81*4882a593Smuzhiyun struct drm_lima_m400_pp_frame {
82*4882a593Smuzhiyun 	__u32 frame[LIMA_PP_FRAME_REG_NUM];
83*4882a593Smuzhiyun 	__u32 num_pp;
84*4882a593Smuzhiyun 	__u32 wb[3 * LIMA_PP_WB_REG_NUM];
85*4882a593Smuzhiyun 	__u32 plbu_array_address[4];
86*4882a593Smuzhiyun 	__u32 fragment_stack_address[4];
87*4882a593Smuzhiyun };
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun /* frame used to setup mali450 GPU PP for each task */
90*4882a593Smuzhiyun struct drm_lima_m450_pp_frame {
91*4882a593Smuzhiyun 	__u32 frame[LIMA_PP_FRAME_REG_NUM];
92*4882a593Smuzhiyun 	__u32 num_pp;
93*4882a593Smuzhiyun 	__u32 wb[3 * LIMA_PP_WB_REG_NUM];
94*4882a593Smuzhiyun 	__u32 use_dlbu;
95*4882a593Smuzhiyun 	__u32 _pad;
96*4882a593Smuzhiyun 	union {
97*4882a593Smuzhiyun 		__u32 plbu_array_address[8];
98*4882a593Smuzhiyun 		__u32 dlbu_regs[4];
99*4882a593Smuzhiyun 	};
100*4882a593Smuzhiyun 	__u32 fragment_stack_address[8];
101*4882a593Smuzhiyun };
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun #define LIMA_PIPE_GP  0x00
104*4882a593Smuzhiyun #define LIMA_PIPE_PP  0x01
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun #define LIMA_SUBMIT_FLAG_EXPLICIT_FENCE (1 << 0)
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun /**
109*4882a593Smuzhiyun  * submit a task to GPU
110*4882a593Smuzhiyun  *
111*4882a593Smuzhiyun  * User can always merge multi sync_file and drm_syncobj
112*4882a593Smuzhiyun  * into one drm_syncobj as in_sync[0], but we reserve
113*4882a593Smuzhiyun  * in_sync[1] for another task's out_sync to avoid the
114*4882a593Smuzhiyun  * export/import/merge pass when explicit sync.
115*4882a593Smuzhiyun  */
116*4882a593Smuzhiyun struct drm_lima_gem_submit {
117*4882a593Smuzhiyun 	__u32 ctx;         /* in, context handle task is submitted to */
118*4882a593Smuzhiyun 	__u32 pipe;        /* in, which pipe to use, GP/PP */
119*4882a593Smuzhiyun 	__u32 nr_bos;      /* in, array length of bos field */
120*4882a593Smuzhiyun 	__u32 frame_size;  /* in, size of frame field */
121*4882a593Smuzhiyun 	__u64 bos;         /* in, array of drm_lima_gem_submit_bo */
122*4882a593Smuzhiyun 	__u64 frame;       /* in, GP/PP frame */
123*4882a593Smuzhiyun 	__u32 flags;       /* in, submit flags */
124*4882a593Smuzhiyun 	__u32 out_sync;    /* in, drm_syncobj handle used to wait task finish after submission */
125*4882a593Smuzhiyun 	__u32 in_sync[2];  /* in, drm_syncobj handle used to wait before start this task */
126*4882a593Smuzhiyun };
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun #define LIMA_GEM_WAIT_READ   0x01
129*4882a593Smuzhiyun #define LIMA_GEM_WAIT_WRITE  0x02
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun /**
132*4882a593Smuzhiyun  * wait pending GPU task finish of a buffer
133*4882a593Smuzhiyun  */
134*4882a593Smuzhiyun struct drm_lima_gem_wait {
135*4882a593Smuzhiyun 	__u32 handle;      /* in, GEM buffer handle */
136*4882a593Smuzhiyun 	__u32 op;          /* in, CPU want to read/write this buffer */
137*4882a593Smuzhiyun 	__s64 timeout_ns;  /* in, wait timeout in absulute time */
138*4882a593Smuzhiyun };
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun /**
141*4882a593Smuzhiyun  * create a context
142*4882a593Smuzhiyun  */
143*4882a593Smuzhiyun struct drm_lima_ctx_create {
144*4882a593Smuzhiyun 	__u32 id;          /* out, context handle */
145*4882a593Smuzhiyun 	__u32 _pad;        /* pad, must be zero */
146*4882a593Smuzhiyun };
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun /**
149*4882a593Smuzhiyun  * free a context
150*4882a593Smuzhiyun  */
151*4882a593Smuzhiyun struct drm_lima_ctx_free {
152*4882a593Smuzhiyun 	__u32 id;          /* in, context handle */
153*4882a593Smuzhiyun 	__u32 _pad;        /* pad, must be zero */
154*4882a593Smuzhiyun };
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun #define DRM_LIMA_GET_PARAM   0x00
157*4882a593Smuzhiyun #define DRM_LIMA_GEM_CREATE  0x01
158*4882a593Smuzhiyun #define DRM_LIMA_GEM_INFO    0x02
159*4882a593Smuzhiyun #define DRM_LIMA_GEM_SUBMIT  0x03
160*4882a593Smuzhiyun #define DRM_LIMA_GEM_WAIT    0x04
161*4882a593Smuzhiyun #define DRM_LIMA_CTX_CREATE  0x05
162*4882a593Smuzhiyun #define DRM_LIMA_CTX_FREE    0x06
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun #define DRM_IOCTL_LIMA_GET_PARAM DRM_IOWR(DRM_COMMAND_BASE + DRM_LIMA_GET_PARAM, struct drm_lima_get_param)
165*4882a593Smuzhiyun #define DRM_IOCTL_LIMA_GEM_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_LIMA_GEM_CREATE, struct drm_lima_gem_create)
166*4882a593Smuzhiyun #define DRM_IOCTL_LIMA_GEM_INFO DRM_IOWR(DRM_COMMAND_BASE + DRM_LIMA_GEM_INFO, struct drm_lima_gem_info)
167*4882a593Smuzhiyun #define DRM_IOCTL_LIMA_GEM_SUBMIT DRM_IOW(DRM_COMMAND_BASE + DRM_LIMA_GEM_SUBMIT, struct drm_lima_gem_submit)
168*4882a593Smuzhiyun #define DRM_IOCTL_LIMA_GEM_WAIT DRM_IOW(DRM_COMMAND_BASE + DRM_LIMA_GEM_WAIT, struct drm_lima_gem_wait)
169*4882a593Smuzhiyun #define DRM_IOCTL_LIMA_CTX_CREATE DRM_IOR(DRM_COMMAND_BASE + DRM_LIMA_CTX_CREATE, struct drm_lima_ctx_create)
170*4882a593Smuzhiyun #define DRM_IOCTL_LIMA_CTX_FREE DRM_IOW(DRM_COMMAND_BASE + DRM_LIMA_CTX_FREE, struct drm_lima_ctx_free)
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun #if defined(__cplusplus)
173*4882a593Smuzhiyun }
174*4882a593Smuzhiyun #endif
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun #endif /* __LIMA_DRM_H__ */
177