xref: /aosp_15_r20/external/mesa3d/include/drm-uapi/dma-buf.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2*61046927SAndroid Build Coastguard Worker /*
3*61046927SAndroid Build Coastguard Worker  * Framework for buffer objects that can be shared across devices/subsystems.
4*61046927SAndroid Build Coastguard Worker  *
5*61046927SAndroid Build Coastguard Worker  * Copyright(C) 2015 Intel Ltd
6*61046927SAndroid Build Coastguard Worker  *
7*61046927SAndroid Build Coastguard Worker  * This program is free software; you can redistribute it and/or modify it
8*61046927SAndroid Build Coastguard Worker  * under the terms of the GNU General Public License version 2 as published by
9*61046927SAndroid Build Coastguard Worker  * the Free Software Foundation.
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * This program is distributed in the hope that it will be useful, but WITHOUT
12*61046927SAndroid Build Coastguard Worker  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
14*61046927SAndroid Build Coastguard Worker  * more details.
15*61046927SAndroid Build Coastguard Worker  *
16*61046927SAndroid Build Coastguard Worker  * You should have received a copy of the GNU General Public License along with
17*61046927SAndroid Build Coastguard Worker  * this program.  If not, see <http://www.gnu.org/licenses/>.
18*61046927SAndroid Build Coastguard Worker  */
19*61046927SAndroid Build Coastguard Worker 
20*61046927SAndroid Build Coastguard Worker #ifndef _DMA_BUF_UAPI_H_
21*61046927SAndroid Build Coastguard Worker #define _DMA_BUF_UAPI_H_
22*61046927SAndroid Build Coastguard Worker 
23*61046927SAndroid Build Coastguard Worker #if defined(__linux__) || defined(__managarm__)
24*61046927SAndroid Build Coastguard Worker 
25*61046927SAndroid Build Coastguard Worker #include <linux/types.h>
26*61046927SAndroid Build Coastguard Worker 
27*61046927SAndroid Build Coastguard Worker #else /* One of the BSDs */
28*61046927SAndroid Build Coastguard Worker 
29*61046927SAndroid Build Coastguard Worker #include <stdint.h>
30*61046927SAndroid Build Coastguard Worker #include <sys/types.h>
31*61046927SAndroid Build Coastguard Worker 
32*61046927SAndroid Build Coastguard Worker typedef int8_t   __s8;
33*61046927SAndroid Build Coastguard Worker typedef uint8_t  __u8;
34*61046927SAndroid Build Coastguard Worker typedef int16_t  __s16;
35*61046927SAndroid Build Coastguard Worker typedef uint16_t __u16;
36*61046927SAndroid Build Coastguard Worker typedef int32_t  __s32;
37*61046927SAndroid Build Coastguard Worker typedef uint32_t __u32;
38*61046927SAndroid Build Coastguard Worker typedef int64_t  __s64;
39*61046927SAndroid Build Coastguard Worker typedef uint64_t __u64;
40*61046927SAndroid Build Coastguard Worker 
41*61046927SAndroid Build Coastguard Worker #endif
42*61046927SAndroid Build Coastguard Worker 
43*61046927SAndroid Build Coastguard Worker /**
44*61046927SAndroid Build Coastguard Worker  * struct dma_buf_sync - Synchronize with CPU access.
45*61046927SAndroid Build Coastguard Worker  *
46*61046927SAndroid Build Coastguard Worker  * When a DMA buffer is accessed from the CPU via mmap, it is not always
47*61046927SAndroid Build Coastguard Worker  * possible to guarantee coherency between the CPU-visible map and underlying
48*61046927SAndroid Build Coastguard Worker  * memory.  To manage coherency, DMA_BUF_IOCTL_SYNC must be used to bracket
49*61046927SAndroid Build Coastguard Worker  * any CPU access to give the kernel the chance to shuffle memory around if
50*61046927SAndroid Build Coastguard Worker  * needed.
51*61046927SAndroid Build Coastguard Worker  *
52*61046927SAndroid Build Coastguard Worker  * Prior to accessing the map, the client must call DMA_BUF_IOCTL_SYNC
53*61046927SAndroid Build Coastguard Worker  * with DMA_BUF_SYNC_START and the appropriate read/write flags.  Once the
54*61046927SAndroid Build Coastguard Worker  * access is complete, the client should call DMA_BUF_IOCTL_SYNC with
55*61046927SAndroid Build Coastguard Worker  * DMA_BUF_SYNC_END and the same read/write flags.
56*61046927SAndroid Build Coastguard Worker  *
57*61046927SAndroid Build Coastguard Worker  * The synchronization provided via DMA_BUF_IOCTL_SYNC only provides cache
58*61046927SAndroid Build Coastguard Worker  * coherency.  It does not prevent other processes or devices from
59*61046927SAndroid Build Coastguard Worker  * accessing the memory at the same time.  If synchronization with a GPU or
60*61046927SAndroid Build Coastguard Worker  * other device driver is required, it is the client's responsibility to
61*61046927SAndroid Build Coastguard Worker  * wait for buffer to be ready for reading or writing before calling this
62*61046927SAndroid Build Coastguard Worker  * ioctl with DMA_BUF_SYNC_START.  Likewise, the client must ensure that
63*61046927SAndroid Build Coastguard Worker  * follow-up work is not submitted to GPU or other device driver until
64*61046927SAndroid Build Coastguard Worker  * after this ioctl has been called with DMA_BUF_SYNC_END?
65*61046927SAndroid Build Coastguard Worker  *
66*61046927SAndroid Build Coastguard Worker  * If the driver or API with which the client is interacting uses implicit
67*61046927SAndroid Build Coastguard Worker  * synchronization, waiting for prior work to complete can be done via
68*61046927SAndroid Build Coastguard Worker  * poll() on the DMA buffer file descriptor.  If the driver or API requires
69*61046927SAndroid Build Coastguard Worker  * explicit synchronization, the client may have to wait on a sync_file or
70*61046927SAndroid Build Coastguard Worker  * other synchronization primitive outside the scope of the DMA buffer API.
71*61046927SAndroid Build Coastguard Worker  */
72*61046927SAndroid Build Coastguard Worker struct dma_buf_sync {
73*61046927SAndroid Build Coastguard Worker 	/**
74*61046927SAndroid Build Coastguard Worker 	 * @flags: Set of access flags
75*61046927SAndroid Build Coastguard Worker 	 *
76*61046927SAndroid Build Coastguard Worker 	 * DMA_BUF_SYNC_START:
77*61046927SAndroid Build Coastguard Worker 	 *     Indicates the start of a map access session.
78*61046927SAndroid Build Coastguard Worker 	 *
79*61046927SAndroid Build Coastguard Worker 	 * DMA_BUF_SYNC_END:
80*61046927SAndroid Build Coastguard Worker 	 *     Indicates the end of a map access session.
81*61046927SAndroid Build Coastguard Worker 	 *
82*61046927SAndroid Build Coastguard Worker 	 * DMA_BUF_SYNC_READ:
83*61046927SAndroid Build Coastguard Worker 	 *     Indicates that the mapped DMA buffer will be read by the
84*61046927SAndroid Build Coastguard Worker 	 *     client via the CPU map.
85*61046927SAndroid Build Coastguard Worker 	 *
86*61046927SAndroid Build Coastguard Worker 	 * DMA_BUF_SYNC_WRITE:
87*61046927SAndroid Build Coastguard Worker 	 *     Indicates that the mapped DMA buffer will be written by the
88*61046927SAndroid Build Coastguard Worker 	 *     client via the CPU map.
89*61046927SAndroid Build Coastguard Worker 	 *
90*61046927SAndroid Build Coastguard Worker 	 * DMA_BUF_SYNC_RW:
91*61046927SAndroid Build Coastguard Worker 	 *     An alias for DMA_BUF_SYNC_READ | DMA_BUF_SYNC_WRITE.
92*61046927SAndroid Build Coastguard Worker 	 */
93*61046927SAndroid Build Coastguard Worker 	__u64 flags;
94*61046927SAndroid Build Coastguard Worker };
95*61046927SAndroid Build Coastguard Worker 
96*61046927SAndroid Build Coastguard Worker #define DMA_BUF_SYNC_READ      (1 << 0)
97*61046927SAndroid Build Coastguard Worker #define DMA_BUF_SYNC_WRITE     (2 << 0)
98*61046927SAndroid Build Coastguard Worker #define DMA_BUF_SYNC_RW        (DMA_BUF_SYNC_READ | DMA_BUF_SYNC_WRITE)
99*61046927SAndroid Build Coastguard Worker #define DMA_BUF_SYNC_START     (0 << 2)
100*61046927SAndroid Build Coastguard Worker #define DMA_BUF_SYNC_END       (1 << 2)
101*61046927SAndroid Build Coastguard Worker #define DMA_BUF_SYNC_VALID_FLAGS_MASK \
102*61046927SAndroid Build Coastguard Worker 	(DMA_BUF_SYNC_RW | DMA_BUF_SYNC_END)
103*61046927SAndroid Build Coastguard Worker 
104*61046927SAndroid Build Coastguard Worker #define DMA_BUF_NAME_LEN	32
105*61046927SAndroid Build Coastguard Worker 
106*61046927SAndroid Build Coastguard Worker /**
107*61046927SAndroid Build Coastguard Worker  * struct dma_buf_export_sync_file - Get a sync_file from a dma-buf
108*61046927SAndroid Build Coastguard Worker  *
109*61046927SAndroid Build Coastguard Worker  * Userspace can perform a DMA_BUF_IOCTL_EXPORT_SYNC_FILE to retrieve the
110*61046927SAndroid Build Coastguard Worker  * current set of fences on a dma-buf file descriptor as a sync_file.  CPU
111*61046927SAndroid Build Coastguard Worker  * waits via poll() or other driver-specific mechanisms typically wait on
112*61046927SAndroid Build Coastguard Worker  * whatever fences are on the dma-buf at the time the wait begins.  This
113*61046927SAndroid Build Coastguard Worker  * is similar except that it takes a snapshot of the current fences on the
114*61046927SAndroid Build Coastguard Worker  * dma-buf for waiting later instead of waiting immediately.  This is
115*61046927SAndroid Build Coastguard Worker  * useful for modern graphics APIs such as Vulkan which assume an explicit
116*61046927SAndroid Build Coastguard Worker  * synchronization model but still need to inter-operate with dma-buf.
117*61046927SAndroid Build Coastguard Worker  *
118*61046927SAndroid Build Coastguard Worker  * The intended usage pattern is the following:
119*61046927SAndroid Build Coastguard Worker  *
120*61046927SAndroid Build Coastguard Worker  *  1. Export a sync_file with flags corresponding to the expected GPU usage
121*61046927SAndroid Build Coastguard Worker  *     via DMA_BUF_IOCTL_EXPORT_SYNC_FILE.
122*61046927SAndroid Build Coastguard Worker  *
123*61046927SAndroid Build Coastguard Worker  *  2. Submit rendering work which uses the dma-buf.  The work should wait on
124*61046927SAndroid Build Coastguard Worker  *     the exported sync file before rendering and produce another sync_file
125*61046927SAndroid Build Coastguard Worker  *     when complete.
126*61046927SAndroid Build Coastguard Worker  *
127*61046927SAndroid Build Coastguard Worker  *  3. Import the rendering-complete sync_file into the dma-buf with flags
128*61046927SAndroid Build Coastguard Worker  *     corresponding to the GPU usage via DMA_BUF_IOCTL_IMPORT_SYNC_FILE.
129*61046927SAndroid Build Coastguard Worker  *
130*61046927SAndroid Build Coastguard Worker  * Unlike doing implicit synchronization via a GPU kernel driver's exec ioctl,
131*61046927SAndroid Build Coastguard Worker  * the above is not a single atomic operation.  If userspace wants to ensure
132*61046927SAndroid Build Coastguard Worker  * ordering via these fences, it is the respnosibility of userspace to use
133*61046927SAndroid Build Coastguard Worker  * locks or other mechanisms to ensure that no other context adds fences or
134*61046927SAndroid Build Coastguard Worker  * submits work between steps 1 and 3 above.
135*61046927SAndroid Build Coastguard Worker  */
136*61046927SAndroid Build Coastguard Worker struct dma_buf_export_sync_file {
137*61046927SAndroid Build Coastguard Worker 	/**
138*61046927SAndroid Build Coastguard Worker 	 * @flags: Read/write flags
139*61046927SAndroid Build Coastguard Worker 	 *
140*61046927SAndroid Build Coastguard Worker 	 * Must be DMA_BUF_SYNC_READ, DMA_BUF_SYNC_WRITE, or both.
141*61046927SAndroid Build Coastguard Worker 	 *
142*61046927SAndroid Build Coastguard Worker 	 * If DMA_BUF_SYNC_READ is set and DMA_BUF_SYNC_WRITE is not set,
143*61046927SAndroid Build Coastguard Worker 	 * the returned sync file waits on any writers of the dma-buf to
144*61046927SAndroid Build Coastguard Worker 	 * complete.  Waiting on the returned sync file is equivalent to
145*61046927SAndroid Build Coastguard Worker 	 * poll() with POLLIN.
146*61046927SAndroid Build Coastguard Worker 	 *
147*61046927SAndroid Build Coastguard Worker 	 * If DMA_BUF_SYNC_WRITE is set, the returned sync file waits on
148*61046927SAndroid Build Coastguard Worker 	 * any users of the dma-buf (read or write) to complete.  Waiting
149*61046927SAndroid Build Coastguard Worker 	 * on the returned sync file is equivalent to poll() with POLLOUT.
150*61046927SAndroid Build Coastguard Worker 	 * If both DMA_BUF_SYNC_WRITE and DMA_BUF_SYNC_READ are set, this
151*61046927SAndroid Build Coastguard Worker 	 * is equivalent to just DMA_BUF_SYNC_WRITE.
152*61046927SAndroid Build Coastguard Worker 	 */
153*61046927SAndroid Build Coastguard Worker 	__u32 flags;
154*61046927SAndroid Build Coastguard Worker 	/** @fd: Returned sync file descriptor */
155*61046927SAndroid Build Coastguard Worker 	__s32 fd;
156*61046927SAndroid Build Coastguard Worker };
157*61046927SAndroid Build Coastguard Worker 
158*61046927SAndroid Build Coastguard Worker /**
159*61046927SAndroid Build Coastguard Worker  * struct dma_buf_import_sync_file - Insert a sync_file into a dma-buf
160*61046927SAndroid Build Coastguard Worker  *
161*61046927SAndroid Build Coastguard Worker  * Userspace can perform a DMA_BUF_IOCTL_IMPORT_SYNC_FILE to insert a
162*61046927SAndroid Build Coastguard Worker  * sync_file into a dma-buf for the purposes of implicit synchronization
163*61046927SAndroid Build Coastguard Worker  * with other dma-buf consumers.  This allows clients using explicitly
164*61046927SAndroid Build Coastguard Worker  * synchronized APIs such as Vulkan to inter-op with dma-buf consumers
165*61046927SAndroid Build Coastguard Worker  * which expect implicit synchronization such as OpenGL or most media
166*61046927SAndroid Build Coastguard Worker  * drivers/video.
167*61046927SAndroid Build Coastguard Worker  */
168*61046927SAndroid Build Coastguard Worker struct dma_buf_import_sync_file {
169*61046927SAndroid Build Coastguard Worker 	/**
170*61046927SAndroid Build Coastguard Worker 	 * @flags: Read/write flags
171*61046927SAndroid Build Coastguard Worker 	 *
172*61046927SAndroid Build Coastguard Worker 	 * Must be DMA_BUF_SYNC_READ, DMA_BUF_SYNC_WRITE, or both.
173*61046927SAndroid Build Coastguard Worker 	 *
174*61046927SAndroid Build Coastguard Worker 	 * If DMA_BUF_SYNC_READ is set and DMA_BUF_SYNC_WRITE is not set,
175*61046927SAndroid Build Coastguard Worker 	 * this inserts the sync_file as a read-only fence.  Any subsequent
176*61046927SAndroid Build Coastguard Worker 	 * implicitly synchronized writes to this dma-buf will wait on this
177*61046927SAndroid Build Coastguard Worker 	 * fence but reads will not.
178*61046927SAndroid Build Coastguard Worker 	 *
179*61046927SAndroid Build Coastguard Worker 	 * If DMA_BUF_SYNC_WRITE is set, this inserts the sync_file as a
180*61046927SAndroid Build Coastguard Worker 	 * write fence.  All subsequent implicitly synchronized access to
181*61046927SAndroid Build Coastguard Worker 	 * this dma-buf will wait on this fence.
182*61046927SAndroid Build Coastguard Worker 	 */
183*61046927SAndroid Build Coastguard Worker 	__u32 flags;
184*61046927SAndroid Build Coastguard Worker 	/** @fd: Sync file descriptor */
185*61046927SAndroid Build Coastguard Worker 	__s32 fd;
186*61046927SAndroid Build Coastguard Worker };
187*61046927SAndroid Build Coastguard Worker 
188*61046927SAndroid Build Coastguard Worker #define DMA_BUF_BASE		'b'
189*61046927SAndroid Build Coastguard Worker #define DMA_BUF_IOCTL_SYNC	_IOW(DMA_BUF_BASE, 0, struct dma_buf_sync)
190*61046927SAndroid Build Coastguard Worker 
191*61046927SAndroid Build Coastguard Worker /* 32/64bitness of this uapi was botched in android, there's no difference
192*61046927SAndroid Build Coastguard Worker  * between them in actual uapi, they're just different numbers.
193*61046927SAndroid Build Coastguard Worker  */
194*61046927SAndroid Build Coastguard Worker #define DMA_BUF_SET_NAME	_IOW(DMA_BUF_BASE, 1, const char *)
195*61046927SAndroid Build Coastguard Worker #define DMA_BUF_SET_NAME_A	_IOW(DMA_BUF_BASE, 1, __u32)
196*61046927SAndroid Build Coastguard Worker #define DMA_BUF_SET_NAME_B	_IOW(DMA_BUF_BASE, 1, __u64)
197*61046927SAndroid Build Coastguard Worker #define DMA_BUF_IOCTL_EXPORT_SYNC_FILE	_IOWR(DMA_BUF_BASE, 2, struct dma_buf_export_sync_file)
198*61046927SAndroid Build Coastguard Worker #define DMA_BUF_IOCTL_IMPORT_SYNC_FILE	_IOW(DMA_BUF_BASE, 3, struct dma_buf_import_sync_file)
199*61046927SAndroid Build Coastguard Worker 
200*61046927SAndroid Build Coastguard Worker #endif
201