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