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