1*dc5698e8SDave Airlie /* 2*dc5698e8SDave Airlie * Virtio GPU Device 3*dc5698e8SDave Airlie * 4*dc5698e8SDave Airlie * Copyright Red Hat, Inc. 2013-2014 5*dc5698e8SDave Airlie * 6*dc5698e8SDave Airlie * Authors: 7*dc5698e8SDave Airlie * Dave Airlie <airlied@redhat.com> 8*dc5698e8SDave Airlie * Gerd Hoffmann <kraxel@redhat.com> 9*dc5698e8SDave Airlie * 10*dc5698e8SDave Airlie * This header is BSD licensed so anyone can use the definitions 11*dc5698e8SDave Airlie * to implement compatible drivers/servers: 12*dc5698e8SDave Airlie * 13*dc5698e8SDave Airlie * Redistribution and use in source and binary forms, with or without 14*dc5698e8SDave Airlie * modification, are permitted provided that the following conditions 15*dc5698e8SDave Airlie * are met: 16*dc5698e8SDave Airlie * 1. Redistributions of source code must retain the above copyright 17*dc5698e8SDave Airlie * notice, this list of conditions and the following disclaimer. 18*dc5698e8SDave Airlie * 2. Redistributions in binary form must reproduce the above copyright 19*dc5698e8SDave Airlie * notice, this list of conditions and the following disclaimer in the 20*dc5698e8SDave Airlie * documentation and/or other materials provided with the distribution. 21*dc5698e8SDave Airlie * 3. Neither the name of IBM nor the names of its contributors 22*dc5698e8SDave Airlie * may be used to endorse or promote products derived from this software 23*dc5698e8SDave Airlie * without specific prior written permission. 24*dc5698e8SDave Airlie * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 25*dc5698e8SDave Airlie * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 26*dc5698e8SDave Airlie * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 27*dc5698e8SDave Airlie * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL IBM OR 28*dc5698e8SDave Airlie * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 29*dc5698e8SDave Airlie * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 30*dc5698e8SDave Airlie * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 31*dc5698e8SDave Airlie * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 32*dc5698e8SDave Airlie * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 33*dc5698e8SDave Airlie * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 34*dc5698e8SDave Airlie * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 35*dc5698e8SDave Airlie * SUCH DAMAGE. 36*dc5698e8SDave Airlie */ 37*dc5698e8SDave Airlie 38*dc5698e8SDave Airlie #ifndef VIRTIO_GPU_HW_H 39*dc5698e8SDave Airlie #define VIRTIO_GPU_HW_H 40*dc5698e8SDave Airlie 41*dc5698e8SDave Airlie enum virtio_gpu_ctrl_type { 42*dc5698e8SDave Airlie VIRTIO_GPU_UNDEFINED = 0, 43*dc5698e8SDave Airlie 44*dc5698e8SDave Airlie /* 2d commands */ 45*dc5698e8SDave Airlie VIRTIO_GPU_CMD_GET_DISPLAY_INFO = 0x0100, 46*dc5698e8SDave Airlie VIRTIO_GPU_CMD_RESOURCE_CREATE_2D, 47*dc5698e8SDave Airlie VIRTIO_GPU_CMD_RESOURCE_UNREF, 48*dc5698e8SDave Airlie VIRTIO_GPU_CMD_SET_SCANOUT, 49*dc5698e8SDave Airlie VIRTIO_GPU_CMD_RESOURCE_FLUSH, 50*dc5698e8SDave Airlie VIRTIO_GPU_CMD_TRANSFER_TO_HOST_2D, 51*dc5698e8SDave Airlie VIRTIO_GPU_CMD_RESOURCE_ATTACH_BACKING, 52*dc5698e8SDave Airlie VIRTIO_GPU_CMD_RESOURCE_DETACH_BACKING, 53*dc5698e8SDave Airlie 54*dc5698e8SDave Airlie /* cursor commands */ 55*dc5698e8SDave Airlie VIRTIO_GPU_CMD_UPDATE_CURSOR = 0x0300, 56*dc5698e8SDave Airlie VIRTIO_GPU_CMD_MOVE_CURSOR, 57*dc5698e8SDave Airlie 58*dc5698e8SDave Airlie /* success responses */ 59*dc5698e8SDave Airlie VIRTIO_GPU_RESP_OK_NODATA = 0x1100, 60*dc5698e8SDave Airlie VIRTIO_GPU_RESP_OK_DISPLAY_INFO, 61*dc5698e8SDave Airlie 62*dc5698e8SDave Airlie /* error responses */ 63*dc5698e8SDave Airlie VIRTIO_GPU_RESP_ERR_UNSPEC = 0x1200, 64*dc5698e8SDave Airlie VIRTIO_GPU_RESP_ERR_OUT_OF_MEMORY, 65*dc5698e8SDave Airlie VIRTIO_GPU_RESP_ERR_INVALID_SCANOUT_ID, 66*dc5698e8SDave Airlie VIRTIO_GPU_RESP_ERR_INVALID_RESOURCE_ID, 67*dc5698e8SDave Airlie VIRTIO_GPU_RESP_ERR_INVALID_CONTEXT_ID, 68*dc5698e8SDave Airlie VIRTIO_GPU_RESP_ERR_INVALID_PARAMETER, 69*dc5698e8SDave Airlie }; 70*dc5698e8SDave Airlie 71*dc5698e8SDave Airlie #define VIRTIO_GPU_FLAG_FENCE (1 << 0) 72*dc5698e8SDave Airlie 73*dc5698e8SDave Airlie struct virtio_gpu_ctrl_hdr { 74*dc5698e8SDave Airlie __le32 type; 75*dc5698e8SDave Airlie __le32 flags; 76*dc5698e8SDave Airlie __le64 fence_id; 77*dc5698e8SDave Airlie __le32 ctx_id; 78*dc5698e8SDave Airlie __le32 padding; 79*dc5698e8SDave Airlie }; 80*dc5698e8SDave Airlie 81*dc5698e8SDave Airlie /* data passed in the cursor vq */ 82*dc5698e8SDave Airlie 83*dc5698e8SDave Airlie struct virtio_gpu_cursor_pos { 84*dc5698e8SDave Airlie __le32 scanout_id; 85*dc5698e8SDave Airlie __le32 x; 86*dc5698e8SDave Airlie __le32 y; 87*dc5698e8SDave Airlie __le32 padding; 88*dc5698e8SDave Airlie }; 89*dc5698e8SDave Airlie 90*dc5698e8SDave Airlie /* VIRTIO_GPU_CMD_UPDATE_CURSOR, VIRTIO_GPU_CMD_MOVE_CURSOR */ 91*dc5698e8SDave Airlie struct virtio_gpu_update_cursor { 92*dc5698e8SDave Airlie struct virtio_gpu_ctrl_hdr hdr; 93*dc5698e8SDave Airlie struct virtio_gpu_cursor_pos pos; /* update & move */ 94*dc5698e8SDave Airlie __le32 resource_id; /* update only */ 95*dc5698e8SDave Airlie __le32 hot_x; /* update only */ 96*dc5698e8SDave Airlie __le32 hot_y; /* update only */ 97*dc5698e8SDave Airlie __le32 padding; 98*dc5698e8SDave Airlie }; 99*dc5698e8SDave Airlie 100*dc5698e8SDave Airlie /* data passed in the control vq, 2d related */ 101*dc5698e8SDave Airlie 102*dc5698e8SDave Airlie struct virtio_gpu_rect { 103*dc5698e8SDave Airlie __le32 x; 104*dc5698e8SDave Airlie __le32 y; 105*dc5698e8SDave Airlie __le32 width; 106*dc5698e8SDave Airlie __le32 height; 107*dc5698e8SDave Airlie }; 108*dc5698e8SDave Airlie 109*dc5698e8SDave Airlie /* VIRTIO_GPU_CMD_RESOURCE_UNREF */ 110*dc5698e8SDave Airlie struct virtio_gpu_resource_unref { 111*dc5698e8SDave Airlie struct virtio_gpu_ctrl_hdr hdr; 112*dc5698e8SDave Airlie __le32 resource_id; 113*dc5698e8SDave Airlie __le32 padding; 114*dc5698e8SDave Airlie }; 115*dc5698e8SDave Airlie 116*dc5698e8SDave Airlie /* VIRTIO_GPU_CMD_RESOURCE_CREATE_2D: create a 2d resource with a format */ 117*dc5698e8SDave Airlie struct virtio_gpu_resource_create_2d { 118*dc5698e8SDave Airlie struct virtio_gpu_ctrl_hdr hdr; 119*dc5698e8SDave Airlie __le32 resource_id; 120*dc5698e8SDave Airlie __le32 format; 121*dc5698e8SDave Airlie __le32 width; 122*dc5698e8SDave Airlie __le32 height; 123*dc5698e8SDave Airlie }; 124*dc5698e8SDave Airlie 125*dc5698e8SDave Airlie /* VIRTIO_GPU_CMD_SET_SCANOUT */ 126*dc5698e8SDave Airlie struct virtio_gpu_set_scanout { 127*dc5698e8SDave Airlie struct virtio_gpu_ctrl_hdr hdr; 128*dc5698e8SDave Airlie struct virtio_gpu_rect r; 129*dc5698e8SDave Airlie __le32 scanout_id; 130*dc5698e8SDave Airlie __le32 resource_id; 131*dc5698e8SDave Airlie }; 132*dc5698e8SDave Airlie 133*dc5698e8SDave Airlie /* VIRTIO_GPU_CMD_RESOURCE_FLUSH */ 134*dc5698e8SDave Airlie struct virtio_gpu_resource_flush { 135*dc5698e8SDave Airlie struct virtio_gpu_ctrl_hdr hdr; 136*dc5698e8SDave Airlie struct virtio_gpu_rect r; 137*dc5698e8SDave Airlie __le32 resource_id; 138*dc5698e8SDave Airlie __le32 padding; 139*dc5698e8SDave Airlie }; 140*dc5698e8SDave Airlie 141*dc5698e8SDave Airlie /* VIRTIO_GPU_CMD_TRANSFER_TO_HOST_2D: simple transfer to_host */ 142*dc5698e8SDave Airlie struct virtio_gpu_transfer_to_host_2d { 143*dc5698e8SDave Airlie struct virtio_gpu_ctrl_hdr hdr; 144*dc5698e8SDave Airlie struct virtio_gpu_rect r; 145*dc5698e8SDave Airlie __le64 offset; 146*dc5698e8SDave Airlie __le32 resource_id; 147*dc5698e8SDave Airlie __le32 padding; 148*dc5698e8SDave Airlie }; 149*dc5698e8SDave Airlie 150*dc5698e8SDave Airlie struct virtio_gpu_mem_entry { 151*dc5698e8SDave Airlie __le64 addr; 152*dc5698e8SDave Airlie __le32 length; 153*dc5698e8SDave Airlie __le32 padding; 154*dc5698e8SDave Airlie }; 155*dc5698e8SDave Airlie 156*dc5698e8SDave Airlie /* VIRTIO_GPU_CMD_RESOURCE_ATTACH_BACKING */ 157*dc5698e8SDave Airlie struct virtio_gpu_resource_attach_backing { 158*dc5698e8SDave Airlie struct virtio_gpu_ctrl_hdr hdr; 159*dc5698e8SDave Airlie __le32 resource_id; 160*dc5698e8SDave Airlie __le32 nr_entries; 161*dc5698e8SDave Airlie }; 162*dc5698e8SDave Airlie 163*dc5698e8SDave Airlie /* VIRTIO_GPU_CMD_RESOURCE_DETACH_BACKING */ 164*dc5698e8SDave Airlie struct virtio_gpu_resource_detach_backing { 165*dc5698e8SDave Airlie struct virtio_gpu_ctrl_hdr hdr; 166*dc5698e8SDave Airlie __le32 resource_id; 167*dc5698e8SDave Airlie __le32 padding; 168*dc5698e8SDave Airlie }; 169*dc5698e8SDave Airlie 170*dc5698e8SDave Airlie /* VIRTIO_GPU_RESP_OK_DISPLAY_INFO */ 171*dc5698e8SDave Airlie #define VIRTIO_GPU_MAX_SCANOUTS 16 172*dc5698e8SDave Airlie struct virtio_gpu_resp_display_info { 173*dc5698e8SDave Airlie struct virtio_gpu_ctrl_hdr hdr; 174*dc5698e8SDave Airlie struct virtio_gpu_display_one { 175*dc5698e8SDave Airlie struct virtio_gpu_rect r; 176*dc5698e8SDave Airlie __le32 enabled; 177*dc5698e8SDave Airlie __le32 flags; 178*dc5698e8SDave Airlie } pmodes[VIRTIO_GPU_MAX_SCANOUTS]; 179*dc5698e8SDave Airlie }; 180*dc5698e8SDave Airlie 181*dc5698e8SDave Airlie #define VIRTIO_GPU_EVENT_DISPLAY (1 << 0) 182*dc5698e8SDave Airlie 183*dc5698e8SDave Airlie struct virtio_gpu_config { 184*dc5698e8SDave Airlie __u32 events_read; 185*dc5698e8SDave Airlie __u32 events_clear; 186*dc5698e8SDave Airlie __u32 num_scanouts; 187*dc5698e8SDave Airlie __u32 reserved; 188*dc5698e8SDave Airlie }; 189*dc5698e8SDave Airlie 190*dc5698e8SDave Airlie /* simple formats for fbcon/X use */ 191*dc5698e8SDave Airlie enum virtio_gpu_formats { 192*dc5698e8SDave Airlie VIRTIO_GPU_FORMAT_B8G8R8A8_UNORM = 1, 193*dc5698e8SDave Airlie VIRTIO_GPU_FORMAT_B8G8R8X8_UNORM = 2, 194*dc5698e8SDave Airlie VIRTIO_GPU_FORMAT_A8R8G8B8_UNORM = 3, 195*dc5698e8SDave Airlie VIRTIO_GPU_FORMAT_X8R8G8B8_UNORM = 4, 196*dc5698e8SDave Airlie 197*dc5698e8SDave Airlie VIRTIO_GPU_FORMAT_R8G8B8A8_UNORM = 67, 198*dc5698e8SDave Airlie VIRTIO_GPU_FORMAT_X8B8G8R8_UNORM = 68, 199*dc5698e8SDave Airlie 200*dc5698e8SDave Airlie VIRTIO_GPU_FORMAT_A8B8G8R8_UNORM = 121, 201*dc5698e8SDave Airlie VIRTIO_GPU_FORMAT_R8G8B8X8_UNORM = 134, 202*dc5698e8SDave Airlie }; 203*dc5698e8SDave Airlie 204*dc5698e8SDave Airlie #endif 205