1 /* $NetBSD: viogpu.h,v 1.1 2025/07/26 14:18:13 martin Exp $ */ 2 /* 3 * Virtio GPU Device 4 * 5 * Copyright Red Hat, Inc. 2013-2014 6 * 7 * Authors: 8 * Dave Airlie <airlied (at) redhat.com> 9 * Gerd Hoffmann <kraxel (at) redhat.com> 10 * 11 * This header is BSD licensed so anyone can use the definitions 12 * to implement compatible drivers/servers: 13 * 14 * Redistribution and use in source and binary forms, with or without 15 * modification, are permitted provided that the following conditions 16 * are met: 17 * 1. Redistributions of source code must retain the above copyright 18 * notice, this list of conditions and the following disclaimer. 19 * 2. Redistributions in binary form must reproduce the above copyright 20 * notice, this list of conditions and the following disclaimer in the 21 * documentation and/or other materials provided with the distribution. 22 * 3. Neither the name of IBM nor the names of its contributors 23 * may be used to endorse or promote products derived from this software 24 * without specific prior written permission. 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 26 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 28 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL IBM OR 29 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 32 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 33 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 34 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 35 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 36 * SUCH DAMAGE. 37 */ 38 39 #ifndef VIRTIO_GPU_HW_H 40 #define VIRTIO_GPU_HW_H 41 42 #include <sys/types.h> 43 44 #define __u8 uint8_t 45 #define __u32 uint32_t 46 #define __le16 uint16_t 47 #define __le32 uint32_t 48 #define __le64 uint64_t 49 50 /* 51 * VIRTIO_GPU_CMD_CTX_* 52 * VIRTIO_GPU_CMD_*_3D 53 */ 54 #define VIRTIO_GPU_F_VIRGL (1ULL << 0) 55 56 /* 57 * VIRTIO_GPU_CMD_GET_EDID 58 */ 59 #define VIRTIO_GPU_F_EDID (1ULL << 1) 60 /* 61 * VIRTIO_GPU_CMD_RESOURCE_ASSIGN_UUID 62 */ 63 #define VIRTIO_GPU_F_RESOURCE_UUID (1ULL << 2) 64 65 /* 66 * VIRTIO_GPU_CMD_RESOURCE_CREATE_BLOB 67 */ 68 #define VIRTIO_GPU_F_RESOURCE_BLOB (1ULL << 3) 69 70 enum virtio_gpu_ctrl_type { 71 VIRTIO_GPU_UNDEFINED = 0, 72 73 /* 2d commands */ 74 VIRTIO_GPU_CMD_GET_DISPLAY_INFO = 0x0100, 75 VIRTIO_GPU_CMD_RESOURCE_CREATE_2D, 76 VIRTIO_GPU_CMD_RESOURCE_UNREF, 77 VIRTIO_GPU_CMD_SET_SCANOUT, 78 VIRTIO_GPU_CMD_RESOURCE_FLUSH, 79 VIRTIO_GPU_CMD_TRANSFER_TO_HOST_2D, 80 VIRTIO_GPU_CMD_RESOURCE_ATTACH_BACKING, 81 VIRTIO_GPU_CMD_RESOURCE_DETACH_BACKING, 82 VIRTIO_GPU_CMD_GET_CAPSET_INFO, 83 VIRTIO_GPU_CMD_GET_CAPSET, 84 VIRTIO_GPU_CMD_GET_EDID, 85 VIRTIO_GPU_CMD_RESOURCE_ASSIGN_UUID, 86 VIRTIO_GPU_CMD_RESOURCE_CREATE_BLOB, 87 VIRTIO_GPU_CMD_SET_SCANOUT_BLOB, 88 89 /* 3d commands */ 90 VIRTIO_GPU_CMD_CTX_CREATE = 0x0200, 91 VIRTIO_GPU_CMD_CTX_DESTROY, 92 VIRTIO_GPU_CMD_CTX_ATTACH_RESOURCE, 93 VIRTIO_GPU_CMD_CTX_DETACH_RESOURCE, 94 VIRTIO_GPU_CMD_RESOURCE_CREATE_3D, 95 VIRTIO_GPU_CMD_TRANSFER_TO_HOST_3D, 96 VIRTIO_GPU_CMD_TRANSFER_FROM_HOST_3D, 97 VIRTIO_GPU_CMD_SUBMIT_3D, 98 VIRTIO_GPU_CMD_RESOURCE_MAP_BLOB, 99 VIRTIO_GPU_CMD_RESOURCE_UNMAP_BLOB, 100 101 /* cursor commands */ 102 VIRTIO_GPU_CMD_UPDATE_CURSOR = 0x0300, 103 VIRTIO_GPU_CMD_MOVE_CURSOR, 104 105 /* success responses */ 106 VIRTIO_GPU_RESP_OK_NODATA = 0x1100, 107 VIRTIO_GPU_RESP_OK_DISPLAY_INFO, 108 VIRTIO_GPU_RESP_OK_CAPSET_INFO, 109 VIRTIO_GPU_RESP_OK_CAPSET, 110 VIRTIO_GPU_RESP_OK_EDID, 111 VIRTIO_GPU_RESP_OK_RESOURCE_UUID, 112 VIRTIO_GPU_RESP_OK_MAP_INFO, 113 114 /* error responses */ 115 VIRTIO_GPU_RESP_ERR_UNSPEC = 0x1200, 116 VIRTIO_GPU_RESP_ERR_OUT_OF_MEMORY, 117 VIRTIO_GPU_RESP_ERR_INVALID_SCANOUT_ID, 118 VIRTIO_GPU_RESP_ERR_INVALID_RESOURCE_ID, 119 VIRTIO_GPU_RESP_ERR_INVALID_CONTEXT_ID, 120 VIRTIO_GPU_RESP_ERR_INVALID_PARAMETER, 121 }; 122 123 enum virtio_gpu_shm_id { 124 VIRTIO_GPU_SHM_ID_UNDEFINED = 0, 125 /* 126 * VIRTIO_GPU_CMD_RESOURCE_MAP_BLOB 127 * VIRTIO_GPU_CMD_RESOURCE_UNMAP_BLOB 128 */ 129 VIRTIO_GPU_SHM_ID_HOST_VISIBLE = 1 130 }; 131 132 #define VIRTIO_GPU_FLAG_FENCE (1 << 0) 133 134 struct virtio_gpu_ctrl_hdr { 135 __le32 type; 136 __le32 flags; 137 __le64 fence_id; 138 __le32 ctx_id; 139 __le32 padding; 140 } __packed; 141 142 /* data passed in the cursor vq */ 143 144 struct virtio_gpu_cursor_pos { 145 __le32 scanout_id; 146 __le32 x; 147 __le32 y; 148 __le32 padding; 149 } __packed; 150 151 /* VIRTIO_GPU_CMD_UPDATE_CURSOR, VIRTIO_GPU_CMD_MOVE_CURSOR */ 152 struct virtio_gpu_update_cursor { 153 struct virtio_gpu_ctrl_hdr hdr; 154 struct virtio_gpu_cursor_pos pos; /* update & move */ 155 __le32 resource_id; /* update only */ 156 __le32 hot_x; /* update only */ 157 __le32 hot_y; /* update only */ 158 __le32 padding; 159 } __packed; 160 161 /* data passed in the control vq, 2d related */ 162 163 struct virtio_gpu_rect { 164 __le32 x; 165 __le32 y; 166 __le32 width; 167 __le32 height; 168 } __packed; 169 170 /* VIRTIO_GPU_CMD_RESOURCE_UNREF */ 171 struct virtio_gpu_resource_unref { 172 struct virtio_gpu_ctrl_hdr hdr; 173 __le32 resource_id; 174 __le32 padding; 175 } __packed; 176 177 /* VIRTIO_GPU_CMD_RESOURCE_CREATE_2D: create a 2d resource with a format */ 178 struct virtio_gpu_resource_create_2d { 179 struct virtio_gpu_ctrl_hdr hdr; 180 __le32 resource_id; 181 __le32 format; 182 __le32 width; 183 __le32 height; 184 } __packed; 185 186 /* VIRTIO_GPU_CMD_SET_SCANOUT */ 187 struct virtio_gpu_set_scanout { 188 struct virtio_gpu_ctrl_hdr hdr; 189 struct virtio_gpu_rect r; 190 __le32 scanout_id; 191 __le32 resource_id; 192 } __packed; 193 194 /* VIRTIO_GPU_CMD_RESOURCE_FLUSH */ 195 struct virtio_gpu_resource_flush { 196 struct virtio_gpu_ctrl_hdr hdr; 197 struct virtio_gpu_rect r; 198 __le32 resource_id; 199 __le32 padding; 200 } __packed; 201 202 /* VIRTIO_GPU_CMD_TRANSFER_TO_HOST_2D: simple transfer to_host */ 203 struct virtio_gpu_transfer_to_host_2d { 204 struct virtio_gpu_ctrl_hdr hdr; 205 struct virtio_gpu_rect r; 206 __le64 offset; 207 __le32 resource_id; 208 __le32 padding; 209 } __packed; 210 211 struct virtio_gpu_mem_entry { 212 __le64 addr; 213 __le32 length; 214 __le32 padding; 215 } __packed; 216 217 /* VIRTIO_GPU_CMD_RESOURCE_ATTACH_BACKING */ 218 struct virtio_gpu_resource_attach_backing { 219 struct virtio_gpu_ctrl_hdr hdr; 220 __le32 resource_id; 221 __le32 nr_entries; 222 } __packed; 223 224 /* VIRTIO_GPU_CMD_RESOURCE_DETACH_BACKING */ 225 struct virtio_gpu_resource_detach_backing { 226 struct virtio_gpu_ctrl_hdr hdr; 227 __le32 resource_id; 228 __le32 padding; 229 } __packed; 230 231 /* VIRTIO_GPU_RESP_OK_DISPLAY_INFO */ 232 #define VIRTIO_GPU_MAX_SCANOUTS 16 233 struct virtio_gpu_resp_display_info { 234 struct virtio_gpu_ctrl_hdr hdr; 235 struct virtio_gpu_display_one { 236 struct virtio_gpu_rect r; 237 __le32 enabled; 238 __le32 flags; 239 } pmodes[VIRTIO_GPU_MAX_SCANOUTS]; 240 } __packed; 241 242 /* data passed in the control vq, 3d related */ 243 244 struct virtio_gpu_box { 245 __le32 x, y, z; 246 __le32 w, h, d; 247 } __packed; 248 249 /* VIRTIO_GPU_CMD_TRANSFER_TO_HOST_3D, VIRTIO_GPU_CMD_TRANSFER_FROM_HOST_3D */ 250 struct virtio_gpu_transfer_host_3d { 251 struct virtio_gpu_ctrl_hdr hdr; 252 struct virtio_gpu_box box; 253 __le64 offset; 254 __le32 resource_id; 255 __le32 level; 256 __le32 stride; 257 __le32 layer_stride; 258 } __packed; 259 260 /* VIRTIO_GPU_CMD_RESOURCE_CREATE_3D */ 261 #define VIRTIO_GPU_RESOURCE_FLAG_Y_0_TOP (1 << 0) 262 struct virtio_gpu_resource_create_3d { 263 struct virtio_gpu_ctrl_hdr hdr; 264 __le32 resource_id; 265 __le32 target; 266 __le32 format; 267 __le32 bind; 268 __le32 width; 269 __le32 height; 270 __le32 depth; 271 __le32 array_size; 272 __le32 last_level; 273 __le32 nr_samples; 274 __le32 flags; 275 __le32 padding; 276 } __packed; 277 278 /* VIRTIO_GPU_CMD_CTX_CREATE */ 279 struct virtio_gpu_ctx_create { 280 struct virtio_gpu_ctrl_hdr hdr; 281 __le32 nlen; 282 __le32 padding; 283 char debug_name[64]; 284 } __packed; 285 286 /* VIRTIO_GPU_CMD_CTX_DESTROY */ 287 struct virtio_gpu_ctx_destroy { 288 struct virtio_gpu_ctrl_hdr hdr; 289 } __packed; 290 291 /* VIRTIO_GPU_CMD_CTX_ATTACH_RESOURCE, VIRTIO_GPU_CMD_CTX_DETACH_RESOURCE */ 292 struct virtio_gpu_ctx_resource { 293 struct virtio_gpu_ctrl_hdr hdr; 294 __le32 resource_id; 295 __le32 padding; 296 } __packed; 297 298 /* VIRTIO_GPU_CMD_SUBMIT_3D */ 299 struct virtio_gpu_cmd_submit { 300 struct virtio_gpu_ctrl_hdr hdr; 301 __le32 size; 302 __le32 padding; 303 } __packed; 304 305 #define VIRTIO_GPU_CAPSET_VIRGL 1 306 #define VIRTIO_GPU_CAPSET_VIRGL2 2 307 308 /* VIRTIO_GPU_CMD_GET_CAPSET_INFO */ 309 struct virtio_gpu_get_capset_info { 310 struct virtio_gpu_ctrl_hdr hdr; 311 __le32 capset_index; 312 __le32 padding; 313 } __packed; 314 315 /* VIRTIO_GPU_RESP_OK_CAPSET_INFO */ 316 struct virtio_gpu_resp_capset_info { 317 struct virtio_gpu_ctrl_hdr hdr; 318 __le32 capset_id; 319 __le32 capset_max_version; 320 __le32 capset_max_size; 321 __le32 padding; 322 } __packed; 323 324 /* VIRTIO_GPU_CMD_GET_CAPSET */ 325 struct virtio_gpu_get_capset { 326 struct virtio_gpu_ctrl_hdr hdr; 327 __le32 capset_id; 328 __le32 capset_version; 329 } __packed; 330 331 /* VIRTIO_GPU_RESP_OK_CAPSET */ 332 struct virtio_gpu_resp_capset { 333 struct virtio_gpu_ctrl_hdr hdr; 334 __u8 capset_data[]; 335 } __packed; 336 337 /* VIRTIO_GPU_CMD_GET_EDID */ 338 struct virtio_gpu_cmd_get_edid { 339 struct virtio_gpu_ctrl_hdr hdr; 340 __le32 scanout; 341 __le32 padding; 342 } __packed; 343 344 /* VIRTIO_GPU_RESP_OK_EDID */ 345 struct virtio_gpu_resp_edid { 346 struct virtio_gpu_ctrl_hdr hdr; 347 __le32 size; 348 __le32 padding; 349 __u8 edid[1024]; 350 } __packed; 351 352 #define VIRTIO_GPU_EVENT_DISPLAY (1 << 0) 353 354 struct virtio_gpu_config { 355 __le32 events_read; 356 __le32 events_clear; 357 __le32 num_scanouts; 358 __le32 num_capsets; 359 } __packed; 360 361 /* simple formats for fbcon/X use */ 362 enum virtio_gpu_formats { 363 VIRTIO_GPU_FORMAT_B8G8R8A8_UNORM = 1, 364 VIRTIO_GPU_FORMAT_B8G8R8X8_UNORM = 2, 365 VIRTIO_GPU_FORMAT_A8R8G8B8_UNORM = 3, 366 VIRTIO_GPU_FORMAT_X8R8G8B8_UNORM = 4, 367 368 VIRTIO_GPU_FORMAT_R8G8B8A8_UNORM = 67, 369 VIRTIO_GPU_FORMAT_X8B8G8R8_UNORM = 68, 370 371 VIRTIO_GPU_FORMAT_A8B8G8R8_UNORM = 121, 372 VIRTIO_GPU_FORMAT_R8G8B8X8_UNORM = 134, 373 }; 374 375 /* VIRTIO_GPU_CMD_RESOURCE_ASSIGN_UUID */ 376 struct virtio_gpu_resource_assign_uuid { 377 struct virtio_gpu_ctrl_hdr hdr; 378 __le32 resource_id; 379 __le32 padding; 380 } __packed; 381 382 /* VIRTIO_GPU_RESP_OK_RESOURCE_UUID */ 383 struct virtio_gpu_resp_resource_uuid { 384 struct virtio_gpu_ctrl_hdr hdr; 385 __u8 uuid[16]; 386 } __packed; 387 388 /* VIRTIO_GPU_CMD_RESOURCE_CREATE_BLOB */ 389 struct virtio_gpu_resource_create_blob { 390 struct virtio_gpu_ctrl_hdr hdr; 391 __le32 resource_id; 392 #define VIRTIO_GPU_BLOB_MEM_GUEST 0x0001 393 #define VIRTIO_GPU_BLOB_MEM_HOST3D 0x0002 394 #define VIRTIO_GPU_BLOB_MEM_HOST3D_GUEST 0x0003 395 396 #define VIRTIO_GPU_BLOB_FLAG_USE_MAPPABLE 0x0001 397 #define VIRTIO_GPU_BLOB_FLAG_USE_SHAREABLE 0x0002 398 #define VIRTIO_GPU_BLOB_FLAG_USE_CROSS_DEVICE 0x0004 399 /* zero is invalid blob mem */ 400 __le32 blob_mem; 401 __le32 blob_flags; 402 __le32 nr_entries; 403 __le64 blob_id; 404 __le64 size; 405 /* 406 * sizeof(nr_entries * virtio_gpu_mem_entry) bytes follow 407 */ 408 } __packed; 409 410 /* VIRTIO_GPU_CMD_SET_SCANOUT_BLOB */ 411 struct virtio_gpu_set_scanout_blob { 412 struct virtio_gpu_ctrl_hdr hdr; 413 struct virtio_gpu_rect r; 414 __le32 scanout_id; 415 __le32 resource_id; 416 __le32 width; 417 __le32 height; 418 __le32 format; 419 __le32 padding; 420 __le32 strides[4]; 421 __le32 offsets[4]; 422 } __packed; 423 424 /* VIRTIO_GPU_CMD_RESOURCE_MAP_BLOB */ 425 struct virtio_gpu_resource_map_blob { 426 struct virtio_gpu_ctrl_hdr hdr; 427 __le32 resource_id; 428 __le32 padding; 429 __le64 offset; 430 } __packed; 431 432 /* VIRTIO_GPU_RESP_OK_MAP_INFO */ 433 #define VIRTIO_GPU_MAP_CACHE_MASK 0x0f 434 #define VIRTIO_GPU_MAP_CACHE_NONE 0x00 435 #define VIRTIO_GPU_MAP_CACHE_CACHED 0x01 436 #define VIRTIO_GPU_MAP_CACHE_UNCACHED 0x02 437 #define VIRTIO_GPU_MAP_CACHE_WC 0x03 438 struct virtio_gpu_resp_map_info { 439 struct virtio_gpu_ctrl_hdr hdr; 440 __u32 map_info; 441 __u32 padding; 442 } __packed; 443 444 /* VIRTIO_GPU_CMD_RESOURCE_UNMAP_BLOB */ 445 struct virtio_gpu_resource_unmap_blob { 446 struct virtio_gpu_ctrl_hdr hdr; 447 __le32 resource_id; 448 __le32 padding; 449 } __packed; 450 451 #endif 452