xref: /aosp_15_r20/external/crosvm/rutabaga_gfx/kumquat/gpu_client/src/include/virtgpu_kumquat_ffi.h (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1 /*
2  * Copyright 2024 The ChromiumOS Authors
3  * Use of this source code is governed by a BSD-style license that can be
4  * found in the LICENSE file.
5  */
6 
7 #include <stdarg.h>
8 #include <stdbool.h>
9 #include <stdint.h>
10 #include <stdlib.h>
11 
12 #ifndef VIRTGPU_KUMQUAT_FFI_H
13 #define VIRTGPU_KUMQUAT_FFI_H
14 
15 #ifdef __cplusplus
16 extern "C" {
17 #endif
18 
19 struct virtgpu_kumquat;
20 
21 struct drm_kumquat_map {
22     uint32_t bo_handle;
23 
24     // out
25     void *ptr;
26     uint64_t size;
27 };
28 
29 #define VIRTGPU_KUMQUAT_EXECBUF_SYNCOBJ_RESET 0x01
30 #define VIRTGPU_KUMQUAT_EXECBUF_SYNCOBJ_FLAGS (VIRTGPU_KUMQUAT_EXECBUF_SYNCOBJ_RESET | 0)
31 struct drm_kumquat_execbuffer_syncobj {
32     uint32_t handle;
33     uint32_t flags;
34     uint64_t point;
35 };
36 
37 #define VIRTGPU_KUMQUAT_EXECBUF_FENCE_HANDLE_IN 0x01
38 #define VIRTGPU_KUMQUAT_EXECBUF_FENCE_HANDLE_OUT 0x02
39 #define VIRTGPU_KUMQUAT_EXECBUF_RING_IDX 0x04
40 #define VIRTGPU_KUMQUAT_EXECBUF_SHAREABLE_IN 0x08
41 #define VIRTGPU_KUMQUAT_EXECBUF_SHAREABLE_OUT 0x10
42 
43 #define VIRTGPU_KUMQUAT_EXECBUF_FLAGS                                                              \
44     (VIRTGPU_EXECBUF_FENCE_HANDLE_IN | VIRTGPU_EXECBUF_FENCE_HANDLE_OUT |                          \
45      VIRTGPU_EXECBUF_RING_IDX | VIRTGPU_EXECBUF_SHAREABLE_IN | VIRTGPU_EXECBUF_SHAREABLE_OUT | 0)
46 
47 /* fence_fd is modified on success if VIRTGPU_KUMQUAT_EXECBUF_FENCE_HANDLE_OUT flag is set. */
48 struct drm_kumquat_execbuffer {
49     uint32_t flags;
50     uint32_t size;
51     uint64_t command; /* void* */
52     uint64_t bo_handles;
53     uint32_t num_bo_handles;
54     int64_t fence_handle;    /* in/out fence fd (see VIRTGPU_KUMQUAT_EXECBUF_FENCE_HANDLE_IN/OUT) */
55     uint32_t ring_idx;       /* command ring index (see VIRTGPU_KUMQUAT_EXECBUF_RING_IDX) */
56     uint32_t syncobj_stride; /* size of @drm_kumquat_execbuffer_syncobj */
57     uint32_t num_in_syncobjs;
58     uint32_t num_out_syncobjs;
59     uint64_t in_syncobjs;
60     uint64_t out_syncobjs;
61 };
62 
63 #define VIRTGPU_KUMQUAT_PARAM_3D_FEATURES 1          /* do we have 3D features in the hw */
64 #define VIRTGPU_KUMQUAT_PARAM_CAPSET_QUERY_FIX 2     /* do we have the capset fix */
65 #define VIRTGPU_KUMQUAT_PARAM_RESOURCE_BLOB 3        /* DRM_VIRTGPU_RESOURCE_CREATE_BLOB */
66 #define VIRTGPU_KUMQUAT_PARAM_HOST_VISIBLE 4         /* Host blob resources are mappable */
67 #define VIRTGPU_KUMQUAT_PARAM_CROSS_DEVICE 5         /* Cross virtio-device resource sharing  */
68 #define VIRTGPU_KUMQUAT_PARAM_CONTEXT_INIT 6         /* DRM_VIRTGPU_KUMQUAT_CONTEXT_INIT */
69 #define VIRTGPU_KUMQUAT_PARAM_SUPPORTED_CAPSET_IDs 7 /* Bitmask of supported capability set ids */
70 #define VIRTGPU_KUMQUAT_PARAM_EXPLICIT_DEBUG_NAME 8  /* Ability to set debug name from userspace */
71 #define VIRTGPU_KUMQUAT_PARAM_FENCE_PASSING 9        /* Host shareable fences */
72 #define VIRTGPU_KUMQUAT_PARAM_CREATE_GUEST_HANDLE 10
73 
74 struct drm_kumquat_getparam {
75     uint64_t param;
76     uint64_t value;
77 };
78 
79 struct drm_kumquat_resource_create_3d {
80     uint32_t target;
81     uint32_t format;
82     uint32_t bind;
83     uint32_t width;
84     uint32_t height;
85     uint32_t depth;
86     uint32_t array_size;
87     uint32_t last_level;
88     uint32_t nr_samples;
89     uint32_t flags;
90     uint32_t bo_handle;
91     uint32_t res_handle;
92     uint32_t size;
93     uint32_t stride;
94 };
95 
96 struct drm_kumquat_resource_info {
97     uint32_t bo_handle;
98     uint32_t res_handle;
99     uint32_t size;
100     uint32_t blob_mem;
101 };
102 
103 struct drm_kumquat_3d_box {
104     uint32_t x;
105     uint32_t y;
106     uint32_t z;
107     uint32_t w;
108     uint32_t h;
109     uint32_t d;
110 };
111 
112 struct drm_kumquat_transfer_to_host {
113     uint32_t bo_handle;
114     struct drm_kumquat_3d_box box;
115     uint32_t level;
116     uint32_t offset;
117     uint32_t stride;
118     uint32_t layer_stride;
119 };
120 
121 struct drm_kumquat_transfer_from_host {
122     uint32_t bo_handle;
123     struct drm_kumquat_3d_box box;
124     uint32_t level;
125     uint32_t offset;
126     uint32_t stride;
127     uint32_t layer_stride;
128 };
129 
130 struct drm_kumquat_wait {
131     uint32_t handle; /* 0 is an invalid handle */
132     uint32_t flags;
133 };
134 
135 struct drm_kumquat_get_caps {
136     uint32_t cap_set_id;
137     uint32_t cap_set_ver;
138     uint64_t addr;
139     uint32_t size;
140     uint32_t pad;
141 };
142 
143 struct drm_kumquat_resource_create_blob {
144 #define VIRTGPU_KUMQUAT_MEM_GUEST 0x0001
145 #define VIRTGPU_KUMQUAT_MEM_HOST3D 0x0002
146 #define VIRTGPU_KUMQUAT_MEM_HOST3D_GUEST 0x0003
147 
148 #define VIRTGPU_KUMQUAT_FLAG_USE_MAPPABLE 0x0001
149 #define VIRTGPU_KUMQUAT_FLAG_USE_SHAREABLE 0x0002
150 #define VIRTGPU_KUMQUAT_FLAG_USE_CROSS_DEVICE 0x0004
151     /* zero is invalid blob_mem */
152     uint32_t blob_mem;
153     uint32_t blob_flags;
154     uint32_t bo_handle;
155     uint32_t res_handle;
156     uint64_t size;
157 
158     /*
159      * for 3D contexts with VIRTGPU_KUMQUAT_MEM_HOST3D_GUEST and
160      * VIRTGPU_KUMQUAT_MEM_HOST3D otherwise, must be zero.
161      */
162     uint32_t pad;
163     uint32_t cmd_size;
164     uint64_t cmd;
165     uint64_t blob_id;
166 };
167 
168 struct drm_kumquat_resource_unref {
169     uint32_t bo_handle;
170     uint32_t pad;
171 };
172 
173 #define VIRTGPU_KUMQUAT_CONTEXT_PARAM_CAPSET_ID 0x0001
174 #define VIRTGPU_KUMQUAT_CONTEXT_PARAM_NUM_RINGS 0x0002
175 #define VIRTGPU_KUMQUAT_CONTEXT_PARAM_POLL_RINGS_MASK 0x0003
176 #define VIRTGPU_KUMQUAT_CONTEXT_PARAM_DEBUG_NAME 0x0004
177 struct drm_kumquat_context_set_param {
178     uint64_t param;
179     uint64_t value;
180 };
181 
182 struct drm_kumquat_context_init {
183     uint32_t num_params;
184     uint32_t pad;
185 
186     /* pointer to drm_kumquat_context_set_param array */
187     uint64_t ctx_set_params;
188 };
189 
190 /*
191  * Without VIRTGPU_KUMQUAT_EMULATED_EXPORT, the server side descriptor will
192  * be provided.
193  *
194  * With VIRTGPU_KUMQUAT_EMULATED_EXPORT, a shared memory descriptor embedded
195  * with resource will be provided.
196  */
197 #define VIRTGPU_KUMQUAT_EMULATED_EXPORT 0x0001
198 
199 #define VIRTGPU_KUMQUAT_MEM_HANDLE_TYPE_OPAQUE_FD 0x1
200 #define VIRTGPU_KUMQUAT_MEM_HANDLE_TYPE_DMABUF 0x2
201 #define VIRTGPU_KUMQUAT_MEM_HANDLE_TYPE_OPAQUE_WIN32 0x3
202 #define VIRTGPU_KUMQUAT_MEM_HANDLE_TYPE_SHM 0x4
203 #define VIRTGPU_KUMQUAT_MEM_HANDLE_TYPE_ZIRCON 0x5
204 
205 #define VIRTGPU_KUMQUAT_FENCE_HANDLE_TYPE_OPAQUE_FD 0x6
206 #define VIRTGPU_KUMQUAT_FENCE_HANDLE_TYPE_SYNC_FD 0x7
207 #define VIRTGPU_KUMQUAT_FENCE_HANDLE_TYPE_OPAQUE_WIN32 0x8
208 #define VIRTGPU_KUMQUAT_FENCE_HANDLE_TYPE_ZIRCON 0x9
209 struct drm_kumquat_resource_export {
210     uint32_t bo_handle;
211     uint32_t flags;
212     int64_t os_handle;
213     uint32_t handle_type;
214 };
215 
216 struct drm_kumquat_resource_import {
217     int64_t os_handle;
218     uint32_t handle_type;
219     uint32_t bo_handle;
220     uint32_t res_handle;
221     uint64_t size;
222 };
223 
224 int32_t virtgpu_kumquat_init(struct virtgpu_kumquat **ptr, const char *gpu_socket);
225 
226 int32_t virtgpu_kumquat_finish(struct virtgpu_kumquat **ptr);
227 
228 int32_t virtgpu_kumquat_get_param(struct virtgpu_kumquat *ptr, struct drm_kumquat_getparam *cmd);
229 
230 int32_t virtgpu_kumquat_get_caps(struct virtgpu_kumquat *ptr, struct drm_kumquat_get_caps *cmd);
231 
232 int32_t virtgpu_kumquat_context_init(struct virtgpu_kumquat *ptr,
233                                      struct drm_kumquat_context_init *cmd);
234 
235 int32_t virtgpu_kumquat_resource_create_3d(struct virtgpu_kumquat *ptr,
236                                            struct drm_kumquat_resource_create_3d *cmd);
237 
238 int32_t virtgpu_kumquat_resource_create_blob(struct virtgpu_kumquat *ptr,
239                                              struct drm_kumquat_resource_create_blob *cmd);
240 
241 int32_t virtgpu_kumquat_resource_unref(struct virtgpu_kumquat *ptr,
242                                        struct drm_kumquat_resource_unref *cmd);
243 
244 int32_t virtgpu_kumquat_resource_map(struct virtgpu_kumquat *ptr, struct drm_kumquat_map *cmd);
245 
246 int32_t virtgpu_kumquat_resource_unmap(struct virtgpu_kumquat *ptr, uint32_t bo_handle);
247 
248 int32_t virtgpu_kumquat_transfer_to_host(struct virtgpu_kumquat *ptr,
249                                          struct drm_kumquat_transfer_to_host *cmd);
250 
251 int32_t virtgpu_kumquat_transfer_from_host(struct virtgpu_kumquat *ptr,
252                                            struct drm_kumquat_transfer_from_host *cmd);
253 
254 int32_t virtgpu_kumquat_execbuffer(struct virtgpu_kumquat *ptr, struct drm_kumquat_execbuffer *cmd);
255 
256 int32_t virtgpu_kumquat_wait(struct virtgpu_kumquat *ptr, struct drm_kumquat_wait *cmd);
257 
258 // The following commands are more emulated than the rest.
259 int32_t virtgpu_kumquat_resource_export(struct virtgpu_kumquat *ptr,
260                                         struct drm_kumquat_resource_export *cmd);
261 
262 int32_t virtgpu_kumquat_resource_import(struct virtgpu_kumquat *ptr,
263                                         struct drm_kumquat_resource_import *cmd);
264 
265 int32_t virtgpu_kumquat_snapshot_save(struct virtgpu_kumquat *ptr);
266 
267 int32_t virtgpu_kumquat_snapshot_restore(struct virtgpu_kumquat *ptr);
268 
269 #ifdef __cplusplus
270 }
271 #endif
272 
273 #endif
274