xref: /OK3568_Linux_fs/kernel/include/uapi/drm/v3d_drm.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright © 2014-2018 Broadcom
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Permission is hereby granted, free of charge, to any person obtaining a
5*4882a593Smuzhiyun  * copy of this software and associated documentation files (the "Software"),
6*4882a593Smuzhiyun  * to deal in the Software without restriction, including without limitation
7*4882a593Smuzhiyun  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*4882a593Smuzhiyun  * and/or sell copies of the Software, and to permit persons to whom the
9*4882a593Smuzhiyun  * Software is furnished to do so, subject to the following conditions:
10*4882a593Smuzhiyun  *
11*4882a593Smuzhiyun  * The above copyright notice and this permission notice (including the next
12*4882a593Smuzhiyun  * paragraph) shall be included in all copies or substantial portions of the
13*4882a593Smuzhiyun  * Software.
14*4882a593Smuzhiyun  *
15*4882a593Smuzhiyun  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*4882a593Smuzhiyun  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*4882a593Smuzhiyun  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*4882a593Smuzhiyun  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*4882a593Smuzhiyun  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*4882a593Smuzhiyun  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*4882a593Smuzhiyun  * IN THE SOFTWARE.
22*4882a593Smuzhiyun  */
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #ifndef _V3D_DRM_H_
25*4882a593Smuzhiyun #define _V3D_DRM_H_
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #include "drm.h"
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun #if defined(__cplusplus)
30*4882a593Smuzhiyun extern "C" {
31*4882a593Smuzhiyun #endif
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun #define DRM_V3D_SUBMIT_CL                         0x00
34*4882a593Smuzhiyun #define DRM_V3D_WAIT_BO                           0x01
35*4882a593Smuzhiyun #define DRM_V3D_CREATE_BO                         0x02
36*4882a593Smuzhiyun #define DRM_V3D_MMAP_BO                           0x03
37*4882a593Smuzhiyun #define DRM_V3D_GET_PARAM                         0x04
38*4882a593Smuzhiyun #define DRM_V3D_GET_BO_OFFSET                     0x05
39*4882a593Smuzhiyun #define DRM_V3D_SUBMIT_TFU                        0x06
40*4882a593Smuzhiyun #define DRM_V3D_SUBMIT_CSD                        0x07
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun #define DRM_IOCTL_V3D_SUBMIT_CL           DRM_IOWR(DRM_COMMAND_BASE + DRM_V3D_SUBMIT_CL, struct drm_v3d_submit_cl)
43*4882a593Smuzhiyun #define DRM_IOCTL_V3D_WAIT_BO             DRM_IOWR(DRM_COMMAND_BASE + DRM_V3D_WAIT_BO, struct drm_v3d_wait_bo)
44*4882a593Smuzhiyun #define DRM_IOCTL_V3D_CREATE_BO           DRM_IOWR(DRM_COMMAND_BASE + DRM_V3D_CREATE_BO, struct drm_v3d_create_bo)
45*4882a593Smuzhiyun #define DRM_IOCTL_V3D_MMAP_BO             DRM_IOWR(DRM_COMMAND_BASE + DRM_V3D_MMAP_BO, struct drm_v3d_mmap_bo)
46*4882a593Smuzhiyun #define DRM_IOCTL_V3D_GET_PARAM           DRM_IOWR(DRM_COMMAND_BASE + DRM_V3D_GET_PARAM, struct drm_v3d_get_param)
47*4882a593Smuzhiyun #define DRM_IOCTL_V3D_GET_BO_OFFSET       DRM_IOWR(DRM_COMMAND_BASE + DRM_V3D_GET_BO_OFFSET, struct drm_v3d_get_bo_offset)
48*4882a593Smuzhiyun #define DRM_IOCTL_V3D_SUBMIT_TFU          DRM_IOW(DRM_COMMAND_BASE + DRM_V3D_SUBMIT_TFU, struct drm_v3d_submit_tfu)
49*4882a593Smuzhiyun #define DRM_IOCTL_V3D_SUBMIT_CSD          DRM_IOW(DRM_COMMAND_BASE + DRM_V3D_SUBMIT_CSD, struct drm_v3d_submit_csd)
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun #define DRM_V3D_SUBMIT_CL_FLUSH_CACHE             0x01
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun /**
54*4882a593Smuzhiyun  * struct drm_v3d_submit_cl - ioctl argument for submitting commands to the 3D
55*4882a593Smuzhiyun  * engine.
56*4882a593Smuzhiyun  *
57*4882a593Smuzhiyun  * This asks the kernel to have the GPU execute an optional binner
58*4882a593Smuzhiyun  * command list, and a render command list.
59*4882a593Smuzhiyun  *
60*4882a593Smuzhiyun  * The L1T, slice, L2C, L2T, and GCA caches will be flushed before
61*4882a593Smuzhiyun  * each CL executes.  The VCD cache should be flushed (if necessary)
62*4882a593Smuzhiyun  * by the submitted CLs.  The TLB writes are guaranteed to have been
63*4882a593Smuzhiyun  * flushed by the time the render done IRQ happens, which is the
64*4882a593Smuzhiyun  * trigger for out_sync.  Any dirtying of cachelines by the job (only
65*4882a593Smuzhiyun  * possible using TMU writes) must be flushed by the caller using the
66*4882a593Smuzhiyun  * DRM_V3D_SUBMIT_CL_FLUSH_CACHE_FLAG flag.
67*4882a593Smuzhiyun  */
68*4882a593Smuzhiyun struct drm_v3d_submit_cl {
69*4882a593Smuzhiyun 	/* Pointer to the binner command list.
70*4882a593Smuzhiyun 	 *
71*4882a593Smuzhiyun 	 * This is the first set of commands executed, which runs the
72*4882a593Smuzhiyun 	 * coordinate shader to determine where primitives land on the screen,
73*4882a593Smuzhiyun 	 * then writes out the state updates and draw calls necessary per tile
74*4882a593Smuzhiyun 	 * to the tile allocation BO.
75*4882a593Smuzhiyun 	 *
76*4882a593Smuzhiyun 	 * This BCL will block on any previous BCL submitted on the
77*4882a593Smuzhiyun 	 * same FD, but not on any RCL or BCLs submitted by other
78*4882a593Smuzhiyun 	 * clients -- that is left up to the submitter to control
79*4882a593Smuzhiyun 	 * using in_sync_bcl if necessary.
80*4882a593Smuzhiyun 	 */
81*4882a593Smuzhiyun 	__u32 bcl_start;
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun 	/** End address of the BCL (first byte after the BCL) */
84*4882a593Smuzhiyun 	__u32 bcl_end;
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun 	/* Offset of the render command list.
87*4882a593Smuzhiyun 	 *
88*4882a593Smuzhiyun 	 * This is the second set of commands executed, which will either
89*4882a593Smuzhiyun 	 * execute the tiles that have been set up by the BCL, or a fixed set
90*4882a593Smuzhiyun 	 * of tiles (in the case of RCL-only blits).
91*4882a593Smuzhiyun 	 *
92*4882a593Smuzhiyun 	 * This RCL will block on this submit's BCL, and any previous
93*4882a593Smuzhiyun 	 * RCL submitted on the same FD, but not on any RCL or BCLs
94*4882a593Smuzhiyun 	 * submitted by other clients -- that is left up to the
95*4882a593Smuzhiyun 	 * submitter to control using in_sync_rcl if necessary.
96*4882a593Smuzhiyun 	 */
97*4882a593Smuzhiyun 	__u32 rcl_start;
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun 	/** End address of the RCL (first byte after the RCL) */
100*4882a593Smuzhiyun 	__u32 rcl_end;
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun 	/** An optional sync object to wait on before starting the BCL. */
103*4882a593Smuzhiyun 	__u32 in_sync_bcl;
104*4882a593Smuzhiyun 	/** An optional sync object to wait on before starting the RCL. */
105*4882a593Smuzhiyun 	__u32 in_sync_rcl;
106*4882a593Smuzhiyun 	/** An optional sync object to place the completion fence in. */
107*4882a593Smuzhiyun 	__u32 out_sync;
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun 	/* Offset of the tile alloc memory
110*4882a593Smuzhiyun 	 *
111*4882a593Smuzhiyun 	 * This is optional on V3D 3.3 (where the CL can set the value) but
112*4882a593Smuzhiyun 	 * required on V3D 4.1.
113*4882a593Smuzhiyun 	 */
114*4882a593Smuzhiyun 	__u32 qma;
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun 	/** Size of the tile alloc memory. */
117*4882a593Smuzhiyun 	__u32 qms;
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun 	/** Offset of the tile state data array. */
120*4882a593Smuzhiyun 	__u32 qts;
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun 	/* Pointer to a u32 array of the BOs that are referenced by the job.
123*4882a593Smuzhiyun 	 */
124*4882a593Smuzhiyun 	__u64 bo_handles;
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun 	/* Number of BO handles passed in (size is that times 4). */
127*4882a593Smuzhiyun 	__u32 bo_handle_count;
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun 	__u32 flags;
130*4882a593Smuzhiyun };
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun /**
133*4882a593Smuzhiyun  * struct drm_v3d_wait_bo - ioctl argument for waiting for
134*4882a593Smuzhiyun  * completion of the last DRM_V3D_SUBMIT_CL on a BO.
135*4882a593Smuzhiyun  *
136*4882a593Smuzhiyun  * This is useful for cases where multiple processes might be
137*4882a593Smuzhiyun  * rendering to a BO and you want to wait for all rendering to be
138*4882a593Smuzhiyun  * completed.
139*4882a593Smuzhiyun  */
140*4882a593Smuzhiyun struct drm_v3d_wait_bo {
141*4882a593Smuzhiyun 	__u32 handle;
142*4882a593Smuzhiyun 	__u32 pad;
143*4882a593Smuzhiyun 	__u64 timeout_ns;
144*4882a593Smuzhiyun };
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun /**
147*4882a593Smuzhiyun  * struct drm_v3d_create_bo - ioctl argument for creating V3D BOs.
148*4882a593Smuzhiyun  *
149*4882a593Smuzhiyun  * There are currently no values for the flags argument, but it may be
150*4882a593Smuzhiyun  * used in a future extension.
151*4882a593Smuzhiyun  */
152*4882a593Smuzhiyun struct drm_v3d_create_bo {
153*4882a593Smuzhiyun 	__u32 size;
154*4882a593Smuzhiyun 	__u32 flags;
155*4882a593Smuzhiyun 	/** Returned GEM handle for the BO. */
156*4882a593Smuzhiyun 	__u32 handle;
157*4882a593Smuzhiyun 	/**
158*4882a593Smuzhiyun 	 * Returned offset for the BO in the V3D address space.  This offset
159*4882a593Smuzhiyun 	 * is private to the DRM fd and is valid for the lifetime of the GEM
160*4882a593Smuzhiyun 	 * handle.
161*4882a593Smuzhiyun 	 *
162*4882a593Smuzhiyun 	 * This offset value will always be nonzero, since various HW
163*4882a593Smuzhiyun 	 * units treat 0 specially.
164*4882a593Smuzhiyun 	 */
165*4882a593Smuzhiyun 	__u32 offset;
166*4882a593Smuzhiyun };
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun /**
169*4882a593Smuzhiyun  * struct drm_v3d_mmap_bo - ioctl argument for mapping V3D BOs.
170*4882a593Smuzhiyun  *
171*4882a593Smuzhiyun  * This doesn't actually perform an mmap.  Instead, it returns the
172*4882a593Smuzhiyun  * offset you need to use in an mmap on the DRM device node.  This
173*4882a593Smuzhiyun  * means that tools like valgrind end up knowing about the mapped
174*4882a593Smuzhiyun  * memory.
175*4882a593Smuzhiyun  *
176*4882a593Smuzhiyun  * There are currently no values for the flags argument, but it may be
177*4882a593Smuzhiyun  * used in a future extension.
178*4882a593Smuzhiyun  */
179*4882a593Smuzhiyun struct drm_v3d_mmap_bo {
180*4882a593Smuzhiyun 	/** Handle for the object being mapped. */
181*4882a593Smuzhiyun 	__u32 handle;
182*4882a593Smuzhiyun 	__u32 flags;
183*4882a593Smuzhiyun 	/** offset into the drm node to use for subsequent mmap call. */
184*4882a593Smuzhiyun 	__u64 offset;
185*4882a593Smuzhiyun };
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun enum drm_v3d_param {
188*4882a593Smuzhiyun 	DRM_V3D_PARAM_V3D_UIFCFG,
189*4882a593Smuzhiyun 	DRM_V3D_PARAM_V3D_HUB_IDENT1,
190*4882a593Smuzhiyun 	DRM_V3D_PARAM_V3D_HUB_IDENT2,
191*4882a593Smuzhiyun 	DRM_V3D_PARAM_V3D_HUB_IDENT3,
192*4882a593Smuzhiyun 	DRM_V3D_PARAM_V3D_CORE0_IDENT0,
193*4882a593Smuzhiyun 	DRM_V3D_PARAM_V3D_CORE0_IDENT1,
194*4882a593Smuzhiyun 	DRM_V3D_PARAM_V3D_CORE0_IDENT2,
195*4882a593Smuzhiyun 	DRM_V3D_PARAM_SUPPORTS_TFU,
196*4882a593Smuzhiyun 	DRM_V3D_PARAM_SUPPORTS_CSD,
197*4882a593Smuzhiyun 	DRM_V3D_PARAM_SUPPORTS_CACHE_FLUSH,
198*4882a593Smuzhiyun };
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun struct drm_v3d_get_param {
201*4882a593Smuzhiyun 	__u32 param;
202*4882a593Smuzhiyun 	__u32 pad;
203*4882a593Smuzhiyun 	__u64 value;
204*4882a593Smuzhiyun };
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun /**
207*4882a593Smuzhiyun  * Returns the offset for the BO in the V3D address space for this DRM fd.
208*4882a593Smuzhiyun  * This is the same value returned by drm_v3d_create_bo, if that was called
209*4882a593Smuzhiyun  * from this DRM fd.
210*4882a593Smuzhiyun  */
211*4882a593Smuzhiyun struct drm_v3d_get_bo_offset {
212*4882a593Smuzhiyun 	__u32 handle;
213*4882a593Smuzhiyun 	__u32 offset;
214*4882a593Smuzhiyun };
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun struct drm_v3d_submit_tfu {
217*4882a593Smuzhiyun 	__u32 icfg;
218*4882a593Smuzhiyun 	__u32 iia;
219*4882a593Smuzhiyun 	__u32 iis;
220*4882a593Smuzhiyun 	__u32 ica;
221*4882a593Smuzhiyun 	__u32 iua;
222*4882a593Smuzhiyun 	__u32 ioa;
223*4882a593Smuzhiyun 	__u32 ios;
224*4882a593Smuzhiyun 	__u32 coef[4];
225*4882a593Smuzhiyun 	/* First handle is the output BO, following are other inputs.
226*4882a593Smuzhiyun 	 * 0 for unused.
227*4882a593Smuzhiyun 	 */
228*4882a593Smuzhiyun 	__u32 bo_handles[4];
229*4882a593Smuzhiyun 	/* sync object to block on before running the TFU job.  Each TFU
230*4882a593Smuzhiyun 	 * job will execute in the order submitted to its FD.  Synchronization
231*4882a593Smuzhiyun 	 * against rendering jobs requires using sync objects.
232*4882a593Smuzhiyun 	 */
233*4882a593Smuzhiyun 	__u32 in_sync;
234*4882a593Smuzhiyun 	/* Sync object to signal when the TFU job is done. */
235*4882a593Smuzhiyun 	__u32 out_sync;
236*4882a593Smuzhiyun };
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun /* Submits a compute shader for dispatch.  This job will block on any
239*4882a593Smuzhiyun  * previous compute shaders submitted on this fd, and any other
240*4882a593Smuzhiyun  * synchronization must be performed with in_sync/out_sync.
241*4882a593Smuzhiyun  */
242*4882a593Smuzhiyun struct drm_v3d_submit_csd {
243*4882a593Smuzhiyun 	__u32 cfg[7];
244*4882a593Smuzhiyun 	__u32 coef[4];
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun 	/* Pointer to a u32 array of the BOs that are referenced by the job.
247*4882a593Smuzhiyun 	 */
248*4882a593Smuzhiyun 	__u64 bo_handles;
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun 	/* Number of BO handles passed in (size is that times 4). */
251*4882a593Smuzhiyun 	__u32 bo_handle_count;
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun 	/* sync object to block on before running the CSD job.  Each
254*4882a593Smuzhiyun 	 * CSD job will execute in the order submitted to its FD.
255*4882a593Smuzhiyun 	 * Synchronization against rendering/TFU jobs or CSD from
256*4882a593Smuzhiyun 	 * other fds requires using sync objects.
257*4882a593Smuzhiyun 	 */
258*4882a593Smuzhiyun 	__u32 in_sync;
259*4882a593Smuzhiyun 	/* Sync object to signal when the CSD job is done. */
260*4882a593Smuzhiyun 	__u32 out_sync;
261*4882a593Smuzhiyun };
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun #if defined(__cplusplus)
264*4882a593Smuzhiyun }
265*4882a593Smuzhiyun #endif
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun #endif /* _V3D_DRM_H_ */
268