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